Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/sugar-emulator54
-rw-r--r--bin/sugar-session9
-rw-r--r--bin/sugar.in5
-rw-r--r--configure.ac6
-rw-r--r--data/GPLv2339
-rw-r--r--data/Makefile.am1
-rw-r--r--data/gtkrc.em4
-rw-r--r--data/mime.defaults9
-rw-r--r--data/nm-user-settings.conf2
-rw-r--r--data/sugar.schemas.in2
-rw-r--r--extensions/cpsection/aboutcomputer/model.py4
-rw-r--r--extensions/cpsection/aboutcomputer/view.py7
-rw-r--r--extensions/cpsection/language/model.py2
-rw-r--r--extensions/cpsection/language/view.py33
-rw-r--r--extensions/deviceicon/network.py149
-rw-r--r--extensions/deviceicon/speaker.py2
-rw-r--r--extensions/deviceicon/volume.py13
-rw-r--r--extensions/globalkey/screenshot.py28
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/de.po1366
-rw-r--r--po/es.po1368
-rw-r--r--po/fr.po230
-rw-r--r--po/it.po315
-rw-r--r--po/ja.po207
-rw-r--r--po/ne.po1324
-rw-r--r--po/nl.po315
-rw-r--r--po/pt.po213
-rw-r--r--po/sl.po210
-rw-r--r--po/sv.po1328
-rw-r--r--po/zh_TW.po258
-rw-r--r--src/jarabe/desktop/Makefile.am1
-rw-r--r--src/jarabe/desktop/activitieslist.py487
-rw-r--r--src/jarabe/desktop/favoriteslayout.py2
-rw-r--r--src/jarabe/desktop/favoritesview.py70
-rw-r--r--src/jarabe/desktop/keydialog.py4
-rw-r--r--src/jarabe/desktop/meshbox.py39
-rwxr-xr-xsrc/jarabe/desktop/proc_smaps.py107
-rw-r--r--src/jarabe/frame/activitiestray.py97
-rw-r--r--src/jarabe/frame/clipboardobject.py16
-rw-r--r--src/jarabe/frame/framewindow.py3
-rw-r--r--src/jarabe/frame/friendstray.py9
-rw-r--r--src/jarabe/intro/window.py3
-rw-r--r--src/jarabe/journal/Makefile.am2
-rw-r--r--src/jarabe/journal/collapsedentry.py397
-rw-r--r--src/jarabe/journal/journalactivity.py19
-rw-r--r--src/jarabe/journal/journalentrybundle.py5
-rw-r--r--src/jarabe/journal/listmodel.py204
-rw-r--r--src/jarabe/journal/listview.py764
-rw-r--r--src/jarabe/journal/misc.py15
-rw-r--r--src/jarabe/journal/model.py93
-rw-r--r--src/jarabe/journal/objectchooser.py59
-rw-r--r--src/jarabe/journal/palettes.py6
-rw-r--r--src/jarabe/journal/volumestoolbar.py14
-rw-r--r--src/jarabe/model/buddy.py11
-rw-r--r--src/jarabe/model/bundleregistry.py72
-rw-r--r--src/jarabe/model/filetransfer.py53
-rw-r--r--src/jarabe/model/network.py39
-rw-r--r--src/jarabe/model/owner.py4
-rw-r--r--src/jarabe/model/shell.py17
-rw-r--r--src/jarabe/view/keyhandler.py70
-rw-r--r--src/jarabe/view/launcher.py18
-rw-r--r--src/jarabe/view/palettes.py12
-rw-r--r--src/jarabe/view/service.py9
-rw-r--r--src/jarabe/view/tabbinghandler.py37
-rw-r--r--src/jarabe/view/viewsource.py2
65 files changed, 6309 insertions, 4256 deletions
diff --git a/bin/sugar-emulator b/bin/sugar-emulator
index 8c0aa8e..7f06609 100644
--- a/bin/sugar-emulator
+++ b/bin/sugar-emulator
@@ -26,23 +26,34 @@ import gobject
from sugar import env
-def _run_xephyr(display, dpi, dimensions):
+default_dimensions = (800, 600)
+def _run_xephyr(display, dpi, dimensions, fullscreen):
cmd = [ 'Xephyr' ]
cmd.append(':%d' % display)
cmd.append('-ac')
- if dimensions is not None:
- cmd.append('-screen')
- cmd.append(dimensions)
- elif gtk.gdk.screen_width() < 1200 or gtk.gdk.screen_height() < 900:
+ screen_size = (gtk.gdk.screen_width(), gtk.gdk.screen_height())
+
+ if (not dimensions) and (fullscreen is None) and \
+ (screen_size < default_dimensions) :
+ # no forced settings, screen too small => fit screen
+ fullscreen = True
+ elif (not dimensions) :
+ # screen is big enough or user has en/disabled fullscreen manually
+ # => use default size (will get ignored for fullscreen)
+ dimensions = '%dx%d' % default_dimensions
+
+ if not dpi :
+ dpi = gtk.settings_get_default().get_property('gtk-xft-dpi') / 1024
+
+ if fullscreen :
cmd.append('-fullscreen')
- else:
+
+ if dimensions :
cmd.append('-screen')
- cmd.append('%dx%d' % (1200, 900))
+ cmd.append(dimensions)
- if dpi is None:
- dpi = gtk.settings_get_default().get_property('gtk-xft-dpi') / 1024
- if dpi > 0:
+ if dpi :
cmd.append('-dpi')
cmd.append('%d' % dpi)
@@ -58,16 +69,16 @@ def _check_xephyr(display):
stderr=open(os.devnull, "w"))
return result == 0
-def _start_xephyr(dpi, dimensions):
+def _start_xephyr(dpi, dimensions, fullscreen):
# FIXME evil workaround until F10 Xephyr is fixed
if os.path.exists('/etc/fedora-release'):
if open('/etc/fedora-release').read().startswith('Fedora release 10'):
- _run_xephyr(random.randint(100, 500), dpi, dimensions)
+ _run_xephyr(random.randint(100, 500), dpi, dimensions, fullscreen)
return
for display in range(100, 110):
if not _check_xephyr(display):
- _run_xephyr(display, dpi, dimensions)
+ _run_xephyr(display, dpi, dimensions, fullscreen)
tries = 10
while tries > 0:
@@ -77,11 +88,10 @@ def _start_xephyr(dpi, dimensions):
tries -= 1
time.sleep(0.1)
-def _start_matchbox():
- cmd = ['matchbox-window-manager']
+def _start_window_manager():
+ cmd = ['metacity']
- cmd.extend(['-use_titlebar', 'no'])
- cmd.extend(['-theme', 'sugar'])
+ cmd.extend(['--no-force-fullscreen'])
gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
@@ -126,11 +136,17 @@ def main():
help='Sugar scaling in %')
parser.add_option('-i', '--dimensions', dest='dimensions',
help='Emulator dimensions (ex. 1200x900)')
+ parser.add_option('-f', '--fullscreen', dest='fullscreen',
+ action='store_true', default=None,
+ help='Run emulator in fullscreen mode')
+ parser.add_option('-F', '--no-fullscreen', dest='fullscreen',
+ action='store_false',
+ help='Do not run emulator in fullscreen mode')
(options, args) = parser.parse_args()
_setup_env()
- _start_xephyr(options.dpi, options.dimensions)
+ _start_xephyr(options.dpi, options.dimensions, options.fullscreen)
if options.scaling:
os.environ['SUGAR_SCALING'] = options.scaling
@@ -140,7 +156,7 @@ def main():
if not args:
command.append('sugar')
else:
- _start_matchbox()
+ _start_window_manager()
if args[0].endswith('.py'):
command.append('python')
diff --git a/bin/sugar-session b/bin/sugar-session
index b4ab2c7..1ce40a3 100644
--- a/bin/sugar-session
+++ b/bin/sugar-session
@@ -134,14 +134,17 @@ def main():
cleanup_logs()
logger.start('shell')
- intro.check_profile()
-
client = gconf.client_get_default()
- timezone = client.get_string('/desktop/sugar/date/timezone')
+ client.set_string('/desktop/gnome/peripherals/mouse/cursor_theme', 'sugar')
+ client.set_string('/apps/metacity/general/mouse_button_modifier',
+ 'disabled')
+ timezone = client.get_string('/desktop/sugar/date/timezone')
if timezone is not None and timezone:
os.environ['TZ'] = timezone
+ intro.check_profile()
+
start_ui_service()
start_session_manager()
diff --git a/bin/sugar.in b/bin/sugar.in
index b9f467c..7b5ca25 100644
--- a/bin/sugar.in
+++ b/bin/sugar.in
@@ -1,7 +1,7 @@
#!/bin/sh
if test -z "$SUGAR_SCALING"; then
- export SUGAR_SCALING=100
+ export SUGAR_SCALING=72
fi
export GTK2_RC_FILES="@prefix@/share/sugar/data/sugar-$SUGAR_SCALING.gtkrc"
@@ -16,7 +16,6 @@ if [ -f ~/.sugar/debug ]; then
. ~/.sugar/debug
fi
-matchbox-window-manager -use_titlebar no -theme sugar \
- -kbdconfig @prefix@/share/sugar/data/kbdconfig &
+metacity --no-force-fullscreen &
exec sugar-session
diff --git a/configure.ac b/configure.ac
index bfb01ea..979c990 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,15 +1,17 @@
-AC_INIT([Sugar],[0.83.8],[],[sugar])
+AC_INIT([Sugar],[0.85.2],[],[sugar])
AC_PREREQ([2.59])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([configure.ac])
-SUCROSE_VERSION="0.83.x"
+SUCROSE_VERSION="0.85.1"
AC_SUBST(SUCROSE_VERSION)
AM_INIT_AUTOMAKE([1.9 foreign dist-bzip2 no-dist-gzip])
+AM_MAINTAINER_MODE
+
AM_PATH_PYTHON
PKG_CHECK_MODULES(SHELL, pygtk-2.0 gtk+-2.0 gconf-2.0)
diff --git a/data/GPLv2 b/data/GPLv2
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/data/GPLv2
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/data/Makefile.am b/data/Makefile.am
index 585f071..684ca20 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -13,6 +13,7 @@ sugar_DATA = \
activities.defaults \
kbdconfig \
mime.defaults \
+ GPLv2 \
$(GTKRC_FILES)
GTKRC_FILES = \
diff --git a/data/gtkrc.em b/data/gtkrc.em
index f355141..b9eeb7d 100644
--- a/data/gtkrc.em
+++ b/data/gtkrc.em
@@ -1,14 +1,12 @@
@{
if scaling == '72':
- font_name = 'Sans Serif 10'
icon_sizes = 'gtk-large-toolbar=40,40'
else:
- font_name = 'Sans Serif 7'
icon_sizes = 'gtk-large-toolbar=55,55'
}@
gtk-theme-name = "sugar-@scaling"
gtk-icon-theme-name = "sugar"
-gtk-font-name = "@font_name"
+gtk-font-name = "Sans Serif 10"
gtk-cursor-theme-name = "sugar"
gtk-toolbar-style = GTK_TOOLBAR_ICONS
gtk-icon-sizes = "@icon_sizes"
diff --git a/data/mime.defaults b/data/mime.defaults
index 4400803..f07e22c 100644
--- a/data/mime.defaults
+++ b/data/mime.defaults
@@ -16,6 +16,9 @@ text/html org.laptop.WebActivity
application/xhtml+xml org.laptop.WebActivity
application/xml org.laptop.WebActivity
application/rss+xml org.laptop.WebActivity
-application/ogg org.laptop.WebActivity
-audio/ogg org.laptop.WebActivity
-video/ogg org.laptop.WebActivity
+application/ogg org.laptop.sugar.Jukebox
+audio/ogg org.laptop.sugar.Jukebox
+video/ogg org.laptop.sugar.Jukebox
+
+text/x-python org.laptop.PippyActivity
+
diff --git a/data/nm-user-settings.conf b/data/nm-user-settings.conf
index 9dda140..16e71e4 100644
--- a/data/nm-user-settings.conf
+++ b/data/nm-user-settings.conf
@@ -14,7 +14,7 @@
<!-- Only root can get secrets -->
<deny send_destination="org.freedesktop.NetworkManagerUserSettings"
- send_interface="org.freedesktop.NetworkManagerSettings.Secrets"/>
+ send_interface="org.freedesktop.NetworkManagerSettings.Connection.Secrets"/>
</policy>
<policy context="default">
<deny send_destination="org.freedesktop.NetworkManagerUserSettings"/>
diff --git a/data/sugar.schemas.in b/data/sugar.schemas.in
index dc7104d..fba89ff 100644
--- a/data/sugar.schemas.in
+++ b/data/sugar.schemas.in
@@ -173,7 +173,7 @@
<applyto>/desktop/sugar/show_logout</applyto>
<owner>sugar</owner>
<type>bool</type>
- <default>false</default>
+ <default>true</default>
<locale name="C">
<!-- FIXME: Enable these after string freeze is over
<short>Show Log out</short>
diff --git a/extensions/cpsection/aboutcomputer/model.py b/extensions/cpsection/aboutcomputer/model.py
index 39a766f..6cddb4c 100644
--- a/extensions/cpsection/aboutcomputer/model.py
+++ b/extensions/cpsection/aboutcomputer/model.py
@@ -22,6 +22,8 @@ import subprocess
from gettext import gettext as _
import errno
+from jarabe import config
+
_logger = logging.getLogger('ControlPanel - AboutComputer')
_not_available = _('Not available')
@@ -113,7 +115,7 @@ def _read_file(path):
return None
def get_license():
- license_file = "/usr/share/licenses/common-licenses/GPLv2"
+ license_file = os.path.join(config.data_path, 'GPLv2')
lang = os.environ['LANG']
if lang.endswith("UTF-8"):
lang = lang[:-6]
diff --git a/extensions/cpsection/aboutcomputer/view.py b/extensions/cpsection/aboutcomputer/view.py
index f8739ee..dd4f8f3 100644
--- a/extensions/cpsection/aboutcomputer/view.py
+++ b/extensions/cpsection/aboutcomputer/view.py
@@ -1,5 +1,6 @@
# coding=utf-8
# Copyright (C) 2008, OLPC
+# Copyright (C) 2009 Simon Schampijer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -173,9 +174,9 @@ class AboutComputer(SectionView):
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 = gtk.Label("© 2006-2009 One Laptop per Child "
+ "Association Inc; Red Hat Inc; Collabora Ltd; "
+ "and Contributors.")
label_copyright.set_alignment(0, 0)
label_copyright.show()
vbox_copyright.pack_start(label_copyright, expand=False)
diff --git a/extensions/cpsection/language/model.py b/extensions/cpsection/language/model.py
index e714dad..fe80410 100644
--- a/extensions/cpsection/language/model.py
+++ b/extensions/cpsection/language/model.py
@@ -74,7 +74,7 @@ def _write_i18n(langs):
fd.close()
else:
fd = open(path, 'w')
- fd.write('LANG="%s"\n' % langs[0])
+ fd.write('LANG="%s"\n' % langs[0].strip("\n"))
fd.write('LANGUAGE="%s"\n' % langstr)
fd.close()
diff --git a/extensions/cpsection/language/view.py b/extensions/cpsection/language/view.py
index 5b7e292..30dc05d 100644
--- a/extensions/cpsection/language/view.py
+++ b/extensions/cpsection/language/view.py
@@ -118,6 +118,8 @@ class Language(SectionView):
previous_add_removes = self._add_remove_boxes[-2]
previous_add_removes.hide_all()
+ self._determine_add_remove_visibility()
+
combobox.show()
def _attach_to_table(self, widget, row, column, padding=20, \
@@ -173,9 +175,6 @@ class Language(SectionView):
remove_button.connect('clicked',
self.__remove_button_clicked_cb)
- if self._selected_lang_count == 1:
- remove_button.set_sensitive(False)
-
add_remove_box = gtk.HButtonBox()
add_remove_box.set_layout(gtk.BUTTONBOX_START)
add_remove_box.set_spacing(10)
@@ -197,6 +196,10 @@ class Language(SectionView):
def _check_change(self):
selected_langs = self._get_selected_langs()
+ last_lang = selected_langs[-1]
+
+ self._determine_add_remove_visibility(last_lang = last_lang)
+
self._changed = (selected_langs != self._selected_locales)
if self._changed == False:
@@ -226,6 +229,30 @@ class Language(SectionView):
return new_codes
+ def _determine_add_remove_visibility(self, last_lang = None):
+ # We should not let users add fallback languages for English (USA)
+ # This is because the software is not usually _translated_ into English
+ # which means that the fallback gets selected automatically
+
+ if last_lang is None:
+ selected_langs = self._get_selected_langs()
+ last_lang = selected_langs[-1]
+
+ add_remove_box = self._add_remove_boxes[-1]
+ buttons = add_remove_box.get_children()
+ add_button, remove_button = buttons
+
+ if last_lang.startswith('en_US'):
+ add_button.props.visible = False
+ else:
+ add_button.props.visible = True
+
+ if self._selected_lang_count == 1:
+ remove_button.props.visible = False
+ else:
+ remove_button.props.visible = True
+
+
def __lang_timeout_cb(self, codes):
self._lang_sid = 0
self._model.set_languages(codes)
diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
index d52f083..5016943 100644
--- a/extensions/deviceicon/network.py
+++ b/extensions/deviceicon/network.py
@@ -1,5 +1,6 @@
#
# Copyright (C) 2008 One Laptop Per Child
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -17,7 +18,7 @@
from gettext import gettext as _
import logging
-import sha
+import hashlib
import socket
import struct
@@ -32,8 +33,11 @@ from sugar.graphics.palette import Palette
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.tray import TrayIcon
from sugar.graphics import xocolor
+from sugar.util import unique_id
from jarabe.model import network
+from jarabe.model.network import Settings
+from jarabe.model.network import IP4Config
from jarabe.frame.frameinvoker import FrameWidgetInvoker
from jarabe.view.pulsingicon import PulsingIcon
@@ -71,7 +75,9 @@ class WirelessPalette(Palette):
__gsignals__ = {
'deactivate-connection' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
+ gobject.TYPE_NONE, ([])),
+ 'create-connection' : (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([])),
}
def __init__(self, primary_text):
@@ -105,6 +111,11 @@ class WirelessPalette(Palette):
self._disconnect_item.connect('activate', self.__disconnect_activate_cb)
self.menu.append(self._disconnect_item)
+ self._adhoc_item = gtk.MenuItem(_('Create new wireless network'))
+ self._adhoc_item.connect('activate', self.__adhoc_activate_cb)
+ self.menu.append(self._adhoc_item)
+ self._adhoc_item.show()
+
def set_connecting(self):
self.props.secondary_text = _('Connecting...')
@@ -114,10 +125,19 @@ class WirelessPalette(Palette):
self._set_channel(frequency)
self._set_ip_address(iaddress)
self._disconnect_item.show()
+
+ def set_disconnected(self):
+ self.props.primary_text = ''
+ self.props.secondary_text = ''
+ self._disconnect_item.hide()
+ self.set_content(None)
def __disconnect_activate_cb(self, menuitem):
self.emit('deactivate-connection')
+ def __adhoc_activate_cb(self, menuitem):
+ self.emit('create-connection')
+
def _set_channel(self, frequency):
try:
channel = frequency_to_channel(frequency)
@@ -192,6 +212,7 @@ class WirelessDeviceView(ToolButton):
self._bus = dbus.SystemBus()
self._device = device
+ self._device_props = None
self._flags = 0
self._name = ''
self._strength = 0
@@ -211,21 +232,24 @@ class WirelessDeviceView(ToolButton):
self.set_icon_widget(self._icon)
self._icon.show()
+ self.set_palette_invoker(FrameWidgetInvoker(self))
self._palette = WirelessPalette(self._name)
self._palette.connect('deactivate-connection',
- self.__deactivate_connection)
+ self.__deactivate_connection_cb)
+ self._palette.connect('create-connection',
+ self.__create_connection_cb)
self.set_palette(self._palette)
- self._palette.props.invoker = FrameWidgetInvoker(self)
self._palette.set_group_id('frame')
- props = dbus.Interface(self._device, 'org.freedesktop.DBus.Properties')
- props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
- reply_handler=self.__get_device_props_reply_cb,
- error_handler=self.__get_device_props_error_cb)
+ self._device_props = dbus.Interface(self._device,
+ 'org.freedesktop.DBus.Properties')
+ self._device_props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
+ reply_handler=self.__get_device_props_reply_cb,
+ error_handler=self.__get_device_props_error_cb)
- self._device.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
- reply_handler=self.__get_active_ap_reply_cb,
- error_handler=self.__get_active_ap_error_cb)
+ self._device_props.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
+ reply_handler=self.__get_active_ap_reply_cb,
+ error_handler=self.__get_active_ap_error_cb)
self._bus.add_signal_receiver(self.__state_changed_cb,
signal_name='StateChanged',
@@ -276,10 +300,9 @@ class WirelessDeviceView(ToolButton):
def __state_changed_cb(self, new_state, old_state, reason):
self._device_state = new_state
self._update_state()
-
- self._device.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
- reply_handler=self.__get_active_ap_reply_cb,
- error_handler=self.__get_active_ap_error_cb)
+ self._device_props.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
+ reply_handler=self.__get_active_ap_reply_cb,
+ error_handler=self.__get_active_ap_error_cb)
def __ap_properties_changed_cb(self, properties):
self._update_properties(properties)
@@ -294,7 +317,7 @@ class WirelessDeviceView(ToolButton):
if 'Frequency' in properties:
self._frequency = properties['Frequency']
- sh = sha.new()
+ sh = hashlib.sha1()
data = self._name + hex(self._flags)
sh.update(data)
h = hash(sh.digest())
@@ -343,16 +366,20 @@ class WirelessDeviceView(ToolButton):
self._palette.set_connecting()
self._icon.props.pulsing = True
elif state == network.DEVICE_STATE_ACTIVATED:
- props = dbus.Interface(self._device,
- 'org.freedesktop.DBus.Properties')
- address = props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
+ address = self._device_props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
self._palette.set_connected(self._frequency, address)
self._icon.props.pulsing = False
+ else:
+ self._icon.props.badge_name = None
+ self._icon.props.pulsing = False
+ self._icon.props.pulse_color = self._inactive_color
+ self._icon.props.base_color = self._inactive_color
+ self._palette.set_disconnected()
def _update_color(self):
self._icon.props.base_color = self._color
- def __deactivate_connection(self, palette, data=None):
+ def __deactivate_connection_cb(self, palette, data=None):
if self._active_ap_op is not None:
obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
netmgr = dbus.Interface(obj, _NM_IFACE)
@@ -369,6 +396,40 @@ class WirelessDeviceView(ToolButton):
netmgr.DeactivateConnection(conn_o)
break
+ def __create_connection_cb(self, palette, data=None):
+ client = gconf.client_get_default()
+ nick = client.get_string('/desktop/sugar/user/nick')
+ connection_name = _('%s\'s network') % nick
+
+ connection = network.find_connection(connection_name)
+ if connection is None:
+ settings = Settings()
+ settings.connection.id = 'Auto ' + connection_name
+ settings.connection.uuid = unique_id()
+ settings.connection.type = '802-11-wireless'
+ settings.wireless.ssid = dbus.ByteArray(connection_name)
+ settings.wireless.band = 'bg'
+ settings.wireless.mode = 'adhoc'
+ settings.ip4_config = IP4Config()
+ settings.ip4_config.method = 'shared'
+
+ connection = network.add_connection(connection_name, settings)
+
+ obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+ netmgr = dbus.Interface(obj, _NM_IFACE)
+
+ netmgr.ActivateConnection(network.SETTINGS_SERVICE,
+ connection.path,
+ self._device.object_path,
+ '/',
+ reply_handler=self.__activate_reply_cb,
+ error_handler=self.__activate_error_cb)
+
+ def __activate_reply_cb(self, connection):
+ logging.debug('Network created: %s', connection)
+
+ def __activate_error_cb(self, err):
+ logging.debug('Failed to create network: %s', err)
class WiredDeviceView(TrayIcon):
@@ -381,61 +442,27 @@ class WiredDeviceView(TrayIcon):
TrayIcon.__init__(self, icon_name=self._ICON_NAME, xo_color=color)
+ self.set_palette_invoker(FrameWidgetInvoker(self))
self._palette = WiredPalette()
self.set_palette(self._palette)
- self._palette.props.invoker = FrameWidgetInvoker(self)
self._palette.set_group_id('frame')
self._palette.set_connected(speed, address)
class WirelessDeviceObserver(object):
def __init__(self, device, tray):
- self._bus = dbus.SystemBus()
self._device = device
self._device_view = None
self._tray = tray
- props = dbus.Interface(self._device, 'org.freedesktop.DBus.Properties')
- props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
- reply_handler=self.__get_device_props_reply_cb,
- error_handler=self.__get_device_props_error_cb)
-
- self._bus.add_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
+ self._device_view = WirelessDeviceView(self._device)
+ self._tray.add_device(self._device_view)
def disconnect(self):
- self._bus.remove_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
-
- def __get_device_props_reply_cb(self, properties):
- if 'State' in properties:
- self._update_state(properties['State'])
-
- def __get_device_props_error_cb(self, err):
- logging.error('Error getting the device properties: %s', err)
-
- def __state_changed_cb(self, new_state, old_state, reason):
- self._update_state(new_state)
-
- def _update_state(self, state):
- if state == network.DEVICE_STATE_PREPARE or \
- state == network.DEVICE_STATE_CONFIG or \
- state == network.DEVICE_STATE_NEED_AUTH or \
- state == network.DEVICE_STATE_IP_CONFIG or \
- state == network.DEVICE_STATE_ACTIVATED:
- if self._device_view is None:
- self._device_view = WirelessDeviceView(self._device)
- self._tray.add_device(self._device_view)
- else:
- if self._device_view is not None:
- self._device_view.disconnect()
- self._tray.remove_device(self._device_view)
- del self._device_view
- self._device_view = None
+ self._device_view.disconnect()
+ self._tray.remove_device(self._device_view)
+ del self._device_view
+ self._device_view = None
class WiredDeviceObserver(object):
diff --git a/extensions/deviceicon/speaker.py b/extensions/deviceicon/speaker.py
index d8e7a2b..3a54464 100644
--- a/extensions/deviceicon/speaker.py
+++ b/extensions/deviceicon/speaker.py
@@ -93,8 +93,6 @@ class SpeakerPalette(Palette):
self._model = model
- self.set_size_request(style.zoom(style.GRID_CELL_SIZE * 4), -1)
-
vbox = gtk.VBox()
self.set_content(vbox)
vbox.show()
diff --git a/extensions/deviceicon/volume.py b/extensions/deviceicon/volume.py
index c795328..5c4c49e 100644
--- a/extensions/deviceicon/volume.py
+++ b/extensions/deviceicon/volume.py
@@ -14,9 +14,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 statvfs
-from gettext import gettext as _
import logging
import gobject
@@ -25,10 +22,7 @@ import gtk
import gconf
from sugar.graphics.tray import TrayIcon
-from sugar.graphics.menuitem import MenuItem
-from sugar.graphics.icon import Icon
from sugar.graphics.xocolor import XoColor
-from sugar.graphics import style
from jarabe.journal import journalactivity
from jarabe.view.palettes import VolumePalette
@@ -88,7 +82,7 @@ def _setup_volumes(tray):
for mount in volume_monitor.get_mounts():
_add_device(mount, tray)
- #volume_monitor.connect('volume-added', _volume_added_cb, tray)
+ volume_monitor.connect('volume-added', _volume_added_cb, tray)
volume_monitor.connect('mount-added', _mount_added_cb, tray)
volume_monitor.connect('mount-removed', _mount_removed_cb, tray)
@@ -102,8 +96,9 @@ def _mount(volume, tray):
#TODO: pass None as mount_operation, or better, SugarMountOperation
volume.mount(gtk.MountOperation(tray.get_toplevel()), _mount_cb)
-def _mount_cb(source, result):
- logging.debug('mount finished %r %r' % (source, result))
+def _mount_cb(volume, result):
+ logging.debug('_mount_cb %r %r' % (volume, result))
+ volume.mount_finish(result)
def _mount_added_cb(volume_monitor, mount, tray):
_add_device(mount, tray)
diff --git a/extensions/globalkey/screenshot.py b/extensions/globalkey/screenshot.py
index b7538ef..5474b4c 100644
--- a/extensions/globalkey/screenshot.py
+++ b/extensions/globalkey/screenshot.py
@@ -1,5 +1,5 @@
# Copyright (C) 2008 One Laptop Per Child
-# Copyright (C) 2009 Simon Schampijer
+# Copyright (C) 2009 Simon Schampijer, James Zaki
#
# 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
@@ -26,6 +26,7 @@ import dbus
from sugar.datastore import datastore
from sugar.graphics import style
+from jarabe.model import shell
BOUND_KEYS = ['<alt>1', 'Print']
@@ -46,9 +47,32 @@ def handle_key_press(key):
client = gconf.client_get_default()
color = client.get_string('/desktop/sugar/user/color')
+ content_title = None
+ shell_model = shell.get_model()
+ zoom_level = shell_model.zoom_level
+
+ # TRANS: Nouns of what a screenshot contains
+ if zoom_level == shell_model.ZOOM_MESH:
+ content_title = _('Mesh')
+ elif zoom_level == shell_model.ZOOM_GROUP:
+ content_title = _('Group')
+ elif zoom_level == shell_model.ZOOM_HOME:
+ content_title = _('Home')
+ elif zoom_level == shell_model.ZOOM_ACTIVITY:
+ activity = shell_model.get_active_activity()
+ if activity != None:
+ content_title = activity.get_title()
+ if content_title == None:
+ content_title = _('Activity')
+
+ if content_title is None:
+ title = _('Screenshot')
+ else:
+ title = _('Screenshot of \"%s\"') % content_title
+
jobject = datastore.create()
try:
- jobject.metadata['title'] = _('Screenshot')
+ jobject.metadata['title'] = title
jobject.metadata['keep'] = '0'
jobject.metadata['buddies'] = ''
jobject.metadata['preview'] = _get_preview_data(screenshot)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 5f19663..e01fb8b 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -29,6 +29,7 @@ src/jarabe/controlpanel/cmd.py
src/jarabe/controlpanel/gui.py
src/jarabe/controlpanel/sectionview.py
src/jarabe/controlpanel/toolbar.py
+src/jarabe/desktop/activitieslist.py
src/jarabe/desktop/favoriteslayout.py
src/jarabe/desktop/favoritesview.py
src/jarabe/desktop/homebox.py
@@ -41,7 +42,6 @@ src/jarabe/frame/clipboardobject.py
src/jarabe/frame/devicestray.py
src/jarabe/frame/zoomtoolbar.py
src/jarabe/intro/window.py
-src/jarabe/journal/collapsedentry.py
src/jarabe/journal/detailview.py
src/jarabe/journal/expandedentry.py
src/jarabe/journal/journalactivity.py
diff --git a/po/de.po b/po/de.po
index 6102875..0b26f20 100644
--- a/po/de.po
+++ b/po/de.po
@@ -4,421 +4,108 @@ msgid ""
msgstr ""
"Project-Id-Version: sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-25 00:30-0400\n"
-"PO-Revision-Date: 2008-11-14 12:15-0500\n"
-"Last-Translator: Markus Schlager <m.slg@gmx.de>\n"
+"POT-Creation-Date: 2009-03-19 00:30-0400\n"
+"PO-Revision-Date: 2009-04-01 01:37-0400\n"
+"Last-Translator: Simon Schampijer <simon@laptop.org>\n"
"Language-Team: German <fedora-trans-de@redhat.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 1.1.0rc2\n"
"X-Poedit-Language: German\n"
-#: ../src/intro/window.py:93 ../src/controlpanel/aboutme/view.py:100
-msgid "Name:"
-msgstr "Name:"
-
-#: ../src/intro/window.py:125
-msgid "Click to change color:"
-msgstr "Klicken zum Wechseln der Farbe:"
-
-#: ../src/intro/window.py:175 ../src/journal/detailview.py:119
-msgid "Back"
-msgstr "Zurück"
-
-#: ../src/intro/window.py:189 ../src/controlpanel/toolbar.py:61
-msgid "Done"
-msgstr "Fertig"
-
-# (Markus S.) war 'Nächste'
-#: ../src/intro/window.py:192
-msgid "Next"
-msgstr "Vor"
-
-#: ../src/view/BuddyMenu.py:60
-msgid "Remove friend"
-msgstr "Freund entfernen"
-
-#: ../src/view/BuddyMenu.py:63
-msgid "Make friend"
-msgstr "Freunde werden"
-
-#: ../src/view/BuddyMenu.py:92
-#, python-format
-msgid "Invite to %s"
-msgstr "Einladen zu %s"
-
-#: ../src/view/clipboardmenu.py:51
-msgid "Remove"
-msgstr "Entfernen"
-
-#: ../src/view/clipboardmenu.py:56 ../src/view/clipboardmenu.py:78
-msgid "Open"
-msgstr "Öffnen"
-
-# self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-# TODO: Implement stopping downloads
-# self._stop_item.connect('activate', self._stop_item_activate_cb)
-# self.append_menu_item(self._stop_item)
-#: ../src/view/clipboardmenu.py:61 ../src/view/home/HomeBox.py:84
-msgid "Keep"
-msgstr "Behalten"
-
-#: ../src/view/clipboardmenu.py:83
-msgid "Open with"
-msgstr "Öffnen mit"
-
-# (Markus S.) 'clipping', nicht 'clipped'
-#: ../src/view/clipboardmenu.py:228
-#, python-format
-#, fuzzy
-msgid "%s clipping"
-msgstr "%s ausgeschnitten"
-
-#: ../src/hardware/keydialog.py:150
-msgid "Key Type:"
-msgstr "Schlüsseltyp:"
-
-#: ../src/hardware/keydialog.py:170
-msgid "Authentication Type:"
-msgstr "Authentifizierungstyp:"
-
-#: ../src/hardware/keydialog.py:251
-msgid "Encryption Type:"
-msgstr "Verschlüsselungstyp:"
-
-#: ../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:251
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
-
-#: ../src/view/home/HomeBox.py:78
-msgid "Confirm erase"
-msgstr "Löschen bestätigen"
-
-#: ../src/view/home/HomeBox.py:80
-#, 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:87 ../src/view/palettes.py:120
-#: ../src/journal/journaltoolbox.py:335 ../src/journal/palettes.py:75
-msgid "Erase"
-msgstr "Löschen"
-
-#: ../src/view/home/HomeBox.py:117
-msgid "Software Update"
-msgstr "Software-Aktualisierung"
-
-#: ../src/view/home/HomeBox.py:118
-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:122 ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: ../src/view/home/HomeBox.py:124 ../src/controlpanel/gui.py:273
-msgid "Later"
-msgstr "Später"
-
-#: ../src/view/home/HomeBox.py:127
-msgid "Check now"
-msgstr "Jetzt prüfen"
-
-#: ../src/view/home/HomeBox.py:261
-msgid "List view"
-msgstr "Listenansicht"
-
-#: ../src/view/home/HomeBox.py:262
-msgid "<Ctrl>2"
-msgstr "<Ctrl>2"
-
-#: ../src/view/home/HomeBox.py:320
-msgid "Favorites view"
-msgstr "Favoritenansicht"
-
-#: ../src/view/home/HomeBox.py:321
-msgid "<Ctrl>1"
-msgstr "<Ctrl>1"
-
-#: ../src/view/home/MeshBox.py:97
-msgid "Connect"
-msgstr "Verbinden"
-
-# (mschlager) war 'Nicht verbunden', ich würde aber eher erwarten, dass das die Beschriftung eines Menüeintrags ist, mit dem man eine Verbindung trennt, was dann in der Folge die Meldung 'Disconnecting...' liefert.
-#: ../src/view/home/MeshBox.py:106
-msgid "Disconnect"
-msgstr "Verbindung trennen"
-
-# 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 "Trenne Verbindung..."
-
-# 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:159
-msgid "Connecting..."
-msgstr "Verbinde..."
-
-# TODO: show the channel number
-#. TODO: show the channel number
-#: ../src/view/home/MeshBox.py:166
-msgid "Connected"
-msgstr "Verbunden"
-
-#: ../src/view/home/MeshBox.py:218 ../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 "Maschennetzwerk"
-
-# 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:221 ../src/view/devices/network/wireless.py:125
-#: ../src/view/devices/network/mesh.py:89
-msgid "Disconnect..."
-msgstr "Verbindung trennen..."
-
-#. TRANS: Action label for resuming an activity.
-#: ../src/view/home/MeshBox.py:309 ../src/view/palettes.py:61
-#: ../src/journal/journaltoolbox.py:399 ../src/journal/palettes.py:57
-msgid "Resume"
-msgstr "Wiederaufnehmen"
-
-#: ../src/view/home/MeshBox.py:314 ../src/view/frame/activitiestray.py:206
-msgid "Join"
-msgstr "Mitmachen"
-
-#: ../src/view/devices/battery.py:45
-msgid "My Battery"
-msgstr "Meine Batterie"
-
-#: ../src/view/devices/battery.py:114
-msgid "Charging"
-msgstr "Aufladen"
-
-#: ../src/view/devices/battery.py:117
-msgid "Very little power remaining"
-msgstr "Sehr wenig Ladung verbleibend"
-
-#: ../src/view/devices/battery.py:123
-#, python-format
-msgid "%(hour)d:%(min).2d remaining"
-msgstr "%(hour)d:%(min).2d verbleibend"
-
-#: ../src/view/devices/battery.py:127
-msgid "Charged"
-msgstr "Aufgeladen"
-
-#: ../src/view/devices/speaker.py:44
-msgid "My Speakers"
-msgstr "Meine Lautsprecher"
-
-#: ../src/view/devices/speaker.py:125
-msgid "Unmute"
-msgstr "Laut schalten"
-
-#: ../src/view/devices/speaker.py:128
-msgid "Mute"
-msgstr "Stumm schalten"
-
-#: ../src/view/devices/network/wireless.py:67
-msgid "Disconnected"
-msgstr "Nicht verbunden"
-
-#: ../src/view/devices/network/wireless.py:143
-msgid "Channel"
-msgstr "Kanal"
-
-#: ../src/view/frame/zoomtoolbar.py:37
-msgid "Neighborhood"
-msgstr "Umgebung"
-
-#: ../src/view/frame/zoomtoolbar.py:39
-msgid "Group"
-msgstr "Gruppe"
-
-# (Markus S.) war 'Zuhause', vgl. stuffer-sheet
-#: ../src/view/frame/zoomtoolbar.py:41
-msgid "Home"
-msgstr "Startbildschirm"
-
-#: ../src/view/frame/zoomtoolbar.py:43
-msgid "Activity"
-msgstr "Aktivität"
-
-#: ../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: WARNUNG, mehr als eine Option mit demselben Namen: %s "
-"und Modul: %r gefunden"
-
-#: ../src/controlpanel/cmd.py:28
-#, python-format
-msgid "sugar-control-panel: key=%s not an available option"
-msgstr "sugar-control-panel: key=%s ist keine verfügbare Option"
-
-#: ../src/controlpanel/cmd.py:29
-#, python-format
-msgid "sugar-control-panel: %s"
-msgstr "sugar-control-panel: %s"
-
-# (Markus S.) war 'Benutzung: sugar-control-panel [ option ] key [ args ... ] \n'; 'Parameter' war 'Key'.
-#. 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"
-" 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 ""
-"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 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:48
-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:121 ../src/view/home/favoritesview.py:305
-msgid "Ok"
-msgstr "Ok"
-
-#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:265
-msgid "Changes require restart"
-msgstr "Neustart zur Übernahme der Änderungen notwendig"
-
-#: ../src/controlpanel/gui.py:264
-msgid "Warning"
-msgstr "Warnung"
-
-#: ../src/controlpanel/gui.py:268
-msgid "Cancel changes"
-msgstr "Änderungen aufheben"
-
-#: ../src/controlpanel/gui.py:277
-msgid "Restart now"
-msgstr "Jetzt neustarten"
+#: ../extensions/cpsection/aboutme/__init__.py:24
+msgid "About Me"
+msgstr "Über mich"
-#: ../src/controlpanel/aboutme/model.py:44
+#: ../extensions/cpsection/aboutme/model.py:43
msgid "You must enter a name."
-msgstr "Bitte einen Namen eingeben"
+msgstr "Bitte einen Namen eingeben."
-#: ../src/controlpanel/aboutme/model.py:69
+#: ../extensions/cpsection/aboutme/model.py:68
#, python-format
msgid "stroke: color=%s hue=%s"
msgstr "Linie: Farbe=%s Farbton=%s"
-#: ../src/controlpanel/aboutme/model.py:72
+#: ../extensions/cpsection/aboutme/model.py:71
#, python-format
msgid "stroke: %s"
msgstr "Linie: %s"
-#: ../src/controlpanel/aboutme/model.py:74
+#: ../extensions/cpsection/aboutme/model.py:73
#, python-format
msgid "fill: color=%s hue=%s"
msgstr "Füllung: Farbe=%s Farbton=%s"
-#: ../src/controlpanel/aboutme/model.py:76
+#: ../extensions/cpsection/aboutme/model.py:75
#, python-format
msgid "fill: %s"
msgstr "Füllung: %s"
-#: ../src/controlpanel/aboutme/model.py:87
+#: ../extensions/cpsection/aboutme/model.py:86
msgid "Error in specified color modifiers."
msgstr "Fehler in den angegebenen Farbänderungen."
-#: ../src/controlpanel/aboutme/model.py:90
+#: ../extensions/cpsection/aboutme/model.py:89
msgid "Error in specified colors."
msgstr "Fehler in den angegebenen Farben."
-#: ../src/controlpanel/aboutme/view.py:32
-#: ../src/controlpanel/aboutme/__init__.py:22
-msgid "About Me"
-msgstr "Über mich"
+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
+msgid "Name:"
+msgstr "Name:"
-#: ../src/controlpanel/aboutme/view.py:134
+#: ../extensions/cpsection/aboutme/view.py:128
msgid "Click to change your color:"
msgstr "Klicken, um deine Farbe zu wechseln:"
-#: ../src/controlpanel/aboutxo/model.py:24
+#: ../extensions/cpsection/aboutcomputer/__init__.py:21
+msgid "About my Computer"
+msgstr "Über meinen Computer"
+
+#: ../extensions/cpsection/aboutcomputer/model.py:26
msgid "Not available"
msgstr "Nicht verfügbar"
-#: ../src/controlpanel/aboutxo/view.py:55
+#: ../extensions/cpsection/aboutcomputer/view.py:59
msgid "Identity"
msgstr "Identität"
-#: ../src/controlpanel/aboutxo/view.py:64
+#: ../extensions/cpsection/aboutcomputer/view.py:68
msgid "Serial Number:"
msgstr "Seriennummer:"
-#: ../src/controlpanel/aboutxo/view.py:87
+#: ../extensions/cpsection/aboutcomputer/view.py:90
msgid "Software"
msgstr "Software"
-#: ../src/controlpanel/aboutxo/view.py:96
+#: ../extensions/cpsection/aboutcomputer/view.py:99
msgid "Build:"
msgstr "Version:"
-#: ../src/controlpanel/aboutxo/view.py:111
+#: ../extensions/cpsection/aboutcomputer/view.py:114
msgid "Sugar:"
msgstr "Sugar:"
-#: ../src/controlpanel/aboutxo/view.py:126
+#: ../extensions/cpsection/aboutcomputer/view.py:130
msgid "Firmware:"
msgstr "Firmware:"
-#: ../src/controlpanel/aboutxo/view.py:148
+#: ../extensions/cpsection/aboutcomputer/view.py:145
+msgid "Wireless Firmware:"
+msgstr "WLAN-Firmware:"
+
+#: ../extensions/cpsection/aboutcomputer/view.py:168
msgid "Copyright and License"
msgstr "Copyright und Lizenz"
-#: ../src/controlpanel/aboutxo/view.py:156
+#: ../extensions/cpsection/aboutcomputer/view.py:176
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/aboutxo/view.py:163
+#: ../extensions/cpsection/aboutcomputer/view.py:183
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 "
@@ -430,395 +117,1014 @@ msgstr ""
"darin festgelegten Bedingungen ist es erlaubt, die Software zu verändern "
"und/oder Kopien davon zu erstellen und zu verteilen."
-#: ../src/controlpanel/aboutxo/view.py:175
+#: ../extensions/cpsection/aboutcomputer/view.py:195
msgid "Full license:"
msgstr "Vollständige Lizenz:"
-#: ../src/controlpanel/aboutxo/__init__.py:21
-msgid "About my XO"
-msgstr "Über meinen XO"
+#: ../extensions/cpsection/datetime/__init__.py:21
+msgid "Date & Time"
+msgstr "Datum & Uhrzeit"
-#: ../src/controlpanel/datetime/model.py:89
+#: ../extensions/cpsection/datetime/model.py:87
msgid "Error timezone does not exist."
msgstr "Fehler: unbekannte Zeitzone."
-#: ../src/controlpanel/datetime/view.py:68
+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:19
msgid "Timezone"
msgstr "Zeitzone"
-#: ../src/controlpanel/datetime/__init__.py:21
-msgid "Date & Time"
-msgstr "Datum & Uhrzeit"
+# (Markus S.) 'Rahmen'? (Vorschlag von hmeyer)
+#: ../extensions/cpsection/frame/__init__.py:21
+msgid "Frame"
+msgstr "Rahmen"
-#: ../src/controlpanel/frame/model.py:38 ../src/controlpanel/frame/model.py:60
+#: ../extensions/cpsection/frame/model.py:38
+#: ../extensions/cpsection/frame/model.py:60
msgid "Value must be an integer."
msgstr "Der Wert muss ganzzahlig sein."
-#: ../src/controlpanel/frame/view.py:26
+#: ../extensions/cpsection/frame/view.py:26
msgid "never"
msgstr "nie"
# (Markus S.) ' unmittelbar'?
-#: ../src/controlpanel/frame/view.py:27
+#: ../extensions/cpsection/frame/view.py:27
msgid "instantaneous"
msgstr "sofort"
-#: ../src/controlpanel/frame/view.py:28
+#: ../extensions/cpsection/frame/view.py:28
#, python-format
msgid "%s seconds"
msgstr "%s Sekunden"
-#: ../src/controlpanel/frame/view.py:52
+#: ../extensions/cpsection/frame/view.py:52
msgid "Activation Delay"
msgstr "Aktivierungsverzögerung"
-#: ../src/controlpanel/frame/view.py:76
+#: ../extensions/cpsection/frame/view.py:76
msgid "Corner"
msgstr "Ecke"
-#: ../src/controlpanel/frame/view.py:111
+#: ../extensions/cpsection/frame/view.py:111
msgid "Edge"
msgstr "Kante"
-# (Markus S.) 'Rahmen'? (Vorschlag von hmeyer)
-#: ../src/controlpanel/frame/__init__.py:21
-#, fuzzy
-msgid "Frame"
-msgstr "Frame"
+#: ../extensions/cpsection/language/__init__.py:21
+#: ../extensions/cpsection/language/view.py:32
+msgid "Language"
+msgstr "Sprache"
-#: ../src/controlpanel/language/model.py:28
+#: ../extensions/cpsection/language/model.py:28
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Zugriff auf %s nicht möglich. Erzeuge daher Standardeinstellungen."
-#: ../src/controlpanel/language/model.py:114
+#: ../extensions/cpsection/language/model.py:124
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "Sprache für Code=%s konnte nicht ermittelt werden."
-#: ../src/controlpanel/language/model.py:131
+#: ../extensions/cpsection/language/model.py:144
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Entschuldigung, ich spreche nicht '%s'."
-#: ../src/controlpanel/language/view.py:70
-#: ../src/controlpanel/language/__init__.py:21
-msgid "Language"
-msgstr "Sprache"
+#: ../extensions/cpsection/network/__init__.py:21
+#: ../extensions/cpsection/network/view.py:28
+msgid "Network"
+msgstr "Netzwerk"
-#: ../src/controlpanel/network/model.py:62
+#: ../extensions/cpsection/network/model.py:79
msgid "State is unknown."
msgstr "Status ist nicht bekannt."
# (Markus S.) vgl. http://lists.laptop.org/pipermail/localization/2008-July/001232.html
-#: ../src/controlpanel/network/model.py:82
+#: ../extensions/cpsection/network/model.py:105
msgid "Error in specified radio argument use on/off."
msgstr "Fehler im angegebenen radio-Parameter (Funknetz) -- on/off verwenden."
-#: ../src/controlpanel/network/view.py:28
-#: ../src/controlpanel/network/__init__.py:21
-msgid "Network"
-msgstr "Netzwerk"
+# (Markus S.) vgl. http://lists.laptop.org/pipermail/localization/2008-July/001232.html
+#: ../extensions/cpsection/network/model.py:137
+msgid "Error in specified argument use 0/1."
+msgstr "Fehler im angegebenen Parameter -- 0/1 verwenden."
-#: ../src/controlpanel/network/view.py:54
+#: ../extensions/cpsection/network/view.py:56
msgid "Wireless"
msgstr "Drahtlosnetzwerk"
-#: ../src/controlpanel/network/view.py:62
-msgid "Turn of the wireless radio to save battery life"
-msgstr "Schalte das Funknetz aus, um die Lebensdauer der Batterie zu erhöhen"
+#: ../extensions/cpsection/network/view.py:64
+msgid "Turn off the wireless radio to save battery life"
+msgstr "Schalte das Funknetz aus, um die Lebensdauer der Batterie zu erhöhen."
# (Markus S,) war 'Radio:'
-#: ../src/controlpanel/network/view.py:75
-#, fuzzy
+#: ../extensions/cpsection/network/view.py:77
msgid "Radio"
msgstr "Funknetz"
-#: ../src/controlpanel/network/view.py:91
+#: ../extensions/cpsection/network/view.py:93
msgid "Discard network history if you have trouble connecting to the network"
msgstr ""
"Verwirf die Netzwerk-Chronik, wenn du Schwierigkeiten hast, dich mit dem "
-"Netzwerk zu verbinden"
+"Netzwerk zu verbinden."
-#: ../src/controlpanel/network/view.py:100
+#: ../extensions/cpsection/network/view.py:102
msgid "Discard network history"
msgstr "Netzwerk-Chronik verwerfen"
-# (Markus S.) 'Zelle'?
-#: ../src/controlpanel/network/view.py:113
-msgid "Mesh"
-msgstr "Masche"
+#: ../extensions/cpsection/network/view.py:115
+msgid "Collaboration"
+msgstr "Zusammenarbeit"
+
+#: ../extensions/cpsection/network/view.py:123
+msgid ""
+"The server is the equivalent of what room you are in; people on the same "
+"server will be able to see each other, even when they aren't on the same "
+"network."
+msgstr ""
+"Der Server entspricht dem Raum, in dem du dich befindest; Personen am selben "
+"Server können einander sehen, selbst wenn sie sich nicht im selben Netzwerk "
+"befinden."
-#: ../src/controlpanel/network/view.py:122
+#: ../extensions/cpsection/network/view.py:133
msgid "Server:"
msgstr "Server:"
+#: ../extensions/cpsection/power/__init__.py:21
+msgid "Power"
+msgstr "Energieversorgung"
+
# (Markus S.) vgl. http://lists.laptop.org/pipermail/localization/2008-July/001232.html
-#: ../src/controlpanel/power/model.py:55
+#: ../extensions/cpsection/power/model.py:54
msgid "Error in automatic pm argument, use on/off."
msgstr ""
"Fehler im automatischen pm-Parameter (Energieverwaltung) --on/off verwenden."
# (Markus S.) vgl. http://lists.laptop.org/pipermail/localization/2008-July/001232.html
-#: ../src/controlpanel/power/model.py:84
+#: ../extensions/cpsection/power/model.py:81
msgid "Error in extreme pm argument, use on/off."
msgstr "Fehler im extremen pm-Parameter (Energieverwaltung) -- on/off benutzen."
-#: ../src/controlpanel/power/view.py:47
+#: ../extensions/cpsection/power/view.py:47
msgid "Power management"
msgstr "Energieverwaltung"
-#: ../src/controlpanel/power/view.py:57
+#: ../extensions/cpsection/power/view.py:57
msgid "Automatic power management (increases battery life)"
msgstr "Automatische Energieverwaltung (erhöht die Lebensdauer der Batterie)"
-#: ../src/controlpanel/power/view.py:85
+#: ../extensions/cpsection/power/view.py:85
msgid ""
"Extreme power management (disableswireless radio, increases battery life)"
msgstr ""
"Extreme Energieverwaltung (deaktiviert das Funknetz, erhöht die Lebensdauer "
"der Batterie)"
-#: ../src/controlpanel/power/__init__.py:21
-msgid "Power"
-msgstr "Energieversorgung"
+#: ../extensions/deviceicon/battery.py:58
+msgid "My Battery"
+msgstr "Meine Batterie"
-#: ../src/view/devices/network/mesh.py:111
-msgid "Connected to a School Mesh Portal"
-msgstr "Verbunden mit einem Schul-Maschennetzwerk-Portal"
+#: ../extensions/deviceicon/battery.py:137
+msgid "Removed"
+msgstr "Entfernt"
-#: ../src/view/devices/network/mesh.py:113
-msgid "Looking for a School Mesh Portal..."
-msgstr "Suche Schul-Maschennetzwerk-Portal..."
+#: ../extensions/deviceicon/battery.py:140
+msgid "Charging"
+msgstr "Aufladen"
+
+#: ../extensions/deviceicon/battery.py:143
+msgid "Very little power remaining"
+msgstr "Sehr wenig Ladung verbleibend"
-#: ../src/view/devices/network/mesh.py:116
-msgid "Connected to an XO Mesh Portal"
-msgstr "Verbunden mit einem XO-Maschennetzwerk-Portal"
+#: ../extensions/deviceicon/battery.py:149
+#, python-format
+msgid "%(hour)d:%(min).2d remaining"
+msgstr "%(hour)d:%(min).2d verbleibend"
-#: ../src/view/devices/network/mesh.py:118
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Suche XO-Maschennetzwerk-Portal..."
+#: ../extensions/deviceicon/battery.py:152
+msgid "Charged"
+msgstr "Aufgeladen"
-#: ../src/view/devices/network/mesh.py:121
-msgid "Connected to a Simple Mesh"
-msgstr "Verbunden mit einem einfachen Maschennetzwerk"
+#: ../extensions/deviceicon/network.py:40
+#, python-format
+msgid "IP address: %s"
+msgstr "IP-Addresse: %s"
-#: ../src/view/devices/network/mesh.py:123
-msgid "Starting a Simple Mesh"
-msgstr "Starte ein einfaches Maschennetzwerk"
+# 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
+#: ../extensions/deviceicon/network.py:104
+msgid "Disconnect..."
+msgstr "Verbindung trennen..."
-#: ../src/view/devices/network/mesh.py:130
-msgid "Unknown Mesh"
-msgstr "Unbekanntes Maschennetzwerk"
+# 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
+#: ../extensions/deviceicon/network.py:109
+#: ../src/jarabe/desktop/meshbox.py:248
+msgid "Connecting..."
+msgstr "Verbinde..."
-#: ../src/view/frame/activitiestray.py:211
-msgid "Decline"
-msgstr "Ablehnen"
+# TODO: show the channel number
+#: ../extensions/deviceicon/network.py:113
+#: ../extensions/deviceicon/network.py:166
+#: ../src/jarabe/desktop/meshbox.py:254
+msgid "Connected"
+msgstr "Verbunden"
+
+#: ../extensions/deviceicon/network.py:126
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../extensions/deviceicon/network.py:141
+msgid "Wired Network"
+msgstr "Kabelnetzwerk"
+
+# (Markus S.) War 'Geschwindigkeit'
+#: ../extensions/deviceicon/network.py:169
+msgid "Speed"
+msgstr "Übertragungsrate"
+
+#: ../extensions/deviceicon/speaker.py:59
+msgid "My Speakers"
+msgstr "Meine Lautsprecher"
+
+#: ../extensions/deviceicon/speaker.py:135
+msgid "Unmute"
+msgstr "Laut schalten"
+
+#: ../extensions/deviceicon/speaker.py:138
+msgid "Mute"
+msgstr "Stumm schalten"
+
+#: ../extensions/globalkey/screenshot.py:51
+msgid "Screenshot"
+msgstr "Bildschirmfoto"
+
+#: ../data/sugar.schemas.in.h:1
+msgid "Backup URL"
+msgstr "Backup-URL"
+
+#: ../data/sugar.schemas.in.h:2
+msgid ""
+"Color for the XO icon that is used throughout the desktop. The string is "
+"composed of the stroke color and fill color, format is that of rbg colors. "
+"Example: #AC32FF,#9A5200"
+msgstr ""
+"Farbe des XO-Symbols, das überall auf dem Desktop benutzt wird. Die "
+"Zeichenkette setzt sich aus der Linien- und der Füllfarbe zusammen, die "
+"jeweils als RGB-Farben angeben werden. Beispiel: #AC32FF,#9A5200"
+
+#: ../data/sugar.schemas.in.h:3
+msgid "Corner Delay"
+msgstr "Eckenverzögerung"
+
+#: ../data/sugar.schemas.in.h:4
+msgid "Delay for the activation of the frame using the corners."
+msgstr "Verzögerung bei der Aktivierung eines Rahmens über die Ecken."
+
+#: ../data/sugar.schemas.in.h:5
+msgid "Delay for the activation of the frame using the edges."
+msgstr "Verzögerung bei der Aktivierung eines Rahmens über die Ränder."
+
+#: ../data/sugar.schemas.in.h:6
+msgid "Edge Delay"
+msgstr "Randverzögerung"
+
+#: ../data/sugar.schemas.in.h:7
+msgid "Favorites Layout"
+msgstr "Favoriten-Layout"
+
+#: ../data/sugar.schemas.in.h:8
+msgid "Favorites resume mode"
+msgstr "Favoriten-Wiederaufnahemodus"
+
+#: ../data/sugar.schemas.in.h:9
+msgid ""
+"If TRUE, Sugar will make us searchable for the other users of the Jabber "
+"server."
+msgstr ""
+"Falls WAHR, wird Sugar es anderen Benutzern des Jabber-Servers ermöglichen, "
+"nach uns zu suchen."
+
+#: ../data/sugar.schemas.in.h:10
+msgid "Jabber Server"
+msgstr "Jabber-Server"
+
+#: ../data/sugar.schemas.in.h:11
+msgid "Layout of the favorites view."
+msgstr "Layout der Favoriten-Ansicht"
+
+#: ../data/sugar.schemas.in.h:12
+msgid "Power Automatic"
+msgstr "Automatische Energieverwaltung"
+
+#: ../data/sugar.schemas.in.h:13
+msgid "Power Automatic."
+msgstr "Automatische Energieverwaltung."
+
+# (Markus S.) war 'Extreme Energieverwaltung'
+#: ../data/sugar.schemas.in.h:14
+#, fuzzy
+msgid "Power Extreme"
+msgstr "Extremes Energiesparen"
+
+# (Markus S.) war 'Extreme Energieverwaltung'
+#: ../data/sugar.schemas.in.h:15
+#, fuzzy
+msgid "Power Extreme."
+msgstr "Extremes Energiesparen."
+
+#: ../data/sugar.schemas.in.h:16
+#, fuzzy
+msgid "Publish to Gadget"
+msgstr "Veröffentlichen auf Gerät"
+
+#: ../data/sugar.schemas.in.h:17
+msgid "Setting for muting the sound device."
+msgstr "Einstellung zum Stummschalten der Audio-Ausgabe"
+
+#: ../data/sugar.schemas.in.h:18
+msgid "Sound Muted"
+msgstr "Stummgeschaltet"
+
+#: ../data/sugar.schemas.in.h:20
+msgid "Timezone setting for the system."
+msgstr "Zeitzoneneinstellung des Systems"
+
+#: ../data/sugar.schemas.in.h:21
+msgid "Url of the jabber server to use."
+msgstr "URL des zu nutzenden Jabber-Servers."
+
+#: ../data/sugar.schemas.in.h:22
+msgid "Url where the backup is saved to."
+msgstr "URL, unter der das Backup gespeichert wird."
+
+#: ../data/sugar.schemas.in.h:23
+msgid "User Color"
+msgstr "Benutzerfarbe"
+
+#: ../data/sugar.schemas.in.h:24
+msgid "User Name"
+msgstr "Benutzername"
+
+#: ../data/sugar.schemas.in.h:25
+msgid "User name that is used throughout the desktop."
+msgstr "Benutzername, der überall auf dem Desktop benutzt wird."
+
+#: ../data/sugar.schemas.in.h:26
+msgid "Volume Level"
+msgstr "Lautstärke"
+
+#: ../data/sugar.schemas.in.h:27
+msgid "Volume level for the sound device."
+msgstr "Lautstärkepegel für die Audio-Ausgabe"
+
+#: ../data/sugar.schemas.in.h:28
+msgid ""
+"When in resume mode, clicking on a favorite icon will cause the last entry "
+"for that activity to be resumed."
+msgstr ""
+"Wenn im Wiederaufnahemodus, führt ein Anklicken des Favoriten-Symbols dazu, "
+"dass der letzte Eintrag für diese Aktivität wieder aufgenommen wird."
+
+#: ../src/jarabe/controlpanel/cmd.py:28
+#, python-format
+msgid ""
+"sugar-control-panel: WARNING, found more than one option with the same name: "
+"%s module: %r"
+msgstr ""
+"sugar-control-panel: WARNUNG, mehr als eine Option mit demselben "
+"Namengefunden: %s Modul: %r "
+
+#: ../src/jarabe/controlpanel/cmd.py:30
+#, python-format
+msgid "sugar-control-panel: key=%s not an available option"
+msgstr "sugar-control-panel: key=%s ist keine verfügbare Option"
+
+#: ../src/jarabe/controlpanel/cmd.py:31
+#, python-format
+msgid "sugar-control-panel: %s"
+msgstr "sugar-control-panel: %s"
+
+# (Markus S.) war 'Benutzung: sugar-control-panel [ option ] key [ args ... ] \n'; 'Parameter' war 'Key'.
+# TRANS: Translators, there's a empty line at the end of this string,
+# which must appear in the translated string (msgstr) as well.
+#. TRANS: Translators, there's a empty line at the end of this string,
+#. which must appear in the translated string (msgstr) as well.
+#: ../src/jarabe/controlpanel/cmd.py:37
+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 ""
+"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 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/jarabe/controlpanel/cmd.py:50
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr "Um die Änderungen zu übernehmen, muss Sugar neu gestartet werden.\n"
+
+#: ../src/jarabe/controlpanel/gui.py:275
+msgid "Warning"
+msgstr "Warnung"
+
+#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/sectionview.py:42
+msgid "Changes require restart"
+msgstr "Neustart zur Übernahme der Änderungen notwendig"
+
+#: ../src/jarabe/controlpanel/gui.py:279
+msgid "Cancel changes"
+msgstr "Änderungen aufheben"
+
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
+msgid "Later"
+msgstr "Später"
+
+#: ../src/jarabe/controlpanel/gui.py:288
+msgid "Restart now"
+msgstr "Jetzt neustarten"
+
+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
+msgid "Done"
+msgstr "Fertig"
+
+#: ../src/jarabe/controlpanel/toolbar.py:115
+#: ../src/jarabe/desktop/homebox.py:111
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../src/jarabe/controlpanel/toolbar.py:121
+#: ../src/jarabe/desktop/favoritesview.py:339
+msgid "Ok"
+msgstr "Ok"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:107
+#: ../src/jarabe/desktop/favoriteslayout.py:116
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/favoriteslayout.py:189
+#: ../src/jarabe/desktop/favoriteslayout.py:198
msgid "Ring"
msgstr "Ring"
+# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:334
+#: ../src/jarabe/desktop/favoriteslayout.py:334
msgid "Spiral"
msgstr "Spirale"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:401
+#: ../src/jarabe/desktop/favoriteslayout.py:401
msgid "Box"
msgstr "Rechteck"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:442
+#: ../src/jarabe/desktop/favoriteslayout.py:442
msgid "Triangle"
msgstr "Dreieck"
-#: ../src/view/home/favoritesview.py:295
+#: ../src/jarabe/desktop/favoritesview.py:330
msgid "Registration Failed"
msgstr "Registrierung fehlgeschlagen"
-#: ../src/view/home/favoritesview.py:296
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:298
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "Registration Successful"
msgstr "Registrierung erfolgreich"
-#: ../src/view/home/favoritesview.py:299
+#: ../src/jarabe/desktop/favoritesview.py:334
msgid "You are now registered with your school server."
msgstr "Du bist nun bei deinem Schulserver registriert."
-#: ../src/view/home/favoritesview.py:420
-msgid "Settings"
-msgstr "Einstellungen"
+#: ../src/jarabe/desktop/favoritesview.py:674
+msgid "Register"
+msgstr "Registrieren"
-#: ../src/view/home/favoritesview.py:425
-msgid "Restart"
-msgstr "Neustart"
+#: ../src/jarabe/desktop/homebox.py:67
+msgid "Confirm erase"
+msgstr "Löschen bestätigen"
-#: ../src/view/home/favoritesview.py:430
-msgid "Shutdown"
-msgstr "Ausschalten"
+#: ../src/jarabe/desktop/homebox.py:69
+#, 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/favoritesview.py:436
-msgid "Register"
-msgstr "Registrieren"
+# 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/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
+msgid "Keep"
+msgstr "Behalten"
-#: ../src/view/palettes.py:42
-msgid "Starting..."
-msgstr "Starte..."
+#: ../src/jarabe/desktop/homebox.py:76
+#: ../src/jarabe/journal/journaltoolbox.py:357
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
+msgid "Erase"
+msgstr "Löschen"
-#: ../src/view/palettes.py:72
-msgid "Stop"
-msgstr "Stopp"
+#: ../src/jarabe/desktop/homebox.py:106
+msgid "Software Update"
+msgstr "Software-Aktualisierung"
-#. TRANS: Action label for starting an entry.
-#: ../src/view/palettes.py:104 ../src/journal/journaltoolbox.py:402
-#: ../src/journal/palettes.py:59
-msgid "Start"
-msgstr "Start"
+#: ../src/jarabe/desktop/homebox.py:107
+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/palettes.py:138
-msgid "Remove favorite"
-msgstr "Favorit entfernen"
+#: ../src/jarabe/desktop/homebox.py:116
+msgid "Check now"
+msgstr "Jetzt prüfen"
-#: ../src/view/palettes.py:142
-msgid "Make favorite"
-msgstr "Zum Favorit machen"
+#: ../src/jarabe/desktop/homebox.py:233
+msgid "List view"
+msgstr "Listenansicht"
-#: ../src/view/palettes.py:191
-msgid "Show contents"
-msgstr "Inhalte anzeigen"
+#: ../src/jarabe/desktop/homebox.py:234
+msgid "<Ctrl>2"
+msgstr "<Ctrl>2"
+
+#: ../src/jarabe/desktop/homebox.py:296
+msgid "Favorites view"
+msgstr "Favoritenansicht"
-#: ../src/view/palettes.py:215
+#: ../src/jarabe/desktop/homebox.py:297
+msgid "<Ctrl>1"
+msgstr "<Ctrl>1"
+
+#: ../src/jarabe/desktop/keydialog.py:131
+msgid "Key Type:"
+msgstr "Schlüsseltyp:"
+
+#: ../src/jarabe/desktop/keydialog.py:151
+msgid "Authentication Type:"
+msgstr "Authentifizierungstyp:"
+
+#: ../src/jarabe/desktop/keydialog.py:215
+msgid "WPA & WPA2 Personal"
+msgstr "WPA & WPA2 Personal"
+
+#: ../src/jarabe/desktop/keydialog.py:224
+msgid "Wireless Security:"
+msgstr "WLAN-Sicherheit:"
+
+#: ../src/jarabe/desktop/meshbox.py:132
+msgid "Connect"
+msgstr "Verbinden"
+
+# (mschlager) war 'Nicht verbunden', ich würde aber eher erwarten, dass das die Beschriftung eines Menüeintrags ist, mit dem man eine Verbindung trennt, was dann in der Folge die Meldung 'Disconnecting...' liefert.
+#: ../src/jarabe/desktop/meshbox.py:136
+msgid "Disconnect"
+msgstr "Verbindung trennen"
+
+# TRANS: Action label for resuming an activity.
+#. TRANS: Action label for resuming an activity.
+#: ../src/jarabe/desktop/meshbox.py:442
+#: ../src/jarabe/frame/activitiestray.py:761
+#: ../src/jarabe/journal/journaltoolbox.py:425
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
+msgid "Resume"
+msgstr "Wiederaufnehmen"
+
+#: ../src/jarabe/desktop/meshbox.py:447
+#: ../src/jarabe/frame/activitiestray.py:235
+msgid "Join"
+msgstr "Mitmachen"
+
+#: ../src/jarabe/desktop/schoolserver.py:34
+msgid "Cannot obtain data needed for registration."
+msgstr "Notwendige Daten für die Registrierung sind nicht verfügbar."
+
+#: ../src/jarabe/desktop/schoolserver.py:51
+msgid "Cannot connect to the server."
+msgstr "Kann nicht mit dem Server verbinden."
+
+#: ../src/jarabe/desktop/schoolserver.py:56
+msgid "The server could not complete the request."
+msgstr "Der Server konnte die Anforderung nicht erfüllen."
+
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
+msgid "Decline"
+msgstr "Ablehnen"
+
+#: ../src/jarabe/frame/activitiestray.py:650
#, python-format
-msgid "%(free_space)d MB Free"
-msgstr "%(free_space)d MB frei"
+msgid "%dB"
+msgstr "%dB"
+
+#: ../src/jarabe/frame/activitiestray.py:652
+#, python-format
+msgid "%dKB"
+msgstr "%dKB"
+
+#: ../src/jarabe/frame/activitiestray.py:654
+#, python-format
+msgid "%dMB"
+msgstr "%dMB"
+
+#: ../src/jarabe/frame/activitiestray.py:671
+#, python-format
+msgid "%s of %s"
+msgstr "%s von %s"
+
+#: ../src/jarabe/frame/activitiestray.py:683
+#, python-format
+msgid "Transfer from %r"
+msgstr "Übertragung von %r"
+
+#: ../src/jarabe/frame/activitiestray.py:693
+msgid "Accept"
+msgstr "Akzeptieren"
-#: ../src/journal/journaltoolbox.py:62
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
+#, python-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr ""
+
+#: ../src/jarabe/frame/activitiestray.py:810
+#, python-format
+msgid "Transfer to %r"
+msgstr "Übertragung zu %r"
+
+#: ../src/jarabe/frame/clipboardmenu.py:52
+msgid "Remove"
+msgstr "Entfernen"
+
+#: ../src/jarabe/frame/clipboardmenu.py:57
+#: ../src/jarabe/frame/clipboardmenu.py:80
+msgid "Open"
+msgstr "Öffnen"
+
+#: ../src/jarabe/frame/clipboardmenu.py:85
+msgid "Open with"
+msgstr "Öffnen mit"
+
+# (Markus S.) 'clipping', nicht 'clipped'
+#: ../src/jarabe/frame/clipboardobject.py:49
+#, python-format
+msgid "%s clipping"
+msgstr "%s ausgeschnitten"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:36
+msgid "Neighborhood"
+msgstr "Umgebung"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:38
+msgid "Group"
+msgstr "Gruppe"
+
+# (Markus S.) war 'Zuhause', vgl. stuffer-sheet
+#: ../src/jarabe/frame/zoomtoolbar.py:40
+msgid "Home"
+msgstr "Startbildschirm"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Aktivität"
+
+#: ../src/jarabe/intro/window.py:124
+msgid "Click to change color:"
+msgstr "Klicken zum Wechseln der Farbe:"
+
+#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
+msgid "Back"
+msgstr "Zurück"
+
+# (Markus S.) war 'Nächste'
+#: ../src/jarabe/intro/window.py:191
+msgid "Next"
+msgstr "Vor"
+
+#: ../src/jarabe/journal/collapsedentry.py:258
+#: ../src/jarabe/journal/expandedentry.py:159
+#: ../src/jarabe/journal/palettes.py:66
+msgid "Untitled"
+msgstr "Ohne Titel"
+
+#: ../src/jarabe/journal/expandedentry.py:205
+msgid "No preview"
+msgstr "Keine Vorschau"
+
+#: ../src/jarabe/journal/expandedentry.py:224
+msgid "Participants:"
+msgstr "Teilnehmer:"
+
+#: ../src/jarabe/journal/expandedentry.py:247
+msgid "Description:"
+msgstr "Beschreibung:"
+
+#: ../src/jarabe/journal/expandedentry.py:273
+msgid "Tags:"
+msgstr "Stichwörter:"
+
+#: ../src/jarabe/journal/journalactivity.py:108
+#: ../src/jarabe/journal/volumestoolbar.py:47
+msgid "Journal"
+msgstr "Journal"
+
+#: ../src/jarabe/journal/journaltoolbox.py:65
msgid "Search"
msgstr "Suchen"
-#: ../src/journal/journaltoolbox.py:119
+#: ../src/jarabe/journal/journaltoolbox.py:124
msgid "Anytime"
msgstr "Beliebiges Datum"
-#: ../src/journal/journaltoolbox.py:121
+#: ../src/jarabe/journal/journaltoolbox.py:126
msgid "Today"
msgstr "Heute"
-#: ../src/journal/journaltoolbox.py:123
+#: ../src/jarabe/journal/journaltoolbox.py:128
msgid "Since yesterday"
msgstr "Seit gestern"
+# TRANS: Filter entries modified during the last 7 days.
#. TRANS: Filter entries modified during the last 7 days.
-#: ../src/journal/journaltoolbox.py:125
+#: ../src/jarabe/journal/journaltoolbox.py:130
msgid "Past week"
msgstr "Vergangene Woche"
+# TRANS: Filter entries modified during the last 30 days.
#. TRANS: Filter entries modified during the last 30 days.
-#: ../src/journal/journaltoolbox.py:127
+#: ../src/jarabe/journal/journaltoolbox.py:132
msgid "Past month"
msgstr "Vergangener Monat"
+# TRANS: Filter entries modified during the last 356 days.
#. TRANS: Filter entries modified during the last 356 days.
-#: ../src/journal/journaltoolbox.py:129
+#: ../src/jarabe/journal/journaltoolbox.py:134
msgid "Past year"
msgstr "Vergangenes Jahr"
-#: ../src/journal/journaltoolbox.py:136
+#: ../src/jarabe/journal/journaltoolbox.py:141
msgid "Anyone"
msgstr "Alle"
-#: ../src/journal/journaltoolbox.py:138
+#: ../src/jarabe/journal/journaltoolbox.py:143
msgid "My friends"
msgstr "Meine Freunde"
-#: ../src/journal/journaltoolbox.py:139
+#: ../src/jarabe/journal/journaltoolbox.py:144
msgid "My class"
msgstr "Meine Klasse"
+# TRANS: Item in a combo box that filters by entry type.
#. TRANS: Item in a combo box that filters by entry type.
-#: ../src/journal/journaltoolbox.py:255
+#: ../src/jarabe/journal/journaltoolbox.py:271
msgid "Anything"
msgstr "Alles"
-#. TODO: Add "Start with" menu item
-#: ../src/journal/journaltoolbox.py:325 ../src/journal/palettes.py:67
+# TODO: Add "Start with" menu item
+#: ../src/jarabe/journal/journaltoolbox.py:347
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Kopieren"
-#: ../src/journal/collapsedentry.py:248 ../src/journal/expandedentry.py:176
-#: ../src/journal/palettes.py:51
-msgid "Untitled"
-msgstr "Ohne Titel"
+# TRANS: Action label for starting an entry.
+#. TRANS: Action label for starting an entry.
+#: ../src/jarabe/journal/journaltoolbox.py:428
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
+msgid "Start"
+msgstr "Start"
-#: ../src/journal/journalactivity.py:119 ../src/journal/volumesmanager.py:57
-msgid "Journal"
-msgstr "Journal"
+#: ../src/jarabe/journal/listview.py:40
+msgid "Your Journal is empty"
+msgstr "Dein Journal ist leer."
-#: ../src/journal/expandedentry.py:222
-msgid "No preview"
-msgstr "Keine Vorschau"
+#: ../src/jarabe/journal/listview.py:41
+msgid "No matching entries "
+msgstr "Keine passenden Einträge"
-#: ../src/journal/expandedentry.py:241
-msgid "Participants:"
-msgstr "Teilnehmer:"
+#: ../src/jarabe/journal/listview.py:369
+msgid "Clear search"
+msgstr "Suchfeld leeren"
-#: ../src/journal/expandedentry.py:266
-msgid "Description:"
-msgstr "Beschreibung:"
+#: ../src/jarabe/journal/misc.py:93
+msgid "No date"
+msgstr "Kein Datum"
-#: ../src/journal/expandedentry.py:292
-msgid "Tags:"
-msgstr "Stichwörter:"
+#: ../src/jarabe/journal/modalalert.py:63
+msgid "Your Journal is full"
+msgstr "Dein Journal ist voll."
+
+#: ../src/jarabe/journal/modalalert.py:67
+msgid "Please delete some old Journal entries to make space for new ones."
+msgstr ""
+"Lösche bitte einige alte Journal-Einträge, um Platz für neue zu schaffen."
+
+#: ../src/jarabe/journal/modalalert.py:79
+msgid "Show Journal"
+msgstr "Journal anzeigen"
-#: ../src/journal/objectchooser.py:134
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Ein Objekt auswählen"
-#: ../src/journal/objectchooser.py:139
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
msgid "Close"
msgstr "Schließen"
-#: ../src/journal/volumestoolbar.py:93
+#: ../src/jarabe/journal/palettes.py:73
+msgid "Resume with"
+msgstr "Wiederaufnehmen mit"
+
+#: ../src/jarabe/journal/palettes.py:76
+msgid "Start with"
+msgstr "Beginnen mit"
+
+#: ../src/jarabe/journal/palettes.py:98
+msgid "Send to"
+msgstr "Senden an"
+
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Details betrachten"
+
+#: ../src/jarabe/journal/palettes.py:185
+msgid "No friends present"
+msgstr "Keine Freunde anwesend"
+
+#: ../src/jarabe/journal/palettes.py:190
+msgid "No valid connection found"
+msgstr "Keine gültige Verbindung gefunden"
+
+#: ../src/jarabe/journal/palettes.py:218
+msgid "No activity to resume entry"
+msgstr "Keine Aktivität, um den Eintrag wieder aufzunehmen"
+
+#: ../src/jarabe/journal/palettes.py:220
+msgid "No activity to start entry"
+msgstr "Keine Aktivität, um den Eintrag zu beginnen"
+
+#: ../src/jarabe/view/buddymenu.py:62
+msgid "Remove friend"
+msgstr "Freund entfernen"
+
+#: ../src/jarabe/view/buddymenu.py:65
+msgid "Make friend"
+msgstr "Freunde werden"
+
+#: ../src/jarabe/view/buddymenu.py:82
+msgid "My Settings"
+msgstr "Meine Einstellungen"
+
+#: ../src/jarabe/view/buddymenu.py:90
+msgid "Logout"
+msgstr "Abmelden"
+
+#: ../src/jarabe/view/buddymenu.py:95
+msgid "Restart"
+msgstr "Neustart"
+
+#: ../src/jarabe/view/buddymenu.py:100
+msgid "Shutdown"
+msgstr "Ausschalten"
+
+#: ../src/jarabe/view/buddymenu.py:135
+#, python-format
+msgid "Invite to %s"
+msgstr "Einladen zu %s"
+
+#: ../src/jarabe/view/palettes.py:47
+msgid "Starting..."
+msgstr "Starte..."
+
+#. TODO: share-with, keep
+#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Quelltext betrachten"
+
+#: ../src/jarabe/view/palettes.py:84
+msgid "Stop"
+msgstr "Beenden"
+
+#: ../src/jarabe/view/palettes.py:171
+msgid "Remove favorite"
+msgstr "Favorit entfernen"
+
+#: ../src/jarabe/view/palettes.py:175
+msgid "Make favorite"
+msgstr "Zum Favorit machen"
+
+#: ../src/jarabe/view/palettes.py:238
+msgid "Show contents"
+msgstr "Inhalte anzeigen"
+
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
+#, python-format
+msgid "%(free_space)d MB Free"
+msgstr "%(free_space)d MB frei"
+
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Einbindung lösen"
-#: ../src/journal/misc.py:95
-msgid "No date"
-msgstr "Kein Datum"
+#: ../src/jarabe/view/viewsource.py:208
+#, fuzzy
+msgid "Instance Source"
+msgstr "Quelltext der Instanz"
-#: ../src/journal/listview.py:39
-msgid "Your Journal is empty"
-msgstr "Dein Journal ist leer."
+#: ../src/jarabe/view/viewsource.py:233
+#, fuzzy
+msgid "Source"
+msgstr "Quelltext"
-#: ../src/journal/listview.py:40
-msgid "No matching entries "
-msgstr "Keine passenden Einträge"
+#: ../src/jarabe/view/viewsource.py:292
+#, fuzzy
+msgid "Activity Bundle Source"
+msgstr "Quelltext des Aktivitätenbündels"
-#: ../src/journal/modalalert.py:59
-msgid "Your Journal is full"
-msgstr "Dein Journal ist voll."
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+#, fuzzy, python-format
+msgid "View source: %r"
+msgstr "Quelltext betrachten: %r"
-#: ../src/journal/modalalert.py:63
-msgid "Please delete some old Journal entries to make space for new ones."
-msgstr ""
-"Lösche bitte einige alte Journal-Einträge, um Platz für neue zu schaffen."
+#~ msgid "Encryption Type:"
+#~ msgstr "Verschlüsselungstyp:"
-#: ../src/journal/modalalert.py:75
-msgid "Show Journal"
-msgstr "Journal anzeigen"
+# 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
+#~ msgid "Disconnecting..."
+#~ msgstr "Trenne Verbindung..."
+
+#~ msgid "Mesh Network"
+#~ msgstr "Maschennetzwerk"
+
+#~ msgid "Disconnected"
+#~ msgstr "Nicht verbunden"
+
+#~ msgid "About my XO"
+#~ msgstr "Über meinen XO"
+
+# (Markus S.) 'Zelle'?
+#~ msgid "Mesh"
+#~ msgstr "Masche"
+
+#~ msgid "Connected to a School Mesh Portal"
+#~ msgstr "Verbunden mit einem Schul-Maschennetzwerk-Portal"
+
+#~ msgid "Looking for a School Mesh Portal..."
+#~ msgstr "Suche Schul-Maschennetzwerk-Portal..."
+
+#~ msgid "Connected to an XO Mesh Portal"
+#~ msgstr "Verbunden mit einem XO-Maschennetzwerk-Portal"
+
+#~ msgid "Looking for an XO Mesh Portal..."
+#~ msgstr "Suche XO-Maschennetzwerk-Portal..."
+
+#~ msgid "Connected to a Simple Mesh"
+#~ msgstr "Verbunden mit einem einfachen Maschennetzwerk"
+
+#~ msgid "Starting a Simple Mesh"
+#~ msgstr "Starte ein einfaches Maschennetzwerk"
+
+#~ msgid "Unknown Mesh"
+#~ msgstr "Unbekanntes Maschennetzwerk"
+
+#~ msgid "Settings"
+#~ msgstr "Einstellungen"
#, python-format
#~ msgid "Clipboard object: %s."
@@ -1008,5 +1314,9 @@ msgstr "Journal anzeigen"
#~ msgid " and "
#~ msgstr " und "
+# 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
#~ msgid ", "
#~ msgstr ", "
diff --git a/po/es.po b/po/es.po
index 194f920..bf29f94 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: olpc-sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-25 00:30-0400\n"
-"PO-Revision-Date: 2008-11-03 03:40-0500\n"
-"Last-Translator: Sebastian Silva <sebastian@fuentelibre.org>\n"
+"POT-Creation-Date: 2009-02-21 00:30-0500\n"
+"PO-Revision-Date: 2009-03-22 13:19-0400\n"
+"Last-Translator: Maria del Pilar Saenz Rodriguez <mapisaro@gmail.com>\n"
"Language-Team: Fedora Spanish <fedora-trans-es@redhat.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,410 +18,98 @@ msgstr ""
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: .\n"
-#: ../src/intro/window.py:93 ../src/controlpanel/aboutme/view.py:100
-msgid "Name:"
-msgstr "Nombre:"
-
-#: ../src/intro/window.py:125
-msgid "Click to change color:"
-msgstr "Clic para cambiar de color:"
-
-#: ../src/intro/window.py:175 ../src/journal/detailview.py:119
-msgid "Back"
-msgstr "Atrás"
-
-#: ../src/intro/window.py:189 ../src/controlpanel/toolbar.py:61
-msgid "Done"
-msgstr "Hecho"
-
-#: ../src/intro/window.py:192
-msgid "Next"
-msgstr "Siguiente"
-
-# "Eliminate friend"??? That's a bit harsh. Wouldn't "quitar amigo" be a better choice?--
-#
-# agree but i preffer remover :). that verbe has the exact meaning we are looking on here.
-#: ../src/view/BuddyMenu.py:60
-msgid "Remove friend"
-msgstr "Remover amigo"
-
-#: ../src/view/BuddyMenu.py:63
-msgid "Make friend"
-msgstr "Agregar amigo"
-
-#: ../src/view/BuddyMenu.py:92
-#, python-format
-msgid "Invite to %s"
-msgstr "invitar a %s"
-
-#: ../src/view/clipboardmenu.py:51
-msgid "Remove"
-msgstr "Eliminar"
-
-#: ../src/view/clipboardmenu.py:56 ../src/view/clipboardmenu.py:78
-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)
-#: ../src/view/clipboardmenu.py:61 ../src/view/home/HomeBox.py:84
-msgid "Keep"
-msgstr "Guardar"
-
-#: ../src/view/clipboardmenu.py:83
-msgid "Open with"
-msgstr "Abrir con"
-
-#: ../src/view/clipboardmenu.py:228
-#, python-format
-msgid "%s clipping"
-msgstr ""
-
-# This is an encryption key type, not a keyboard key
-#: ../src/hardware/keydialog.py:150
-msgid "Key Type:"
-msgstr "Tipo de Clave:"
-
-#: ../src/hardware/keydialog.py:170
-msgid "Authentication Type:"
-msgstr "Tipo de Autenticación:"
-
-#: ../src/hardware/keydialog.py:251
-msgid "Encryption Type:"
-msgstr "Tipo de Encriptación:"
-
-#: ../src/hardware/schoolserver.py:17
-msgid "Cannot obtain data needed for registration."
-msgstr "No se puede obtener 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 el pedido."
-
-#: ../src/view/Shell.py:251
-msgid "Screenshot"
-msgstr "Captura de pantalla"
-
-#: ../src/view/home/HomeBox.py:78
-msgid "Confirm erase"
-msgstr "Confirmar borrado"
-
-#: ../src/view/home/HomeBox.py:80
-#, python-format
-msgid "Confirm erase: Do you want to permanently erase %s?"
-msgstr "Confirmar borrado:Quiere borrar permanentemente%s?"
-
-#: ../src/view/home/HomeBox.py:87 ../src/view/palettes.py:120
-#: ../src/journal/journaltoolbox.py:335 ../src/journal/palettes.py:75
-msgid "Erase"
-msgstr "Borrar"
-
-#: ../src/view/home/HomeBox.py:117
-msgid "Software Update"
-msgstr "Actualización de Software"
-
-#: ../src/view/home/HomeBox.py:118
-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:122 ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Cancelar"
-
-#: ../src/view/home/HomeBox.py:124 ../src/controlpanel/gui.py:273
-msgid "Later"
-msgstr "Después"
-
-#: ../src/view/home/HomeBox.py:127
-msgid "Check now"
-msgstr "Pruebe ahora"
-
-#: ../src/view/home/HomeBox.py:261
-msgid "List view"
-msgstr "Vista en lista"
-
-#: ../src/view/home/HomeBox.py:262
-#, fuzzy
-msgid "<Ctrl>2"
-msgstr "<Ctrl>L"
-
-#: ../src/view/home/HomeBox.py:320
-msgid "Favorites view"
-msgstr "Vista de Favoritos"
-
-#: ../src/view/home/HomeBox.py:321
-#, fuzzy
-msgid "<Ctrl>1"
-msgstr "<Ctrl>L"
-
-#: ../src/view/home/MeshBox.py:97
-msgid "Connect"
-msgstr "Conectar"
-
-#: ../src/view/home/MeshBox.py:106
-msgid "Disconnect"
-msgstr "Desconectar"
-
-# 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
-# DjToXiC: It's a good point, however, I think you should communicate that bug to the developers, because we only have to translate. ;-) In my opinion, the translation is perfect (I'm Uruguaian).
-#: ../src/view/home/MeshBox.py:118
-msgid "Disconnecting..."
-msgstr "Desconectando..."
-
-#: ../src/view/home/MeshBox.py:159
-msgid "Connecting..."
-msgstr "Conectando..."
-
-# TODO: show the channel number
-#. TODO: show the channel number
-#: ../src/view/home/MeshBox.py:166
-msgid "Connected"
-msgstr "Conectado"
-
-#: ../src/view/home/MeshBox.py:218 ../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 "Red Malla"
-
-# 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:221 ../src/view/devices/network/wireless.py:125
-#: ../src/view/devices/network/mesh.py:89
-msgid "Disconnect..."
-msgstr "Desconectando..."
-
-#. TRANS: Action label for resuming an activity.
-#: ../src/view/home/MeshBox.py:309 ../src/view/palettes.py:61
-#: ../src/journal/journaltoolbox.py:399 ../src/journal/palettes.py:57
-msgid "Resume"
-msgstr "Retomar"
-
-#: ../src/view/home/MeshBox.py:314 ../src/view/frame/activitiestray.py:206
-msgid "Join"
-msgstr "Unirse"
-
-#: ../src/view/devices/battery.py:45
-msgid "My Battery"
-msgstr "Mi batería"
-
-#: ../src/view/devices/battery.py:114
-msgid "Charging"
-msgstr "Cargando"
-
-#: ../src/view/devices/battery.py:117
-msgid "Very little power remaining"
-msgstr "Queda muy poca batería"
-
-#: ../src/view/devices/battery.py:123
-#, python-format
-msgid "%(hour)d:%(min).2d remaining"
-msgstr "Quedan %(hour)d:%(min).2d"
-
-#: ../src/view/devices/battery.py:127
-msgid "Charged"
-msgstr "Cargada"
-
-#: ../src/view/devices/speaker.py:44
-msgid "My Speakers"
-msgstr "Mis parlantes"
-
-# la traducción la tome del AlsaMixer de Gnome.
-#: ../src/view/devices/speaker.py:125
-#, fuzzy
-msgid "Unmute"
-msgstr "Dar voz"
-
-#: ../src/view/devices/speaker.py:128
-msgid "Mute"
-msgstr "Silenciar"
-
-#: ../src/view/devices/network/wireless.py:67
-msgid "Disconnected"
-msgstr "Desconectado"
-
-#: ../src/view/devices/network/wireless.py:143
-msgid "Channel"
-msgstr "Canal"
-
-#: ../src/view/frame/zoomtoolbar.py:37
-msgid "Neighborhood"
-msgstr "Vecindario"
-
-#: ../src/view/frame/zoomtoolbar.py:39
-msgid "Group"
-msgstr "Grupo"
-
-#: ../src/view/frame/zoomtoolbar.py:41
-msgid "Home"
-msgstr "Hogar"
-
-#: ../src/view/frame/zoomtoolbar.py:43
-msgid "Activity"
-msgstr "Actividad"
-
-#: ../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: ADVERTENCIA, hay más de una opción con el mismo nombre: "
-"%s módulo: %r"
-
-#: ../src/controlpanel/cmd.py:28
-#, python-format
-msgid "sugar-control-panel: key=%s not an available option"
-msgstr "sugar-control-panel: clave=%s no es una opción disponible"
-
-#: ../src/controlpanel/cmd.py:29
-#, python-format
-msgid "sugar-control-panel: %s"
-msgstr "sugar-control-panel: %s"
-
-#. 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
-#, fuzzy
-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 ""
-"Uso: sugar-control-panel [opción] clave [args ...] \n"
-" Control para el ambiente de sugar. \n"
-" Opciones: \n"
-" -h muestra este mensaje de ayuda y sale \n"
-" -l enumera todas las opciones disponibles \n"
-" -h clave muestra la información sobre esta clave \n"
-" -g clave obtiene el valor actual de la clave \n"
-" -s clave establece el valor actual para la clave \n"
-" "
-
-#: ../src/controlpanel/cmd.py:48
-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:121 ../src/view/home/favoritesview.py:305
-msgid "Ok"
-msgstr "Ok"
-
-#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:265
-msgid "Changes require restart"
-msgstr "Los cambios requieren reiniciar"
-
-#: ../src/controlpanel/gui.py:264
-msgid "Warning"
-msgstr "Advertencia"
-
-#: ../src/controlpanel/gui.py:268
-msgid "Cancel changes"
-msgstr "Cancelar cambios"
-
-#: ../src/controlpanel/gui.py:277
-msgid "Restart now"
-msgstr "Reiniciar ahora"
+#: ../extensions/cpsection/aboutme/__init__.py:24
+msgid "About Me"
+msgstr "Acerca de mí."
-#: ../src/controlpanel/aboutme/model.py:44
+#: ../extensions/cpsection/aboutme/model.py:43
msgid "You must enter a name."
msgstr "Debe ingresar un nombre."
-#: ../src/controlpanel/aboutme/model.py:69
+#: ../extensions/cpsection/aboutme/model.py:68
#, python-format
msgid "stroke: color=%s hue=%s"
msgstr "Borde: color=%s tonalidad=%s"
-#: ../src/controlpanel/aboutme/model.py:72
+#: ../extensions/cpsection/aboutme/model.py:71
#, python-format
msgid "stroke: %s"
msgstr "Borde: %s"
-#: ../src/controlpanel/aboutme/model.py:74
+#: ../extensions/cpsection/aboutme/model.py:73
#, python-format
msgid "fill: color=%s hue=%s"
msgstr "relleno: color=%s tonalidad=%s"
-#: ../src/controlpanel/aboutme/model.py:76
+#: ../extensions/cpsection/aboutme/model.py:75
#, python-format
msgid "fill: %s"
msgstr "relleno: %s"
-#: ../src/controlpanel/aboutme/model.py:87
+#: ../extensions/cpsection/aboutme/model.py:86
msgid "Error in specified color modifiers."
msgstr "Error en modificadores de color especificados."
-#: ../src/controlpanel/aboutme/model.py:90
+#: ../extensions/cpsection/aboutme/model.py:89
msgid "Error in specified colors."
msgstr "Error en colores especificados."
-#: ../src/controlpanel/aboutme/view.py:32
-#: ../src/controlpanel/aboutme/__init__.py:22
-msgid "About Me"
-msgstr "Acerca de mí."
+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
+msgid "Name:"
+msgstr "Nombre:"
-#: ../src/controlpanel/aboutme/view.py:134
+#: ../extensions/cpsection/aboutme/view.py:128
msgid "Click to change your color:"
msgstr "Clic para cambiar su color:"
-#: ../src/controlpanel/aboutxo/model.py:24
+#: ../extensions/cpsection/aboutcomputer/__init__.py:21
+msgid "About my Computer"
+msgstr "Acerca de mi computadora"
+
+#: ../extensions/cpsection/aboutcomputer/model.py:26
msgid "Not available"
msgstr "No disponible"
-#: ../src/controlpanel/aboutxo/view.py:55
+#: ../extensions/cpsection/aboutcomputer/view.py:59
msgid "Identity"
msgstr "Identidad"
-#: ../src/controlpanel/aboutxo/view.py:64
+#: ../extensions/cpsection/aboutcomputer/view.py:68
msgid "Serial Number:"
-msgstr "Número de Serie:"
+msgstr "Número de serie:"
-#: ../src/controlpanel/aboutxo/view.py:87
+#: ../extensions/cpsection/aboutcomputer/view.py:90
msgid "Software"
msgstr "Software"
# Por ahora..
-#: ../src/controlpanel/aboutxo/view.py:96
+#: ../extensions/cpsection/aboutcomputer/view.py:99
msgid "Build:"
msgstr "Ensamble:"
-#: ../src/controlpanel/aboutxo/view.py:111
+#: ../extensions/cpsection/aboutcomputer/view.py:114
msgid "Sugar:"
-msgstr "Azucar:"
+msgstr "Azúcar:"
-#: ../src/controlpanel/aboutxo/view.py:126
+#: ../extensions/cpsection/aboutcomputer/view.py:130
msgid "Firmware:"
msgstr "Firmware"
-#: ../src/controlpanel/aboutxo/view.py:148
+#: ../extensions/cpsection/aboutcomputer/view.py:145
+msgid "Wireless Firmware:"
+msgstr "Firmware Wireless:"
+
+#: ../extensions/cpsection/aboutcomputer/view.py:168
msgid "Copyright and License"
msgstr "Licencia y Copyright"
-#: ../src/controlpanel/aboutxo/view.py:156
+#: ../extensions/cpsection/aboutcomputer/view.py:176
msgid ""
"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
msgstr ""
"© 2008 One Laptop per Child Association Inc; Red Hat Inc; y Contribuyentes."
-#: ../src/controlpanel/aboutxo/view.py:163
+#: ../extensions/cpsection/aboutcomputer/view.py:183
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 "
@@ -433,391 +121,995 @@ msgstr ""
"esta invitado a cambiarla y/o distribuir copias bajo ciertas condiciones que "
"se describen en ella."
-#: ../src/controlpanel/aboutxo/view.py:175
+#: ../extensions/cpsection/aboutcomputer/view.py:195
msgid "Full license:"
-msgstr "Licencia Completa:"
+msgstr "Licencia completa:"
-#: ../src/controlpanel/aboutxo/__init__.py:21
-msgid "About my XO"
-msgstr "Acerca de mi XO"
+#: ../extensions/cpsection/datetime/__init__.py:21
+msgid "Date & Time"
+msgstr "Fecha y hora"
-#: ../src/controlpanel/datetime/model.py:89
+#: ../extensions/cpsection/datetime/model.py:87
msgid "Error timezone does not exist."
msgstr "Error, zona horaria no existe."
-#: ../src/controlpanel/datetime/view.py:68
+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:19
msgid "Timezone"
msgstr "Zona horaria"
-#: ../src/controlpanel/datetime/__init__.py:21
-msgid "Date & Time"
-msgstr "Fecha y Hora"
+#: ../extensions/cpsection/frame/__init__.py:21
+msgid "Frame"
+msgstr "Cuadro"
-#: ../src/controlpanel/frame/model.py:38 ../src/controlpanel/frame/model.py:60
+#: ../extensions/cpsection/frame/model.py:38
+#: ../extensions/cpsection/frame/model.py:60
msgid "Value must be an integer."
msgstr "El valor debe ser un número entero."
-#: ../src/controlpanel/frame/view.py:26
+#: ../extensions/cpsection/frame/view.py:26
msgid "never"
msgstr "nunca"
-#: ../src/controlpanel/frame/view.py:27
+#: ../extensions/cpsection/frame/view.py:27
msgid "instantaneous"
msgstr "instantáneo"
-#: ../src/controlpanel/frame/view.py:28
+#: ../extensions/cpsection/frame/view.py:28
#, python-format
msgid "%s seconds"
msgstr "%s segundos"
-#: ../src/controlpanel/frame/view.py:52
+#: ../extensions/cpsection/frame/view.py:52
msgid "Activation Delay"
msgstr "Retraso de activación"
-#: ../src/controlpanel/frame/view.py:76
+#: ../extensions/cpsection/frame/view.py:76
msgid "Corner"
msgstr "Esquina"
-#: ../src/controlpanel/frame/view.py:111
+#: ../extensions/cpsection/frame/view.py:111
msgid "Edge"
msgstr "Borde"
-#: ../src/controlpanel/frame/__init__.py:21
-msgid "Frame"
-msgstr "Cuadro"
+#: ../extensions/cpsection/language/__init__.py:21
+#: ../extensions/cpsection/language/view.py:32
+msgid "Language"
+msgstr "Idioma"
-#: ../src/controlpanel/language/model.py:28
+#: ../extensions/cpsection/language/model.py:28
msgid "Could not access ~/.i18n. Create standard settings."
msgstr ""
"No se puede acceder a ~/.i18n. Crear configuración internacional estándar."
-#: ../src/controlpanel/language/model.py:114
+#: ../extensions/cpsection/language/model.py:124
#, python-format
msgid "Language for code=%s could not be determined."
msgstr "El lenguaje del código=%s no pudo ser determinado."
-#: ../src/controlpanel/language/model.py:131
+#: ../extensions/cpsection/language/model.py:144
#, python-format
msgid "Sorry I do not speak '%s'."
-msgstr "Lo siento yo no hablo '%s'."
+msgstr "Lo siento, yo no hablo '%s'."
-#: ../src/controlpanel/language/view.py:70
-#: ../src/controlpanel/language/__init__.py:21
-msgid "Language"
-msgstr "Idioma"
+#: ../extensions/cpsection/network/__init__.py:21
+#: ../extensions/cpsection/network/view.py:28
+msgid "Network"
+msgstr "Red"
-#: ../src/controlpanel/network/model.py:62
+#: ../extensions/cpsection/network/model.py:79
msgid "State is unknown."
msgstr "Estado desconocido."
-#: ../src/controlpanel/network/model.py:82
+#: ../extensions/cpsection/network/model.py:105
msgid "Error in specified radio argument use on/off."
msgstr "Error en argumento especificado de radio use on/off."
-#: ../src/controlpanel/network/view.py:28
-#: ../src/controlpanel/network/__init__.py:21
-msgid "Network"
-msgstr "Red"
+#: ../extensions/cpsection/network/model.py:137
+msgid "Error in specified argument use 0/1."
+msgstr "Error en argumento especificado use 0/1."
-#: ../src/controlpanel/network/view.py:54
+#: ../extensions/cpsection/network/view.py:56
msgid "Wireless"
msgstr "Inalámbrica"
-#: ../src/controlpanel/network/view.py:62
-msgid "Turn of the wireless radio to save battery life"
-msgstr "Apague el radio de la inalámbrica y ahorre vida de batería."
+#: ../extensions/cpsection/network/view.py:64
+msgid "Turn off the wireless radio to save battery life"
+msgstr "Apague la radio inalámbrica y ahorre vida de batería."
-#: ../src/controlpanel/network/view.py:75
-#, fuzzy
+#: ../extensions/cpsection/network/view.py:77
msgid "Radio"
-msgstr "Radio:"
+msgstr "Radio"
-#: ../src/controlpanel/network/view.py:91
-#, fuzzy
+#: ../extensions/cpsection/network/view.py:93
msgid "Discard network history if you have trouble connecting to the network"
-msgstr "Descarte la historia de la red si tiene problemas de conexión "
+msgstr "Descarte el historial de la red si tiene problemas de conexión "
-#: ../src/controlpanel/network/view.py:100
+#: ../extensions/cpsection/network/view.py:102
msgid "Discard network history"
msgstr "Descarte historial de la red."
-#: ../src/controlpanel/network/view.py:113
-msgid "Mesh"
-msgstr "Malla"
+#: ../extensions/cpsection/network/view.py:115
+msgid "Collaboration"
+msgstr "Colaboración"
+
+#: ../extensions/cpsection/network/view.py:123
+msgid ""
+"The server is the equivalent of what room you are in; people on the same "
+"server will be able to see each other, even when they aren't on the same "
+"network."
+msgstr ""
+"El servidor es equivalente al cuarto en el cual se esta; la gente en el "
+"mismo servidor podrá verse entre ellos, aun cuando no esten en la misma red."
-#: ../src/controlpanel/network/view.py:122
+#: ../extensions/cpsection/network/view.py:133
msgid "Server:"
msgstr "Servidor:"
-#: ../src/controlpanel/power/model.py:55
+#: ../extensions/cpsection/power/__init__.py:21
+msgid "Power"
+msgstr "Energía "
+
+#: ../extensions/cpsection/power/model.py:54
msgid "Error in automatic pm argument, use on/off."
-msgstr "Error en argumento automatico de pm, use on/off "
+msgstr "Error en argumento automático de pm, use on/off."
-#: ../src/controlpanel/power/model.py:84
+#: ../extensions/cpsection/power/model.py:81
msgid "Error in extreme pm argument, use on/off."
msgstr "Error en argumento extremo de pm, use on/off"
-#: ../src/controlpanel/power/view.py:47
+#: ../extensions/cpsection/power/view.py:47
msgid "Power management"
msgstr "Manejo de energía"
-#: ../src/controlpanel/power/view.py:57
+#: ../extensions/cpsection/power/view.py:57
msgid "Automatic power management (increases battery life)"
-msgstr "Manejo automático de Energía (incrementa la vida de la batería)"
+msgstr "Manejo automático de energía (incrementa la vida de la batería)"
-#: ../src/controlpanel/power/view.py:85
-#, fuzzy
+# best translationfor now
+#: ../extensions/cpsection/power/view.py:85
msgid ""
"Extreme power management (disableswireless radio, increases battery life)"
msgstr ""
"Manejo extremo de energía (deshabilita el radio wireless, incrementa la vida "
"de la batería)"
-#: ../src/controlpanel/power/__init__.py:21
-msgid "Power"
-msgstr "Energía "
+#: ../extensions/deviceicon/battery.py:56
+msgid "My Battery"
+msgstr "Mi batería"
-#: ../src/view/devices/network/mesh.py:111
-msgid "Connected to a School Mesh Portal"
-msgstr "Conectado a un enlace escolar de red malla"
+#: ../extensions/deviceicon/battery.py:137
+msgid "Removed"
+msgstr "Eliminado"
-# "portal malla de colegio", en Castellano de España suena fatal... ¿Realmente se quiere decir malla?
-#: ../src/view/devices/network/mesh.py:113
-msgid "Looking for a School Mesh Portal..."
-msgstr "Buscando un enlace escolar de red malla..."
+#: ../extensions/deviceicon/battery.py:140
+msgid "Charging"
+msgstr "Cargando"
-#: ../src/view/devices/network/mesh.py:116
-msgid "Connected to an XO Mesh Portal"
-msgstr "Conectado a un Portal Malla XO"
+#: ../extensions/deviceicon/battery.py:143
+msgid "Very little power remaining"
+msgstr "Queda muy poca batería"
-#: ../src/view/devices/network/mesh.py:118
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Buscando un Portal Malla XO..."
+#: ../extensions/deviceicon/battery.py:149
+#, python-format
+msgid "%(hour)d:%(min).2d remaining"
+msgstr "Quedan %(hour)d:%(min).2d"
-#: ../src/view/devices/network/mesh.py:121
-msgid "Connected to a Simple Mesh"
-msgstr "Conectado a una Red Malla Simple"
+#: ../extensions/deviceicon/battery.py:152
+msgid "Charged"
+msgstr "Cargada"
-#: ../src/view/devices/network/mesh.py:123
-msgid "Starting a Simple Mesh"
-msgstr "Empezando una Red Malla Simple"
+#: ../extensions/deviceicon/network.py:40
+#, python-format
+msgid "IP address: %s"
+msgstr "Direccion IP: %s"
-#: ../src/view/devices/network/mesh.py:130
-msgid "Unknown Mesh"
-msgstr "Red Malla Desconocida"
+# 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
+#: ../extensions/deviceicon/network.py:104
+msgid "Disconnect..."
+msgstr "Desconectando..."
-#: ../src/view/frame/activitiestray.py:211
-msgid "Decline"
-msgstr "Rechazar"
+#: ../extensions/deviceicon/network.py:109
+#: ../src/jarabe/desktop/meshbox.py:247
+msgid "Connecting..."
+msgstr "Conectando..."
+
+# TODO: show the channel number
+#: ../extensions/deviceicon/network.py:113
+#: ../extensions/deviceicon/network.py:166
+#: ../src/jarabe/desktop/meshbox.py:253
+msgid "Connected"
+msgstr "Conectado"
+
+#: ../extensions/deviceicon/network.py:126
+msgid "Channel"
+msgstr "Canal"
+
+#: ../extensions/deviceicon/network.py:141
+msgid "Wired Network"
+msgstr "red cableada"
+
+#: ../extensions/deviceicon/network.py:169
+msgid "Speed"
+msgstr "Velocidad"
+
+#: ../extensions/deviceicon/speaker.py:46
+msgid "My Speakers"
+msgstr "Mis parlantes"
+
+# la traducción la tome del AlsaMixer de Gnome.
+#: ../extensions/deviceicon/speaker.py:128
+msgid "Unmute"
+msgstr "Dar voz"
+
+#: ../extensions/deviceicon/speaker.py:131
+msgid "Mute"
+msgstr "Silenciar"
+
+#: ../extensions/globalkey/screenshot.py:50
+msgid "Screenshot"
+msgstr "Captura de pantalla"
+
+#: ../data/sugar.schemas.in.h:1
+msgid "Backup URL"
+msgstr "URL de Respaldo"
+
+#: ../data/sugar.schemas.in.h:2
+msgid ""
+"Color for the XO icon that is used throughout the desktop. The string is "
+"composed of the stroke color and fill color, format is that of rbg colors. "
+"Example: #AC32FF,#9A5200"
+msgstr ""
+"El color para el ícono del XO se utiliza en todo el escritorio. La cadena "
+"está compuesta por el trazo y color de relleno de color, el formato es el de "
+"colores RBG. Ejemplo: AC32FF #, # 9A5200"
+
+# es la mejor traduccion ?
+#: ../data/sugar.schemas.in.h:3
+msgid "Corner Delay"
+msgstr "Retraso de las Esquinas"
+
+#: ../data/sugar.schemas.in.h:4
+msgid "Delay for the activation of the frame using the corners."
+msgstr "Retraso para la activación del cuadro utilizando las esquinas."
+
+#: ../data/sugar.schemas.in.h:5
+msgid "Delay for the activation of the frame using the edges."
+msgstr "Retraso para la activación del cuadro utilizando los bordes"
+
+# es la mejor traduccion ?
+#: ../data/sugar.schemas.in.h:6
+msgid "Edge Delay"
+msgstr "Retraso del Borde"
+
+#: ../data/sugar.schemas.in.h:7
+msgid "Favorites Layout"
+msgstr "Diseño de favoritos"
+
+#: ../data/sugar.schemas.in.h:8
+msgid "Favorites resume mode"
+msgstr "Modo de reanudar favoritos"
+
+#: ../data/sugar.schemas.in.h:9
+msgid ""
+"If TRUE, Sugar will make us searchable for the other users of the Jabber "
+"server."
+msgstr ""
+"Si es TRUE, Azúcar habilitará que otros usuarios nos busquen en el servidor "
+"Jabber."
+
+#: ../data/sugar.schemas.in.h:10
+msgid "Jabber Server"
+msgstr "Servidor Jabber."
+
+#: ../data/sugar.schemas.in.h:11
+msgid "Layout of the favorites view."
+msgstr "Distribución de las actividades favoritas"
+
+#: ../data/sugar.schemas.in.h:12
+msgid "Power Automatic"
+msgstr "Manejo automática de energía"
+
+#: ../data/sugar.schemas.in.h:13
+msgid "Power Automatic."
+msgstr "Manejo automática de energía."
+
+#: ../data/sugar.schemas.in.h:14
+msgid "Power Extreme"
+msgstr "Manejo extremo de energía"
+
+#: ../data/sugar.schemas.in.h:15
+msgid "Power Extreme."
+msgstr "Manejo extremo de energía."
+
+#: ../data/sugar.schemas.in.h:16
+msgid "Publish to Gadget"
+msgstr "Publicar en Gadget"
+
+#: ../data/sugar.schemas.in.h:17
+msgid "Setting for muting the sound device."
+msgstr "Configuración para silenciar el dispositivo de sonido"
+
+#: ../data/sugar.schemas.in.h:18
+msgid "Sound Muted"
+msgstr "Sonido silenciado"
+
+#: ../data/sugar.schemas.in.h:20
+msgid "Timezone setting for the system."
+msgstr "Configuración de zona horaria para el sistema."
+
+#: ../data/sugar.schemas.in.h:21
+msgid "Url of the jabber server to use."
+msgstr "URL del servidor de Jabber para usar."
+
+#: ../data/sugar.schemas.in.h:22
+msgid "Url where the backup is saved to."
+msgstr "URL donde se guarda el backup."
+
+#: ../data/sugar.schemas.in.h:23
+msgid "User Color"
+msgstr "Color del usuario"
+
+#: ../data/sugar.schemas.in.h:24
+msgid "User Name"
+msgstr "Nombre de usuario"
+
+#: ../data/sugar.schemas.in.h:25
+msgid "User name that is used throughout the desktop."
+msgstr "Nombre de usuario que se utiliza en todo el escritorio."
+
+#: ../data/sugar.schemas.in.h:26
+msgid "Volume Level"
+msgstr "Nivel de volumen"
+
+#: ../data/sugar.schemas.in.h:27
+msgid "Volume level for the sound device."
+msgstr "Nivel de volumen para el dispositivo de sonido"
+
+#: ../data/sugar.schemas.in.h:28
+msgid ""
+"When in resume mode, clicking on a favorite icon will cause the last entry "
+"for that activity to be resumed."
+msgstr ""
+"Cuando en el modo de retomar, al hacer clic en un icono de favoritos causa "
+"que se retome la última entrada de esa actividad."
+
+#: ../src/jarabe/controlpanel/cmd.py:28
+#, python-format
+msgid ""
+"sugar-control-panel: WARNING, found more than one option with the same name: "
+"%s module: %r"
+msgstr ""
+"sugar-control-panel: ADVERTENCIA, hay más de una opción con el mismo nombre: "
+"%s módulo: %r"
+
+#: ../src/jarabe/controlpanel/cmd.py:30
+#, python-format
+msgid "sugar-control-panel: key=%s not an available option"
+msgstr "sugar-control-panel: clave=%s no es una opción disponible"
+
+#: ../src/jarabe/controlpanel/cmd.py:31
+#, python-format
+msgid "sugar-control-panel: %s"
+msgstr "sugar-control-panel: %s"
+
+# TRANS: Translators, there's a empty line at the end of this string,
+# which must appear in the translated string (msgstr) as well.
+#. TRANS: Translators, there's a empty line at the end of this string,
+#. which must appear in the translated string (msgstr) as well.
+#: ../src/jarabe/controlpanel/cmd.py:37
+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 ""
+"Uso: sugar-control-panel [opción] clave [args ...] \n"
+" Control para el ambiente de sugar. \n"
+" Opciones: \n"
+" -h muestra este mensaje de ayuda y sale \n"
+" -l enumera todas las opciones disponibles \n"
+" -h clave muestra la información sobre esta clave \n"
+" -g clave obtiene el valor actual de la clave \n"
+" -s clave establece el valor actual para la clave \n"
+" "
+
+#: ../src/jarabe/controlpanel/cmd.py:50
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr "Para aplicar sus cambios tiene que reiniciar sugar.\n"
+
+#: ../src/jarabe/controlpanel/gui.py:275
+msgid "Warning"
+msgstr "Advertencia"
+
+#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/sectionview.py:42
+msgid "Changes require restart"
+msgstr "Los cambios requieren reiniciar"
+
+#: ../src/jarabe/controlpanel/gui.py:279
+msgid "Cancel changes"
+msgstr "Cancelar cambios"
+
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
+msgid "Later"
+msgstr "Después"
+
+#: ../src/jarabe/controlpanel/gui.py:288
+msgid "Restart now"
+msgstr "Reiniciar ahora"
+
+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
+msgid "Done"
+msgstr "Hecho"
+
+#: ../src/jarabe/controlpanel/toolbar.py:115
+#: ../src/jarabe/desktop/homebox.py:111
+#: ../src/jarabe/frame/activitiestray.py:687
+#: ../src/jarabe/frame/activitiestray.py:766
+#: ../src/jarabe/frame/activitiestray.py:794
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/jarabe/controlpanel/toolbar.py:121
+#: ../src/jarabe/desktop/favoritesview.py:338
+msgid "Ok"
+msgstr "Ok"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:107
+#: ../src/jarabe/desktop/favoriteslayout.py:114
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/favoriteslayout.py:189
+#: ../src/jarabe/desktop/favoriteslayout.py:196
msgid "Ring"
msgstr "Anillo"
+# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:334
+#: ../src/jarabe/desktop/favoriteslayout.py:332
msgid "Spiral"
msgstr "Espiral"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:401
+#: ../src/jarabe/desktop/favoriteslayout.py:399
msgid "Box"
msgstr "Caja"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:442
+#: ../src/jarabe/desktop/favoriteslayout.py:440
msgid "Triangle"
msgstr "Triángulo"
-#: ../src/view/home/favoritesview.py:295
+#: ../src/jarabe/desktop/favoritesview.py:329
msgid "Registration Failed"
-msgstr "Registro Fallido"
+msgstr "Registro fallido"
-#: ../src/view/home/favoritesview.py:296
+#: ../src/jarabe/desktop/favoritesview.py:330
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:298
+#: ../src/jarabe/desktop/favoritesview.py:332
msgid "Registration Successful"
-msgstr "Registro Exitoso"
+msgstr "Registro exitoso"
-#: ../src/view/home/favoritesview.py:299
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "You are now registered with your school server."
-msgstr "Ahora estas registrado en el servidor de colegio"
+msgstr "Ahora estás registrado en el servidor de colegio"
-#: ../src/view/home/favoritesview.py:420
-#, fuzzy
-msgid "Settings"
-msgstr "Configuración "
+#: ../src/jarabe/desktop/favoritesview.py:668
+msgid "Register"
+msgstr "Registro"
-#: ../src/view/home/favoritesview.py:425
-msgid "Restart"
-msgstr "Reiniciar"
+#: ../src/jarabe/desktop/homebox.py:67
+msgid "Confirm erase"
+msgstr "Confirmar borrado"
-#: ../src/view/home/favoritesview.py:430
-msgid "Shutdown"
-msgstr "Apagar"
+#: ../src/jarabe/desktop/homebox.py:69
+#, python-format
+msgid "Confirm erase: Do you want to permanently erase %s?"
+msgstr "Confirmar el borrado: ¿Quiere borrar %s de forma permanente?"
-#: ../src/view/home/favoritesview.py:436
-msgid "Register"
-msgstr "Registro"
+# 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/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
+msgid "Keep"
+msgstr "Guardar"
-#: ../src/view/palettes.py:42
-msgid "Starting..."
-msgstr "Iniciando..."
+#: ../src/jarabe/desktop/homebox.py:76
+#: ../src/jarabe/journal/journaltoolbox.py:357
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
+msgid "Erase"
+msgstr "Borrar"
-#: ../src/view/palettes.py:72
-msgid "Stop"
-msgstr "Parar"
+#: ../src/jarabe/desktop/homebox.py:106
+msgid "Software Update"
+msgstr "Actualización de Software"
-#. TRANS: Action label for starting an entry.
-#: ../src/view/palettes.py:104 ../src/journal/journaltoolbox.py:402
-#: ../src/journal/palettes.py:59
-msgid "Start"
-msgstr "Iniciar"
+#: ../src/jarabe/desktop/homebox.py:107
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Actualice sus actividades para asegurar compatibilidad con su nuevo software"
-#: ../src/view/palettes.py:138
-msgid "Remove favorite"
-msgstr "Remover favorito"
+#: ../src/jarabe/desktop/homebox.py:116
+msgid "Check now"
+msgstr "Pruebe ahora"
-#: ../src/view/palettes.py:142
-msgid "Make favorite"
-msgstr "Hacer favorito"
+#: ../src/jarabe/desktop/homebox.py:233
+msgid "List view"
+msgstr "Vista en lista"
-#: ../src/view/palettes.py:191
-msgid "Show contents"
-msgstr "Mostrar contenidos"
+#: ../src/jarabe/desktop/homebox.py:234
+msgid "<Ctrl>2"
+msgstr "<Ctrl>2"
+
+#: ../src/jarabe/desktop/homebox.py:296
+msgid "Favorites view"
+msgstr "Vista de favoritos"
+
+#: ../src/jarabe/desktop/homebox.py:297
+msgid "<Ctrl>1"
+msgstr "<Ctrl>1"
-#: ../src/view/palettes.py:215
+# This is an encryption key type, not a keyboard key
+#: ../src/jarabe/desktop/keydialog.py:131
+msgid "Key Type:"
+msgstr "Tipo de clave:"
+
+#: ../src/jarabe/desktop/keydialog.py:151
+msgid "Authentication Type:"
+msgstr "Tipo de autenticación:"
+
+#: ../src/jarabe/desktop/keydialog.py:215
+msgid "WPA & WPA2 Personal"
+msgstr "WPA y WPA2 Personal"
+
+#: ../src/jarabe/desktop/keydialog.py:224
+msgid "Wireless Security:"
+msgstr "Seguridad inalámbrica:"
+
+#: ../src/jarabe/desktop/meshbox.py:131
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../src/jarabe/desktop/meshbox.py:135
+msgid "Disconnect"
+msgstr "Desconectar"
+
+# TRANS: Action label for resuming an activity.
+#. TRANS: Action label for resuming an activity.
+#: ../src/jarabe/desktop/meshbox.py:441
+#: ../src/jarabe/frame/activitiestray.py:711
+#: ../src/jarabe/journal/journaltoolbox.py:425
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
+msgid "Resume"
+msgstr "Retomar"
+
+#: ../src/jarabe/desktop/meshbox.py:446
+#: ../src/jarabe/frame/activitiestray.py:227
+msgid "Join"
+msgstr "Unirse"
+
+#: ../src/jarabe/desktop/schoolserver.py:34
+msgid "Cannot obtain data needed for registration."
+msgstr "No se puede obtener datos necesarios para el registro"
+
+#: ../src/jarabe/desktop/schoolserver.py:51
+msgid "Cannot connect to the server."
+msgstr "No se puede conectar al servidor."
+
+#: ../src/jarabe/desktop/schoolserver.py:56
+msgid "The server could not complete the request."
+msgstr "El servidor no pudo completar el pedido."
+
+#: ../src/jarabe/frame/activitiestray.py:232
+#: ../src/jarabe/frame/activitiestray.py:659
+msgid "Decline"
+msgstr "Rechazar"
+
+#: ../src/jarabe/frame/activitiestray.py:612
#, python-format
-msgid "%(free_space)d MB Free"
-msgstr "%(free_space)d MB libres"
+msgid "%dB"
+msgstr "%dB"
+
+#: ../src/jarabe/frame/activitiestray.py:614
+#, python-format
+msgid "%dKB"
+msgstr "%dKB"
+
+#: ../src/jarabe/frame/activitiestray.py:616
+#, python-format
+msgid "%dMB"
+msgstr "%dMB"
+
+#: ../src/jarabe/frame/activitiestray.py:633
+#, python-format
+msgid "%s of %s"
+msgstr "%s de %s"
+
+#: ../src/jarabe/frame/activitiestray.py:644
+#, python-format
+msgid "Transfer from %r"
+msgstr "Transferencia desde %r"
-#: ../src/journal/journaltoolbox.py:62
+#: ../src/jarabe/frame/activitiestray.py:654
+msgid "Accept"
+msgstr "Aceptar"
+
+#: ../src/jarabe/frame/activitiestray.py:677
+#: ../src/jarabe/frame/activitiestray.py:784
+#, python-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: ../src/jarabe/frame/activitiestray.py:755
+#, python-format
+msgid "Transfer to %r"
+msgstr "Transferencia a %r"
+
+#: ../src/jarabe/frame/clipboardmenu.py:52
+msgid "Remove"
+msgstr "Eliminar"
+
+#: ../src/jarabe/frame/clipboardmenu.py:57
+#: ../src/jarabe/frame/clipboardmenu.py:80
+msgid "Open"
+msgstr "Abrir"
+
+#: ../src/jarabe/frame/clipboardmenu.py:85
+msgid "Open with"
+msgstr "Abrir con"
+
+#: ../src/jarabe/frame/clipboardobject.py:49
+#, python-format
+msgid "%s clipping"
+msgstr "Recorte de %s"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:36
+msgid "Neighborhood"
+msgstr "Vecindario"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:38
+msgid "Group"
+msgstr "Grupo"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:40
+msgid "Home"
+msgstr "Hogar"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Actividad"
+
+#: ../src/jarabe/intro/window.py:124
+msgid "Click to change color:"
+msgstr "Clic para cambiar de color:"
+
+#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
+msgid "Back"
+msgstr "Atrás"
+
+#: ../src/jarabe/intro/window.py:191
+msgid "Next"
+msgstr "Siguiente"
+
+#: ../src/jarabe/journal/collapsedentry.py:258
+#: ../src/jarabe/journal/expandedentry.py:159
+#: ../src/jarabe/journal/palettes.py:66
+msgid "Untitled"
+msgstr "Sin título"
+
+#: ../src/jarabe/journal/expandedentry.py:205
+msgid "No preview"
+msgstr "Sin vista previa"
+
+#: ../src/jarabe/journal/expandedentry.py:224
+msgid "Participants:"
+msgstr "Participantes:"
+
+#: ../src/jarabe/journal/expandedentry.py:247
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../src/jarabe/journal/expandedentry.py:273
+msgid "Tags:"
+msgstr "Etiquetas:"
+
+#: ../src/jarabe/journal/journalactivity.py:108
+#: ../src/jarabe/journal/volumestoolbar.py:47
+msgid "Journal"
+msgstr "Diario"
+
+#: ../src/jarabe/journal/journaltoolbox.py:65
msgid "Search"
msgstr "Buscar"
-#: ../src/journal/journaltoolbox.py:119
+#: ../src/jarabe/journal/journaltoolbox.py:124
msgid "Anytime"
msgstr "Cualquier momento"
-#: ../src/journal/journaltoolbox.py:121
+#: ../src/jarabe/journal/journaltoolbox.py:126
msgid "Today"
msgstr "Hoy"
-#: ../src/journal/journaltoolbox.py:123
+#: ../src/jarabe/journal/journaltoolbox.py:128
msgid "Since yesterday"
msgstr "Desde ayer"
+# TRANS: Filter entries modified during the last 7 days.
#. TRANS: Filter entries modified during the last 7 days.
-#: ../src/journal/journaltoolbox.py:125
+#: ../src/jarabe/journal/journaltoolbox.py:130
msgid "Past week"
msgstr "Última semana"
+# TRANS: Filter entries modified during the last 30 days.
#. TRANS: Filter entries modified during the last 30 days.
-#: ../src/journal/journaltoolbox.py:127
+#: ../src/jarabe/journal/journaltoolbox.py:132
msgid "Past month"
msgstr "Último mes"
+# TRANS: Filter entries modified during the last 356 days.
#. TRANS: Filter entries modified during the last 356 days.
-#: ../src/journal/journaltoolbox.py:129
+#: ../src/jarabe/journal/journaltoolbox.py:134
msgid "Past year"
msgstr "Último año"
-#: ../src/journal/journaltoolbox.py:136
+#: ../src/jarabe/journal/journaltoolbox.py:141
msgid "Anyone"
msgstr "Cualquiera"
-#: ../src/journal/journaltoolbox.py:138
+#: ../src/jarabe/journal/journaltoolbox.py:143
msgid "My friends"
msgstr "Mis amigos"
-#: ../src/journal/journaltoolbox.py:139
+#: ../src/jarabe/journal/journaltoolbox.py:144
msgid "My class"
msgstr "Mi clase"
+# TRANS: Item in a combo box that filters by entry type.
#. TRANS: Item in a combo box that filters by entry type.
-#: ../src/journal/journaltoolbox.py:255
+#: ../src/jarabe/journal/journaltoolbox.py:271
msgid "Anything"
msgstr "Cualquiera"
-#. TODO: Add "Start with" menu item
-#: ../src/journal/journaltoolbox.py:325 ../src/journal/palettes.py:67
+# TODO: Add "Start with" menu item
+#: ../src/jarabe/journal/journaltoolbox.py:347
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Copiar"
-#: ../src/journal/collapsedentry.py:248 ../src/journal/expandedentry.py:176
-#: ../src/journal/palettes.py:51
-msgid "Untitled"
-msgstr "Sin título"
+# TRANS: Action label for starting an entry.
+#. TRANS: Action label for starting an entry.
+#: ../src/jarabe/journal/journaltoolbox.py:428
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
+msgid "Start"
+msgstr "Iniciar"
-#: ../src/journal/journalactivity.py:119 ../src/journal/volumesmanager.py:57
-msgid "Journal"
-msgstr "Diario"
+#: ../src/jarabe/journal/listview.py:40
+msgid "Your Journal is empty"
+msgstr "Su diario está vacío"
-#: ../src/journal/expandedentry.py:222
-msgid "No preview"
-msgstr "Sin vista previa"
+#: ../src/jarabe/journal/listview.py:41
+msgid "No matching entries "
+msgstr "No hay entradas coincidentes"
-#: ../src/journal/expandedentry.py:241
-msgid "Participants:"
-msgstr "Participantes:"
+#: ../src/jarabe/journal/listview.py:369
+msgid "Clear search"
+msgstr "Limpiar búsqueda"
-#: ../src/journal/expandedentry.py:266
-msgid "Description:"
-msgstr "Descripción:"
+#: ../src/jarabe/journal/misc.py:91
+msgid "No date"
+msgstr "Sin fecha"
-#: ../src/journal/expandedentry.py:292
-msgid "Tags:"
-msgstr "Etiquetas:"
+#: ../src/jarabe/journal/modalalert.py:63
+msgid "Your Journal is full"
+msgstr "Su diario está vacío"
+
+#: ../src/jarabe/journal/modalalert.py:67
+msgid "Please delete some old Journal entries to make space for new ones."
+msgstr ""
+"Por favor borre las entradas viejas del diario para hacer espacio a las "
+"nuevas entradas."
-#: ../src/journal/objectchooser.py:134
+#: ../src/jarabe/journal/modalalert.py:79
+msgid "Show Journal"
+msgstr "Mostrar diario"
+
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Escoja un objeto"
-#: ../src/journal/objectchooser.py:139
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
msgid "Close"
msgstr "Cerrar"
-#: ../src/journal/volumestoolbar.py:93
+#: ../src/jarabe/journal/palettes.py:73
+msgid "Resume with"
+msgstr "Reiniciar con"
+
+#: ../src/jarabe/journal/palettes.py:76
+msgid "Start with"
+msgstr "Empezar con"
+
+#: ../src/jarabe/journal/palettes.py:98
+msgid "Send to"
+msgstr "Enviar a"
+
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Ver detalles"
+
+#: ../src/jarabe/journal/palettes.py:185
+msgid "No friends present"
+msgstr "No hay amigos presentes"
+
+# tildes
+#: ../src/jarabe/journal/palettes.py:190
+msgid "No valid connection found"
+msgstr "No se encontró una conexión válida"
+
+# tildes...
+#: ../src/jarabe/journal/palettes.py:218
+msgid "No activity to resume entry"
+msgstr "No se encontró una actividad para retomar la entrada"
+
+#: ../src/jarabe/journal/palettes.py:220
+msgid "No activity to start entry"
+msgstr "No se encontró una actividad para iniciar la entrada"
+
+# "Eliminate friend"??? That's a bit harsh. Wouldn't "quitar amigo" be a better choice?--
+# agree but i preffer remover :). that verbe has the exact meaning we are looking on here.
+#: ../src/jarabe/view/buddymenu.py:62
+msgid "Remove friend"
+msgstr "Remover amigo"
+
+#: ../src/jarabe/view/buddymenu.py:65
+msgid "Make friend"
+msgstr "Agregar amigo"
+
+#: ../src/jarabe/view/buddymenu.py:82
+msgid "My Settings"
+msgstr "Mis ajustes"
+
+#: ../src/jarabe/view/buddymenu.py:90
+msgid "Logout"
+msgstr "Salir"
+
+#: ../src/jarabe/view/buddymenu.py:95
+msgid "Restart"
+msgstr "Reiniciar"
+
+#: ../src/jarabe/view/buddymenu.py:100
+msgid "Shutdown"
+msgstr "Apagar"
+
+#: ../src/jarabe/view/buddymenu.py:135
+#, python-format
+msgid "Invite to %s"
+msgstr "Invitar a %s"
+
+#: ../src/jarabe/view/palettes.py:47
+msgid "Starting..."
+msgstr "Iniciando..."
+
+#. TODO: share-with, keep
+#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Ver fuente"
+
+#: ../src/jarabe/view/palettes.py:84
+msgid "Stop"
+msgstr "Parar"
+
+#: ../src/jarabe/view/palettes.py:171
+msgid "Remove favorite"
+msgstr "Remover favorito"
+
+#: ../src/jarabe/view/palettes.py:175
+msgid "Make favorite"
+msgstr "Hacer favorito"
+
+#: ../src/jarabe/view/palettes.py:238
+msgid "Show contents"
+msgstr "Mostrar contenidos"
+
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
+#, python-format
+msgid "%(free_space)d MB Free"
+msgstr "%(free_space)d MB libres"
+
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Desmontar"
-#: ../src/journal/misc.py:95
-msgid "No date"
-msgstr "Sin fecha"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Fuente de la instancia"
-#: ../src/journal/listview.py:39
-msgid "Your Journal is empty"
-msgstr "Su diario está vacío"
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Fuente"
-#: ../src/journal/listview.py:40
-msgid "No matching entries "
-msgstr "No hay entradas coincidentes"
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Fuente del paquete de la actividad"
-#: ../src/journal/modalalert.py:59
-msgid "Your Journal is full"
-msgstr "Su diario está vacío"
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Ver código fuente: %r"
-#: ../src/journal/modalalert.py:63
-#, fuzzy
-msgid "Please delete some old Journal entries to make space for new ones."
-msgstr ""
-"Por favor borre las entradas viejas del diario para hacer espacio a las "
-"nuevas entradas."
+#~ msgid "Document"
+#~ msgstr "Documento"
-#: ../src/journal/modalalert.py:75
-msgid "Show Journal"
-msgstr "Mostrar Diario"
+#~ msgid "Resume by default"
+#~ msgstr "Continuar de forma predeterminada"
+
+#~ msgid "Encryption Type:"
+#~ msgstr "Tipo de Encriptación:"
+
+# 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
+# DjToXiC: It's a good point, however, I think you should communicate that bug to the developers, because we only have to translate. ;-) In my opinion, the translation is perfect (I'm Uruguaian).
+#~ msgid "Disconnecting..."
+#~ msgstr "Desconectando..."
+
+#~ msgid "Mesh Network"
+#~ msgstr "Red Malla"
+
+#~ msgid "Disconnected"
+#~ msgstr "Desconectado"
+
+#~ msgid "About my XO"
+#~ msgstr "Acerca de mi XO"
+
+#~ msgid "Mesh"
+#~ msgstr "Malla"
+
+#~ 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?
+#~ msgid "Looking for a School Mesh Portal..."
+#~ msgstr "Buscando un enlace escolar de red malla..."
+
+#~ msgid "Connected to an XO Mesh Portal"
+#~ msgstr "Conectado a un Portal Malla XO"
+
+#~ msgid "Looking for an XO Mesh Portal..."
+#~ msgstr "Buscando un Portal Malla XO..."
+
+#~ msgid "Connected to a Simple Mesh"
+#~ msgstr "Conectado a una Red Malla Simple"
+
+#~ msgid "Starting a Simple Mesh"
+#~ msgstr "Empezando una Red Malla Simple"
+
+#~ msgid "Unknown Mesh"
+#~ msgstr "Red Malla Desconocida"
+
+#~ msgid "Settings"
+#~ msgstr "Configuración "
#, python-format
#~ msgid "Clipboard object: %s."
diff --git a/po/fr.po b/po/fr.po
index bca46be..3e6a802 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,14 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-02-14 05:40-0500\n"
+"POT-Creation-Date: 2009-03-19 00:30-0400\n"
+"PO-Revision-Date: 2009-05-01 11:59-0400\n"
"Last-Translator: samy boutayeb <s.boutayeb@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
+"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.1.0rc2\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Pootle 1.2.1\n"
#: ../extensions/cpsection/aboutme/__init__.py:24
msgid "About Me"
@@ -271,7 +273,7 @@ msgstr ""
"Gestion extrême de l'alimentation (désactive la radio sans fil, prolonge la "
"durée de vie de la batterie)"
-#: ../extensions/deviceicon/battery.py:56
+#: ../extensions/deviceicon/battery.py:58
msgid "My Battery"
msgstr "Ma batterie"
@@ -292,7 +294,7 @@ msgstr "La batterie est pratiquement déchargée"
msgid "%(hour)d:%(min).2d remaining"
msgstr "%(hour)d:%(min).2d restantes"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "Charge complète"
@@ -310,14 +312,14 @@ msgid "Disconnect..."
msgstr "Déconnexion..."
#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../src/jarabe/desktop/meshbox.py:248
msgid "Connecting..."
msgstr "Connexion..."
# TODO: show the channel number
#: ../extensions/deviceicon/network.py:113
#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../src/jarabe/desktop/meshbox.py:254
msgid "Connected"
msgstr "Connecté"
@@ -333,41 +335,22 @@ msgstr "Réseau filaire"
msgid "Speed"
msgstr "Vitesse"
-#: ../extensions/deviceicon/speaker.py:46
+#: ../extensions/deviceicon/speaker.py:59
msgid "My Speakers"
msgstr "Haut-parleurs"
-#: ../extensions/deviceicon/speaker.py:128
+#: ../extensions/deviceicon/speaker.py:135
msgid "Unmute"
msgstr "Activer le son"
-#: ../extensions/deviceicon/speaker.py:131
+#: ../extensions/deviceicon/speaker.py:138
msgid "Mute"
msgstr "Mettre en sourdine"
-#: ../extensions/globalkey/screenshot.py:50
+#: ../extensions/globalkey/screenshot.py:51
msgid "Screenshot"
msgstr "Capture d'écran"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "Afficher le code source : %r"
-
-#: ../extensions/globalkey/viewsource.py:205
-#: ../src/jarabe/frame/zoomtoolbar.py:42
-msgid "Activity"
-msgstr "Activité"
-
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "Document"
-
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "Fermer"
-
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
msgstr "Sauvegarde de l'URL"
@@ -540,24 +523,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Redémarrer sugar pour que les changements prennent effet.\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "Attention"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "Relancer pour valider"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "Abandonner"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "Plus tard"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "Maintenant"
@@ -567,65 +550,65 @@ msgstr "Accepter"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
msgid "Cancel"
msgstr "Annuler"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:339
msgid "Ok"
msgstr "Ok"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:114
+#: ../src/jarabe/desktop/favoriteslayout.py:116
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/jarabe/desktop/favoriteslayout.py:196
+#: ../src/jarabe/desktop/favoriteslayout.py:198
msgid "Ring"
msgstr "Concentrique"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:334
msgid "Spiral"
msgstr "Spirale"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:401
msgid "Box"
msgstr "Boîte"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:442
msgid "Triangle"
msgstr "Triangle"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:330
msgid "Registration Failed"
msgstr "Echec de l'enregistrement"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "Registration Successful"
msgstr "Enregistrement réussi"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:334
msgid "You are now registered with your school server."
msgstr "Vous êtes maintenant enregistré sur le serveur de l'école"
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:674
msgid "Register"
msgstr "S'enregistrer"
@@ -644,12 +627,13 @@ msgstr "Confirmer la suppression : faut-il supprimer %s définitivement ?"
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "Conserver"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "Supprimer"
@@ -681,10 +665,6 @@ msgstr "Écran favoris"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "Reprise par défaut"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "Type de clé :"
@@ -701,81 +681,86 @@ msgstr "WPA & WPA2 Personal"
msgid "Wireless Security:"
msgstr "Sécurité sans fil :"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:132
msgid "Connect"
msgstr "Connecter"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:136
msgid "Disconnect"
msgstr "Déconnecter"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:442
+#: ../src/jarabe/frame/activitiestray.py:761
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "Reprendre"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:447
+#: ../src/jarabe/frame/activitiestray.py:235
msgid "Join"
msgstr "Rejoindre"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "Impossible d'obtenir les données nécessaires à l'enregistrement."
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "Impossible de se connecter au serveur."
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "Le serveur n'a pas pu achever la requête."
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
msgid "Decline"
msgstr "Refuser"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:650
#, python-format
msgid "%dB"
msgstr "%do"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:652
#, python-format
msgid "%dKB"
msgstr "%dKo"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:654
#, python-format
msgid "%dMB"
msgstr "%dMo"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:671
#, python-format
msgid "%s of %s"
msgstr "%s sur %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:683
#, python-format
msgid "Transfer from %r"
msgstr "Transfert depuis %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:693
msgid "Accept"
msgstr "Accepter"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr "Refuser"
+
+#: ../src/jarabe/frame/activitiestray.py:810
#, python-format
msgid "Transfer to %r"
msgstr "Transfert vers %r"
@@ -793,7 +778,7 @@ msgstr "Ouvrir"
msgid "Open with"
msgstr "Ouvrir avec"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "%s coupure"
@@ -810,6 +795,10 @@ msgstr "Groupe"
msgid "Home"
msgstr "Accueil"
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Activité"
+
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "Cliquer pour changer de couleur :"
@@ -822,9 +811,9 @@ msgstr "Précédent"
msgid "Next"
msgstr "Suivant"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "Sans titre"
@@ -903,14 +892,14 @@ msgstr "Tout"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Copier"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "Lancer"
@@ -926,7 +915,7 @@ msgstr "Aucune entrée correspondante"
msgid "Clear search"
msgstr "Effacer la recherche"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:93
msgid "No date"
msgstr "Sans date"
@@ -944,96 +933,133 @@ msgstr ""
msgid "Show Journal"
msgstr "Montre le Journal"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Choisir un objet"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "Fermer"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "Reprendre avec"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "Commencer avec"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "Envoyer à"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Afficher les détails"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "Aucun ami présent"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "Aucune connexion valide trouvée"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "Aucune activité pour reprendre l'entrée"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "Acune activité pour démarrer l'entrée"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "Retirer de mes amis"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "Ajouter à mes amis"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "Mes paramètres"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "Se déconnecter"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "Redémarrer"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "Éteindre"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "Inviter à %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "Démarrage..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Afficher la source"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "Arrêter"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:171
msgid "Remove favorite"
msgstr "Retirer le favori"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:175
msgid "Make favorite"
msgstr "Ajouter aux favoris"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:238
msgid "Show contents"
msgstr "Afficher les contenus"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d Mo de libre"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Démonter"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Instancie source"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Source"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Source du paquet activité"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Afficher le code source : %r"
+
+#~ msgid "Document"
+#~ msgstr "Document"
+
+#~ msgid "Resume by default"
+#~ msgstr "Reprise par défaut"
+
#~ msgid "Encryption Type:"
#~ msgstr "Type d'encryptage :"
diff --git a/po/it.po b/po/it.po
index 35049be..59af549 100644
--- a/po/it.po
+++ b/po/it.po
@@ -6,14 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-02-05 06:48-0500\n"
+"POT-Creation-Date: 2009-06-11 00:31-0400\n"
+"PO-Revision-Date: 2009-07-07 12:04-0400\n"
"Last-Translator: Carlo Falciola <cfalciola@yahoo.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.1.0rc2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
#: ../extensions/cpsection/aboutme/__init__.py:24
msgid "About Me"
@@ -63,49 +65,43 @@ msgstr "Seleziona per cambiare il tuo colore:"
msgid "About my Computer"
msgstr "Il mio Computer"
-#: ../extensions/cpsection/aboutcomputer/model.py:26
+#: ../extensions/cpsection/aboutcomputer/model.py:28
msgid "Not available"
msgstr "Non disponibile"
-#: ../extensions/cpsection/aboutcomputer/view.py:59
+#: ../extensions/cpsection/aboutcomputer/view.py:60
msgid "Identity"
msgstr "Identità"
-#: ../extensions/cpsection/aboutcomputer/view.py:68
+#: ../extensions/cpsection/aboutcomputer/view.py:69
msgid "Serial Number:"
msgstr "Numero di Serie:"
-#: ../extensions/cpsection/aboutcomputer/view.py:90
+#: ../extensions/cpsection/aboutcomputer/view.py:91
msgid "Software"
msgstr "Software"
-#: ../extensions/cpsection/aboutcomputer/view.py:99
+#: ../extensions/cpsection/aboutcomputer/view.py:100
msgid "Build:"
msgstr "Build:"
-#: ../extensions/cpsection/aboutcomputer/view.py:114
+#: ../extensions/cpsection/aboutcomputer/view.py:115
msgid "Sugar:"
msgstr "Sugar:"
-#: ../extensions/cpsection/aboutcomputer/view.py:130
+#: ../extensions/cpsection/aboutcomputer/view.py:131
msgid "Firmware:"
msgstr "Firmware:"
-#: ../extensions/cpsection/aboutcomputer/view.py:145
+#: ../extensions/cpsection/aboutcomputer/view.py:146
msgid "Wireless Firmware:"
msgstr "Wireless Firmware:"
-#: ../extensions/cpsection/aboutcomputer/view.py:168
+#: ../extensions/cpsection/aboutcomputer/view.py:169
msgid "Copyright and License"
msgstr "Copyright e Licenza"
-#: ../extensions/cpsection/aboutcomputer/view.py:176
-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."
-
-#: ../extensions/cpsection/aboutcomputer/view.py:183
+#: ../extensions/cpsection/aboutcomputer/view.py:184
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 "
@@ -117,7 +113,7 @@ msgstr ""
"chiunque è il benvenuto per apportare modifiche e migliorie e/o distribuirne "
"copie, alle condizioni descritte nella licenza medesima."
-#: ../extensions/cpsection/aboutcomputer/view.py:195
+#: ../extensions/cpsection/aboutcomputer/view.py:196
msgid "Full license:"
msgstr "Testo della Licenza:"
@@ -273,7 +269,7 @@ msgstr ""
"Gestione Risparmio Energetico Estrema (spegne la connessione radio wireless, "
"incrementa la durata delle batterie)"
-#: ../extensions/deviceicon/battery.py:56
+#: ../extensions/deviceicon/battery.py:58
msgid "My Battery"
msgstr "La mia Batteria"
@@ -294,11 +290,11 @@ msgstr "Pochissima carica rimanente"
msgid "%(hour)d:%(min).2d remaining"
msgstr "%(hour)d:%(min).2d rimanenti"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "Carica"
-#: ../extensions/deviceicon/network.py:40
+#: ../extensions/deviceicon/network.py:43
#, python-format
msgid "IP address: %s"
msgstr "Indirizzo IP: %s"
@@ -307,68 +303,82 @@ msgstr "Indirizzo IP: %s"
# 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
-#: ../extensions/deviceicon/network.py:104
+#: ../extensions/deviceicon/network.py:109
msgid "Disconnect..."
msgstr "Disconnessione..."
-#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../extensions/deviceicon/network.py:113
+msgid "Create new wireless network"
+msgstr "Crea una nuova rete wireless"
+
+#: ../extensions/deviceicon/network.py:119
+#: ../src/jarabe/desktop/meshbox.py:250
msgid "Connecting..."
msgstr "Connessione..."
# TODO: show the channel number
-#: ../extensions/deviceicon/network.py:113
-#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../extensions/deviceicon/network.py:123
+#: ../extensions/deviceicon/network.py:179
+#: ../src/jarabe/desktop/meshbox.py:256
msgid "Connected"
msgstr "Connesso"
-#: ../extensions/deviceicon/network.py:126
+#: ../extensions/deviceicon/network.py:139
msgid "Channel"
msgstr "Canale"
-#: ../extensions/deviceicon/network.py:141
+#: ../extensions/deviceicon/network.py:154
msgid "Wired Network"
msgstr "Rete su cavo"
-#: ../extensions/deviceicon/network.py:169
+#: ../extensions/deviceicon/network.py:182
msgid "Speed"
msgstr "Velocità"
-#: ../extensions/deviceicon/speaker.py:46
+#: ../extensions/deviceicon/network.py:389
+#, python-format
+msgid "%s's network"
+msgstr "rete di %s"
+
+#: ../extensions/deviceicon/speaker.py:59
msgid "My Speakers"
msgstr "I miei Altoparlanti"
-#: ../extensions/deviceicon/speaker.py:128
+#: ../extensions/deviceicon/speaker.py:133
msgid "Unmute"
-msgstr "riAttiva"
+msgstr "Attiva"
-#: ../extensions/deviceicon/speaker.py:131
+#: ../extensions/deviceicon/speaker.py:136
msgid "Mute"
msgstr "Silenzia"
-#: ../extensions/globalkey/screenshot.py:50
-msgid "Screenshot"
-msgstr "Schermata"
+#: ../extensions/globalkey/screenshot.py:56
+msgid "Mesh"
+msgstr "Mesh"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "Vedi codice sorgente: %r"
+#: ../extensions/globalkey/screenshot.py:58
+#: ../src/jarabe/frame/zoomtoolbar.py:38
+msgid "Group"
+msgstr "Gruppo"
+
+#: ../extensions/globalkey/screenshot.py:60
+#: ../src/jarabe/frame/zoomtoolbar.py:40
+msgid "Home"
+msgstr "Casa"
-#: ../extensions/globalkey/viewsource.py:205
+#: ../extensions/globalkey/screenshot.py:66
#: ../src/jarabe/frame/zoomtoolbar.py:42
msgid "Activity"
msgstr "Attività"
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "Documento"
+#: ../extensions/globalkey/screenshot.py:69
+msgid "Screenshot"
+msgstr "Schermata"
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "Chiudi"
+#: ../extensions/globalkey/screenshot.py:71
+#, python-format
+msgid "Screenshot of \"%s\""
+msgstr "Schermata di \"%s\""
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
@@ -545,24 +555,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Per applicare le modifiche è necessario riavviare sugar.\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "Attenzione"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "Le modifiche rendono necessario un riavvio"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "Annulla modifiche"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "Dopo"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "Riavvia adesso"
@@ -572,65 +582,65 @@ msgstr "Fatto"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
msgid "Cancel"
-msgstr "Annulla"
+msgstr "Cancella"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:339
msgid "Ok"
msgstr "Ok"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:114
+#: ../src/jarabe/desktop/favoriteslayout.py:116
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/jarabe/desktop/favoriteslayout.py:196
+#: ../src/jarabe/desktop/favoriteslayout.py:198
msgid "Ring"
msgstr "Anello"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:334
msgid "Spiral"
msgstr "Spirale"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:401
msgid "Box"
msgstr "Scatola"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:442
msgid "Triangle"
msgstr "Triangolo"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:330
msgid "Registration Failed"
msgstr "Registrazione Fallita"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "Registration Successful"
msgstr "Registrazione Effettuata"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:334
msgid "You are now registered with your school server."
msgstr "Ora sei registrato sul tuo server di scuola"
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:674
msgid "Register"
msgstr "Registra"
@@ -649,12 +659,13 @@ msgstr ""
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "Memorizza"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "Elimina"
@@ -688,10 +699,6 @@ msgstr "Visualizza i Preferiti"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "Riprendi per default"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "Tipo Chiave:"
@@ -708,81 +715,86 @@ msgstr "WPA & WPA2 Personal"
msgid "Wireless Security:"
msgstr "Wireless Security:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:134
msgid "Connect"
msgstr "Connetti"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:138
msgid "Disconnect"
msgstr "Disconnetti"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:449
+#: ../src/jarabe/frame/activitiestray.py:761
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "Riprendi"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:454
+#: ../src/jarabe/frame/activitiestray.py:235
msgid "Join"
msgstr "Associa"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "Non riesco ad ottenere i dati necessari alla registrazione."
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "Impossibile connettersi al server."
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "Il server non può completare la richiesta."
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
msgid "Decline"
msgstr "Rinuncia"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:650
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:652
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:654
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:671
#, python-format
msgid "%s of %s"
msgstr "%s di %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:683
#, python-format
msgid "Transfer from %r"
msgstr "Trasferisci da %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:693
msgid "Accept"
msgstr "Accetta"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr "Abbandona"
+
+#: ../src/jarabe/frame/activitiestray.py:810
#, python-format
msgid "Transfer to %r"
msgstr "Trasferisci verso %r"
@@ -800,7 +812,7 @@ msgstr "Apri"
msgid "Open with"
msgstr "Apri con"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "ritaglio %s"
@@ -810,14 +822,6 @@ msgstr "ritaglio %s"
msgid "Neighborhood"
msgstr "I miei vicini"
-#: ../src/jarabe/frame/zoomtoolbar.py:38
-msgid "Group"
-msgstr "Gruppo"
-
-#: ../src/jarabe/frame/zoomtoolbar.py:40
-msgid "Home"
-msgstr "Casa"
-
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "Seleziona per cambiare colore:"
@@ -830,9 +834,9 @@ msgstr "Indietro"
msgid "Next"
msgstr "Prossimo"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "Senza titolo"
@@ -911,14 +915,14 @@ msgstr "Qualsiasi"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Copia"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "Avvia"
@@ -930,11 +934,11 @@ msgstr "Il tuo Diario è vuoto"
msgid "No matching entries "
msgstr "Non ci sono dati corrispondenti "
-#: ../src/jarabe/journal/listview.py:369
+#: ../src/jarabe/journal/listview.py:370
msgid "Clear search"
msgstr "Annulla ricerca"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:93
msgid "No date"
msgstr "Nessuna data"
@@ -952,96 +956,138 @@ msgstr ""
msgid "Show Journal"
msgstr "Apri il Diario"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Scegli un oggetto"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "Chiudi"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "Riprendi con"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "Inizia con"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "Invia a"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Visualizza Dettagli"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "Non ci sono amici presenti"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "Connessione non trovata"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "Sessione dell'Attività da riprendere non presente"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "Attività per riprendere la sessione non presente"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "Rimuovi l'amico"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "Aggiungi agli amici"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "Le mie Preferenze"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "Disconnessione"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "Riavvia"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "Spegni"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "Invito per %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "Inizio..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Visualizza Sorgente"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "Chiudi"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:174
msgid "Remove favorite"
msgstr "Rimuovi preferito"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:178
msgid "Make favorite"
msgstr "Definisci preferito"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:241
msgid "Show contents"
msgstr "Mostra i contenuti"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:263 ../src/jarabe/view/palettes.py:313
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB Liberi"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:288
msgid "Unmount"
msgstr "Rimuovi"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Sorgente Istanza"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Sorgente"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Sorgente della Attività"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Vedi codice sorgente: %r"
+
+#~ 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."
+
+#~ msgid "Document"
+#~ msgstr "Documento"
+
+#~ msgid "Resume by default"
+#~ msgstr "Riprendi per default"
+
#~ msgid "Encryption Type:"
#~ msgstr "Tipo di Crittografia:"
@@ -1062,9 +1108,6 @@ msgstr "Rimuovi"
#~ msgid "About my XO"
#~ msgstr "Informazioni sul mio XO"
-#~ msgid "Mesh"
-#~ msgstr "Mesh"
-
#~ msgid "Connected to a School Mesh Portal"
#~ msgstr "Connesso ad un Portale Mesh di scuola"
diff --git a/po/ja.po b/po/ja.po
index 9a767fb..781ac36 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: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-02-15 09:52-0500\n"
+"POT-Creation-Date: 2009-02-21 00:30-0500\n"
+"PO-Revision-Date: 2009-03-01 17:27-0500\n"
"Last-Translator: korakurider <korakurider@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -283,7 +283,7 @@ msgstr "電池が残りわずかです"
msgid "%(hour)d:%(min).2d remaining"
msgstr "残り %(hour)d:%(min).2d"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "充電済み"
@@ -305,14 +305,14 @@ msgstr "切断..."
# method for a device either (for various reasons) so this doesn't
# have a good mapping
#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../src/jarabe/desktop/meshbox.py:247
msgid "Connecting..."
msgstr "接続しています..."
# TODO: show the channel number
#: ../extensions/deviceicon/network.py:113
#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../src/jarabe/desktop/meshbox.py:253
msgid "Connected"
msgstr "接続しました"
@@ -344,25 +344,6 @@ msgstr "音を消す"
msgid "Screenshot"
msgstr "スクリーンショット"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "ソースを表示: %r"
-
-#: ../extensions/globalkey/viewsource.py:205
-#: ../src/jarabe/frame/zoomtoolbar.py:42
-msgid "Activity"
-msgstr "アクティビティ"
-
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "ドキュメント"
-
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "閉じる"
-
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
msgstr "バックアップURL"
@@ -528,24 +509,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "変更を適用するにはsugarを再起動しなければいけません。\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "注意"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "変更には再起動が必要です"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "変更を取りやめる"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "あとで"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "今すぐ再起動"
@@ -555,14 +536,14 @@ msgstr "完了"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:687
+#: ../src/jarabe/frame/activitiestray.py:766
+#: ../src/jarabe/frame/activitiestray.py:794
msgid "Cancel"
msgstr "中止"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:338
msgid "Ok"
msgstr "了解"
@@ -580,40 +561,40 @@ msgstr "円に並べる"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:332
msgid "Spiral"
msgstr "渦巻きに並べる"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:399
msgid "Box"
msgstr "箱型に並べる"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:440
msgid "Triangle"
msgstr "三角形に並べる"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:329
msgid "Registration Failed"
msgstr "登録失敗"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:330
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:332
msgid "Registration Successful"
msgstr "登録成功"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "You are now registered with your school server."
msgstr "あなたはスクールサーバーに登録されました"
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:668
msgid "Register"
msgstr "登録"
@@ -631,12 +612,13 @@ msgstr "消去の確認: %s を完全に消去しますか?"
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "ジャーナルに保存"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "消去する"
@@ -668,10 +650,6 @@ msgstr "お気に入り"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "デフォルトのアクティビティで再開"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "キーのタイプ:"
@@ -688,81 +666,81 @@ msgstr "WPA と WPA2パーソナル"
msgid "Wireless Security:"
msgstr "無線のセキュリティ:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:131
msgid "Connect"
msgstr "接続"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:135
msgid "Disconnect"
msgstr "切断"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:441
+#: ../src/jarabe/frame/activitiestray.py:711
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "再開"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:446
+#: ../src/jarabe/frame/activitiestray.py:227
msgid "Join"
msgstr "参加"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "登録に必要なデータを取得できません"
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "サーバーに接続できません"
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "サーバーは要求の処理を完了できませんでした"
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:232
+#: ../src/jarabe/frame/activitiestray.py:659
msgid "Decline"
msgstr "断る"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:612
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:614
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:616
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:633
#, python-format
msgid "%s of %s"
msgstr "%s の %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:644
#, python-format
msgid "Transfer from %r"
msgstr "%rから転送"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:654
msgid "Accept"
msgstr "受け入れる"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:677
+#: ../src/jarabe/frame/activitiestray.py:784
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:755
#, python-format
msgid "Transfer to %r"
msgstr "%rへ転送"
@@ -780,7 +758,7 @@ msgstr "開く"
msgid "Open with"
msgstr "次のもので開く:"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "%sのクリッピング"
@@ -797,6 +775,10 @@ msgstr "グループ"
msgid "Home"
msgstr "ホーム"
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "アクティビティ"
+
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "クリックして色を変更:"
@@ -809,9 +791,9 @@ msgstr "戻る"
msgid "Next"
msgstr "進む"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "タイトル無し"
@@ -890,14 +872,14 @@ msgstr "すべての種類"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "コピー"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "開始"
@@ -913,7 +895,7 @@ msgstr "あてはまるものが無いです"
msgid "Clear search"
msgstr "検索をクリア"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:91
msgid "No date"
msgstr "日付無し"
@@ -929,96 +911,133 @@ msgstr "新しいものが入るよう、ジャーナルの中身の古いもの
msgid "Show Journal"
msgstr "ジャーナルを表示"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "オブジェクトを選ぶ"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "閉じる"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "次のアクティビティで再開"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "次のアクティビティで開始"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "次に送る"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "詳細を表示"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "お友達がいません"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "正しい接続がありません"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "エントリを再開するアクティビティがありません"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "エントリを開始するアクティビティがありません"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "お友だちの登録削除"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "お友だちを登録"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "私の設定"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "ログアウト"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "再起動"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "シャットダウン"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "%s に招待する"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "起動中..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "ソースコードを表示"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "停止"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:171
msgid "Remove favorite"
msgstr "お気に入りから削除"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:175
msgid "Make favorite"
msgstr "お気に入りに登録"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:238
msgid "Show contents"
msgstr "内容を表示"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB 空き"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "取りはずす"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "インスタンスのソースコード"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "ソースコード"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "アクティビティバンドルのソースコード"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "ソースを表示: %r"
+
+#~ msgid "Document"
+#~ msgstr "ドキュメント"
+
+#~ msgid "Resume by default"
+#~ msgstr "デフォルトのアクティビティで再開"
+
#~ msgid "Encryption Type:"
#~ msgstr "暗号タイプ:"
diff --git a/po/ne.po b/po/ne.po
index dc0b251..dd2c9a7 100644
--- a/po/ne.po
+++ b/po/ne.po
@@ -6,266 +6,521 @@ 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-01 03:57-0400\n"
-"Last-Translator: Bibek Kafle <oxese.eax@gmail.com>\n"
+"POT-Creation-Date: 2009-06-11 00:31-0400\n"
+"PO-Revision-Date: 2009-07-27 00:08-0400\n"
+"Last-Translator: Daniel Drake <dsd@laptop.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ne\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.1.0rc2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
-#: ../src/intro/intro.py:65 ../src/controlpanel/view/aboutme.py:100
+#: ../extensions/cpsection/aboutme/__init__.py:24
+msgid "About Me"
+msgstr "मेरो बारेमा"
+
+#: ../extensions/cpsection/aboutme/model.py:43
+msgid "You must enter a name."
+msgstr "तिमीले नाम हाल्नै पर्छ।"
+
+#: ../extensions/cpsection/aboutme/model.py:68
+#, python-format
+msgid "stroke: color=%s hue=%s"
+msgstr "ब्रसको धर्को: रङ्ग=%s ह्‍यु‍=%s"
+
+#: ../extensions/cpsection/aboutme/model.py:71
+#, python-format
+msgid "stroke: %s"
+msgstr "ब्रसको धर्का: %s"
+
+#: ../extensions/cpsection/aboutme/model.py:73
+#, python-format
+msgid "fill: color=%s hue=%s"
+msgstr "भर: रङ्ग=%s ह्‍यु=%s"
+
+#: ../extensions/cpsection/aboutme/model.py:75
+#, python-format
+msgid "fill: %s"
+msgstr "भर: %s"
+
+#: ../extensions/cpsection/aboutme/model.py:86
+msgid "Error in specified color modifiers."
+msgstr "तोकिएको रङ्ग परिमार्जकहरुमा त्रुटी छ।"
+
+#: ../extensions/cpsection/aboutme/model.py:89
+msgid "Error in specified colors."
+msgstr "तोकिएको रङ्गहरुमा त्रुटी छ।"
+
+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
msgid "Name:"
msgstr "नामः"
-#: ../src/intro/intro.py:94
-msgid "Click to change color:"
+#: ../extensions/cpsection/aboutme/view.py:128
+msgid "Click to change your color:"
msgstr "रङ्ग परिवर्तन गर्न क्लिक गरः"
-#: ../src/intro/intro.py:145
-msgid "Back"
-msgstr "पछाडि"
+#: ../extensions/cpsection/aboutcomputer/__init__.py:21
+msgid "About my Computer"
+msgstr "मेरो कम्पयूटरको बारेमा"
-#: ../src/intro/intro.py:159 ../src/controlpanel/toolbar.py:61
-msgid "Done"
-msgstr "भयो"
+#: ../extensions/cpsection/aboutcomputer/model.py:28
+msgid "Not available"
+msgstr "उपलब्ध छैन"
-#: ../src/intro/intro.py:162
-msgid "Next"
-msgstr "अर्को"
+#: ../extensions/cpsection/aboutcomputer/view.py:60
+msgid "Identity"
+msgstr "व्यक्तित्ब"
-#: ../src/view/BuddyMenu.py:58
-msgid "Remove friend"
-msgstr "साथी हटाऊ"
+#: ../extensions/cpsection/aboutcomputer/view.py:69
+msgid "Serial Number:"
+msgstr "क्रमिक अङ्क"
-#: ../src/view/BuddyMenu.py:61
-msgid "Make friend"
-msgstr "साथी बनाऊ"
+#: ../extensions/cpsection/aboutcomputer/view.py:91
+msgid "Software"
+msgstr "सफ्टवेर"
-#: ../src/view/BuddyMenu.py:91
-#, python-format
-msgid "Invite to %s"
-msgstr "%s लाई निम्ता देऊ"
+#: ../extensions/cpsection/aboutcomputer/view.py:100
+msgid "Build:"
+msgstr "बनाइ:"
-#: ../src/view/clipboardmenu.py:48
-msgid "Remove"
-msgstr "हटाऊ"
+#: ../extensions/cpsection/aboutcomputer/view.py:115
+msgid "Sugar:"
+msgstr "सुगर:"
-#: ../src/view/clipboardmenu.py:53 ../src/view/clipboardmenu.py:79
-msgid "Open"
-msgstr "खोल"
+#: ../extensions/cpsection/aboutcomputer/view.py:131
+msgid "Firmware:"
+msgstr "फर्मवेर:"
-# self._stop_item = MenuItem(_('Stop download'), 'stock-close')
-# TODO: Implement stopping downloads
-# self._stop_item.connect('activate', self._stop_item_activate_cb)
-# self.append_menu_item(self._stop_item)
-#. 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/home/HomeBox.py:86
-msgid "Keep"
-msgstr "राख"
+#: ../extensions/cpsection/aboutcomputer/view.py:146
+msgid "Wireless Firmware:"
+msgstr "तारबिनाको फर्मवेर:"
-#: ../src/view/clipboardmenu.py:84
-msgid "Open with"
-msgstr " साथ खोल"
+#: ../extensions/cpsection/aboutcomputer/view.py:169
+msgid "Copyright and License"
+msgstr "कपिराइट र अनुमतिपत्र"
+
+#: ../extensions/cpsection/aboutcomputer/view.py:184
+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 ""
+"अहिले तपाईंले हेरिराखेको ग्रफीकल युजर इन्टरफेस सुगर हो। सुगर फ्री सफ्टवेर "
+"हो, सुगर ले जि एन यु जनरल पब्लिक अनुमति पत्र प्रयोग गर्छ र तपाईंले यसलाई "
+"परिवर्तन गरेर नियम अनुसार अरुलाई दिन सक्नुहुन्छ।"
+
+#: ../extensions/cpsection/aboutcomputer/view.py:196
+msgid "Full license:"
+msgstr "सम्पूर्ण अनुमति पत्र:"
-#: ../src/view/clipboardmenu.py:216
+#: ../extensions/cpsection/datetime/__init__.py:21
+msgid "Date & Time"
+msgstr "मिती & समय"
+
+#: ../extensions/cpsection/datetime/model.py:87
+msgid "Error timezone does not exist."
+msgstr "त्रुटि, समयक्षेत्र उपलब्ध छैन।"
+
+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:19
+msgid "Timezone"
+msgstr "समयक्षेत्र"
+
+#: ../extensions/cpsection/frame/__init__.py:21
+msgid "Frame"
+msgstr "चौखट"
+
+#: ../extensions/cpsection/frame/model.py:38
+#: ../extensions/cpsection/frame/model.py:60
+msgid "Value must be an integer."
+msgstr "गुण संख्या हुनु पर्छ।"
+
+#: ../extensions/cpsection/frame/view.py:26
+msgid "never"
+msgstr "कहिलेपनि नगर"
+
+#: ../extensions/cpsection/frame/view.py:27
+msgid "instantaneous"
+msgstr "तात्कालिक"
+
+#: ../extensions/cpsection/frame/view.py:28
#, python-format
-msgid "Clipboard object: %s."
-msgstr "क्लिपपाटी वस्तु: %s."
+msgid "%s seconds"
+msgstr "%s सेकेण्ड"
-#: ../src/hardware/keydialog.py:150
-msgid "Key Type:"
-msgstr "कुञ्जी प्रकार:"
+#: ../extensions/cpsection/frame/view.py:52
+msgid "Activation Delay"
+msgstr "सुरु गर्न ढिलाइ"
-#: ../src/hardware/keydialog.py:170
-msgid "Authentication Type:"
-msgstr "प्रमाणीकरण प्रकार:"
+#: ../extensions/cpsection/frame/view.py:76
+msgid "Corner"
+msgstr "कुना"
-#: ../src/hardware/keydialog.py:251
-msgid "Encryption Type:"
-msgstr "गुप्तीकरण प्रकार:"
+#: ../extensions/cpsection/frame/view.py:111
+msgid "Edge"
+msgstr "कुना"
-#: ../src/view/Shell.py:240
-msgid "Screenshot"
-msgstr "पर्दाछवि"
+#: ../extensions/cpsection/language/__init__.py:21
+#: ../extensions/cpsection/language/view.py:32
+msgid "Language"
+msgstr "भाषा"
-#: ../src/view/home/HomeBox.py:80
-msgid "Confirm erase"
-msgstr "साँच्चै मेट्ने"
+#: ../extensions/cpsection/language/model.py:28
+msgid "Could not access ~/.i18n. Create standard settings."
+msgstr "~/.i18n. मा पहुँच भएन। मानक सेटिङ्गहरु बनाऊ।"
-#: ../src/view/home/HomeBox.py:82
+#: ../extensions/cpsection/language/model.py:124
#, python-format
-msgid "Confirm erase: Do you want to permanently erase %s?"
-msgstr "साँच्छै मेट्ने: %s लाई सधैँको लागी मेट्न चहान्छौ?"
+msgid "Language for code=%s could not be determined."
+msgstr "कोड=%sको भाषा निश्चित गर्न सकिएन।"
-#: ../src/view/home/HomeBox.py:89 ../src/view/palettes.py:120
-msgid "Erase"
-msgstr "मेट"
+#: ../extensions/cpsection/language/model.py:144
+#, python-format
+msgid "Sorry I do not speak '%s'."
+msgstr "माफ गर्नुस, म '%s' बोल्दिन।"
-#: ../src/view/home/HomeBox.py:215
-msgid "List view"
-msgstr "सुची दृश्य"
+#: ../extensions/cpsection/network/__init__.py:21
+#: ../extensions/cpsection/network/view.py:28
+msgid "Network"
+msgstr "सञ्जाल"
-#: ../src/view/home/HomeBox.py:216
-msgid "<Ctrl>2"
-msgstr "<Ctrl> २"
+#: ../extensions/cpsection/network/model.py:79
+msgid "State is unknown."
+msgstr "अवस्था अज्ञात छ।"
-#: ../src/view/home/HomeBox.py:273
-msgid "Favorites view"
-msgstr "मन्पर्दो दृश्य"
+#: ../extensions/cpsection/network/model.py:105
+msgid "Error in specified radio argument use on/off."
+msgstr "तोकिएको रेडियो निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
-#: ../src/view/home/HomeBox.py:274
-msgid "<Ctrl>1"
-msgstr "<Ctrl> १"
+#: ../extensions/cpsection/network/model.py:137
+msgid "Error in specified argument use 0/1."
+msgstr "तोकिएको निर्देशनमा त्रुटि छ, 0/1 प्रयोग गर।"
-#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/HomeBox.py:282
-msgid "Freeform"
-msgstr "स्वतन्त्र आकारको"
+#: ../extensions/cpsection/network/view.py:56
+msgid "Wireless"
+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 "औँठी"
+#: ../extensions/cpsection/network/view.py:64
+msgid "Turn off the wireless radio to save battery life"
+msgstr "ब्याटरि बचाउन तारबिनाको रेडियो बन्द गर्नुहोस।"
-#: ../src/view/home/MeshBox.py:97
-msgid "Connect"
-msgstr "जोड"
+#: ../extensions/cpsection/network/view.py:77
+msgid "Radio"
+msgstr "रेडियो"
-#: ../src/view/home/MeshBox.py:106
-#, fuzzy
-msgid "Disconnect"
-msgstr "विच्छेद भयो"
+#: ../extensions/cpsection/network/view.py:93
+msgid "Discard network history if you have trouble connecting to the network"
+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
-#: ../src/view/home/MeshBox.py:118
-#, fuzzy
-msgid "Disconnecting..."
-msgstr "जडान विच्छेद"
+#: ../extensions/cpsection/network/view.py:102
+msgid "Discard network history"
+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
-#: ../src/view/home/MeshBox.py:152
-#, fuzzy
-msgid "Connecting..."
-msgstr "जडान विच्छेद"
+#: ../extensions/cpsection/network/view.py:115
+msgid "Collaboration"
+msgstr "सहकार्य"
-#. TODO: show the channel number
-#: ../src/view/home/MeshBox.py:159
-msgid "Connected"
-msgstr "जडान भयो"
+#: ../extensions/cpsection/network/view.py:123
+msgid ""
+"The server is the equivalent of what room you are in; people on the same "
+"server will be able to see each other, even when they aren't on the same "
+"network."
+msgstr ""
+"सर्भर भनेको तिमी बसेको कोठा जस्तो हो, ‍एउटै सर्भरमा भएका XO हरु एक अर्कालाई "
+"देख्न सक्छन्, एउटै नेटवर्कमा नहुन्दा पनि।"
-#: ../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 "मेश सञ्जाल"
+#: ../extensions/cpsection/network/view.py:133
+msgid "Server:"
+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
-#: ../src/view/home/MeshBox.py:214 ../src/view/devices/network/wireless.py:119
-#: ../src/view/devices/network/mesh.py:89
-msgid "Disconnect..."
-msgstr "जडान विच्छेद"
+#: ../extensions/cpsection/power/__init__.py:21
+msgid "Power"
+msgstr "शक्ति"
-#: ../src/view/home/MeshBox.py:302 ../src/view/palettes.py:61
-msgid "Resume"
-msgstr "पुनरारम्भ"
+#: ../extensions/cpsection/power/model.py:54
+msgid "Error in automatic pm argument, use on/off."
+msgstr "आफैँ चल्ने pm निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
-#: ../src/view/home/MeshBox.py:307 ../src/view/frame/activitiestray.py:205
-msgid "Join"
-msgstr "सहभागी होऊ"
+#: ../extensions/cpsection/power/model.py:81
+msgid "Error in extreme pm argument, use on/off."
+msgstr "अन्तिम रुपको pm निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
+
+#: ../extensions/cpsection/power/view.py:47
+msgid "Power management"
+msgstr "शक्तिको प्रभन्धकर्ता"
-#: ../src/view/devices/battery.py:45
+#: ../extensions/cpsection/power/view.py:57
+msgid "Automatic power management (increases battery life)"
+msgstr "आफैँ चल्ने शक्तिको प्रबन्धकर्ता (ब्याटरिको जीवन बढाउँछ)"
+
+#: ../extensions/cpsection/power/view.py:85
+msgid ""
+"Extreme power management (disableswireless radio, increases battery life)"
+msgstr ""
+"अति किफायत शक्तिको प्रबन्धकर्ता (तार बिनाको रेडियो असमर्थ पार्छ, ब्याटरिको "
+"जीवन बढाउँछ)"
+
+#: ../extensions/deviceicon/battery.py:58
msgid "My Battery"
-msgstr "मेरो बाटरी"
+msgstr "मेरो बेटरी"
+
+#: ../extensions/deviceicon/battery.py:137
+msgid "Removed"
+msgstr "हट्यो"
-#: ../src/view/devices/battery.py:114
+#: ../extensions/deviceicon/battery.py:140
msgid "Charging"
msgstr "चार्ज हुँदैछ"
-#: ../src/view/devices/battery.py:117
+#: ../extensions/deviceicon/battery.py:143
msgid "Very little power remaining"
msgstr "एकदमै थोरै शक्‍ति बाँकी छ"
-#: ../src/view/devices/battery.py:123
+#: ../extensions/deviceicon/battery.py:149
#, python-format
msgid "%(hour)d:%(min).2d remaining"
-msgstr "%(घण्टा)d:%(मिनेट).2d बाँकी"
+msgstr "%(hour)d:%(min).2d बाँकी"
-#: ../src/view/devices/battery.py:127
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "चार्ज भयो"
-#: ../src/view/devices/speaker.py:44
+#: ../extensions/deviceicon/network.py:43
+#, python-format
+msgid "IP address: %s"
+msgstr "आइपी अड्रेस: %s"
+
+# 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
+#: ../extensions/deviceicon/network.py:109
+msgid "Disconnect..."
+msgstr "जडान विच्छेद..."
+
+#: ../extensions/deviceicon/network.py:113
+msgid "Create new wireless network"
+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
+#: ../extensions/deviceicon/network.py:119
+#: ../src/jarabe/desktop/meshbox.py:250
+msgid "Connecting..."
+msgstr "जडान हुदैछ..."
+
+# TODO: show the channel number
+#: ../extensions/deviceicon/network.py:123
+#: ../extensions/deviceicon/network.py:179
+#: ../src/jarabe/desktop/meshbox.py:256
+msgid "Connected"
+msgstr "जडान भयो"
+
+#: ../extensions/deviceicon/network.py:139
+msgid "Channel"
+msgstr "माध्यम"
+
+#: ../extensions/deviceicon/network.py:154
+msgid "Wired Network"
+msgstr "तार युक्त संजाल"
+
+#: ../extensions/deviceicon/network.py:182
+msgid "Speed"
+msgstr "गति"
+
+#: ../extensions/deviceicon/network.py:389
+#, python-format
+msgid "%s's network"
+msgstr ""
+
+#: ../extensions/deviceicon/speaker.py:59
msgid "My Speakers"
msgstr "मेरो स्पिकरहरु"
-#: ../src/view/devices/speaker.py:119
+#: ../extensions/deviceicon/speaker.py:133
msgid "Unmute"
msgstr "आवाज खोल"
-#: ../src/view/devices/speaker.py:122
+#: ../extensions/deviceicon/speaker.py:136
msgid "Mute"
msgstr "आवाज बन्द"
-#: ../src/view/devices/network/wireless.py:67
-msgid "Disconnected"
-msgstr "विच्छेद भयो"
-
-#: ../src/view/devices/network/wireless.py:137
-msgid "Channel"
-msgstr "माध्यम"
-
-#: ../src/view/frame/zoomtoolbar.py:34
-msgid "Neighborhood"
-msgstr "छिमेक"
+#: ../extensions/globalkey/screenshot.py:56
+msgid "Mesh"
+msgstr "मेश"
-#: ../src/view/frame/zoomtoolbar.py:36
+#: ../extensions/globalkey/screenshot.py:58
+#: ../src/jarabe/frame/zoomtoolbar.py:38
msgid "Group"
msgstr "समुह"
-#: ../src/view/frame/zoomtoolbar.py:38
+#: ../extensions/globalkey/screenshot.py:60
+#: ../src/jarabe/frame/zoomtoolbar.py:40
msgid "Home"
msgstr "गृह"
-#: ../src/view/frame/zoomtoolbar.py:40
+#: ../extensions/globalkey/screenshot.py:66
+#: ../src/jarabe/frame/zoomtoolbar.py:42
msgid "Activity"
msgstr "क्रियाकलाप"
-#: ../src/controlpanel/cmd.py:26
+#: ../extensions/globalkey/screenshot.py:69
+msgid "Screenshot"
+msgstr "पर्दाछवि"
+
+#: ../extensions/globalkey/screenshot.py:71
+#, python-format
+msgid "Screenshot of \"%s\""
+msgstr ""
+
+#: ../data/sugar.schemas.in.h:1
+msgid "Backup URL"
+msgstr "बैकअप URL"
+
+#: ../data/sugar.schemas.in.h:2
+msgid ""
+"Color for the XO icon that is used throughout the desktop. The string is "
+"composed of the stroke color and fill color, format is that of rbg colors. "
+"Example: #AC32FF,#9A5200"
+msgstr ""
+"XO आईकनको रंग जुन डेस्कटप भरि प्रयोग गरिन्छ । स्ट्रिङ्ग स्ट्रोक रंग र फिल "
+"रंगले बनेको हो, फर्म्याट rbg रंगको हुन्छ। उदाहरण: #AC32FF,#9A5200"
+
+#: ../data/sugar.schemas.in.h:3
+msgid "Corner Delay"
+msgstr "फ्रेम आउन ढिलाइ"
+
+#: ../data/sugar.schemas.in.h:4
+msgid "Delay for the activation of the frame using the corners."
+msgstr "कनँर प्रयोग गरेर ढांचाको सक्रियतालाई ढिलाइ गर्ने।"
+
+#: ../data/sugar.schemas.in.h:5
+msgid "Delay for the activation of the frame using the edges."
+msgstr "उद्विग्न प्रयोग गरेर ढांचाको सक्रियतालाई ढिलाइ गर्ने।"
+
+#: ../data/sugar.schemas.in.h:6
+msgid "Edge Delay"
+msgstr "उद्विग्न ढिलाइ"
+
+#: ../data/sugar.schemas.in.h:7
+msgid "Favorites Layout"
+msgstr "मनपर्दो रूपरेखा"
+
+#: ../data/sugar.schemas.in.h:8
+msgid "Favorites resume mode"
+msgstr "मनपर्दो पुनरारम्भ विधा"
+
+#: ../data/sugar.schemas.in.h:9
+msgid ""
+"If TRUE, Sugar will make us searchable for the other users of the Jabber "
+"server."
+msgstr ""
+"यदि सही हो भने, सुगरले हामिलाई अरु ज्याबर सर्भरको अरु युजरहरुले खोज्न मिल्छ।"
+
+#: ../data/sugar.schemas.in.h:10
+msgid "Jabber Server"
+msgstr "ज्याबर सर्भर"
+
+#: ../data/sugar.schemas.in.h:11
+msgid "Layout of the favorites view."
+msgstr "मनपर्दो दर्श्यको रूपरेखा।"
+
+#: ../data/sugar.schemas.in.h:12
+msgid "Power Automatic"
+msgstr "स्वचालित शक्ती"
+
+#: ../data/sugar.schemas.in.h:13
+msgid "Power Automatic."
+msgstr "स्वचालित शक्ती."
+
+#: ../data/sugar.schemas.in.h:14
+msgid "Power Extreme"
+msgstr "अत्यधिक शक्ती"
+
+#: ../data/sugar.schemas.in.h:15
+msgid "Power Extreme."
+msgstr "अत्यधिक शक्ती."
+
+#: ../data/sugar.schemas.in.h:16
+msgid "Publish to Gadget"
+msgstr "यन्त्रमा प्रकाशित गर"
+
+#: ../data/sugar.schemas.in.h:17
+msgid "Setting for muting the sound device."
+msgstr "ध्वनि यन्त्रको आवाज बन्द गर्ने सेटिङ्ग।"
+
+#: ../data/sugar.schemas.in.h:18
+msgid "Sound Muted"
+msgstr "आवाज बन्द"
+
+#: ../data/sugar.schemas.in.h:20
+msgid "Timezone setting for the system."
+msgstr "यस सिस्टमको समय अंचल सेटिङ्ग।"
+
+#: ../data/sugar.schemas.in.h:21
+msgid "Url of the jabber server to use."
+msgstr "ज्याबर सर्भर चलाउनको लागि चाहिने Url"
+
+#: ../data/sugar.schemas.in.h:22
+msgid "Url where the backup is saved to."
+msgstr "ब्याकप बचत गर्ने ठाउँको Url"
+
+#: ../data/sugar.schemas.in.h:23
+msgid "User Color"
+msgstr "युजरको रङ्ग"
+
+#: ../data/sugar.schemas.in.h:24
+msgid "User Name"
+msgstr "युजरको नाम"
+
+#: ../data/sugar.schemas.in.h:25
+msgid "User name that is used throughout the desktop."
+msgstr "डेस्कटपभरि प्रयोग हुने युजरको नाम।"
+
+#: ../data/sugar.schemas.in.h:26
+msgid "Volume Level"
+msgstr "आवाज सतह"
+
+#: ../data/sugar.schemas.in.h:27
+msgid "Volume level for the sound device."
+msgstr "आवाज सतह यन्त्रको लागि।"
+
+#: ../data/sugar.schemas.in.h:28
+msgid ""
+"When in resume mode, clicking on a favorite icon will cause the last entry "
+"for that activity to be resumed."
+msgstr ""
+"पुनरारम्भ मोडमा भएको बेलामा कृपापात्रमा क्लिक गरेमा क्रियाकलापको अन्तिम "
+"प्रविष्टि पुनरारम्भ हुन्छ।"
+
+#: ../src/jarabe/controlpanel/cmd.py:28
#, python-format
-#, fuzzy
msgid ""
"sugar-control-panel: WARNING, found more than one option with the same name: "
"%s module: %r"
msgstr ""
-"सुगर-कन्ट्रोल-प्यानल: सावधान, त्यही नाम भएको एउटा भन्दा धेरै रोजाई भेटियो: "
-"%ऽ मोडियुल: %r"
+"सुगर-कन्ट्रोल-प्यानल: सावधान, त्यही नाम भएको एउटा भन्दा धेरै रोजाई भेटियो: %"
+"s मोडियुल: %r"
-#: ../src/controlpanel/cmd.py:28
+#: ../src/jarabe/controlpanel/cmd.py:30
#, python-format
msgid "sugar-control-panel: key=%s not an available option"
-msgstr "सुगर-कन्ट्रोल-प्यानल:कि=%s उपलब्ध छैन"
+msgstr "सुगर-कन्ट्रोल-प्यानल: key=%s उपलब्ध छैन"
-#: ../src/controlpanel/cmd.py:29
+#: ../src/jarabe/controlpanel/cmd.py:31
#, python-format
msgid "sugar-control-panel: %s"
-msgstr "सुगर-कन्ट्रोल-प्यानल:%s"
+msgstr "सुगर-कन्ट्रोल-प्यानल: %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.
+#. TRANS: Translators, there's a empty line at the end of this string,
+#. which must appear in the translated string (msgstr) as well.
+#: ../src/jarabe/controlpanel/cmd.py:37
msgid ""
"Usage: sugar-control-panel [ option ] key [ args ... ] \n"
" Control for the sugar environment. \n"
@@ -275,340 +530,602 @@ 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 ""
-"प्रयोग: सुगर-कन्ट्रोल-प्यानल [ option ] कि [args ...] \n"
-"- - - - सुगर वातावरणको लागी कन्ट्रोल।\n"
-"- - - - Option:\n"
-"_ _ _ _ -h _ _ _ _ _ _ यो सहयोग सन्देश देखाउ र निस्क \n"
-" _ _ _ _ -l _ _ _ _ _ _ भएका सबै सेवाहरु सुचिमा देखाउ\n"
-"_ _ _ _ -h key _ _ _ _ _ _ यो कि सम्बन्धि जानकारी देखाउ \n"
-"_ _ _ _ -g key _ _ _ _ _ _ किको अहिलेको मान लिउ \n"
-"_ _ _ _ -s key _ _ _ _ _ _ किको लागी अहिलेको मान राख \n"
-"_ _ _ _"
-
-#: ../src/controlpanel/cmd.py:45
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "परिवर्तन लागू गर्न सुगर पुन:शुरु गर्नु पर्छ ।\n"
+"प्रयोग: सुगर-कन्ट्रोल-प्यानल [ option ] कि [ args ... ] \n"
+" सुगर वातावरणको लागी कन्ट्रोल।\n"
+" Option: \n"
+" -h यो सहयोग सन्देश देखाउ र निस्क \n"
+" -l भएका सबै सेवाहरु सुचिमा देखाउ \n"
+" -h कि यो कि सम्बन्धि जानकारी देखाउ \n"
+" -g कि किको अहिलेको मान लिउ \n"
+" -s कि किको लागी अहिलेको मान राख \n"
+" -c कि किको लागी अहिलेको मान सफा गर \n"
+" "
-#: ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "रद्द"
+#: ../src/jarabe/controlpanel/cmd.py:50
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr "परिवर्तन लागू गर्न सुगर पुन:शुरु गर्नु पर्छ । \n"
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:294
-msgid "Ok"
-msgstr "हुन्छ"
+#: ../src/jarabe/controlpanel/gui.py:275
+msgid "Warning"
+msgstr "सावधान"
-#: ../src/controlpanel/sectionview.py:34 ../src/controlpanel/gui.py:260
+#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "परिवर्तनका लागी पुण: सुरु गर्न आवश्यक छ"
-#: ../src/controlpanel/gui.py:259
-msgid "Warning"
-msgstr "सावधान"
-
-#: ../src/controlpanel/gui.py:263
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "परिवर्तनहरु रद्द गर"
-#: ../src/controlpanel/gui.py:267
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "पछी"
-#: ../src/controlpanel/gui.py:271
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "पुन: सुरु गर"
-#: ../src/controlpanel/model/aboutme.py:44
-msgid "You must enter a name."
-msgstr "तिमीले नाम हाल्नै पर्छ"
+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
+msgid "Done"
+msgstr "भयो"
-#: ../src/controlpanel/model/aboutme.py:69
-#, python-format
-msgid "stroke: color=%s hue=%s"
-msgstr "ब्रसको धर्को: ॒॒॒॒___रङ्ग=%s ह्‍यु‍=%s"
+#: ../src/jarabe/controlpanel/toolbar.py:115
+#: ../src/jarabe/desktop/homebox.py:111
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
+msgid "Cancel"
+msgstr "रद्द"
-#: ../src/controlpanel/model/aboutme.py:72
-#, python-format
-msgid "stroke: %s"
-msgstr "ब्रसको धर्का:___%s"
+#: ../src/jarabe/controlpanel/toolbar.py:121
+#: ../src/jarabe/desktop/favoritesview.py:339
+msgid "Ok"
+msgstr "हुन्छ"
-#: ../src/controlpanel/model/aboutme.py:74
+# TRANS: label for the freeform layout in the favorites view
+#. TRANS: label for the freeform layout in the favorites view
+#: ../src/jarabe/desktop/favoriteslayout.py:116
+msgid "Freeform"
+msgstr "स्वतन्त्र आकारको"
+
+# TRANS: label for the ring layout in the favorites view
+#. TRANS: label for the ring layout in the favorites view
+#: ../src/jarabe/desktop/favoriteslayout.py:198
+msgid "Ring"
+msgstr "औँठी"
+
+# TRANS: label for the spiral layout in the favorites view
+#. TRANS: label for the spiral layout in the favorites view
+#: ../src/jarabe/desktop/favoriteslayout.py:334
+msgid "Spiral"
+msgstr "पेंचदार"
+
+# TRANS: label for the box layout in the favorites view
+#. TRANS: label for the box layout in the favorites view
+#: ../src/jarabe/desktop/favoriteslayout.py:401
+msgid "Box"
+msgstr "बाकस"
+
+# TRANS: label for the box layout in the favorites view
+#. TRANS: label for the box layout in the favorites view
+#: ../src/jarabe/desktop/favoriteslayout.py:442
+msgid "Triangle"
+msgstr "त्रिकोण"
+
+#: ../src/jarabe/desktop/favoritesview.py:330
+msgid "Registration Failed"
+msgstr "दर्ता असफल भयो"
+
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
-msgid "fill: color=%s hue=%s"
-msgstr "भर:___रङ्ग=%s ह्‍यु=%s"
+msgid "%s"
+msgstr "%s"
+
+#: ../src/jarabe/desktop/favoritesview.py:333
+msgid "Registration Successful"
+msgstr "दर्ता सफल"
-#: ../src/controlpanel/model/aboutme.py:76
+#: ../src/jarabe/desktop/favoritesview.py:334
+msgid "You are now registered with your school server."
+msgstr "अब तपाईँको नाम बिद्यालयको सर्भरमा दर्ता भइसक्यो।"
+
+#: ../src/jarabe/desktop/favoritesview.py:674
+msgid "Register"
+msgstr "दर्ता"
+
+#: ../src/jarabe/desktop/homebox.py:67
+msgid "Confirm erase"
+msgstr "साँच्चै मेट्ने"
+
+#: ../src/jarabe/desktop/homebox.py:69
#, python-format
-msgid "fill: %s"
-msgstr "भर:॒॒॒॒____%ऽ"
+msgid "Confirm erase: Do you want to permanently erase %s?"
+msgstr "साँच्छै मेट्ने: %s लाई सधैँको लागी मेट्न चहान्छौ?"
-#: ../src/controlpanel/model/aboutme.py:87
-msgid "Error in specified color modifiers."
-msgstr "तोकिएको रङ्ग परिमार्जकहरुमा त्रुटी छ।"
+# self._stop_item = MenuItem(_('Stop download'), 'stock-close')
+# TODO: Implement stopping downloads
+# self._stop_item.connect('activate', self._stop_item_activate_cb)
+# self.append_menu_item(self._stop_item)
+#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
+msgid "Keep"
+msgstr "राख"
-#: ../src/controlpanel/model/aboutme.py:90
-msgid "Error in specified colors."
-msgstr "तोकिएको रङ्गहरुमा त्रुटी छ।"
+#: ../src/jarabe/desktop/homebox.py:76
+#: ../src/jarabe/journal/journaltoolbox.py:357
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
+msgid "Erase"
+msgstr "मेट"
-#: ../src/controlpanel/model/aboutxo.py:24
-msgid "Not available"
-msgstr "उपलब्ध छैन"
+#: ../src/jarabe/desktop/homebox.py:106
+msgid "Software Update"
+msgstr "सॉफ्टवेयर आधुनिकीकरण"
-#: ../src/controlpanel/model/datetime.py:85
-msgid "Error timezone does not exist."
-msgstr "त्रुटि, समयक्षेत्र उपलब्ध छैन।"
+#: ../src/jarabe/desktop/homebox.py:107
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr "नया सफ्टवेर चलाउनका निमीत्त तिम्रो क्रियाकलापहरु अप्डेट गर"
-#: ../src/controlpanel/model/frame.py:38 ../src/controlpanel/model/frame.py:60
-msgid "Value must be an integer."
-msgstr "गुण संख्या हुनु पर्छ।"
+#: ../src/jarabe/desktop/homebox.py:116
+msgid "Check now"
+msgstr "अहिले जाँच गर"
-#: ../src/controlpanel/model/language.py:28
-#, fuzzy
-msgid "Could not access ~/.i18n. Create standard settings."
-msgstr "%s मा पहुँच भएन। मानक सेटिङ्गहरु बनाऊ।"
+#: ../src/jarabe/desktop/homebox.py:233
+msgid "List view"
+msgstr "सुची दृश्य"
-#: ../src/controlpanel/model/language.py:104
-#, python-format
-msgid "Language for code=%s could not be determined."
-msgstr "कोड=%sको भाषा निश्चित गर्न सकिएन।"
+#: ../src/jarabe/desktop/homebox.py:234
+msgid "<Ctrl>2"
+msgstr "<Ctrl>२"
-#: ../src/controlpanel/model/language.py:121
-#, python-format
-msgid "Sorry I do not speak '%s'."
-msgstr "माफ गर्नुस, म '%s' बोल्दिन।"
+#: ../src/jarabe/desktop/homebox.py:296
+msgid "Favorites view"
+msgstr "मन्पर्दो दृश्य"
-#: ../src/controlpanel/model/network.py:48
-msgid "You must enter a server."
-msgstr "तिमिले सर्भर हाल्नु पर्छ"
+#: ../src/jarabe/desktop/homebox.py:297
+msgid "<Ctrl>1"
+msgstr "<Ctrl>१"
-#: ../src/controlpanel/model/network.py:63
-msgid "State is unknown."
-msgstr "अवस्था अज्ञात छ।"
+#: ../src/jarabe/desktop/keydialog.py:131
+msgid "Key Type:"
+msgstr "कुञ्जी प्रकार:"
-#: ../src/controlpanel/model/network.py:83
-msgid "Error in specified radio argument use on/off."
-msgstr "तोकिएको रेडियो निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
+#: ../src/jarabe/desktop/keydialog.py:151
+msgid "Authentication Type:"
+msgstr "प्रमाणीकरण प्रकार:"
-#: ../src/controlpanel/model/power.py:57
-msgid "Error in automatic pm argument, use on/off."
-msgstr "आफैँ चल्ने pm निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर।"
+#: ../src/jarabe/desktop/keydialog.py:215
+msgid "WPA & WPA2 Personal"
+msgstr "WPA र WPA2 निजी"
-#: ../src/controlpanel/model/power.py:86
-msgid "Error in extreme pm argument, use on/off."
-msgstr "अन्तिम रुपको pm निर्देशनमा त्रुटि छ, बन्द/खुला प्रयोग गर। "
+#: ../src/jarabe/desktop/keydialog.py:224
+msgid "Wireless Security:"
+msgstr "तारबिनाको लागि सुरक्षा"
-#: ../src/controlpanel/view/aboutme.py:32
-msgid "About Me"
-msgstr "म बारे"
+#: ../src/jarabe/desktop/meshbox.py:134
+msgid "Connect"
+msgstr "जोड"
-#: ../src/controlpanel/view/aboutme.py:134
-#, fuzzy
-msgid "Click to change your color:"
-msgstr "रङ्ग परिवर्तन गर्न क्लिक गरः"
+#: ../src/jarabe/desktop/meshbox.py:138
+msgid "Disconnect"
+msgstr "विच्छेद भयो"
-#: ../src/controlpanel/view/aboutxo.py:26
-msgid "About my XO"
-msgstr "मिरो XO बारे"
+# TRANS: Action label for resuming an activity.
+#. TRANS: Action label for resuming an activity.
+#: ../src/jarabe/desktop/meshbox.py:449
+#: ../src/jarabe/frame/activitiestray.py:761
+#: ../src/jarabe/journal/journaltoolbox.py:425
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
+msgid "Resume"
+msgstr "पुनरारम्भ"
-#: ../src/controlpanel/view/aboutxo.py:47
-msgid "Identity"
-msgstr "व्यक्तित्ब"
+#: ../src/jarabe/desktop/meshbox.py:454
+#: ../src/jarabe/frame/activitiestray.py:235
+msgid "Join"
+msgstr "सहभागी होऊ"
-#: ../src/controlpanel/view/aboutxo.py:56
-msgid "Serial Number:"
-msgstr "क्रमिक अङ्क"
+#: ../src/jarabe/desktop/schoolserver.py:34
+msgid "Cannot obtain data needed for registration."
+msgstr "रजिस्टरको लागि चाइने तथ्याङ्क प्राप्त गर्न सकिएन।"
-#: ../src/controlpanel/view/aboutxo.py:79
-#, fuzzy
-msgid "Software"
-msgstr "सफ्टवेर"
+#: ../src/jarabe/desktop/schoolserver.py:51
+msgid "Cannot connect to the server."
+msgstr "सर्भरमा जड़ान हुन सकेन।"
-#: ../src/controlpanel/view/aboutxo.py:88
-msgid "Build:"
-msgstr "बनाइ:"
+#: ../src/jarabe/desktop/schoolserver.py:56
+msgid "The server could not complete the request."
+msgstr "सर्भरले अनुरोध पुरा गर्न सकेन।"
-#: ../src/controlpanel/view/aboutxo.py:103
-#, fuzzy
-msgid "Firmware:"
-msgstr "फर्मवेर"
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
+msgid "Decline"
+msgstr "नाई"
-#: ../src/controlpanel/view/datetime.py:29
-msgid "Date & Time"
-msgstr "मिती & समय"
+#: ../src/jarabe/frame/activitiestray.py:650
+#, python-format
+msgid "%dB"
+msgstr "%dB"
-#: ../src/controlpanel/view/datetime.py:72
-msgid "Timezone"
-msgstr "समयक्षेत्र"
+#: ../src/jarabe/frame/activitiestray.py:652
+#, python-format
+msgid "%dKB"
+msgstr "%dKB"
-#: ../src/controlpanel/view/frame.py:28
-msgid "Frame"
-msgstr "चौखट"
+#: ../src/jarabe/frame/activitiestray.py:654
+#, python-format
+msgid "%dMB"
+msgstr "%dMB"
-#: ../src/controlpanel/view/frame.py:30
-msgid "never"
-msgstr "कहिलेपनि नगर"
+#: ../src/jarabe/frame/activitiestray.py:671
+#, python-format
+msgid "%s of %s"
+msgstr "%s को %s"
-#: ../src/controlpanel/view/frame.py:31
-msgid "instantaneous"
-msgstr "तात्कालिक"
+#: ../src/jarabe/frame/activitiestray.py:683
+#, python-format
+msgid "Transfer from %r"
+msgstr "%r बाट सार्नुहोस"
+
+#: ../src/jarabe/frame/activitiestray.py:693
+msgid "Accept"
+msgstr "स्विकार"
-#: ../src/controlpanel/view/frame.py:32
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
#, python-format
-#, fuzzy
-msgid "%s seconds"
-msgstr "%d सेकेण्ड"
+msgid "%s (%s)"
+msgstr "%s (%s)"
-#: ../src/controlpanel/view/frame.py:56
-msgid "Activation Delay"
-msgstr "सुरु गर्न ढिलाइ"
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr ""
-#: ../src/controlpanel/view/frame.py:80
-msgid "Corner"
-msgstr "कुना"
+#: ../src/jarabe/frame/activitiestray.py:810
+#, python-format
+msgid "Transfer to %r"
+msgstr "%r मा सार्नुहोस"
-#: ../src/controlpanel/view/frame.py:115
-msgid "Edge"
-msgstr "कुना"
+#: ../src/jarabe/frame/clipboardmenu.py:52
+msgid "Remove"
+msgstr "हटाऊ"
-#: ../src/controlpanel/view/language.py:29
-#: ../src/controlpanel/view/language.py:74
-msgid "Language"
-msgstr "भाषा"
+#: ../src/jarabe/frame/clipboardmenu.py:57
+#: ../src/jarabe/frame/clipboardmenu.py:80
+msgid "Open"
+msgstr "खोल"
-#: ../src/controlpanel/view/network.py:28
-msgid "Network"
-msgstr "सञ्जाल"
+#: ../src/jarabe/frame/clipboardmenu.py:85
+msgid "Open with"
+msgstr "साथ खोल"
-#: ../src/controlpanel/view/network.py:53
-msgid "Wireless"
-msgstr "तार विना"
+#: ../src/jarabe/frame/clipboardobject.py:49
+#, python-format
+msgid "%s clipping"
+msgstr "%s क्लिपिङ"
-#: ../src/controlpanel/view/network.py:61
-msgid "Radio:"
-msgstr "रेडियो"
+#: ../src/jarabe/frame/zoomtoolbar.py:36
+msgid "Neighborhood"
+msgstr "छिमेक"
-#: ../src/controlpanel/view/network.py:94
-msgid "Mesh"
-msgstr "मेश"
+#: ../src/jarabe/intro/window.py:124
+msgid "Click to change color:"
+msgstr "रङ्ग परिवर्तन गर्न क्लिक गरः"
-#: ../src/controlpanel/view/network.py:103
-#, fuzzy
-msgid "Server:"
-msgstr "सर्भर"
+#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
+msgid "Back"
+msgstr "पछाडि"
-#: ../src/controlpanel/view/power.py:27
-msgid "Power"
-msgstr "शक्ति"
+#: ../src/jarabe/intro/window.py:191
+msgid "Next"
+msgstr "अर्को"
-#: ../src/controlpanel/view/power.py:51
-msgid "Power management"
-msgstr "शक्तिको प्रभन्धकर्ता"
+#: ../src/jarabe/journal/collapsedentry.py:258
+#: ../src/jarabe/journal/expandedentry.py:159
+#: ../src/jarabe/journal/palettes.py:66
+msgid "Untitled"
+msgstr "बिना शिर्षक"
+
+#: ../src/jarabe/journal/expandedentry.py:205
+msgid "No preview"
+msgstr "पूर्वावलोकन छैन"
+
+#: ../src/jarabe/journal/expandedentry.py:224
+msgid "Participants:"
+msgstr "भागिदारहरु"
+
+#: ../src/jarabe/journal/expandedentry.py:247
+msgid "Description:"
+msgstr "वर्णनः"
+
+#: ../src/jarabe/journal/expandedentry.py:273
+msgid "Tags:"
+msgstr "चिनोहरु:"
+
+#: ../src/jarabe/journal/journalactivity.py:108
+#: ../src/jarabe/journal/volumestoolbar.py:47
+msgid "Journal"
+msgstr "पंजिका"
+
+#: ../src/jarabe/journal/journaltoolbox.py:65
+msgid "Search"
+msgstr "खोज"
+
+#: ../src/jarabe/journal/journaltoolbox.py:124
+msgid "Anytime"
+msgstr "कुनैबेला"
+
+#: ../src/jarabe/journal/journaltoolbox.py:126
+msgid "Today"
+msgstr "आज"
+
+#: ../src/jarabe/journal/journaltoolbox.py:128
+msgid "Since yesterday"
+msgstr "हिजो देखि"
+
+# TRANS: Filter entries modified during the last 7 days.
+#. TRANS: Filter entries modified during the last 7 days.
+#: ../src/jarabe/journal/journaltoolbox.py:130
+msgid "Past week"
+msgstr "गत हप्ता"
+
+# TRANS: Filter entries modified during the last 30 days.
+#. TRANS: Filter entries modified during the last 30 days.
+#: ../src/jarabe/journal/journaltoolbox.py:132
+msgid "Past month"
+msgstr "गत महिना"
+
+# TRANS: Filter entries modified during the last 356 days.
+#. TRANS: Filter entries modified during the last 356 days.
+#: ../src/jarabe/journal/journaltoolbox.py:134
+msgid "Past year"
+msgstr "गत वर्ष"
+
+#: ../src/jarabe/journal/journaltoolbox.py:141
+msgid "Anyone"
+msgstr "जो सुकै"
+
+#: ../src/jarabe/journal/journaltoolbox.py:143
+msgid "My friends"
+msgstr "मेरा साथीहरु"
+
+#: ../src/jarabe/journal/journaltoolbox.py:144
+msgid "My class"
+msgstr "मेरो कक्षा"
+
+# TRANS: Item in a combo box that filters by entry type.
+#. TRANS: Item in a combo box that filters by entry type.
+#: ../src/jarabe/journal/journaltoolbox.py:271
+msgid "Anything"
+msgstr "कुनैपनि"
+
+# TODO: Add "Start with" menu item
+#: ../src/jarabe/journal/journaltoolbox.py:347
+#: ../src/jarabe/journal/palettes.py:90
+msgid "Copy"
+msgstr "प्रतिलिपि"
+
+# TRANS: Action label for starting an entry.
+#. TRANS: Action label for starting an entry.
+#: ../src/jarabe/journal/journaltoolbox.py:428
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
+msgid "Start"
+msgstr "सुरु गर"
-#: ../src/controlpanel/view/power.py:61
-msgid "Automatic power management (increases battery life)"
-msgstr "आफैँ चल्ने शक्तिको प्रबन्धकर्ता (ब्याटरिको जीवन बढाउँछ)"
+#: ../src/jarabe/journal/listview.py:40
+msgid "Your Journal is empty"
+msgstr "तिम्रो पंजिका खाली छ"
-#: ../src/controlpanel/view/power.py:89
-msgid ""
-"Extreme power management (disables wireless radio, increases battery life)"
-msgstr ""
-"अति किफायत शक्तिको प्रबन्धकर्ता ( तार बिनाको रेडियो असमर्थ पार्छ, ब्याटरिको "
-"जीवन बढाउँछ)"
+#: ../src/jarabe/journal/listview.py:41
+msgid "No matching entries "
+msgstr "मिल्ने लेखा छैन "
-#: ../src/view/devices/network/mesh.py:111
-msgid "Connected to a School Mesh Portal"
-msgstr "विद्यालय मेश पोर्टलमा जडान भयो"
+#: ../src/jarabe/journal/listview.py:370
+msgid "Clear search"
+msgstr "खोजलाई सफा गर"
-#: ../src/view/devices/network/mesh.py:113
-msgid "Looking for a School Mesh Portal..."
-msgstr "विद्यालय मेश पोर्टल खोज्दै..."
+#: ../src/jarabe/journal/misc.py:93
+msgid "No date"
+msgstr "मिति छैन"
-#: ../src/view/devices/network/mesh.py:116
-msgid "Connected to an XO Mesh Portal"
-msgstr "XO मेश पोर्टलमा जडान भयो"
+#: ../src/jarabe/journal/modalalert.py:63
+msgid "Your Journal is full"
+msgstr "तिम्रो पंजिका भरिएको छ"
-#: ../src/view/devices/network/mesh.py:118
-msgid "Looking for an XO Mesh Portal..."
-msgstr "XO मेश पोर्टल खोज्दै..."
+#: ../src/jarabe/journal/modalalert.py:67
+msgid "Please delete some old Journal entries to make space for new ones."
+msgstr "क्रिपया कुनै पुरानो पंजिकाहरु हटाएर नया पंजिकाहरु को लागि ठाउ बनाउ।"
-#: ../src/view/devices/network/mesh.py:121
-msgid "Connected to a Simple Mesh"
-msgstr "साधारण मेशमा जडान भयो"
+#: ../src/jarabe/journal/modalalert.py:79
+msgid "Show Journal"
+msgstr "पंजिका देखाउ"
-#: ../src/view/devices/network/mesh.py:123
-msgid "Starting a Simple Mesh"
-msgstr "साधारण मेश शुरु गर्दै"
+#: ../src/jarabe/journal/objectchooser.py:147
+msgid "Choose an object"
+msgstr "वस्तु छान"
-#: ../src/view/devices/network/mesh.py:130
-msgid "Unknown Mesh"
-msgstr "अज्ञात मेश"
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "बन्द"
-#: ../src/view/frame/activitiestray.py:210
-msgid "Decline"
-msgstr "नाई"
+#: ../src/jarabe/journal/palettes.py:73
+msgid "Resume with"
+msgstr "पुनरारम्भ सहित"
-#: ../src/view/home/favoritesview.py:285
-msgid "Registration Failed"
-msgstr "दर्ता असफल भयो"
+#: ../src/jarabe/journal/palettes.py:76
+msgid "Start with"
+msgstr "शुरु सहित"
-#: ../src/view/home/favoritesview.py:286
-#, python-format
-msgid "%s"
-msgstr "%स"
+#: ../src/jarabe/journal/palettes.py:98
+msgid "Send to"
+msgstr "पठाउनु"
-#: ../src/view/home/favoritesview.py:288
-msgid "Registration Successful"
-msgstr "दर्ता सफल"
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "वृत्तांत हेर"
-#: ../src/view/home/favoritesview.py:289
-msgid "You are now registered with your school server."
-msgstr "अब तपाईँको नाम बिद्यालयको सर्भरमा दर्ता भइसक्यो।"
+#: ../src/jarabe/journal/palettes.py:185
+msgid "No friends present"
+msgstr "कुनै पनि साथीहरु हाजीर छैन"
+
+#: ../src/jarabe/journal/palettes.py:190
+msgid "No valid connection found"
+msgstr "कुनै पनि सदर संयोग भेटिएन"
-#: ../src/view/home/favoritesview.py:405
-msgid "Control Panel"
-msgstr "नियन्त्रण चौकोस"
+#: ../src/jarabe/journal/palettes.py:218
+msgid "No activity to resume entry"
+msgstr "पुनरारम्भ गर्न कुनै क्रियाकलाप छैन"
+
+#: ../src/jarabe/journal/palettes.py:220
+msgid "No activity to start entry"
+msgstr "सुरु गर्न कुनै क्रियाकलाप छैन"
+
+#: ../src/jarabe/view/buddymenu.py:62
+msgid "Remove friend"
+msgstr "साथी हटाऊ"
-#: ../src/view/home/favoritesview.py:416
+#: ../src/jarabe/view/buddymenu.py:65
+msgid "Make friend"
+msgstr "साथी बनाऊ"
+
+#: ../src/jarabe/view/buddymenu.py:82
+msgid "My Settings"
+msgstr "मेरो योजनाहरु"
+
+#: ../src/jarabe/view/buddymenu.py:90
+msgid "Logout"
+msgstr "लगआउट"
+
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "पून: सुरु"
-#: ../src/view/home/favoritesview.py:421
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "बन्द"
-#: ../src/view/home/favoritesview.py:427
-msgid "Register"
-msgstr "दर्ता"
+#: ../src/jarabe/view/buddymenu.py:135
+#, python-format
+msgid "Invite to %s"
+msgstr "%s लाई निम्ता देऊ"
-#: ../src/view/palettes.py:42
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "शुरु हुदैछ..."
-#: ../src/view/palettes.py:72
+#. TODO: share-with, keep
+#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "स्रोत हेर"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "बन्द गर"
-#: ../src/view/palettes.py:104
-msgid "Start"
-msgstr "सुरु गर"
-
-#: ../src/view/palettes.py:132
+#: ../src/jarabe/view/palettes.py:174
msgid "Remove favorite"
msgstr "प्रिय हटाउ"
-#: ../src/view/palettes.py:136
+#: ../src/jarabe/view/palettes.py:178
msgid "Make favorite"
msgstr "प्रिय बनाउ"
-#: ../src/view/palettes.py:185
+#: ../src/jarabe/view/palettes.py:241
msgid "Show contents"
msgstr "वस्तुहरु देखाउ"
-#: ../src/view/palettes.py:209
+#: ../src/jarabe/view/palettes.py:263 ../src/jarabe/view/palettes.py:313
#, python-format
msgid "%(free_space)d MB Free"
-msgstr "%(खालि॒_ठाउँ )d MB खालि"
+msgstr "%(free_space)d MB खालि"
+
+#: ../src/jarabe/view/palettes.py:288
+msgid "Unmount"
+msgstr "हटाऊ"
+
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "दृष्टांत मुल"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "मुल"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "क्रियाकलाप बन्डलको मुल"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "स्रोत हेर : %r"
+
+#~ msgid ""
+#~ "© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
+#~ msgstr ""
+#~ "© २००८ वान ल्यप् टप पर चाईल्ड असोसिएसन आइ एन सि; रेड ह्यट आइ एन सि; र अरु "
+#~ "निर्माताहरु।"
+
+#~ msgid "Document"
+#~ msgstr "कागतपत्र"
+
+#~ msgid "Resume by default"
+#~ msgstr "पुनरारम्भद्वारा बकाया"
+
+#~ msgid "Encryption Type:"
+#~ 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
+#, fuzzy
+#~ msgid "Disconnecting..."
+#~ msgstr "जडान विच्छेद"
+
+#~ msgid "Mesh Network"
+#~ msgstr "मेश सञ्जाल"
+
+#~ msgid "Disconnected"
+#~ msgstr "विच्छेद भयो"
+
+#~ msgid "About my XO"
+#~ msgstr "मिरो XO बारे"
+
+#~ msgid "Connected to a School Mesh Portal"
+#~ msgstr "विद्यालय मेश पोर्टलमा जडान भयो"
+
+#~ msgid "Looking for a School Mesh Portal..."
+#~ msgstr "विद्यालय मेश पोर्टल खोज्दै..."
+
+#~ msgid "Connected to an XO Mesh Portal"
+#~ msgstr "XO मेश पोर्टलमा जडान भयो"
+
+#~ msgid "Looking for an XO Mesh Portal..."
+#~ msgstr "XO मेश पोर्टल खोज्दै..."
+
+#~ msgid "Connected to a Simple Mesh"
+#~ msgstr "साधारण मेशमा जडान भयो"
+
+#~ msgid "Starting a Simple Mesh"
+#~ msgstr "साधारण मेश शुरु गर्दै"
+
+#~ msgid "Unknown Mesh"
+#~ msgstr "अज्ञात मेश"
+
+#, python-format
+#~ msgid "Clipboard object: %s."
+#~ msgstr "क्लिपपाटी वस्तु: %s."
+
+#~ msgid "You must enter a server."
+#~ msgstr "तिमिले सर्भर हाल्नु पर्छ"
+
+#~ msgid "Control Panel"
+#~ msgstr "नियन्त्रण चौकोस"
#~ msgid "off"
#~ msgstr "बन्द"
@@ -666,9 +1183,6 @@ msgstr "%(खालि॒_ठाउँ )d MB खालि"
#~ msgid "Redo"
#~ msgstr "नयाँस्थिति"
-#~ msgid "Copy"
-#~ msgstr "प्रतिलिपि"
-
#~ msgid "Paste"
#~ msgstr "टाँस"
diff --git a/po/nl.po b/po/nl.po
index e91fe05..d70783b 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -6,14 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-01-28 15:45-0500\n"
+"POT-Creation-Date: 2009-06-11 00:31-0400\n"
+"PO-Revision-Date: 2009-07-31 16:03-0400\n"
"Last-Translator: Myckel Habets <myckel@sdf.lonestar.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.1.0rc2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 1.2.1\n"
#: ../extensions/cpsection/aboutme/__init__.py:24
msgid "About Me"
@@ -63,50 +65,43 @@ msgstr "Klik om de kleur te veranderen:"
msgid "About my Computer"
msgstr "Over mijn computer"
-#: ../extensions/cpsection/aboutcomputer/model.py:26
+#: ../extensions/cpsection/aboutcomputer/model.py:28
msgid "Not available"
msgstr "Niet beschikbaar"
-#: ../extensions/cpsection/aboutcomputer/view.py:59
+#: ../extensions/cpsection/aboutcomputer/view.py:60
msgid "Identity"
msgstr "Identiteit"
-#: ../extensions/cpsection/aboutcomputer/view.py:68
+#: ../extensions/cpsection/aboutcomputer/view.py:69
msgid "Serial Number:"
msgstr "Serienummer:"
-#: ../extensions/cpsection/aboutcomputer/view.py:90
+#: ../extensions/cpsection/aboutcomputer/view.py:91
msgid "Software"
msgstr "Software"
-#: ../extensions/cpsection/aboutcomputer/view.py:99
+#: ../extensions/cpsection/aboutcomputer/view.py:100
msgid "Build:"
msgstr "Bouw:"
-#: ../extensions/cpsection/aboutcomputer/view.py:114
+#: ../extensions/cpsection/aboutcomputer/view.py:115
msgid "Sugar:"
msgstr "Sugar:"
-#: ../extensions/cpsection/aboutcomputer/view.py:130
+#: ../extensions/cpsection/aboutcomputer/view.py:131
msgid "Firmware:"
msgstr "Firmware:"
-#: ../extensions/cpsection/aboutcomputer/view.py:145
+#: ../extensions/cpsection/aboutcomputer/view.py:146
msgid "Wireless Firmware:"
msgstr "Firmware draadloos netwerk:"
-#: ../extensions/cpsection/aboutcomputer/view.py:168
+#: ../extensions/cpsection/aboutcomputer/view.py:169
msgid "Copyright and License"
msgstr "Copyright en licentie"
-#: ../extensions/cpsection/aboutcomputer/view.py:176
-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."
-
-#: ../extensions/cpsection/aboutcomputer/view.py:183
+#: ../extensions/cpsection/aboutcomputer/view.py:184
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 "
@@ -118,7 +113,7 @@ msgstr ""
"je mag het aanpassen en/of kopieën distribueren onder de condities zoals "
"vermeld in de licentie."
-#: ../extensions/cpsection/aboutcomputer/view.py:195
+#: ../extensions/cpsection/aboutcomputer/view.py:196
msgid "Full license:"
msgstr "Volledige licentie:"
@@ -271,7 +266,7 @@ msgstr ""
"Extreem energiebeheer (deactiveert draadloze zender, verhoogt gebruiksduur "
"accu)"
-#: ../extensions/deviceicon/battery.py:56
+#: ../extensions/deviceicon/battery.py:58
msgid "My Battery"
msgstr "Mijn Accu"
@@ -292,77 +287,91 @@ msgstr "Heel weinig energie over"
msgid "%(hour)d:%(min).2d remaining"
msgstr "%(hour)d:%(min).2d over"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "Opgeladen"
-#: ../extensions/deviceicon/network.py:40
+#: ../extensions/deviceicon/network.py:43
#, python-format
msgid "IP address: %s"
msgstr "IP adres: %s"
-#: ../extensions/deviceicon/network.py:104
+#: ../extensions/deviceicon/network.py:109
msgid "Disconnect..."
msgstr "Verbinding verbreken..."
-#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../extensions/deviceicon/network.py:113
+msgid "Create new wireless network"
+msgstr "Nieuw draadloos netwerk aanmaken"
+
+#: ../extensions/deviceicon/network.py:119
+#: ../src/jarabe/desktop/meshbox.py:250
msgid "Connecting..."
msgstr "Verbinden..."
# TODO: show the channel number
-#: ../extensions/deviceicon/network.py:113
-#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../extensions/deviceicon/network.py:123
+#: ../extensions/deviceicon/network.py:179
+#: ../src/jarabe/desktop/meshbox.py:256
msgid "Connected"
msgstr "Verbonden"
-#: ../extensions/deviceicon/network.py:126
+#: ../extensions/deviceicon/network.py:139
msgid "Channel"
msgstr "Kanaal"
-#: ../extensions/deviceicon/network.py:141
+#: ../extensions/deviceicon/network.py:154
msgid "Wired Network"
msgstr "Bedraad netwerk"
-#: ../extensions/deviceicon/network.py:169
+#: ../extensions/deviceicon/network.py:182
msgid "Speed"
msgstr "Snelheid"
-#: ../extensions/deviceicon/speaker.py:46
+#: ../extensions/deviceicon/network.py:389
+#, python-format
+msgid "%s's network"
+msgstr "%s's netwerk"
+
+#: ../extensions/deviceicon/speaker.py:59
msgid "My Speakers"
msgstr "Mijn Speakers"
-#: ../extensions/deviceicon/speaker.py:128
+#: ../extensions/deviceicon/speaker.py:133
msgid "Unmute"
msgstr "Ontdempen"
-#: ../extensions/deviceicon/speaker.py:131
+#: ../extensions/deviceicon/speaker.py:136
msgid "Mute"
msgstr "Dempen"
-#: ../extensions/globalkey/screenshot.py:50
-msgid "Screenshot"
-msgstr "Schermafdruk"
+#: ../extensions/globalkey/screenshot.py:56
+msgid "Mesh"
+msgstr "Mesh"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "Bron weergeven: %r"
+#: ../extensions/globalkey/screenshot.py:58
+#: ../src/jarabe/frame/zoomtoolbar.py:38
+msgid "Group"
+msgstr "Groep"
+
+#: ../extensions/globalkey/screenshot.py:60
+#: ../src/jarabe/frame/zoomtoolbar.py:40
+msgid "Home"
+msgstr "Thuis"
-#: ../extensions/globalkey/viewsource.py:205
+#: ../extensions/globalkey/screenshot.py:66
#: ../src/jarabe/frame/zoomtoolbar.py:42
msgid "Activity"
msgstr "Activiteit"
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "Document"
+#: ../extensions/globalkey/screenshot.py:69
+msgid "Screenshot"
+msgstr "Schermafdruk"
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "Sluiten"
+#: ../extensions/globalkey/screenshot.py:71
+#, python-format
+msgid "Screenshot of \"%s\""
+msgstr "Schermafdruk van \"%s\""
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
@@ -537,24 +546,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Om je veranderingen toe te passen moet je sugar herstarten.\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "Waarschuwing"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "Verandering vereist een herstart"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "Veranderingen annuleren"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "Later"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "Herstart nu"
@@ -564,65 +573,65 @@ msgstr "Klaar"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
msgid "Cancel"
msgstr "Annuleren"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:339
msgid "Ok"
msgstr "Ok"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:114
+#: ../src/jarabe/desktop/favoriteslayout.py:116
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/jarabe/desktop/favoriteslayout.py:196
+#: ../src/jarabe/desktop/favoriteslayout.py:198
msgid "Ring"
msgstr "Ring"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:334
msgid "Spiral"
msgstr "Spiraal"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:401
msgid "Box"
msgstr "Vierkant"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:442
msgid "Triangle"
msgstr "Driehoek"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:330
msgid "Registration Failed"
msgstr "Registratie mislukt"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "Registration Successful"
msgstr "Registratie succesvol uitgevoerd"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:334
msgid "You are now registered with your school server."
msgstr "Je bent nu geregistreerd bij je schoolserver."
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:674
msgid "Register"
msgstr "Registreren"
@@ -641,12 +650,13 @@ msgstr "Bevestig wissen: Wilt u permanent %s wissen?"
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "Bewaar"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "Wissen"
@@ -680,10 +690,6 @@ msgstr "Favorietenweergave"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "Standaard hervatten"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "Sleutel type:"
@@ -700,82 +706,87 @@ msgstr "WPA en WPA 2 Persoonlijk"
msgid "Wireless Security:"
msgstr "Draadloze netwerkbeveiliging:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:134
msgid "Connect"
msgstr "Verbinden"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:138
msgid "Disconnect"
msgstr "Verbinding verbreken"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:449
+#: ../src/jarabe/frame/activitiestray.py:761
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "Hervatten"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:454
+#: ../src/jarabe/frame/activitiestray.py:235
msgid "Join"
msgstr "Bijvoegen"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr ""
"Kan vereiste gegevens die nodig zijn voor de registratie niet verkrijgen."
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "Kan niet met de server verbinden."
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "De server kon de aanvraag niet voltooien."
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
msgid "Decline"
msgstr "Weigeren"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:650
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:652
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:654
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:671
#, python-format
msgid "%s of %s"
msgstr "%s van %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:683
#, python-format
msgid "Transfer from %r"
msgstr "Overdragen van %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:693
msgid "Accept"
msgstr "Accepteren"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr "Wegdoen"
+
+#: ../src/jarabe/frame/activitiestray.py:810
#, python-format
msgid "Transfer to %r"
msgstr "Overdragen naar %r"
@@ -793,7 +804,7 @@ msgstr "Openen"
msgid "Open with"
msgstr "Openen met"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "%s in klembord zetten"
@@ -802,14 +813,6 @@ msgstr "%s in klembord zetten"
msgid "Neighborhood"
msgstr "Omgeving"
-#: ../src/jarabe/frame/zoomtoolbar.py:38
-msgid "Group"
-msgstr "Groep"
-
-#: ../src/jarabe/frame/zoomtoolbar.py:40
-msgid "Home"
-msgstr "Thuis"
-
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "Klik om de kleur te veranderen:"
@@ -822,9 +825,9 @@ msgstr "Terug"
msgid "Next"
msgstr "Volgende"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "Naamloos"
@@ -903,14 +906,14 @@ msgstr "Alles"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Kopieer"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "Start"
@@ -922,11 +925,11 @@ msgstr "Je dagboek is leeg"
msgid "No matching entries "
msgstr "Geen overeenkomende ingangen "
-#: ../src/jarabe/journal/listview.py:369
+#: ../src/jarabe/journal/listview.py:370
msgid "Clear search"
msgstr "Zoekopdracht wissen"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:93
msgid "No date"
msgstr "Geen datum"
@@ -942,96 +945,139 @@ msgstr "Verwijder a.u.b. oude dagboekingangen om ruimte te maken voor nieuwe."
msgid "Show Journal"
msgstr "Dagboek weergeven"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Kies een object"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "Sluiten"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "Hervatten met"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "Starten met"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "Verstuur naar"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Details weergeven"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "Geen vrienden aanwezig"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
-msgstr "Geen geldige verbinding gevonden"
+msgstr "Geen bruikbare verbinding gevonden"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "Geen activiteit om ingang mee te hervatten"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "Geen activiteit om ingang mee te starten"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "Verwijder vriend"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "Maak vriend"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "Mijn instellingen"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "Afmelden"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "Herstarten"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "Afsluiten"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "Nodig uit voor %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "Beginnen..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Bron weergeven"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "Stop"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:174
msgid "Remove favorite"
msgstr "Verwijder favoriet"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:178
msgid "Make favorite"
msgstr "Maak favoriet"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:241
msgid "Show contents"
msgstr "Inhoud weergeven"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:263 ../src/jarabe/view/palettes.py:313
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB vrij"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:288
msgid "Unmount"
msgstr "Loskoppelen"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Werkkopie van bron maken"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Bron"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Activiteitsbundel Bron"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Bron weergeven: %r"
+
+#~ 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."
+
+#~ msgid "Document"
+#~ msgstr "Document"
+
+#~ msgid "Resume by default"
+#~ msgstr "Standaard hervatten"
+
#~ msgid "Encryption Type:"
#~ msgstr "Encryptie type:"
@@ -1047,9 +1093,6 @@ msgstr "Loskoppelen"
#~ msgid "About my XO"
#~ msgstr "Over mijn XO"
-#~ msgid "Mesh"
-#~ msgstr "Mesh"
-
#~ msgid "Connected to a School Mesh Portal"
#~ msgstr "Verbonden met een School Mesh Portaal"
diff --git a/po/pt.po b/po/pt.po
index 1f14db0..cba72e0 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-02-22 12:50-0500\n"
-"Last-Translator: Eduardo H. Silva <HoboPrimate@gmail.com>\n"
+"POT-Creation-Date: 2009-02-21 00:30-0500\n"
+"PO-Revision-Date: 2009-03-01 20:34-0500\n"
+"Last-Translator: Chris Leonard <cjl@laptop.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -288,7 +288,7 @@ msgstr "Resta muito pouca energia"
msgid "%(hour)d:%(min).2d remaining"
msgstr "%(hour)d:%(min).2d restantes"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "Recarregada"
@@ -310,14 +310,14 @@ msgstr "Desligar..."
# method for a device either (for various reasons) so this doesn't
# have a good mapping
#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../src/jarabe/desktop/meshbox.py:247
msgid "Connecting..."
msgstr "A Ligar..."
# TODO: show the channel number
#: ../extensions/deviceicon/network.py:113
#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../src/jarabe/desktop/meshbox.py:253
msgid "Connected"
msgstr "Ligado"
@@ -349,25 +349,6 @@ msgstr "Silenciar"
msgid "Screenshot"
msgstr "Imagem do ecrã"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "Ver o código-fonte: %r"
-
-#: ../extensions/globalkey/viewsource.py:205
-#: ../src/jarabe/frame/zoomtoolbar.py:42
-msgid "Activity"
-msgstr "Actividade"
-
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "Documento"
-
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "Fechar"
-
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
msgstr "URL da cópia de segurança"
@@ -541,24 +522,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Para aplicar as alterações tens que reiniciar o açúcar (sugar).\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "Aviso"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "As alterações feitas necessitam que reinicies"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "Cancelar alterações"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "Mais tarde"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "Reiniciar agora"
@@ -568,14 +549,14 @@ msgstr "Finalizar"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:687
+#: ../src/jarabe/frame/activitiestray.py:766
+#: ../src/jarabe/frame/activitiestray.py:794
msgid "Cancel"
msgstr "Cancelar"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:338
msgid "Ok"
msgstr "Ok"
@@ -591,39 +572,42 @@ msgstr "Disposição livre"
msgid "Ring"
msgstr "Anel"
+# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:332
msgid "Spiral"
msgstr "Espiral"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:399
msgid "Box"
msgstr "Caixa"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:440
msgid "Triangle"
msgstr "Triângulo "
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:329
msgid "Registration Failed"
msgstr "O Registo Falhou"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:330
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:332
msgid "Registration Successful"
msgstr "O Registo teve sucesso"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "You are now registered with your school server."
msgstr "Estás agora registado com o teu servidor de escola."
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:668
msgid "Register"
msgstr "Registar"
@@ -641,12 +625,13 @@ msgstr "Confirma apagar: Queres apagar permanentemente %s?"
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "Guardar"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "Apagar"
@@ -680,10 +665,6 @@ msgstr "Vista de favoritos"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "Continuar por omissão"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "Tipo de chave:"
@@ -693,7 +674,6 @@ msgid "Authentication Type:"
msgstr "Tipo de Autenticação:"
#: ../src/jarabe/desktop/keydialog.py:215
-#, fuzzy
msgid "WPA & WPA2 Personal"
msgstr "WPA e WPA2 pessoal"
@@ -701,81 +681,81 @@ msgstr "WPA e WPA2 pessoal"
msgid "Wireless Security:"
msgstr "Segurança da rede sem fios:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:131
msgid "Connect"
msgstr "Ligar"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:135
msgid "Disconnect"
msgstr "Desligar"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:441
+#: ../src/jarabe/frame/activitiestray.py:711
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "Continuar"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:446
+#: ../src/jarabe/frame/activitiestray.py:227
msgid "Join"
msgstr "Juntar-se"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "Não foi possível obter os dados necessários para o registo."
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "Não foi possível ligar ao servidor."
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "Não foi possível ao servidor completar o pedido."
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:232
+#: ../src/jarabe/frame/activitiestray.py:659
msgid "Decline"
msgstr "Recusar"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:612
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:614
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:616
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:633
#, python-format
msgid "%s of %s"
msgstr "%s de %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:644
#, python-format
msgid "Transfer from %r"
msgstr "Transferência de %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:654
msgid "Accept"
msgstr "Aceitar"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:677
+#: ../src/jarabe/frame/activitiestray.py:784
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:755
#, python-format
msgid "Transfer to %r"
msgstr "Transferência para %r"
@@ -793,7 +773,7 @@ msgstr "Abrir"
msgid "Open with"
msgstr "Abrir com"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "Recorte de %s"
@@ -810,6 +790,10 @@ msgstr "Grupo"
msgid "Home"
msgstr "Casa"
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Actividade"
+
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "Clica para mudar a cor:"
@@ -822,9 +806,9 @@ msgstr "Voltar"
msgid "Next"
msgstr "Próximo"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "Sem título"
@@ -903,14 +887,14 @@ msgstr "Qualquer coisa"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Copiar"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "Iniciar"
@@ -926,7 +910,7 @@ msgstr "Nenhuma entrada encontrada "
msgid "Clear search"
msgstr "Limpar a busca"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:91
msgid "No date"
msgstr "Sem data"
@@ -944,96 +928,133 @@ msgstr ""
msgid "Show Journal"
msgstr "Mostrar o diário"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Escolhe um objecto"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "Fechar"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "Continuar com"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "Iniciar com"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "Enviar para"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Ver detalhes"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "Não está presente nenhum amigo"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "Não foi encontrada uma ligação válida"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "Não existe nenhuma actividade para continuar a entrada"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "Não existe nenhuma actividade para iniciar a entrada"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "Remover amigo"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "Fazer amigo"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "As minhas definições"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "Terminar a sessão"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "Reiniciar"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "Desligar"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "Convidar para %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "A Iniciar..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Ver código-fonte"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "Parar"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:171
msgid "Remove favorite"
msgstr "Remover favorito"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:175
msgid "Make favorite"
msgstr "Tornar favorito"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:238
msgid "Show contents"
msgstr "Mostrar os conteúdos"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB Livres"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Remover"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Código-fonte da instância"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Código-fonte"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Código-fonte do pacote de actividade"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Ver o código-fonte: %r"
+
+#~ msgid "Document"
+#~ msgstr "Documento"
+
+#~ msgid "Resume by default"
+#~ msgstr "Continuar por omissão"
+
#~ msgid "Encryption Type:"
#~ msgstr "Tipo de Encriptação:"
diff --git a/po/sl.po b/po/sl.po
index 4ce5cb0..6981824 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: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-01-28 16:33-0500\n"
+"POT-Creation-Date: 2009-02-21 00:30-0500\n"
+"PO-Revision-Date: 2009-02-28 04:26-0500\n"
"Last-Translator: Denis Oštir <denis.ostir@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -289,7 +289,7 @@ msgstr "Baterija je skoraj prazna"
msgid "%(hour)d:%(min).2d remaining"
msgstr "Ostaja %(hour)d:%(min).2d"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "Polno"
@@ -303,14 +303,14 @@ msgid "Disconnect..."
msgstr "Prekini ... "
#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../src/jarabe/desktop/meshbox.py:247
msgid "Connecting..."
msgstr "Povezujem ..."
# TODO: show the channel number
#: ../extensions/deviceicon/network.py:113
#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../src/jarabe/desktop/meshbox.py:253
msgid "Connected"
msgstr "Povezan"
@@ -343,25 +343,6 @@ msgstr "Tiho"
msgid "Screenshot"
msgstr "Slika zaslona"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "Poglej vir: %r"
-
-#: ../extensions/globalkey/viewsource.py:205
-#: ../src/jarabe/frame/zoomtoolbar.py:42
-msgid "Activity"
-msgstr "Aktivnost"
-
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "Dokument"
-
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "Zapri"
-
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
msgstr "Nadomestni spletni naslov"
@@ -433,9 +414,8 @@ msgid "Power Extreme."
msgstr "Ekstremno upravljanje z elektriko"
#: ../data/sugar.schemas.in.h:16
-#, fuzzy
msgid "Publish to Gadget"
-msgstr "Objavi "
+msgstr "Objavi v napravi"
#: ../data/sugar.schemas.in.h:17
msgid "Setting for muting the sound device."
@@ -536,24 +516,24 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "Za uveljavitev sprememb je potreben ponovni zagon programa sugar.\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "Opozorilo"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "Sprembe zahtevajo ponovni zagon"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "Prekliči spremembe"
-#: ../src/jarabe/controlpanel/gui.py:281 ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "Kasneje"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "Ponovni zagon"
@@ -563,14 +543,14 @@ msgstr "Končano"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:687
+#: ../src/jarabe/frame/activitiestray.py:766
+#: ../src/jarabe/frame/activitiestray.py:794
msgid "Cancel"
msgstr "Prekliči"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:338
msgid "Ok"
msgstr "V redu"
@@ -588,40 +568,40 @@ msgstr "Obroč"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:332
msgid "Spiral"
msgstr "Spirala"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:399
msgid "Box"
msgstr "Okvir"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:440
msgid "Triangle"
msgstr "Trikotnik"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:329
msgid "Registration Failed"
msgstr "Registracija ni uspela"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:330
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:332
msgid "Registration Successful"
msgstr "Uspešna registracija"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "You are now registered with your school server."
msgstr "Vpisan si v šolski strežnik."
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:668
msgid "Register"
msgstr "Registracija"
@@ -635,12 +615,13 @@ msgid "Confirm erase: Do you want to permanently erase %s?"
msgstr "Potrdi brisanje: Želiš dokočno izbrisati %s?"
#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "Obdrži"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97 ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "Izbriši"
@@ -673,10 +654,6 @@ msgstr "Priljubljene"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "Vedno nadaljuj"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "Tip ključa:"
@@ -693,81 +670,81 @@ msgstr "WPA in WPA2 Osebni ključ"
msgid "Wireless Security:"
msgstr "Varovanje brezžičnega omrežja:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:131
msgid "Connect"
msgstr "Poveži"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:135
msgid "Disconnect"
msgstr "Prekini"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:441
+#: ../src/jarabe/frame/activitiestray.py:711
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63 ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "Nadaljuj"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:446
+#: ../src/jarabe/frame/activitiestray.py:227
msgid "Join"
msgstr "Pridruži se"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "Ne morem pridobiti podatkov, potrebnih za registracijo."
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "Povezava s strežnikom ni mogoča."
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "Strežnik ne more izpolniti zahteve."
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:232
+#: ../src/jarabe/frame/activitiestray.py:659
msgid "Decline"
msgstr "Zavrni"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:612
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:614
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:616
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:633
#, python-format
msgid "%s of %s"
msgstr "%s od %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:644
#, python-format
msgid "Transfer from %r"
msgstr "Prenesi z %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:654
msgid "Accept"
msgstr "Sprejmi"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:677
+#: ../src/jarabe/frame/activitiestray.py:784
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:755
#, python-format
msgid "Transfer to %r"
msgstr "Prenesi na %r"
@@ -785,7 +762,7 @@ msgstr "Odpri"
msgid "Open with"
msgstr "Odpri z"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "%s strižem"
@@ -802,6 +779,10 @@ msgstr "Skupina"
msgid "Home"
msgstr "Domov"
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Aktivnost"
+
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "Klikni za spremembo barve:"
@@ -814,9 +795,9 @@ msgstr "Nazaj"
msgid "Next"
msgstr "Naslednji"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "Neimenovan"
@@ -895,14 +876,14 @@ msgstr "Karkoli"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Kopiraj"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66 ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "Zaženi"
@@ -918,7 +899,7 @@ msgstr "Ne najdem vsebine za "
msgid "Clear search"
msgstr "Počisti iskanje"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:91
msgid "No date"
msgstr "Brez datuma"
@@ -934,96 +915,133 @@ msgstr "Izbriši starejše vpise v beležko, da narediš prostor za nove."
msgid "Show Journal"
msgstr "Prikaži beležko"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Izberi predmet"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "Zapri"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "Nadaljuj z"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "Začni z"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "Pošlji"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Poglej podrobnosti"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "Prisoten ni noben prijatelj"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "Na voljo ni nobena veljavna povezava"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
msgstr "Ni aktivnosti za nadaljevanje"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
msgstr "Ni aktivnosti za začetek"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "Odstrani prijatelja"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "Dodaj prijatelja"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "Moje nastavitve"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "Odjava"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "Ponovni zagon"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "Zaustavitev"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "Povabi na %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "Zaganjam ..."
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Poglej izvor"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "Ustavi"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:171
msgid "Remove favorite"
msgstr "Odstrani priljubljeno"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:175
msgid "Make favorite"
msgstr "Nastavi priljubljeno"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:238
msgid "Show contents"
msgstr "Prikaži vsebino"
-#: ../src/jarabe/view/palettes.py:223 ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
#, python-format
msgid "%(free_space)d MB Free"
msgstr "%(free_space)d MB prosto"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Odstrani"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Primer izvora"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Izvor"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Izvor kompleta aktivnosti"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Poglej vir: %r"
+
+#~ msgid "Document"
+#~ msgstr "Dokument"
+
+#~ msgid "Resume by default"
+#~ msgstr "Vedno nadaljuj"
+
#~ msgid "Encryption Type:"
#~ msgstr "Tip kodiranja:"
diff --git a/po/sv.po b/po/sv.po
index 0ab6089..3b430ce 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -6,408 +6,108 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-25 00:30-0400\n"
-"PO-Revision-Date: 2008-10-14 08:00-0400\n"
-"Last-Translator: Mattias Ohlsson <mattias_oh@yahoo.com>\n"
+"POT-Creation-Date: 2009-02-21 00:30-0500\n"
+"PO-Revision-Date: 2009-02-27 19:17-0500\n"
+"Last-Translator: Susanna Björverud <susanna.bjorverud@telia.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Pootle 1.1.0rc2\n"
-#: ../src/intro/window.py:93 ../src/controlpanel/aboutme/view.py:100
-msgid "Name:"
-msgstr "Namn:"
-
-#: ../src/intro/window.py:125
-msgid "Click to change color:"
-msgstr "Klicka för att ändra färg:"
-
-#: ../src/intro/window.py:175 ../src/journal/detailview.py:119
-msgid "Back"
-msgstr "Tillbaka"
-
-#: ../src/intro/window.py:189 ../src/controlpanel/toolbar.py:61
-msgid "Done"
-msgstr "Klar"
-
-#: ../src/intro/window.py:192
-msgid "Next"
-msgstr "Nästa"
-
-#: ../src/view/BuddyMenu.py:60
-msgid "Remove friend"
-msgstr "Ta bort kompis"
-
-#: ../src/view/BuddyMenu.py:63
-msgid "Make friend"
-msgstr "Bli kompis med"
-
-#: ../src/view/BuddyMenu.py:92
-#, python-format
-msgid "Invite to %s"
-msgstr "Bjud in till %s"
-
-#: ../src/view/clipboardmenu.py:51
-msgid "Remove"
-msgstr "Ta bort"
-
-#: ../src/view/clipboardmenu.py:56 ../src/view/clipboardmenu.py:78
-msgid "Open"
-msgstr "Öppna"
-
-# 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:61 ../src/view/home/HomeBox.py:84
-msgid "Keep"
-msgstr "Spara"
-
-#: ../src/view/clipboardmenu.py:83
-msgid "Open with"
-msgstr "Öppna med"
-
-#: ../src/view/clipboardmenu.py:228
-#, python-format
-msgid "%s clipping"
-msgstr ""
-
-#: ../src/hardware/keydialog.py:150
-msgid "Key Type:"
-msgstr "Huvudtyp:"
-
-#: ../src/hardware/keydialog.py:170
-msgid "Authentication Type:"
-msgstr "Verifieringstyp:"
-
-#: ../src/hardware/keydialog.py:251
-msgid "Encryption Type:"
-msgstr "Krypteringstyp:"
-
-#: ../src/hardware/schoolserver.py:17
-msgid "Cannot obtain data needed for registration."
-msgstr ""
-"Kunde inte komma åt den data som krävs för att genomföra registreringen."
-
-#: ../src/hardware/schoolserver.py:31
-msgid "Cannot connect to the server."
-msgstr "Kunde inte komma åter servern."
-
-#: ../src/hardware/schoolserver.py:36
-msgid "The server could not complete the request."
-msgstr "Servern misslyckades med att fullfölja förfrågan."
-
-#: ../src/view/Shell.py:251
-msgid "Screenshot"
-msgstr "Skärmbild"
-
-#: ../src/view/home/HomeBox.py:78
-msgid "Confirm erase"
-msgstr "Bekräfta borttagning"
-
-#: ../src/view/home/HomeBox.py:80
-#, python-format
-msgid "Confirm erase: Do you want to permanently erase %s?"
-msgstr "Bekräfta borttagning: Vill du verkligen ta bort %s för alltid?"
-
-#: ../src/view/home/HomeBox.py:87 ../src/view/palettes.py:120
-#: ../src/journal/journaltoolbox.py:335 ../src/journal/palettes.py:75
-msgid "Erase"
-msgstr "Ta bort"
-
-#: ../src/view/home/HomeBox.py:117
-msgid "Software Update"
-msgstr "Aktivitetsuppdatering"
-
-#: ../src/view/home/HomeBox.py:118
-msgid "Update your activities to ensure compatibility with your new software"
-msgstr ""
-"Uppdaterar dina aktiviteter för att på så sätt ge dig tillgång till nya "
-"funktioner"
-
-#: ../src/view/home/HomeBox.py:122 ../src/controlpanel/toolbar.py:115
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: ../src/view/home/HomeBox.py:124 ../src/controlpanel/gui.py:273
-msgid "Later"
-msgstr "Senare"
-
-#: ../src/view/home/HomeBox.py:127
-msgid "Check now"
-msgstr "Kontrollera nu"
-
-#: ../src/view/home/HomeBox.py:261
-msgid "List view"
-msgstr "Listvy"
-
-#: ../src/view/home/HomeBox.py:262
-msgid "<Ctrl>2"
-msgstr "<Ctrl> + 2"
-
-#: ../src/view/home/HomeBox.py:320
-msgid "Favorites view"
-msgstr "Favoritvy"
-
-#: ../src/view/home/HomeBox.py:321
-msgid "<Ctrl>1"
-msgstr "<Ctrl> + 1"
-
-#: ../src/view/home/MeshBox.py:97
-msgid "Connect"
-msgstr "Anslut"
-
-#: ../src/view/home/MeshBox.py:106
-msgid "Disconnect"
-msgstr "Avbryt anslutning"
-
-#: ../src/view/home/MeshBox.py:118
-msgid "Disconnecting..."
-msgstr "Kopplar ned..."
-
-#: ../src/view/home/MeshBox.py:159
-msgid "Connecting..."
-msgstr "Kopplar upp..."
-
-# TODO: show the channel number
-#. TODO: show the channel number
-#: ../src/view/home/MeshBox.py:166
-msgid "Connected"
-msgstr "Ansluten"
-
-# only temporarily
-#: ../src/view/home/MeshBox.py:218 ../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 "Meshnätverk"
-
-#: ../src/view/home/MeshBox.py:221 ../src/view/devices/network/wireless.py:125
-#: ../src/view/devices/network/mesh.py:89
-msgid "Disconnect..."
-msgstr "Avbryt anslutning..."
-
-#. TRANS: Action label for resuming an activity.
-#: ../src/view/home/MeshBox.py:309 ../src/view/palettes.py:61
-#: ../src/journal/journaltoolbox.py:399 ../src/journal/palettes.py:57
-msgid "Resume"
-msgstr "Återuppta"
-
-#: ../src/view/home/MeshBox.py:314 ../src/view/frame/activitiestray.py:206
-msgid "Join"
-msgstr "Gå med i"
-
-#: ../src/view/devices/battery.py:45
-msgid "My Battery"
-msgstr "Mitt batteri"
-
-#: ../src/view/devices/battery.py:114
-msgid "Charging"
-msgstr "Laddar"
-
-#: ../src/view/devices/battery.py:117
-msgid "Very little power remaining"
-msgstr "Batteriet är nästan slut"
-
-#: ../src/view/devices/battery.py:123
-#, python-format
-msgid "%(hour)d:%(min).2d remaining"
-msgstr "%(hour)d:%(min).2d återstår"
-
-#: ../src/view/devices/battery.py:127
-msgid "Charged"
-msgstr "Fulladdad"
-
-#: ../src/view/devices/speaker.py:44
-msgid "My Speakers"
-msgstr "Mina högtalare"
-
-#: ../src/view/devices/speaker.py:125
-msgid "Unmute"
-msgstr "Slå på ljud"
-
-#: ../src/view/devices/speaker.py:128
-msgid "Mute"
-msgstr "Stäng av ljud"
-
-#: ../src/view/devices/network/wireless.py:67
-msgid "Disconnected"
-msgstr "Inte ansluten"
-
-#: ../src/view/devices/network/wireless.py:143
-msgid "Channel"
-msgstr "Kanal"
-
-#: ../src/view/frame/zoomtoolbar.py:37
-msgid "Neighborhood"
-msgstr "Grannar"
-
-#: ../src/view/frame/zoomtoolbar.py:39
-msgid "Group"
-msgstr "Grupp"
-
-#: ../src/view/frame/zoomtoolbar.py:41
-msgid "Home"
-msgstr "Hem"
-
-#: ../src/view/frame/zoomtoolbar.py:43
-msgid "Activity"
-msgstr "Aktivitet"
-
-#: ../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: VARNING, Hittade mer än ett alternativ med samma namn: "
-"%s modul: %r"
-
-#: ../src/controlpanel/cmd.py:28
-#, python-format
-msgid "sugar-control-panel: key=%s not an available option"
-msgstr "sugar-control-panel: key=%s är inte ett giltigt val."
-
-#: ../src/controlpanel/cmd.py:29
-#, python-format
-msgid "sugar-control-panel: %s"
-msgstr "sugar-control-panel: %s"
-
-# TRANS: Translators, there's a empty line at the end of this string,
-# which must appear in the translated string (msgstr) as well.
-#. 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"
-" 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 ""
-"Användning: sugar-control-panel [ val ] nyckel [ parametrar ... ] \n"
-" Ställ in Sockermiljön. \n"
-" Val: \n"
-" -h visar hjälpmeddelande och avslutar. \n"
-" -l listar upp alla möjliga val \n"
-" -h nyckel Visar information om nyckeln \n"
-" -g nyckel Hämtar nuvarande värde på nyckel \n"
-" -s nyckel Sätter nuvarande värde på nyckel \n"
-" -c nyckel Rensar nuvarande värde på nyckel \n"
-" "
-
-#: ../src/controlpanel/cmd.py:48
-msgid "To apply your changes you have to restart sugar.\n"
-msgstr "För att förändringarna ska träda i kraft behöver du starta om Socker."
-
-#: ../src/controlpanel/toolbar.py:121 ../src/view/home/favoritesview.py:305
-msgid "Ok"
-msgstr "Ok"
-
-#: ../src/controlpanel/sectionview.py:42 ../src/controlpanel/gui.py:265
-msgid "Changes require restart"
-msgstr "Ändringarna kräver omstart"
-
-#: ../src/controlpanel/gui.py:264
-msgid "Warning"
-msgstr "Varning"
-
-#: ../src/controlpanel/gui.py:268
-msgid "Cancel changes"
-msgstr "Ångra ändringar"
-
-#: ../src/controlpanel/gui.py:277
-msgid "Restart now"
-msgstr "Starta om nu"
+#: ../extensions/cpsection/aboutme/__init__.py:24
+msgid "About Me"
+msgstr "Om mig"
-#: ../src/controlpanel/aboutme/model.py:44
+#: ../extensions/cpsection/aboutme/model.py:43
msgid "You must enter a name."
msgstr "Du måste ange ett namn."
# Varför ska detta översättas? Är det inte direkta kommandon till grafikuppritaren?
-#: ../src/controlpanel/aboutme/model.py:69
+#: ../extensions/cpsection/aboutme/model.py:68
#, python-format
msgid "stroke: color=%s hue=%s"
msgstr "stroke: color=%s hue=%s"
-#: ../src/controlpanel/aboutme/model.py:72
+#: ../extensions/cpsection/aboutme/model.py:71
#, python-format
msgid "stroke: %s"
msgstr "stroke: %s"
-#: ../src/controlpanel/aboutme/model.py:74
+#: ../extensions/cpsection/aboutme/model.py:73
#, python-format
msgid "fill: color=%s hue=%s"
msgstr "fill: color=%s hue=%s"
-#: ../src/controlpanel/aboutme/model.py:76
+#: ../extensions/cpsection/aboutme/model.py:75
#, python-format
msgid "fill: %s"
msgstr "fill: %s"
-#: ../src/controlpanel/aboutme/model.py:87
+#: ../extensions/cpsection/aboutme/model.py:86
msgid "Error in specified color modifiers."
msgstr "Error in specified color modifiers."
-#: ../src/controlpanel/aboutme/model.py:90
+#: ../extensions/cpsection/aboutme/model.py:89
msgid "Error in specified colors."
msgstr "Fel i angivna färger."
-#: ../src/controlpanel/aboutme/view.py:32
-#: ../src/controlpanel/aboutme/__init__.py:22
-msgid "About Me"
-msgstr "Om mig"
+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
+msgid "Name:"
+msgstr "Namn:"
-#: ../src/controlpanel/aboutme/view.py:134
+#: ../extensions/cpsection/aboutme/view.py:128
msgid "Click to change your color:"
msgstr "Klicka för att ändra din färg:"
-#: ../src/controlpanel/aboutxo/model.py:24
+#: ../extensions/cpsection/aboutcomputer/__init__.py:21
+msgid "About my Computer"
+msgstr "Om min dator"
+
+#: ../extensions/cpsection/aboutcomputer/model.py:26
msgid "Not available"
msgstr "Finns inte tillgänglig"
-#: ../src/controlpanel/aboutxo/view.py:55
+#: ../extensions/cpsection/aboutcomputer/view.py:59
msgid "Identity"
msgstr "Identitet"
-#: ../src/controlpanel/aboutxo/view.py:64
+#: ../extensions/cpsection/aboutcomputer/view.py:68
msgid "Serial Number:"
msgstr "Serienummer:"
-#: ../src/controlpanel/aboutxo/view.py:87
+#: ../extensions/cpsection/aboutcomputer/view.py:90
msgid "Software"
msgstr "Programvara"
-#: ../src/controlpanel/aboutxo/view.py:96
+#: ../extensions/cpsection/aboutcomputer/view.py:99
msgid "Build:"
msgstr "Byggnummer:"
-#: ../src/controlpanel/aboutxo/view.py:111
+#: ../extensions/cpsection/aboutcomputer/view.py:114
msgid "Sugar:"
msgstr "Sockerversion:"
-#: ../src/controlpanel/aboutxo/view.py:126
+#: ../extensions/cpsection/aboutcomputer/view.py:130
msgid "Firmware:"
-msgstr "Firmware:"
+msgstr "Fast mjukvara:"
-#: ../src/controlpanel/aboutxo/view.py:148
+#: ../extensions/cpsection/aboutcomputer/view.py:145
+msgid "Wireless Firmware:"
+msgstr "Trådlös fast mjukvara:"
+
+#: ../extensions/cpsection/aboutcomputer/view.py:168
msgid "Copyright and License"
msgstr "Copyright och Licens"
-#: ../src/controlpanel/aboutxo/view.py:156
+#: ../extensions/cpsection/aboutcomputer/view.py:176
msgid ""
"© 2008 One Laptop per Child Association Inc; Red Hat Inc; and Contributors."
msgstr ""
"© 2008 One Laptop per Child Association Inc; Red Hat Inc; och andra "
"bidragare."
-#: ../src/controlpanel/aboutxo/view.py:163
+#: ../extensions/cpsection/aboutcomputer/view.py:183
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 "
@@ -418,392 +118,988 @@ msgstr ""
"är fri programvara och licenserad under GNU GPL vilket innebär att du fritt "
"får ändra programmet och/eller sprida vidare kopior av programmet."
-#: ../src/controlpanel/aboutxo/view.py:175
+#: ../extensions/cpsection/aboutcomputer/view.py:195
msgid "Full license:"
msgstr "Detaljerad licens:"
-#: ../src/controlpanel/aboutxo/__init__.py:21
-msgid "About my XO"
-msgstr "Om min XO"
+#: ../extensions/cpsection/datetime/__init__.py:21
+msgid "Date & Time"
+msgstr "Datum och tid"
-#: ../src/controlpanel/datetime/model.py:89
+#: ../extensions/cpsection/datetime/model.py:87
msgid "Error timezone does not exist."
msgstr "Fel: Tidszonen finns inte."
-#: ../src/controlpanel/datetime/view.py:68
+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:19
msgid "Timezone"
msgstr "Tidszon"
-#: ../src/controlpanel/datetime/__init__.py:21
-msgid "Date & Time"
-msgstr "Datum och tid"
+#: ../extensions/cpsection/frame/__init__.py:21
+msgid "Frame"
+msgstr "Ram"
-#: ../src/controlpanel/frame/model.py:38 ../src/controlpanel/frame/model.py:60
+#: ../extensions/cpsection/frame/model.py:38
+#: ../extensions/cpsection/frame/model.py:60
msgid "Value must be an integer."
msgstr "Talet måste vara ett heltal."
-#: ../src/controlpanel/frame/view.py:26
+#: ../extensions/cpsection/frame/view.py:26
msgid "never"
msgstr "aldrig"
-#: ../src/controlpanel/frame/view.py:27
+#: ../extensions/cpsection/frame/view.py:27
msgid "instantaneous"
msgstr "direkt"
-#: ../src/controlpanel/frame/view.py:28
+#: ../extensions/cpsection/frame/view.py:28
#, python-format
msgid "%s seconds"
msgstr "efter %s sekunder"
-#: ../src/controlpanel/frame/view.py:52
+#: ../extensions/cpsection/frame/view.py:52
msgid "Activation Delay"
msgstr "Tid tills aktivering"
-#: ../src/controlpanel/frame/view.py:76
+#: ../extensions/cpsection/frame/view.py:76
msgid "Corner"
msgstr "Hörn"
-#: ../src/controlpanel/frame/view.py:111
+#: ../extensions/cpsection/frame/view.py:111
msgid "Edge"
msgstr "Kant"
-#: ../src/controlpanel/frame/__init__.py:21
-msgid "Frame"
-msgstr "Ram"
+#: ../extensions/cpsection/language/__init__.py:21
+#: ../extensions/cpsection/language/view.py:32
+msgid "Language"
+msgstr "Språk"
-#: ../src/controlpanel/language/model.py:28
+#: ../extensions/cpsection/language/model.py:28
msgid "Could not access ~/.i18n. Create standard settings."
msgstr "Kunde inte komma åt ~/.i18n. Skapar standardinställningar."
-#: ../src/controlpanel/language/model.py:114
+#: ../extensions/cpsection/language/model.py:124
#, python-format
msgid "Language for code=%s could not be determined."
-msgstr "Kunde inte avgöra vilket språk det är som förkortas %s."
+msgstr "Kunde inte avgöra vilket språk det är som har koden %s."
-#: ../src/controlpanel/language/model.py:131
+#: ../extensions/cpsection/language/model.py:144
#, python-format
msgid "Sorry I do not speak '%s'."
msgstr "Tyvärr så pratar jag inte '%s'."
-#: ../src/controlpanel/language/view.py:70
-#: ../src/controlpanel/language/__init__.py:21
-msgid "Language"
-msgstr "Språk"
+#: ../extensions/cpsection/network/__init__.py:21
+#: ../extensions/cpsection/network/view.py:28
+msgid "Network"
+msgstr "Nätverk"
-#: ../src/controlpanel/network/model.py:62
+#: ../extensions/cpsection/network/model.py:79
msgid "State is unknown."
msgstr "Status är okänd."
-#: ../src/controlpanel/network/model.py:82
+#: ../extensions/cpsection/network/model.py:105
msgid "Error in specified radio argument use on/off."
msgstr "Fel i angiven trådlös nätverksinställning. Använd på eller av."
-#: ../src/controlpanel/network/view.py:28
-#: ../src/controlpanel/network/__init__.py:21
-msgid "Network"
-msgstr "Nätverk"
+#: ../extensions/cpsection/network/model.py:137
+msgid "Error in specified argument use 0/1."
+msgstr "Fel i angivet argument. Använd 0/1"
-#: ../src/controlpanel/network/view.py:54
+#: ../extensions/cpsection/network/view.py:56
msgid "Wireless"
msgstr "Trådlöst nätverk"
-#: ../src/controlpanel/network/view.py:62
-msgid "Turn of the wireless radio to save battery life"
+#: ../extensions/cpsection/network/view.py:64
+msgid "Turn off the wireless radio to save battery life"
msgstr "Stäng av det trådlösa nätverket för att få batteriet att räcka längre"
-#: ../src/controlpanel/network/view.py:75
+#: ../extensions/cpsection/network/view.py:77
msgid "Radio"
msgstr "Trådlöst nätverk"
-#: ../src/controlpanel/network/view.py:91
+#: ../extensions/cpsection/network/view.py:93
msgid "Discard network history if you have trouble connecting to the network"
msgstr ""
"Ta bort nätverkshistoriken om du har problem med att ansluta till ett "
"nätverk"
-#: ../src/controlpanel/network/view.py:100
+#: ../extensions/cpsection/network/view.py:102
msgid "Discard network history"
msgstr "Ta bort nätverkshistorik"
-#: ../src/controlpanel/network/view.py:113
-msgid "Mesh"
-msgstr "Mesh"
+#: ../extensions/cpsection/network/view.py:115
+msgid "Collaboration"
+msgstr "Samarbete"
-#: ../src/controlpanel/network/view.py:122
+#: ../extensions/cpsection/network/view.py:123
+msgid ""
+"The server is the equivalent of what room you are in; people on the same "
+"server will be able to see each other, even when they aren't on the same "
+"network."
+msgstr ""
+"Servern motsvarar det rum som du är i; de som är på samma server kan se "
+"varandra även när de inte är på samma nätverk."
+
+#: ../extensions/cpsection/network/view.py:133
msgid "Server:"
msgstr "Server:"
-#: ../src/controlpanel/power/model.py:55
+#: ../extensions/cpsection/power/__init__.py:21
+msgid "Power"
+msgstr "Ström"
+
+#: ../extensions/cpsection/power/model.py:54
msgid "Error in automatic pm argument, use on/off."
-msgstr "Fel i angiven strömbestparingsinställning. Använd på eller av."
+msgstr "Fel i angiven strömbesparingsinställning. Använd på eller av."
-#: ../src/controlpanel/power/model.py:84
+#: ../extensions/cpsection/power/model.py:81
msgid "Error in extreme pm argument, use on/off."
-msgstr "Fel i angiven extrem strömbestparingsinställning. Använd på eller av."
+msgstr "Fel i angiven extrem strömbesparingsinställning. Använd på eller av."
-#: ../src/controlpanel/power/view.py:47
+#: ../extensions/cpsection/power/view.py:47
msgid "Power management"
msgstr "Strömhantering"
-#: ../src/controlpanel/power/view.py:57
+#: ../extensions/cpsection/power/view.py:57
msgid "Automatic power management (increases battery life)"
-msgstr "Automatisk strömhantering (förbättrar tiden som batteriet håller)"
+msgstr "Automatisk strömhantering (förlänger tiden som batteriet varar)"
-#: ../src/controlpanel/power/view.py:85
+#: ../extensions/cpsection/power/view.py:85
msgid ""
"Extreme power management (disableswireless radio, increases battery life)"
msgstr ""
"Extrem strömhantering (stänger av det trådlösa nätverket, ökar "
"batterilivslängden)"
-#: ../src/controlpanel/power/__init__.py:21
-msgid "Power"
-msgstr "Ström"
+#: ../extensions/deviceicon/battery.py:56
+msgid "My Battery"
+msgstr "Mitt batteri"
-#: ../src/view/devices/network/mesh.py:111
-msgid "Connected to a School Mesh Portal"
-msgstr "Ansluten till en skolportal"
+#: ../extensions/deviceicon/battery.py:137
+msgid "Removed"
+msgstr "Borttaget"
-#: ../src/view/devices/network/mesh.py:113
-msgid "Looking for a School Mesh Portal..."
-msgstr "Letar efter en skolportal..."
+#: ../extensions/deviceicon/battery.py:140
+msgid "Charging"
+msgstr "Laddar"
-#: ../src/view/devices/network/mesh.py:116
-msgid "Connected to an XO Mesh Portal"
-msgstr "Ansluten till en XO-portal"
+#: ../extensions/deviceicon/battery.py:143
+msgid "Very little power remaining"
+msgstr "Batteriet är nästan slut"
-#: ../src/view/devices/network/mesh.py:118
-msgid "Looking for an XO Mesh Portal..."
-msgstr "Letar efter en XO-portal..."
+#: ../extensions/deviceicon/battery.py:149
+#, python-format
+msgid "%(hour)d:%(min).2d remaining"
+msgstr "%(hour)d:%(min).2d återstår"
-#: ../src/view/devices/network/mesh.py:121
-msgid "Connected to a Simple Mesh"
-msgstr "Ansluten till ett enkelt meshnätverk"
+#: ../extensions/deviceicon/battery.py:152
+msgid "Charged"
+msgstr "Fulladdad"
-#: ../src/view/devices/network/mesh.py:123
-msgid "Starting a Simple Mesh"
-msgstr "Startar ett enkelt meshnätverk..."
+#: ../extensions/deviceicon/network.py:40
+#, python-format
+msgid "IP address: %s"
+msgstr "IP-adress: %s"
-#: ../src/view/devices/network/mesh.py:130
-msgid "Unknown Mesh"
-msgstr "Okänt meshnätverk"
+#: ../extensions/deviceicon/network.py:104
+msgid "Disconnect..."
+msgstr "Avbryt anslutning..."
-#: ../src/view/frame/activitiestray.py:211
-msgid "Decline"
-msgstr "Avstå"
+#: ../extensions/deviceicon/network.py:109
+#: ../src/jarabe/desktop/meshbox.py:247
+msgid "Connecting..."
+msgstr "Kopplar upp..."
+
+# TODO: show the channel number
+#: ../extensions/deviceicon/network.py:113
+#: ../extensions/deviceicon/network.py:166
+#: ../src/jarabe/desktop/meshbox.py:253
+msgid "Connected"
+msgstr "Ansluten"
+
+#: ../extensions/deviceicon/network.py:126
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../extensions/deviceicon/network.py:141
+msgid "Wired Network"
+msgstr "Trådbundet nätverk"
+
+#: ../extensions/deviceicon/network.py:169
+msgid "Speed"
+msgstr "Hastighet"
+
+#: ../extensions/deviceicon/speaker.py:46
+msgid "My Speakers"
+msgstr "Mina högtalare"
+
+#: ../extensions/deviceicon/speaker.py:128
+msgid "Unmute"
+msgstr "Slå på ljud"
+
+#: ../extensions/deviceicon/speaker.py:131
+msgid "Mute"
+msgstr "Stäng av ljud"
+
+#: ../extensions/globalkey/screenshot.py:50
+msgid "Screenshot"
+msgstr "Skärmbild"
+
+#: ../data/sugar.schemas.in.h:1
+msgid "Backup URL"
+msgstr "URL för säkerhetskopiering"
+
+# Error in original string! Never heard of "rbg colors".
+#: ../data/sugar.schemas.in.h:2
+msgid ""
+"Color for the XO icon that is used throughout the desktop. The string is "
+"composed of the stroke color and fill color, format is that of rbg colors. "
+"Example: #AC32FF,#9A5200"
+msgstr ""
+"Den färg som används för XO-ikonen överallt på skrivbordet. Det skall vara "
+"en sträng som består av streckfärg och fyllnadsfärg båda formaterade som "
+"rgb-färger. Exempel: #AC32FF,#9A5200"
+
+#: ../data/sugar.schemas.in.h:3
+msgid "Corner Delay"
+msgstr "Hörnfördröjning"
+
+#: ../data/sugar.schemas.in.h:4
+msgid "Delay for the activation of the frame using the corners."
+msgstr "Fördröjning innan aktivering av ramen med hjälp av hörnen."
+
+#: ../data/sugar.schemas.in.h:5
+msgid "Delay for the activation of the frame using the edges."
+msgstr "Fördröjning innan aktivering av ramen med hjälp av kanterna."
+
+#: ../data/sugar.schemas.in.h:6
+msgid "Edge Delay"
+msgstr "Kantfördröjning"
+
+#: ../data/sugar.schemas.in.h:7
+msgid "Favorites Layout"
+msgstr "Utseende på favoriter"
+
+#: ../data/sugar.schemas.in.h:8
+msgid "Favorites resume mode"
+msgstr "Fortsättningsläge för favoriter"
+
+#: ../data/sugar.schemas.in.h:9
+msgid ""
+"If TRUE, Sugar will make us searchable for the other users of the Jabber "
+"server."
+msgstr ""
+"Om SANT, så gör Sugar så att vi kan sökas fram av andra användare av jabber-"
+"servern."
+
+#: ../data/sugar.schemas.in.h:10
+msgid "Jabber Server"
+msgstr "Jabber-server"
+
+#: ../data/sugar.schemas.in.h:11
+msgid "Layout of the favorites view."
+msgstr "Hur favoritvyn ser ut."
+
+#: ../data/sugar.schemas.in.h:12
+msgid "Power Automatic"
+msgstr "Automatisk ström"
+
+#: ../data/sugar.schemas.in.h:13
+msgid "Power Automatic."
+msgstr "Automatisk ström."
+
+#: ../data/sugar.schemas.in.h:14
+msgid "Power Extreme"
+msgstr "Extrem ström"
+
+#: ../data/sugar.schemas.in.h:15
+msgid "Power Extreme."
+msgstr "Extrem ström."
+
+#: ../data/sugar.schemas.in.h:16
+msgid "Publish to Gadget"
+msgstr "Publicera till Gadget"
+
+#: ../data/sugar.schemas.in.h:17
+msgid "Setting for muting the sound device."
+msgstr "Inställningar för att stänga av ljudenheten."
+
+#: ../data/sugar.schemas.in.h:18
+msgid "Sound Muted"
+msgstr "Ljud avstängt"
+
+#: ../data/sugar.schemas.in.h:20
+msgid "Timezone setting for the system."
+msgstr "Systemets tidszonsinställning."
+
+#: ../data/sugar.schemas.in.h:21
+msgid "Url of the jabber server to use."
+msgstr "URL för den jabber-server som skall användas."
+
+#: ../data/sugar.schemas.in.h:22
+msgid "Url where the backup is saved to."
+msgstr "URL för den plats där säkerhetskopieringar skall lagras."
+
+#: ../data/sugar.schemas.in.h:23
+msgid "User Color"
+msgstr "Användarfärg"
+
+#: ../data/sugar.schemas.in.h:24
+msgid "User Name"
+msgstr "Användarnamn"
+
+#: ../data/sugar.schemas.in.h:25
+msgid "User name that is used throughout the desktop."
+msgstr "Det användarnamn som används överallt på skrivbordet."
+
+#: ../data/sugar.schemas.in.h:26
+msgid "Volume Level"
+msgstr "Volymnivå"
+
+#: ../data/sugar.schemas.in.h:27
+msgid "Volume level for the sound device."
+msgstr "Ljudenhetens volymnivå."
+#: ../data/sugar.schemas.in.h:28
+msgid ""
+"When in resume mode, clicking on a favorite icon will cause the last entry "
+"for that activity to be resumed."
+msgstr ""
+"Om fortsättningsläge är aktiverat så kommer ett klick på en favoritikon "
+"innebära att den senaste posten för den aktiviteten kommer att återupptas."
+
+#: ../src/jarabe/controlpanel/cmd.py:28
+#, python-format
+msgid ""
+"sugar-control-panel: WARNING, found more than one option with the same name: "
+"%s module: %r"
+msgstr ""
+"sugar-control-panel: VARNING, Hittade mer än ett alternativ med samma namn: "
+"%s modul: %r"
+
+#: ../src/jarabe/controlpanel/cmd.py:30
+#, python-format
+msgid "sugar-control-panel: key=%s not an available option"
+msgstr "sugar-control-panel: key=%s är inte ett giltigt val."
+
+#: ../src/jarabe/controlpanel/cmd.py:31
+#, python-format
+msgid "sugar-control-panel: %s"
+msgstr "sugar-control-panel: %s"
+
+# TRANS: Translators, there's a empty line at the end of this string,
+# which must appear in the translated string (msgstr) as well.
+#. TRANS: Translators, there's a empty line at the end of this string,
+#. which must appear in the translated string (msgstr) as well.
+#: ../src/jarabe/controlpanel/cmd.py:37
+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 ""
+"Användning: sugar-control-panel [ val ] nyckel [ parametrar ... ] \n"
+" Ställ in Sockermiljön. \n"
+" Val: \n"
+" -h visar hjälpmeddelande och avslutar. \n"
+" -l listar upp alla möjliga val \n"
+" -h nyckel Visar information om nyckeln \n"
+" -g nyckel Hämtar nuvarande värde på nyckel \n"
+" -s nyckel Sätter nuvarande värde på nyckel \n"
+" -c nyckel Rensar nuvarande värde på nyckel \n"
+" "
+
+#: ../src/jarabe/controlpanel/cmd.py:50
+msgid "To apply your changes you have to restart sugar.\n"
+msgstr "För att förändringarna ska träda i kraft behöver du starta om Socker."
+
+#: ../src/jarabe/controlpanel/gui.py:275
+msgid "Warning"
+msgstr "Varning"
+
+#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/sectionview.py:42
+msgid "Changes require restart"
+msgstr "Ändringarna kräver omstart"
+
+#: ../src/jarabe/controlpanel/gui.py:279
+msgid "Cancel changes"
+msgstr "Ångra ändringar"
+
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
+msgid "Later"
+msgstr "Senare"
+
+#: ../src/jarabe/controlpanel/gui.py:288
+msgid "Restart now"
+msgstr "Starta om nu"
+
+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
+msgid "Done"
+msgstr "Klar"
+
+#: ../src/jarabe/controlpanel/toolbar.py:115
+#: ../src/jarabe/desktop/homebox.py:111
+#: ../src/jarabe/frame/activitiestray.py:687
+#: ../src/jarabe/frame/activitiestray.py:766
+#: ../src/jarabe/frame/activitiestray.py:794
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: ../src/jarabe/controlpanel/toolbar.py:121
+#: ../src/jarabe/desktop/favoritesview.py:338
+msgid "Ok"
+msgstr "Ok"
+
+# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:107
+#: ../src/jarabe/desktop/favoriteslayout.py:114
msgid "Freeform"
msgstr "Frihand"
+# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:189
+#: ../src/jarabe/desktop/favoriteslayout.py:196
msgid "Ring"
msgstr "Ring"
+# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:334
+#: ../src/jarabe/desktop/favoriteslayout.py:332
msgid "Spiral"
msgstr "Spiral"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:401
-#, fuzzy
+#: ../src/jarabe/desktop/favoriteslayout.py:399
msgid "Box"
msgstr "Låda"
+# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/view/home/favoriteslayout.py:442
+#: ../src/jarabe/desktop/favoriteslayout.py:440
msgid "Triangle"
msgstr "Triangel"
-#: ../src/view/home/favoritesview.py:295
+#: ../src/jarabe/desktop/favoritesview.py:329
msgid "Registration Failed"
msgstr "Registreringen misslyckades"
-#: ../src/view/home/favoritesview.py:296
+#: ../src/jarabe/desktop/favoritesview.py:330
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/view/home/favoritesview.py:298
+#: ../src/jarabe/desktop/favoritesview.py:332
msgid "Registration Successful"
msgstr "Registreringen lyckades"
-#: ../src/view/home/favoritesview.py:299
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "You are now registered with your school server."
msgstr "Du är nu registread hos din skolserver"
-#: ../src/view/home/favoritesview.py:420
-msgid "Settings"
-msgstr "Inställningar"
+#: ../src/jarabe/desktop/favoritesview.py:668
+msgid "Register"
+msgstr "Registrera"
-#: ../src/view/home/favoritesview.py:425
-msgid "Restart"
-msgstr "Starta om"
+#: ../src/jarabe/desktop/homebox.py:67
+msgid "Confirm erase"
+msgstr "Bekräfta borttagning"
-#: ../src/view/home/favoritesview.py:430
-msgid "Shutdown"
-msgstr "Stäng av"
+#: ../src/jarabe/desktop/homebox.py:69
+#, python-format
+msgid "Confirm erase: Do you want to permanently erase %s?"
+msgstr "Bekräfta borttagning: Vill du verkligen ta bort %s för alltid?"
-#: ../src/view/home/favoritesview.py:436
-msgid "Register"
-msgstr "Registrera"
+# 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/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
+msgid "Keep"
+msgstr "Spara"
-#: ../src/view/palettes.py:42
-msgid "Starting..."
-msgstr "Startar..."
+#: ../src/jarabe/desktop/homebox.py:76
+#: ../src/jarabe/journal/journaltoolbox.py:357
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
+msgid "Erase"
+msgstr "Ta bort"
-#: ../src/view/palettes.py:72
-msgid "Stop"
-msgstr "Avsluta"
+#: ../src/jarabe/desktop/homebox.py:106
+msgid "Software Update"
+msgstr "Mjukvaruuppdatering"
-#. TRANS: Action label for starting an entry.
-#: ../src/view/palettes.py:104 ../src/journal/journaltoolbox.py:402
-#: ../src/journal/palettes.py:59
-msgid "Start"
-msgstr "Starta"
+#: ../src/jarabe/desktop/homebox.py:107
+msgid "Update your activities to ensure compatibility with your new software"
+msgstr ""
+"Uppdatera dina aktiviteter så att du är säker på att de fungerar ihop med "
+"din nya mjukvara"
-#: ../src/view/palettes.py:138
-msgid "Remove favorite"
-msgstr "Ta bort från favoriter"
+#: ../src/jarabe/desktop/homebox.py:116
+msgid "Check now"
+msgstr "Kontrollera nu"
-#: ../src/view/palettes.py:142
-msgid "Make favorite"
-msgstr "Lägg till till favoriter"
+#: ../src/jarabe/desktop/homebox.py:233
+msgid "List view"
+msgstr "Listvy"
-#: ../src/view/palettes.py:191
-msgid "Show contents"
-msgstr "Visa innehåll"
+#: ../src/jarabe/desktop/homebox.py:234
+msgid "<Ctrl>2"
+msgstr "<Ctrl> + 2"
+
+#: ../src/jarabe/desktop/homebox.py:296
+msgid "Favorites view"
+msgstr "Favoritvy"
+
+#: ../src/jarabe/desktop/homebox.py:297
+msgid "<Ctrl>1"
+msgstr "<Ctrl> + 1"
+
+#: ../src/jarabe/desktop/keydialog.py:131
+msgid "Key Type:"
+msgstr "Huvudtyp:"
+
+#: ../src/jarabe/desktop/keydialog.py:151
+msgid "Authentication Type:"
+msgstr "Verifieringstyp:"
+
+# Uncertain whether Personal here refers to both protocols or WPA2 only.
+#: ../src/jarabe/desktop/keydialog.py:215
+msgid "WPA & WPA2 Personal"
+msgstr "WPA & WPA2 Personal"
-#: ../src/view/palettes.py:215
+#: ../src/jarabe/desktop/keydialog.py:224
+msgid "Wireless Security:"
+msgstr "Trådlös säkerhet:"
+
+#: ../src/jarabe/desktop/meshbox.py:131
+msgid "Connect"
+msgstr "Anslut"
+
+#: ../src/jarabe/desktop/meshbox.py:135
+msgid "Disconnect"
+msgstr "Avbryt anslutning"
+
+# TRANS: Action label for resuming an activity.
+#. TRANS: Action label for resuming an activity.
+#: ../src/jarabe/desktop/meshbox.py:441
+#: ../src/jarabe/frame/activitiestray.py:711
+#: ../src/jarabe/journal/journaltoolbox.py:425
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
+msgid "Resume"
+msgstr "Återuppta"
+
+#: ../src/jarabe/desktop/meshbox.py:446
+#: ../src/jarabe/frame/activitiestray.py:227
+msgid "Join"
+msgstr "Gå med i"
+
+#: ../src/jarabe/desktop/schoolserver.py:34
+msgid "Cannot obtain data needed for registration."
+msgstr ""
+"Kunde inte komma åt den data som krävs för att genomföra registreringen."
+
+#: ../src/jarabe/desktop/schoolserver.py:51
+msgid "Cannot connect to the server."
+msgstr "Kunde inte komma åter servern."
+
+#: ../src/jarabe/desktop/schoolserver.py:56
+msgid "The server could not complete the request."
+msgstr "Servern misslyckades med att fullfölja förfrågan."
+
+#: ../src/jarabe/frame/activitiestray.py:232
+#: ../src/jarabe/frame/activitiestray.py:659
+msgid "Decline"
+msgstr "Avstå"
+
+#: ../src/jarabe/frame/activitiestray.py:612
#, python-format
-msgid "%(free_space)d MB Free"
-msgstr "%(free_space)d MB ledigt"
+msgid "%dB"
+msgstr "%dB"
+
+#: ../src/jarabe/frame/activitiestray.py:614
+#, python-format
+msgid "%dKB"
+msgstr "%dKB"
+
+#: ../src/jarabe/frame/activitiestray.py:616
+#, python-format
+msgid "%dMB"
+msgstr "%dMB"
+
+# This really needs a TRANS!
+#: ../src/jarabe/frame/activitiestray.py:633
+#, python-format
+msgid "%s of %s"
+msgstr "%s av %s"
-#: ../src/journal/journaltoolbox.py:62
+#: ../src/jarabe/frame/activitiestray.py:644
+#, python-format
+msgid "Transfer from %r"
+msgstr "Överföring från %r"
+
+#: ../src/jarabe/frame/activitiestray.py:654
+msgid "Accept"
+msgstr "Godta"
+
+#: ../src/jarabe/frame/activitiestray.py:677
+#: ../src/jarabe/frame/activitiestray.py:784
+#, python-format
+msgid "%s (%s)"
+msgstr "%s (%s)"
+
+#: ../src/jarabe/frame/activitiestray.py:755
+#, python-format
+msgid "Transfer to %r"
+msgstr "Överföring till %r"
+
+#: ../src/jarabe/frame/clipboardmenu.py:52
+msgid "Remove"
+msgstr "Ta bort"
+
+#: ../src/jarabe/frame/clipboardmenu.py:57
+#: ../src/jarabe/frame/clipboardmenu.py:80
+msgid "Open"
+msgstr "Öppna"
+
+#: ../src/jarabe/frame/clipboardmenu.py:85
+msgid "Open with"
+msgstr "Öppna med"
+
+#: ../src/jarabe/frame/clipboardobject.py:49
+#, python-format
+msgid "%s clipping"
+msgstr "%s urklipp"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:36
+msgid "Neighborhood"
+msgstr "Grannar"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:38
+msgid "Group"
+msgstr "Grupp"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:40
+msgid "Home"
+msgstr "Hem"
+
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "Aktivitet"
+
+#: ../src/jarabe/intro/window.py:124
+msgid "Click to change color:"
+msgstr "Klicka för att ändra färg:"
+
+#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
+msgid "Back"
+msgstr "Tillbaka"
+
+#: ../src/jarabe/intro/window.py:191
+msgid "Next"
+msgstr "Nästa"
+
+#: ../src/jarabe/journal/collapsedentry.py:258
+#: ../src/jarabe/journal/expandedentry.py:159
+#: ../src/jarabe/journal/palettes.py:66
+msgid "Untitled"
+msgstr "Ingen titel"
+
+#: ../src/jarabe/journal/expandedentry.py:205
+msgid "No preview"
+msgstr "Ingen förhandsvisning"
+
+#: ../src/jarabe/journal/expandedentry.py:224
+msgid "Participants:"
+msgstr "Medverkande:"
+
+#: ../src/jarabe/journal/expandedentry.py:247
+msgid "Description:"
+msgstr "Beskrivning:"
+
+#: ../src/jarabe/journal/expandedentry.py:273
+msgid "Tags:"
+msgstr "Nyckelord:"
+
+#: ../src/jarabe/journal/journalactivity.py:108
+#: ../src/jarabe/journal/volumestoolbar.py:47
+msgid "Journal"
+msgstr "Dagbok"
+
+#: ../src/jarabe/journal/journaltoolbox.py:65
msgid "Search"
msgstr "Sök"
-#: ../src/journal/journaltoolbox.py:119
+#: ../src/jarabe/journal/journaltoolbox.py:124
msgid "Anytime"
msgstr "När som helst"
-#: ../src/journal/journaltoolbox.py:121
+#: ../src/jarabe/journal/journaltoolbox.py:126
msgid "Today"
msgstr "Idag"
-#: ../src/journal/journaltoolbox.py:123
+#: ../src/jarabe/journal/journaltoolbox.py:128
msgid "Since yesterday"
msgstr "Sedan igår"
+# TRANS: Filter entries modified during the last 7 days.
#. TRANS: Filter entries modified during the last 7 days.
-#: ../src/journal/journaltoolbox.py:125
+#: ../src/jarabe/journal/journaltoolbox.py:130
msgid "Past week"
msgstr "Förra veckan"
+# TRANS: Filter entries modified during the last 30 days.
#. TRANS: Filter entries modified during the last 30 days.
-#: ../src/journal/journaltoolbox.py:127
+#: ../src/jarabe/journal/journaltoolbox.py:132
msgid "Past month"
msgstr "Senaste månaden"
+# TRANS: Filter entries modified during the last 356 days.
#. TRANS: Filter entries modified during the last 356 days.
-#: ../src/journal/journaltoolbox.py:129
+#: ../src/jarabe/journal/journaltoolbox.py:134
msgid "Past year"
msgstr "Senaste året"
-#: ../src/journal/journaltoolbox.py:136
+#: ../src/jarabe/journal/journaltoolbox.py:141
msgid "Anyone"
msgstr "Vem som helst"
-#: ../src/journal/journaltoolbox.py:138
+#: ../src/jarabe/journal/journaltoolbox.py:143
msgid "My friends"
msgstr "Mina vänner"
-#: ../src/journal/journaltoolbox.py:139
+#: ../src/jarabe/journal/journaltoolbox.py:144
msgid "My class"
msgstr "Mina klasskompisar"
+# TRANS: Item in a combo box that filters by entry type.
#. TRANS: Item in a combo box that filters by entry type.
-#: ../src/journal/journaltoolbox.py:255
+#: ../src/jarabe/journal/journaltoolbox.py:271
msgid "Anything"
msgstr "Vad som helst"
-#. TODO: Add "Start with" menu item
-#: ../src/journal/journaltoolbox.py:325 ../src/journal/palettes.py:67
+# TODO: Add "Start with" menu item
+#: ../src/jarabe/journal/journaltoolbox.py:347
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "Kopiera"
-#: ../src/journal/collapsedentry.py:248 ../src/journal/expandedentry.py:176
-#: ../src/journal/palettes.py:51
-msgid "Untitled"
-msgstr "Ingen titel"
+# TRANS: Action label for starting an entry.
+#. TRANS: Action label for starting an entry.
+#: ../src/jarabe/journal/journaltoolbox.py:428
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
+msgid "Start"
+msgstr "Starta"
-#: ../src/journal/journalactivity.py:119 ../src/journal/volumesmanager.py:57
-msgid "Journal"
-msgstr "Dagbok"
+#: ../src/jarabe/journal/listview.py:40
+msgid "Your Journal is empty"
+msgstr "Din dagbok är tom."
-#: ../src/journal/expandedentry.py:222
-msgid "No preview"
-msgstr "Ingen förhandsvisning"
+#: ../src/jarabe/journal/listview.py:41
+msgid "No matching entries "
+msgstr "Kunde inte hitta några matchande filer "
-#: ../src/journal/expandedentry.py:241
-msgid "Participants:"
-msgstr "Medverkande:"
+# Uncertain if this is used to clear the search criteria or the search results. A TRANS would be nice.
+#: ../src/jarabe/journal/listview.py:369
+msgid "Clear search"
+msgstr "Rensa sökning"
-#: ../src/journal/expandedentry.py:266
-msgid "Description:"
-msgstr "Beskrivning:"
+#: ../src/jarabe/journal/misc.py:91
+msgid "No date"
+msgstr "Inget datum"
-#: ../src/journal/expandedentry.py:292
-msgid "Tags:"
-msgstr "Nyckelord:"
+#: ../src/jarabe/journal/modalalert.py:63
+msgid "Your Journal is full"
+msgstr "Din dagbok är full"
-#: ../src/journal/objectchooser.py:134
+#: ../src/jarabe/journal/modalalert.py:67
+msgid "Please delete some old Journal entries to make space for new ones."
+msgstr "Ta bort gamla dagboksinlägg för att få plats med nya."
+
+#: ../src/jarabe/journal/modalalert.py:79
+msgid "Show Journal"
+msgstr "Visa Dagbok"
+
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "Välj ett objekt"
-#: ../src/journal/objectchooser.py:139
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
msgid "Close"
msgstr "Stäng"
-#: ../src/journal/volumestoolbar.py:93
+#: ../src/jarabe/journal/palettes.py:73
+msgid "Resume with"
+msgstr "Återuppta med"
+
+#: ../src/jarabe/journal/palettes.py:76
+msgid "Start with"
+msgstr "Börja med"
+
+#: ../src/jarabe/journal/palettes.py:98
+msgid "Send to"
+msgstr "Skicka till"
+
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "Se detaljer"
+
+#: ../src/jarabe/journal/palettes.py:185
+msgid "No friends present"
+msgstr "Inga kompisar närvarande"
+
+#: ../src/jarabe/journal/palettes.py:190
+msgid "No valid connection found"
+msgstr "Ingen giltig anslutning hittad"
+
+#: ../src/jarabe/journal/palettes.py:218
+msgid "No activity to resume entry"
+msgstr "Ingen aktivitet att fortsätta med"
+
+#: ../src/jarabe/journal/palettes.py:220
+msgid "No activity to start entry"
+msgstr "Ingen aktivitet att börja med"
+
+#: ../src/jarabe/view/buddymenu.py:62
+msgid "Remove friend"
+msgstr "Ta bort kompis"
+
+#: ../src/jarabe/view/buddymenu.py:65
+msgid "Make friend"
+msgstr "Bli kompis med"
+
+#: ../src/jarabe/view/buddymenu.py:82
+msgid "My Settings"
+msgstr "Mina inställningar"
+
+#: ../src/jarabe/view/buddymenu.py:90
+msgid "Logout"
+msgstr "Logga ut"
+
+#: ../src/jarabe/view/buddymenu.py:95
+msgid "Restart"
+msgstr "Starta om"
+
+#: ../src/jarabe/view/buddymenu.py:100
+msgid "Shutdown"
+msgstr "Stäng av"
+
+#: ../src/jarabe/view/buddymenu.py:135
+#, python-format
+msgid "Invite to %s"
+msgstr "Bjud in till %s"
+
+#: ../src/jarabe/view/palettes.py:47
+msgid "Starting..."
+msgstr "Startar..."
+
+#. TODO: share-with, keep
+#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "Se källa"
+
+#: ../src/jarabe/view/palettes.py:84
+msgid "Stop"
+msgstr "Avsluta"
+
+#: ../src/jarabe/view/palettes.py:171
+msgid "Remove favorite"
+msgstr "Ta bort från favoriter"
+
+#: ../src/jarabe/view/palettes.py:175
+msgid "Make favorite"
+msgstr "Lägg till till favoriter"
+
+#: ../src/jarabe/view/palettes.py:238
+msgid "Show contents"
+msgstr "Visa innehåll"
+
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
+#, python-format
+msgid "%(free_space)d MB Free"
+msgstr "%(free_space)d MB ledigt"
+
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "Avmontera"
-#: ../src/journal/misc.py:95
-msgid "No date"
-msgstr "Inget datum"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "Instanskälla"
-#: ../src/journal/listview.py:39
-msgid "Your Journal is empty"
-msgstr "Din dagbok är tom."
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "Källa"
-#: ../src/journal/listview.py:40
-msgid "No matching entries "
-msgstr "Kunde inte hitta några matchande filer "
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "Källa för aktivitetspaket"
-#: ../src/journal/modalalert.py:59
-msgid "Your Journal is full"
-msgstr "Din dagbok är full"
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "Se källa: %r"
-#: ../src/journal/modalalert.py:63
-msgid "Please delete some old Journal entries to make space for new ones."
-msgstr "Ta bort gamla dagboksinlägg för att få plats med nya."
+#~ msgid "Document"
+#~ msgstr "Dokument"
-#: ../src/journal/modalalert.py:75
-msgid "Show Journal"
-msgstr "Visa Dagbok"
+#~ msgid "Resume by default"
+#~ msgstr "Återuppta som förval"
+
+#~ msgid "Encryption Type:"
+#~ msgstr "Krypteringstyp:"
+
+#~ msgid "Disconnecting..."
+#~ msgstr "Kopplar ned..."
+
+# only temporarily
+#~ msgid "Mesh Network"
+#~ msgstr "Meshnätverk"
+
+#~ msgid "Disconnected"
+#~ msgstr "Inte ansluten"
+
+#~ msgid "About my XO"
+#~ msgstr "Om min XO"
+
+#~ msgid "Mesh"
+#~ msgstr "Mesh"
+
+#~ msgid "Connected to a School Mesh Portal"
+#~ msgstr "Ansluten till en skolportal"
+
+#~ msgid "Looking for a School Mesh Portal..."
+#~ msgstr "Letar efter en skolportal..."
+
+#~ msgid "Connected to an XO Mesh Portal"
+#~ msgstr "Ansluten till en XO-portal"
+
+#~ msgid "Looking for an XO Mesh Portal..."
+#~ msgstr "Letar efter en XO-portal..."
+
+#~ msgid "Connected to a Simple Mesh"
+#~ msgstr "Ansluten till ett enkelt meshnätverk"
+
+#~ msgid "Starting a Simple Mesh"
+#~ msgstr "Startar ett enkelt meshnätverk..."
+
+#~ msgid "Unknown Mesh"
+#~ msgstr "Okänt meshnätverk"
+
+#~ msgid "Settings"
+#~ msgstr "Inställningar"
#, python-format
#~ msgid "Clipboard object: %s."
#~ msgstr "Kopieringsminne: %s."
-#, python-format
-#~ msgid "IP address: %s"
-#~ msgstr "IP-adress: %s"
-
#~ msgid ""
#~ "Extreme power management (disables wireless radio, increases battery life)"
#~ msgstr ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 4300edd..37d94f9 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -6,14 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: Sugar\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-01-27 13:34-0500\n"
-"PO-Revision-Date: 2009-02-14 18:37-0500\n"
+"POT-Creation-Date: 2009-03-19 00:30-0400\n"
+"PO-Revision-Date: 2009-05-10 10:53-0400\n"
"Last-Translator: Yuan Chao <yuanchao@gmail.com>\n"
"Language-Team: Yuan CHAO <yuanchao@gmail.com>\n"
+"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Pootle 1.1.0rc2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 1.2.1\n"
#: ../extensions/cpsection/aboutme/__init__.py:24
msgid "About Me"
@@ -21,7 +23,7 @@ msgstr "關於我"
#: ../extensions/cpsection/aboutme/model.py:43
msgid "You must enter a name."
-msgstr "您必需輸入名稱"
+msgstr "請輸入姓名"
#: ../extensions/cpsection/aboutme/model.py:68
#, python-format
@@ -51,8 +53,7 @@ msgstr "指定增修顏色時發生錯誤"
msgid "Error in specified colors."
msgstr "指定顏色時發生錯誤"
-#: ../extensions/cpsection/aboutme/view.py:94
-#: ../src/jarabe/intro/window.py:92
+#: ../extensions/cpsection/aboutme/view.py:94 ../src/jarabe/intro/window.py:92
msgid "Name:"
msgstr "姓名:"
@@ -125,8 +126,7 @@ msgstr "日期與時間"
msgid "Error timezone does not exist."
msgstr "錯誤,時區資料不存在."
-#: ../extensions/cpsection/datetime/view.py:68
-#: ../data/sugar.schemas.in.h:19
+#: ../extensions/cpsection/datetime/view.py:68 ../data/sugar.schemas.in.h:19
msgid "Timezone"
msgstr "時區"
@@ -198,7 +198,7 @@ msgstr "錯誤的無線網路信號開關設定,請指定on/off。"
#: ../extensions/cpsection/network/model.py:137
msgid "Error in specified argument use 0/1."
-msgstr "錯誤的無線網路信號開關設定,請指定0/1。"
+msgstr "無線網路信號開關只能設為 0/1。"
#: ../extensions/cpsection/network/view.py:56
msgid "Wireless"
@@ -260,7 +260,7 @@ msgid ""
"Extreme power management (disableswireless radio, increases battery life)"
msgstr "積極電源管理模式 (關閉無線網路,增加電池使用時間)"
-#: ../extensions/deviceicon/battery.py:56
+#: ../extensions/deviceicon/battery.py:58
msgid "My Battery"
msgstr "我的電池狀態"
@@ -281,7 +281,7 @@ msgstr "電池電源即將用完"
msgid "%(hour)d:%(min).2d remaining"
msgstr "剩餘 %(hour)d:%(min).2d"
-#: ../extensions/deviceicon/battery.py:153
+#: ../extensions/deviceicon/battery.py:152
msgid "Charged"
msgstr "充電完成"
@@ -303,14 +303,14 @@ msgstr "切斷連線…"
# method for a device either (for various reasons) so this doesn't
# have a good mapping
#: ../extensions/deviceicon/network.py:109
-#: ../src/jarabe/desktop/meshbox.py:246
+#: ../src/jarabe/desktop/meshbox.py:248
msgid "Connecting..."
msgstr "連線中…"
# TODO: show the channel number
#: ../extensions/deviceicon/network.py:113
#: ../extensions/deviceicon/network.py:166
-#: ../src/jarabe/desktop/meshbox.py:252
+#: ../src/jarabe/desktop/meshbox.py:254
msgid "Connected"
msgstr "已連線"
@@ -326,41 +326,22 @@ msgstr "有線網路"
msgid "Speed"
msgstr "速度"
-#: ../extensions/deviceicon/speaker.py:46
+#: ../extensions/deviceicon/speaker.py:59
msgid "My Speakers"
msgstr "我的喇叭"
-#: ../extensions/deviceicon/speaker.py:128
+#: ../extensions/deviceicon/speaker.py:135
msgid "Unmute"
msgstr "取消靜音"
-#: ../extensions/deviceicon/speaker.py:131
+#: ../extensions/deviceicon/speaker.py:138
msgid "Mute"
msgstr "喇叭靜音"
-#: ../extensions/globalkey/screenshot.py:50
+#: ../extensions/globalkey/screenshot.py:51
msgid "Screenshot"
msgstr "畫面抓圖"
-#: ../extensions/globalkey/viewsource.py:196
-#, python-format
-msgid "View source: %r"
-msgstr "查看原始碼: %r"
-
-#: ../extensions/globalkey/viewsource.py:205
-#: ../src/jarabe/frame/zoomtoolbar.py:42
-msgid "Activity"
-msgstr "活動"
-
-#: ../extensions/globalkey/viewsource.py:212
-msgid "Document"
-msgstr "文件"
-
-#: ../extensions/globalkey/viewsource.py:226
-#: ../src/jarabe/journal/objectchooser.py:141
-msgid "Close"
-msgstr "關閉"
-
#: ../data/sugar.schemas.in.h:1
msgid "Backup URL"
msgstr "備份網址"
@@ -525,94 +506,92 @@ msgstr ""
msgid "To apply your changes you have to restart sugar.\n"
msgstr "需要重新啟動系統使變更生效.\n"
-#: ../src/jarabe/controlpanel/gui.py:272
+#: ../src/jarabe/controlpanel/gui.py:275
msgid "Warning"
msgstr "警告"
-#: ../src/jarabe/controlpanel/gui.py:273
+#: ../src/jarabe/controlpanel/gui.py:276
#: ../src/jarabe/controlpanel/sectionview.py:42
msgid "Changes require restart"
msgstr "改變須要重新啟動才能生效"
-#: ../src/jarabe/controlpanel/gui.py:276
+#: ../src/jarabe/controlpanel/gui.py:279
msgid "Cancel changes"
msgstr "取消改變"
-#: ../src/jarabe/controlpanel/gui.py:281
-#: ../src/jarabe/desktop/homebox.py:113
+#: ../src/jarabe/controlpanel/gui.py:284 ../src/jarabe/desktop/homebox.py:113
msgid "Later"
msgstr "稍候"
-#: ../src/jarabe/controlpanel/gui.py:285
+#: ../src/jarabe/controlpanel/gui.py:288
msgid "Restart now"
msgstr "馬上重新啟動"
-#: ../src/jarabe/controlpanel/toolbar.py:61
-#: ../src/jarabe/intro/window.py:188
+#: ../src/jarabe/controlpanel/toolbar.py:61 ../src/jarabe/intro/window.py:188
msgid "Done"
msgstr "完成"
#: ../src/jarabe/controlpanel/toolbar.py:115
#: ../src/jarabe/desktop/homebox.py:111
-#: ../src/jarabe/frame/activitiestray.py:683
-#: ../src/jarabe/frame/activitiestray.py:762
-#: ../src/jarabe/frame/activitiestray.py:790
+#: ../src/jarabe/frame/activitiestray.py:726
+#: ../src/jarabe/frame/activitiestray.py:821
+#: ../src/jarabe/frame/activitiestray.py:849
msgid "Cancel"
msgstr "取消"
#: ../src/jarabe/controlpanel/toolbar.py:121
-#: ../src/jarabe/desktop/favoritesview.py:334
+#: ../src/jarabe/desktop/favoritesview.py:339
msgid "Ok"
msgstr "確定"
# TRANS: label for the freeform layout in the favorites view
#. TRANS: label for the freeform layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:114
+#: ../src/jarabe/desktop/favoriteslayout.py:116
msgid "Freeform"
msgstr "自由格式"
# TRANS: label for the ring layout in the favorites view
#. TRANS: label for the ring layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:196
+#: ../src/jarabe/desktop/favoriteslayout.py:198
msgid "Ring"
msgstr "活動環"
# TRANS: label for the spiral layout in the favorites view
#. TRANS: label for the spiral layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:341
+#: ../src/jarabe/desktop/favoriteslayout.py:334
msgid "Spiral"
msgstr "螺旋"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:408
+#: ../src/jarabe/desktop/favoriteslayout.py:401
msgid "Box"
msgstr "方型"
# TRANS: label for the box layout in the favorites view
#. TRANS: label for the box layout in the favorites view
-#: ../src/jarabe/desktop/favoriteslayout.py:449
+#: ../src/jarabe/desktop/favoriteslayout.py:442
msgid "Triangle"
msgstr "三角形"
-#: ../src/jarabe/desktop/favoritesview.py:325
+#: ../src/jarabe/desktop/favoritesview.py:330
msgid "Registration Failed"
msgstr "註冊失敗"
-#: ../src/jarabe/desktop/favoritesview.py:326
+#: ../src/jarabe/desktop/favoritesview.py:331
#, python-format
msgid "%s"
msgstr "%s"
-#: ../src/jarabe/desktop/favoritesview.py:328
+#: ../src/jarabe/desktop/favoritesview.py:333
msgid "Registration Successful"
msgstr "註冊成功"
-#: ../src/jarabe/desktop/favoritesview.py:329
+#: ../src/jarabe/desktop/favoritesview.py:334
msgid "You are now registered with your school server."
msgstr "您已經成功註冊到校園主機"
-#: ../src/jarabe/desktop/favoritesview.py:666
+#: ../src/jarabe/desktop/favoritesview.py:674
msgid "Register"
msgstr "註冊"
@@ -629,15 +608,14 @@ msgstr "確認刪除:您確定要永久地刪除 %s 嗎?"
# TODO: Implement stopping downloads
# self._stop_item.connect('activate', self._stop_item_activate_cb)
# self.append_menu_item(self._stop_item)
-#: ../src/jarabe/desktop/homebox.py:73
-#: ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/desktop/homebox.py:73 ../src/jarabe/frame/clipboardmenu.py:62
+#: ../src/jarabe/view/viewsource.py:218
msgid "Keep"
msgstr "保存"
#: ../src/jarabe/desktop/homebox.py:76
#: ../src/jarabe/journal/journaltoolbox.py:357
-#: ../src/jarabe/journal/palettes.py:97
-#: ../src/jarabe/view/palettes.py:127
+#: ../src/jarabe/journal/palettes.py:112 ../src/jarabe/view/palettes.py:153
msgid "Erase"
msgstr "刪除"
@@ -669,10 +647,6 @@ msgstr "偏好檢視"
msgid "<Ctrl>1"
msgstr "<Ctrl>1"
-#: ../src/jarabe/desktop/homebox.py:304
-msgid "Resume by default"
-msgstr "預設回復"
-
#: ../src/jarabe/desktop/keydialog.py:131
msgid "Key Type:"
msgstr "金鑰類型:"
@@ -689,82 +663,86 @@ msgstr "個人的 WPA & WPA2 加密"
msgid "Wireless Security:"
msgstr "無線網路加密:"
-#: ../src/jarabe/desktop/meshbox.py:130
+#: ../src/jarabe/desktop/meshbox.py:132
msgid "Connect"
msgstr "連線"
-#: ../src/jarabe/desktop/meshbox.py:134
+#: ../src/jarabe/desktop/meshbox.py:136
msgid "Disconnect"
msgstr "切斷連線"
# TRANS: Action label for resuming an activity.
#. TRANS: Action label for resuming an activity.
-#: ../src/jarabe/desktop/meshbox.py:440
-#: ../src/jarabe/frame/activitiestray.py:707
+#: ../src/jarabe/desktop/meshbox.py:442
+#: ../src/jarabe/frame/activitiestray.py:761
#: ../src/jarabe/journal/journaltoolbox.py:425
-#: ../src/jarabe/journal/palettes.py:63
-#: ../src/jarabe/view/palettes.py:62
+#: ../src/jarabe/journal/palettes.py:72 ../src/jarabe/view/palettes.py:66
msgid "Resume"
msgstr "回復"
-#: ../src/jarabe/desktop/meshbox.py:445
-#: ../src/jarabe/frame/activitiestray.py:221
+#: ../src/jarabe/desktop/meshbox.py:447
+#: ../src/jarabe/frame/activitiestray.py:235
msgid "Join"
msgstr "加入"
-#: ../src/jarabe/desktop/schoolserver.py:18
+#: ../src/jarabe/desktop/schoolserver.py:34
msgid "Cannot obtain data needed for registration."
msgstr "無法取得註冊所需的資料"
-#: ../src/jarabe/desktop/schoolserver.py:35
+#: ../src/jarabe/desktop/schoolserver.py:51
msgid "Cannot connect to the server."
msgstr "無法連線到伺服器"
-#: ../src/jarabe/desktop/schoolserver.py:40
+#: ../src/jarabe/desktop/schoolserver.py:56
msgid "The server could not complete the request."
msgstr "伺服器無法完成查尋動作"
-#: ../src/jarabe/frame/activitiestray.py:226
-#: ../src/jarabe/frame/activitiestray.py:655
+#: ../src/jarabe/frame/activitiestray.py:240
+#: ../src/jarabe/frame/activitiestray.py:698
msgid "Decline"
msgstr "拒絕"
-#: ../src/jarabe/frame/activitiestray.py:608
+#: ../src/jarabe/frame/activitiestray.py:650
#, python-format
msgid "%dB"
msgstr "%dB"
-#: ../src/jarabe/frame/activitiestray.py:610
+#: ../src/jarabe/frame/activitiestray.py:652
#, python-format
msgid "%dKB"
msgstr "%dKB"
-#: ../src/jarabe/frame/activitiestray.py:612
+#: ../src/jarabe/frame/activitiestray.py:654
#, python-format
msgid "%dMB"
msgstr "%dMB"
-#: ../src/jarabe/frame/activitiestray.py:629
+#: ../src/jarabe/frame/activitiestray.py:671
#, python-format
msgid "%s of %s"
msgstr "%s 之 %s"
-#: ../src/jarabe/frame/activitiestray.py:640
+#: ../src/jarabe/frame/activitiestray.py:683
#, python-format
msgid "Transfer from %r"
msgstr "傳送自 %r"
-#: ../src/jarabe/frame/activitiestray.py:650
+#: ../src/jarabe/frame/activitiestray.py:693
msgid "Accept"
msgstr "接受"
-#: ../src/jarabe/frame/activitiestray.py:673
-#: ../src/jarabe/frame/activitiestray.py:780
+#: ../src/jarabe/frame/activitiestray.py:716
+#: ../src/jarabe/frame/activitiestray.py:839
#, python-format
msgid "%s (%s)"
msgstr "%s (%s)"
-#: ../src/jarabe/frame/activitiestray.py:751
+#: ../src/jarabe/frame/activitiestray.py:750
+#: ../src/jarabe/frame/activitiestray.py:873
+msgid "Dismiss"
+msgstr "拒絕"
+
+#: ../src/jarabe/frame/activitiestray.py:810
#, python-format
msgid "Transfer to %r"
msgstr "傳送給 %r"
@@ -782,7 +760,7 @@ msgstr "開啟"
msgid "Open with"
msgstr "開啟使用"
-#: ../src/jarabe/frame/clipboardobject.py:47
+#: ../src/jarabe/frame/clipboardobject.py:49
#, python-format
msgid "%s clipping"
msgstr "%s 裁剪"
@@ -799,12 +777,15 @@ msgstr "我的群組"
msgid "Home"
msgstr "我的家"
+#: ../src/jarabe/frame/zoomtoolbar.py:42
+msgid "Activity"
+msgstr "活動"
+
#: ../src/jarabe/intro/window.py:124
msgid "Click to change color:"
msgstr "點選改變顏色:"
-#: ../src/jarabe/intro/window.py:174
-#: ../src/jarabe/journal/detailview.py:103
+#: ../src/jarabe/intro/window.py:174 ../src/jarabe/journal/detailview.py:103
msgid "Back"
msgstr "上一步"
@@ -812,9 +793,9 @@ msgstr "上一步"
msgid "Next"
msgstr "下一步"
-#: ../src/jarabe/journal/collapsedentry.py:243
+#: ../src/jarabe/journal/collapsedentry.py:258
#: ../src/jarabe/journal/expandedentry.py:159
-#: ../src/jarabe/journal/palettes.py:57
+#: ../src/jarabe/journal/palettes.py:66
msgid "Untitled"
msgstr "未命名"
@@ -893,15 +874,14 @@ msgstr "所有類別"
# TODO: Add "Start with" menu item
#: ../src/jarabe/journal/journaltoolbox.py:347
-#: ../src/jarabe/journal/palettes.py:81
+#: ../src/jarabe/journal/palettes.py:90
msgid "Copy"
msgstr "複製"
# TRANS: Action label for starting an entry.
#. TRANS: Action label for starting an entry.
#: ../src/jarabe/journal/journaltoolbox.py:428
-#: ../src/jarabe/journal/palettes.py:66
-#: ../src/jarabe/view/palettes.py:111
+#: ../src/jarabe/journal/palettes.py:75 ../src/jarabe/view/palettes.py:135
msgid "Start"
msgstr "啟動"
@@ -917,7 +897,7 @@ msgstr "沒有相符的紀錄 "
msgid "Clear search"
msgstr "清除搜尋項目"
-#: ../src/jarabe/journal/misc.py:92
+#: ../src/jarabe/journal/misc.py:93
msgid "No date"
msgstr "無日期"
@@ -933,97 +913,133 @@ msgstr "請刪除一些舊的日誌內容來騰出空間給新的日誌"
msgid "Show Journal"
msgstr "顯示日誌"
-#: ../src/jarabe/journal/objectchooser.py:136
+#: ../src/jarabe/journal/objectchooser.py:147
msgid "Choose an object"
msgstr "選擇物件"
-#: ../src/jarabe/journal/palettes.py:64
+#: ../src/jarabe/journal/objectchooser.py:152
+#: ../src/jarabe/view/viewsource.py:308
+msgid "Close"
+msgstr "關閉"
+
+#: ../src/jarabe/journal/palettes.py:73
msgid "Resume with"
msgstr "回復活動"
-#: ../src/jarabe/journal/palettes.py:67
+#: ../src/jarabe/journal/palettes.py:76
msgid "Start with"
msgstr "開始活動"
-#: ../src/jarabe/journal/palettes.py:89
+#: ../src/jarabe/journal/palettes.py:98
msgid "Send to"
msgstr "傳送給"
-#: ../src/jarabe/journal/palettes.py:167
+#: ../src/jarabe/journal/palettes.py:107
+msgid "View Details"
+msgstr "檢視詳細內容"
+
+#: ../src/jarabe/journal/palettes.py:185
msgid "No friends present"
msgstr "沒有好友上線"
-#: ../src/jarabe/journal/palettes.py:172
+#: ../src/jarabe/journal/palettes.py:190
msgid "No valid connection found"
msgstr "找不到有效的網路連線"
-#: ../src/jarabe/journal/palettes.py:200
+#: ../src/jarabe/journal/palettes.py:218
msgid "No activity to resume entry"
-msgstr "找不到用來回復的活動"
+msgstr "找不到可以回復的活動"
-#: ../src/jarabe/journal/palettes.py:202
+#: ../src/jarabe/journal/palettes.py:220
msgid "No activity to start entry"
-msgstr "找不到用來啟用的活動"
+msgstr "找不到可以開始的活動"
-#: ../src/jarabe/view/buddymenu.py:61
+#: ../src/jarabe/view/buddymenu.py:62
msgid "Remove friend"
msgstr "移除好友"
-#: ../src/jarabe/view/buddymenu.py:64
+#: ../src/jarabe/view/buddymenu.py:65
msgid "Make friend"
msgstr "結交好友"
-#: ../src/jarabe/view/buddymenu.py:81
+#: ../src/jarabe/view/buddymenu.py:82
msgid "My Settings"
msgstr "我的設定"
-#: ../src/jarabe/view/buddymenu.py:86
+#: ../src/jarabe/view/buddymenu.py:90
msgid "Logout"
msgstr "顯示方式"
-#: ../src/jarabe/view/buddymenu.py:91
+#: ../src/jarabe/view/buddymenu.py:95
msgid "Restart"
msgstr "重新啟動"
-#: ../src/jarabe/view/buddymenu.py:96
+#: ../src/jarabe/view/buddymenu.py:100
msgid "Shutdown"
msgstr "關機"
-#: ../src/jarabe/view/buddymenu.py:131
+#: ../src/jarabe/view/buddymenu.py:135
#, python-format
msgid "Invite to %s"
msgstr "邀請 %s"
-#: ../src/jarabe/view/palettes.py:43
+#: ../src/jarabe/view/palettes.py:47
msgid "Starting..."
msgstr "啟動中…"
+#. TODO: share-with, keep
#: ../src/jarabe/view/palettes.py:73
+msgid "View Source"
+msgstr "檢視原始碼"
+
+#: ../src/jarabe/view/palettes.py:84
msgid "Stop"
msgstr "停止"
-#: ../src/jarabe/view/palettes.py:145
+#: ../src/jarabe/view/palettes.py:171
msgid "Remove favorite"
msgstr "移除偏好活動"
-#: ../src/jarabe/view/palettes.py:149
+#: ../src/jarabe/view/palettes.py:175
msgid "Make favorite"
msgstr "指定偏好活動"
-#: ../src/jarabe/view/palettes.py:201
+#: ../src/jarabe/view/palettes.py:238
msgid "Show contents"
msgstr "顯示內容"
-#: ../src/jarabe/view/palettes.py:223
-#: ../src/jarabe/view/palettes.py:272
+#: ../src/jarabe/view/palettes.py:260 ../src/jarabe/view/palettes.py:309
#, python-format
msgid "%(free_space)d MB Free"
msgstr "剩餘 %(free_space)d MB 空間"
-#: ../src/jarabe/view/palettes.py:248
+#: ../src/jarabe/view/palettes.py:285
msgid "Unmount"
msgstr "退出磁碟"
+#: ../src/jarabe/view/viewsource.py:208
+msgid "Instance Source"
+msgstr "範例原始碼"
+
+#: ../src/jarabe/view/viewsource.py:233
+msgid "Source"
+msgstr "原始碼"
+
+#: ../src/jarabe/view/viewsource.py:292
+msgid "Activity Bundle Source"
+msgstr "預裝活動原始碼"
+
+#: ../src/jarabe/view/viewsource.py:299
+#, python-format
+msgid "View source: %r"
+msgstr "查看原始碼: %r"
+
+#~ msgid "Document"
+#~ msgstr "文件"
+
+#~ msgid "Resume by default"
+#~ msgstr "預設回復"
+
#~ msgid "Encryption Type:"
#~ msgstr "加密類型:"
diff --git a/src/jarabe/desktop/Makefile.am b/src/jarabe/desktop/Makefile.am
index 94d8ab9..5b47455 100644
--- a/src/jarabe/desktop/Makefile.am
+++ b/src/jarabe/desktop/Makefile.am
@@ -12,7 +12,6 @@ sugar_PYTHON = \
keydialog.py \
meshbox.py \
myicon.py \
- proc_smaps.py \
schoolserver.py \
snowflakelayout.py \
spreadlayout.py \
diff --git a/src/jarabe/desktop/activitieslist.py b/src/jarabe/desktop/activitieslist.py
index 5d6f900..299df14 100644
--- a/src/jarabe/desktop/activitieslist.py
+++ b/src/jarabe/desktop/activitieslist.py
@@ -1,4 +1,5 @@
# Copyright (C) 2008 One Laptop Per Child
+# Copyright (C) 2009 Tomeu Vizoso
#
# 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
@@ -15,15 +16,18 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import logging
+from gettext import gettext as _
import gobject
+import pango
+import gconf
import gtk
import hippo
-import gconf
from sugar import util
from sugar.graphics import style
-from sugar.graphics.icon import CanvasIcon
+from sugar.graphics.icon import CanvasIcon, CellRendererIcon
+from sugar.graphics.palette import Palette
from sugar.graphics.xocolor import XoColor
from sugar.activity import activityfactory
from sugar.activity.activityhandle import ActivityHandle
@@ -32,8 +36,8 @@ from jarabe.model import bundleregistry
from jarabe.view.palettes import ActivityPalette
from jarabe.view import launcher
-class ActivitiesList(gtk.VBox):
- __gtype_name__ = 'SugarActivitiesList'
+class ActivitiesTreeView(gtk.TreeView):
+ __gtype_name__ = 'SugarActivitiesTreeView'
__gsignals__ = {
'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
@@ -41,27 +45,133 @@ class ActivitiesList(gtk.VBox):
}
def __init__(self):
- logging.debug('STARTUP: Loading the activities list')
-
gobject.GObject.__init__(self)
- scrolled_window = gtk.ScrolledWindow()
- scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
- scrolled_window.set_shadow_type(gtk.SHADOW_NONE)
- scrolled_window.connect('key-press-event', self.__key_press_event_cb)
- self.pack_start(scrolled_window)
- scrolled_window.show()
+ self._query = ''
- canvas = hippo.Canvas()
- scrolled_window.add_with_viewport(canvas)
- scrolled_window.child.set_shadow_type(gtk.SHADOW_NONE)
- canvas.show()
+ self.modify_base(gtk.STATE_NORMAL, style.COLOR_WHITE.get_gdk_color())
+
+ model = ListModel()
+ model.set_visible_func(self.__model_visible_cb)
+ self.set_model(model)
+
+ cell_favorite = CellRendererFavorite(self)
+ cell_favorite.connect('clicked', self.__favorite_clicked_cb)
+
+ column = gtk.TreeViewColumn('')
+ column.pack_start(cell_favorite)
+ column.set_cell_data_func(cell_favorite, self.__favorite_set_data_cb)
+ self.append_column(column)
+
+ cell_icon = CellRendererActivityIcon(self)
+ cell_icon.connect('erase-activated', self.__erase_activated_cb)
+ cell_icon.connect('clicked', self.__icon_clicked_cb)
+
+ column = gtk.TreeViewColumn('')
+ column.pack_start(cell_icon)
+ column.add_attribute(cell_icon, 'file-name', ListModel.COLUMN_ICON)
+ self.append_column(column)
+
+ cell_text = gtk.CellRendererText()
+ cell_text.props.ellipsize = pango.ELLIPSIZE_MIDDLE
+ cell_text.props.ellipsize_set = True
+
+ column = gtk.TreeViewColumn(_('Title'))
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_GROW_ONLY
+ column.props.expand = True
+ column.set_sort_column_id(ListModel.COLUMN_TITLE)
+ column.pack_start(cell_text)
+ column.add_attribute(cell_text, 'markup', ListModel.COLUMN_TITLE)
+ self.append_column(column)
+
+ cell_text = gtk.CellRendererText()
+ cell_text.props.xalign = 1
+
+ column = gtk.TreeViewColumn(_('Version'))
+ column.set_alignment(1)
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_GROW_ONLY
+ column.props.resizable = True
+ column.props.reorderable = True
+ column.props.expand = True
+ column.set_sort_column_id(ListModel.COLUMN_VERSION)
+ column.pack_start(cell_text)
+ column.add_attribute(cell_text, 'text', ListModel.COLUMN_VERSION_TEXT)
+ self.append_column(column)
+
+ cell_text = gtk.CellRendererText()
+ cell_text.props.xalign = 1
+
+ column = gtk.TreeViewColumn(_('Date'))
+ column.set_alignment(1)
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_GROW_ONLY
+ column.props.resizable = True
+ column.props.reorderable = True
+ column.props.expand = True
+ column.set_sort_column_id(ListModel.COLUMN_DATE)
+ column.pack_start(cell_text)
+ column.add_attribute(cell_text, 'text', ListModel.COLUMN_DATE_TEXT)
+ self.append_column(column)
+
+ self.set_search_column(ListModel.COLUMN_TITLE)
+
+ def __erase_activated_cb(self, cell_renderer, bundle_id):
+ self.emit('erase-activated', bundle_id)
- self._alert = None
- self._query = ''
- self._box = hippo.CanvasBox()
- self._box.props.background_color = style.COLOR_WHITE.get_int()
- canvas.set_root(self._box)
+ def __favorite_set_data_cb(self, column, cell, model, tree_iter):
+ favorite = model[tree_iter][ListModel.COLUMN_FAVORITE]
+ if favorite:
+ client = gconf.client_get_default()
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ cell.props.xo_color = color
+ else:
+ cell.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ cell.props.fill_color = style.COLOR_WHITE.get_svg()
+
+ def __favorite_clicked_cb(self, cell, path):
+ row = self.get_model()[path]
+ registry = bundleregistry.get_registry()
+ registry.set_bundle_favorite(row[ListModel.COLUMN_BUNDLE_ID],
+ row[ListModel.COLUMN_VERSION],
+ not row[ListModel.COLUMN_FAVORITE])
+
+ def __icon_clicked_cb(self, cell, path):
+ row = self.get_model()[path]
+
+ registry = bundleregistry.get_registry()
+ bundle = registry.get_bundle(row[ListModel.COLUMN_BUNDLE_ID])
+
+ activity_id = activityfactory.create_activity_id()
+
+ client = gconf.client_get_default()
+ xo_color = XoColor(client.get_string('/desktop/sugar/user/color'))
+
+ launcher.add_launcher(activity_id, bundle.get_icon(), xo_color)
+ activityfactory.create(bundle, ActivityHandle(activity_id))
+
+ def set_filter(self, query):
+ self._query = query.lower()
+ self.get_model().refilter()
+
+ def __model_visible_cb(self, model, tree_iter):
+ title = model[tree_iter][ListModel.COLUMN_TITLE]
+ return title is not None and title.lower().find(self._query) > -1
+
+class ListModel(gtk.TreeModelSort):
+ __gtype_name__ = 'SugarListModel'
+
+ COLUMN_BUNDLE_ID = 0
+ COLUMN_FAVORITE = 1
+ COLUMN_ICON = 2
+ COLUMN_TITLE = 3
+ COLUMN_VERSION = 4
+ COLUMN_VERSION_TEXT = 5
+ COLUMN_DATE = 6
+ COLUMN_DATE_TEXT = 7
+
+ def __init__(self):
+ self._model = gtk.ListStore(str, bool, str, str, int, str, int, str)
+ self._model_filter = self._model.filter_new()
+ gtk.TreeModelSort.__init__(self, self._model_filter)
gobject.idle_add(self.__connect_to_bundle_registry_cb)
@@ -70,36 +180,148 @@ class ActivitiesList(gtk.VBox):
for info in registry:
self._add_activity(info)
registry.connect('bundle-added', self.__activity_added_cb)
+ registry.connect('bundle-changed', self.__activity_changed_cb)
registry.connect('bundle-removed', self.__activity_removed_cb)
def __activity_added_cb(self, activity_registry, activity_info):
self._add_activity(activity_info)
- def __activity_removed_cb(self, activity_registry, activity_info):
- for entry in self._box.get_children():
- if entry.get_bundle_id() == activity_info.get_bundle_id() and \
- entry.get_version() == activity_info.get_activity_version():
- self._box.remove(entry)
+ def __activity_changed_cb(self, activity_registry, activity_info):
+ bundle_id = activity_info.get_bundle_id()
+ version = activity_info.get_activity_version()
+ favorite = activity_registry.is_bundle_favorite(bundle_id, version)
+ for row in self._model:
+ if row[ListModel.COLUMN_BUNDLE_ID] == bundle_id and \
+ row[ListModel.COLUMN_VERSION] == version:
+ row[ListModel.COLUMN_FAVORITE] = favorite
return
- def _compare_activities(self, entry_a, entry_b):
- return entry_b.get_installation_time() - entry_a.get_installation_time()
+ def __activity_removed_cb(self, activity_registry, activity_info):
+ bundle_id = activity_info.get_bundle_id()
+ version = activity_info.get_activity_version()
+ favorite = activity_registry.is_bundle_favorite(bundle_id, version)
+ for row in self._model:
+ if row[ListModel.COLUMN_BUNDLE_ID] == bundle_id and \
+ row[ListModel.COLUMN_VERSION] == version:
+ self.remove(row.iter)
+ return
def _add_activity(self, activity_info):
if activity_info.get_bundle_id() == 'org.laptop.JournalActivity':
return
- entry = ActivityEntry(activity_info)
- entry.icon.connect('erase-activated', self.__erase_activated_cb)
- self._box.insert_sorted(entry, 0, self._compare_activities)
- entry.set_visible(entry.matches(self._query))
- def __erase_activated_cb(self, activity_icon, bundle_id):
+ timestamp = activity_info.get_installation_time()
+ version = activity_info.get_activity_version()
+
+ registry = bundleregistry.get_registry()
+ favorite = registry.is_bundle_favorite(activity_info.get_bundle_id(),
+ version)
+
+ tag_list = activity_info.get_tags()
+ if tag_list is None or not tag_list:
+ title = '<b>%s</b>' % activity_info.get_name()
+ else:
+ tags = ', '.join(tag_list)
+ title = '<b>%s</b>\n' \
+ '<span style="italic" weight="light">%s</span>' % \
+ (activity_info.get_name(), tags)
+
+ self._model.append([activity_info.get_bundle_id(),
+ favorite,
+ activity_info.get_icon(),
+ title,
+ version,
+ _('Version %s') % version,
+ timestamp,
+ util.timestamp_to_elapsed_string(timestamp)])
+
+ def set_visible_func(self, func):
+ self._model_filter.set_visible_func(func)
+
+ def refilter(self):
+ self._model_filter.refilter()
+
+class CellRendererFavorite(CellRendererIcon):
+ __gtype_name__ = 'SugarCellRendererFavorite'
+
+ def __init__(self, tree_view):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.SMALL_ICON_SIZE
+ self.props.icon_name = 'emblem-favorite'
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+ self.props.prelit_stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.prelit_fill_color = style.COLOR_BUTTON_GREY.get_svg()
+
+class CellRendererActivityIcon(CellRendererIcon):
+ __gtype_name__ = 'SugarCellRendererActivityIcon'
+
+ __gsignals__ = {
+ 'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([str]))
+ }
+
+ def __init__(self, tree_view):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.STANDARD_ICON_SIZE
+ self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+
+ client = gconf.client_get_default()
+ prelit_color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ self.props.prelit_stroke_color = prelit_color.get_stroke_color()
+ self.props.prelit_fill_color = prelit_color.get_fill_color()
+
+ self._tree_view = tree_view
+
+ def create_palette(self):
+ model = self._tree_view.get_model()
+ row = model[self.props.palette_invoker.path]
+ bundle_id = row[ListModel.COLUMN_BUNDLE_ID]
+
+ registry = bundleregistry.get_registry()
+ palette = ActivityPalette(registry.get_bundle(bundle_id))
+ palette.connect('erase-activated', self.__erase_activated_cb)
+ return palette
+
+ def __erase_activated_cb(self, palette, bundle_id):
self.emit('erase-activated', bundle_id)
+class ActivitiesList(gtk.VBox):
+ __gtype_name__ = 'SugarActivitiesList'
+
+ __gsignals__ = {
+ 'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([str]))
+ }
+
+ def __init__(self):
+ logging.debug('STARTUP: Loading the activities list')
+
+ gobject.GObject.__init__(self)
+
+ scrolled_window = gtk.ScrolledWindow()
+ scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ scrolled_window.set_shadow_type(gtk.SHADOW_NONE)
+ scrolled_window.connect('key-press-event', self.__key_press_event_cb)
+ self.pack_start(scrolled_window)
+ scrolled_window.show()
+
+ self._tree_view = ActivitiesTreeView()
+ self._tree_view.connect('erase-activated', self.__erase_activated_cb)
+ scrolled_window.add(self._tree_view)
+ self._tree_view.show()
+
+ self._alert = None
+
def set_filter(self, query):
- self._query = query
- for entry in self._box.get_children():
- entry.set_visible(entry.matches(query))
+ self._tree_view.set_filter(query)
def __key_press_event_cb(self, scrolled_window, event):
keyname = gtk.gdk.keyval_name(event.keyval)
@@ -130,195 +352,6 @@ class ActivitiesList(gtk.VBox):
self.remove(self._alert)
self._alert = None
-class ActivityIcon(CanvasIcon):
- __gtype_name__ = 'SugarListActivityIcon'
-
- __gsignals__ = {
- 'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([str]))
- }
-
- def __init__(self, activity_info):
- CanvasIcon.__init__(self, size=style.STANDARD_ICON_SIZE, cache=True,
- file_name=activity_info.get_icon())
- self._activity_info = activity_info
- self._uncolor()
- self.connect('hovering-changed', self.__hovering_changed_event_cb)
- self.connect('button-release-event', self.__button_release_event_cb)
-
- client = gconf.client_get_default()
- self._xocolor = XoColor(client.get_string("/desktop/sugar/user/color"))
-
- def create_palette(self):
- palette = ActivityPalette(self._activity_info)
- palette.connect('erase-activated', self.__erase_activated_cb)
- return palette
-
- def __erase_activated_cb(self, palette):
- self.emit('erase-activated', self._activity_info.get_bundle_id())
-
- def _color(self):
- self.props.xo_color = self._xocolor
-
- def _uncolor(self):
- self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
- self.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
-
- def __hovering_changed_event_cb(self, icon, hovering):
- if hovering:
- self._color()
- else:
- self._uncolor()
-
- def __button_release_event_cb(self, icon, event):
- self.palette.popdown(immediate=True)
- self._uncolor()
-
-class ActivityEntry(hippo.CanvasBox, hippo.CanvasItem):
- __gtype_name__ = 'SugarActivityEntry'
-
- _TITLE_COL_WIDTH = style.GRID_CELL_SIZE * 3
- _VERSION_COL_WIDTH = style.GRID_CELL_SIZE * 1
- _DATE_COL_WIDTH = style.GRID_CELL_SIZE * 5
-
- def __init__(self, activity_info):
- hippo.CanvasBox.__init__(self, spacing=style.DEFAULT_SPACING,
- padding_top=style.DEFAULT_PADDING,
- padding_bottom=style.DEFAULT_PADDING,
- padding_left=style.DEFAULT_PADDING * 2,
- padding_right=style.DEFAULT_PADDING * 2,
- box_height=style.GRID_CELL_SIZE,
- orientation=hippo.ORIENTATION_HORIZONTAL)
-
- registry = bundleregistry.get_registry()
- registry.connect('bundle-changed', self.__activity_changed_cb)
-
- self._bundle = activity_info
- self._bundle_id = activity_info.get_bundle_id()
- self._version = activity_info.get_activity_version()
- self._favorite = registry.is_bundle_favorite(self._bundle_id,
- self._version)
- self._title = activity_info.get_name()
- self._installation_time = activity_info.get_installation_time()
-
- self._favorite_icon = FavoriteIcon(self._favorite)
- self._favorite_icon.connect('notify::favorite',
- self.__favorite_changed_cb)
- self.append(self._favorite_icon)
-
- self.icon = ActivityIcon(activity_info)
- self.icon.connect('button-release-event',
- 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.get_name(),
- xalign=align,
- font_desc=style.FONT_BOLD.get_pango_desc(),
- box_width=ActivityEntry._TITLE_COL_WIDTH)
- self.append(title)
-
- version = hippo.CanvasText(text=activity_info.get_activity_version(),
- xalign=hippo.ALIGNMENT_END,
- font_desc=style.FONT_NORMAL.get_pango_desc(),
- box_width=ActivityEntry._VERSION_COL_WIDTH)
- self.append(version)
-
- expander = hippo.CanvasBox()
- self.append(expander, hippo.PACK_EXPAND)
-
- timestamp = activity_info.get_installation_time()
- date = hippo.CanvasText(
- text=util.timestamp_to_elapsed_string(timestamp),
- 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 = bundleregistry.get_registry()
- registry.set_bundle_favorite(self._bundle_id, self._version,
- favorite_icon.props.favorite)
-
- def __activity_changed_cb(self, activity_registry, activity_info):
- if self._bundle_id == activity_info.get_bundle_id() and \
- self._version == activity_info.get_activity_version():
- self._title = activity_info.get_name()
-
- registry = bundleregistry.get_registry()
- self._favorite = registry.is_bundle_favorite(self._bundle_id,
- self._version)
-
- self._favorite_icon.props.favorite = self._favorite
-
- def __icon_button_release_event_cb(self, icon, event):
- activity_id = activityfactory.create_activity_id()
-
- client = gconf.client_get_default()
- xo_color = XoColor(client.get_string('/desktop/sugar/user/color'))
-
- launcher.add_launcher(activity_id,
- self._bundle.get_icon(),
- xo_color)
-
- activityfactory.create(self._bundle, ActivityHandle(activity_id))
-
- def get_bundle_id(self):
- return self._bundle_id
-
- def get_version(self):
- return self._version
-
- def get_installation_time(self):
- return self._installation_time
-
- def matches(self, query):
- if not query:
- return True
- return self._title.lower().find(query) > -1
-
-class FavoriteIcon(CanvasIcon):
- def __init__(self, favorite):
- CanvasIcon.__init__(self, icon_name='emblem-favorite',
- box_width=style.GRID_CELL_SIZE*3/5,
- size=style.SMALL_ICON_SIZE)
- self._favorite = None
- self.set_favorite(favorite)
- self.connect('button-release-event', self.__release_event_cb)
- self.connect('motion-notify-event', self.__motion_notify_event_cb)
-
- def set_favorite(self, favorite):
- if favorite == self._favorite:
- return
-
- self._favorite = favorite
- if favorite:
- client = gconf.client_get_default()
- color = XoColor(client.get_string('/desktop/sugar/user/color'))
- self.props.xo_color = color
- else:
- self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
- self.props.fill_color = style.COLOR_WHITE.get_svg()
-
- def get_favorite(self):
- return self._favorite
-
- favorite = gobject.property(
- type=bool, default=False, getter=get_favorite, setter=set_favorite)
-
- def __release_event_cb(self, icon, event):
- self.props.favorite = not self.props.favorite
+ def __erase_activated_cb(self, tree_view, bundle_id):
+ self.emit('erase-activated', bundle_id)
- def __motion_notify_event_cb(self, icon, event):
- if not self._favorite:
- if event.detail == hippo.MOTION_DETAIL_ENTER:
- icon.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
- elif event.detail == hippo.MOTION_DETAIL_LEAVE:
- icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
diff --git a/src/jarabe/desktop/favoriteslayout.py b/src/jarabe/desktop/favoriteslayout.py
index 4e00387..506446f 100644
--- a/src/jarabe/desktop/favoriteslayout.py
+++ b/src/jarabe/desktop/favoriteslayout.py
@@ -60,6 +60,8 @@ class FavoritesLayout(gobject.GObject, hippo.CanvasLayout):
logging.debug('Icon without fixed_position: %r' % icon)
return
+ icon.props.size = max(icon.props.size, style.STANDARD_ICON_SIZE)
+
relative_x, relative_y = icon.fixed_position
if relative_x < 0 or relative_y < 0:
logging.debug('Icon out of bounds: %r' % icon)
diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
index 9669d75..4037fae 100644
--- a/src/jarabe/desktop/favoritesview.py
+++ b/src/jarabe/desktop/favoritesview.py
@@ -17,9 +17,10 @@
import logging
from gettext import gettext as _
-import gconf
+import math
import gobject
+import gconf
import gtk
import hippo
import dbus
@@ -376,7 +377,7 @@ class DatastoreListener(object):
def get_last_activity_async(self, bundle_id, properties, callback_cb):
query = {'activity': bundle_id,
'limit': 5,
- 'order_by': ['-mtime']}
+ 'order_by': ['+timestamp']}
reply_handler = lambda entries, total_count: self.__reply_handler_cb(
entries, total_count, callback_cb)
@@ -385,8 +386,8 @@ class DatastoreListener(object):
error, callback_cb)
self._datastore.find(query, properties, byte_arrays=True,
- reply_handler=reply_handler,
- error_handler=error_handler)
+ reply_handler=reply_handler,
+ error_handler=error_handler)
def __reply_handler_cb(self, entries, total_count, callback_cb):
logging.debug('__reply_handler_cb')
@@ -399,7 +400,7 @@ class DatastoreListener(object):
class ActivityIcon(CanvasIcon):
__gtype_name__ = 'SugarFavoriteActivityIcon'
- _BORDER_WIDTH = 4
+ _BORDER_WIDTH = style.zoom(3)
__gsignals__ = {
'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
@@ -445,6 +446,7 @@ class ActivityIcon(CanvasIcon):
def __get_last_activity_async_cb(self, entries, error=None):
if error is not None:
logging.error('Error retrieving most recent activities: %r' % error)
+ return
# If there's a problem with the DS index, we may get entries not related
# to this activity.
@@ -471,8 +473,8 @@ class ActivityIcon(CanvasIcon):
palette.connect('erase-activated', self.__erase_activated_cb)
return palette
- def __erase_activated_cb(self, palette):
- self.emit('erase-activated', self._activity_info.get_bundle_id())
+ def __erase_activated_cb(self, palette, bundle_id):
+ self.emit('erase-activated', bundle_id)
def __palette_activate_cb(self, palette):
self._activate()
@@ -482,31 +484,29 @@ class ActivityIcon(CanvasIcon):
self.emit_paint_needed(0, 0, -1, -1)
def do_paint_above_children(self, cr, damaged_box):
- if self._hovering:
- width, height = self.get_allocation()
-
- color = style.COLOR_SELECTION_GREY.get_int()
- hippo.cairo_set_source_rgba32(cr, color)
-
- x = ActivityIcon._BORDER_WIDTH / 2
- y = ActivityIcon._BORDER_WIDTH / 2
- width -= ActivityIcon._BORDER_WIDTH
- height -= ActivityIcon._BORDER_WIDTH
-
- cr.move_to(0, y)
- cr.line_to(width, y)
+ if not self._hovering:
+ return
- cr.move_to(width, 0)
- cr.line_to(width, height + ActivityIcon._BORDER_WIDTH / 2)
+ width, height = self.get_allocation()
- cr.move_to(width, height)
- cr.line_to(0, height)
+ x = ActivityIcon._BORDER_WIDTH / 2.0
+ y = ActivityIcon._BORDER_WIDTH / 2.0
+ width -= ActivityIcon._BORDER_WIDTH
+ height -= ActivityIcon._BORDER_WIDTH
+ radius = width / 10.0
- cr.move_to(x, height)
- cr.line_to(x, 0)
+ cr.move_to(x + radius, y)
+ cr.arc(x + width - radius, y + radius, radius, math.pi * 1.5,
+ math.pi * 2.0)
+ cr.arc(x + width - radius, x + height - radius, radius, 0,
+ math.pi * 0.5)
+ cr.arc(x + radius, y + height - radius, radius, math.pi * 0.5, math.pi)
+ cr.arc(x + radius, y + radius, radius, math.pi, math.pi * 1.5)
- cr.set_line_width(style.zoom(ActivityIcon._BORDER_WIDTH))
- cr.stroke()
+ color = style.COLOR_SELECTION_GREY.get_int()
+ hippo.cairo_set_source_rgba32(cr, color)
+ cr.set_line_width(ActivityIcon._BORDER_WIDTH)
+ cr.stroke()
def do_get_content_height_request(self, for_width):
height, height = CanvasIcon.do_get_content_height_request(self,
@@ -526,10 +526,17 @@ class ActivityIcon(CanvasIcon):
self.palette.popdown(immediate=True)
if self._journal_entries:
entry = self._journal_entries[0]
+
+ shell_model = shell.get_model()
+ activity = shell_model.get_activity_by_id(entry['activity_id'])
+ if activity:
+ activity.get_window().activate(gtk.get_current_event_time())
+ return
+
launcher.add_launcher(entry['activity_id'],
self._activity_info.get_icon(),
XoColor(entry.get('icon-color', '')))
- journal.misc.resume(entry)
+ journal.misc.resume(entry, self._activity_info.get_bundle_id())
else:
client = gconf.client_get_default()
xo_color = XoColor(client.get_string('/desktop/sugar/user/color'))
@@ -600,7 +607,7 @@ class FavoritePalette(ActivityPalette):
def __resume_entry_cb(self, menu_item, entry):
if entry is not None:
- activityfactory.create_with_object_id(self._bundle, entry['uid'])
+ journal.misc.resume(entry, self._bundle_id)
class CurrentActivityIcon(CanvasIcon, hippo.CanvasItem):
def __init__(self):
@@ -617,7 +624,8 @@ class CurrentActivityIcon(CanvasIcon, hippo.CanvasItem):
self.connect('button-release-event', self.__button_release_event_cb)
def __button_release_event_cb(self, icon, event):
- self._home_model.get_active_activity().get_window().activate(1)
+ window = self._home_model.get_active_activity().get_window()
+ window.activate(gtk.get_current_event_time())
def _update(self):
self.props.file_name = self._home_activity.get_icon_path()
diff --git a/src/jarabe/desktop/keydialog.py b/src/jarabe/desktop/keydialog.py
index f5995e6..93f07c4 100644
--- a/src/jarabe/desktop/keydialog.py
+++ b/src/jarabe/desktop/keydialog.py
@@ -14,7 +14,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-import md5
+import hashlib
from gettext import gettext as _
import gtk
@@ -53,7 +53,7 @@ def hash_passphrase(passphrase):
elif len(passphrase) < 64:
while len(passphrase) < 64:
passphrase += passphrase[:64 - len(passphrase)]
- passphrase = md5.new(passphrase).digest()
+ passphrase = hashlib.md5(passphrase).digest()
return string_to_hex(passphrase)[:26]
class CanceledKeyRequestError(dbus.DBusException):
diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py
index e56c4d5..de1f18d 100644
--- a/src/jarabe/desktop/meshbox.py
+++ b/src/jarabe/desktop/meshbox.py
@@ -1,4 +1,5 @@
# Copyright (C) 2006-2007 Red Hat, Inc.
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,7 +17,7 @@
from gettext import gettext as _
import logging
-import sha
+import hashlib
import dbus
import hippo
@@ -46,6 +47,7 @@ from jarabe.model import bundleregistry
from jarabe.model import network
from jarabe.model import shell
from jarabe.model.network import Settings
+from jarabe.model.network import IP4Config
from jarabe.model.network import WirelessSecurity
_NM_SERVICE = 'org.freedesktop.NetworkManager'
@@ -101,15 +103,17 @@ class AccessPointView(CanvasPulsingIcon):
dbus_interface=_NM_ACCESSPOINT_IFACE,
byte_arrays=True)
- self._device.Get(_NM_DEVICE_IFACE, 'State',
- reply_handler=self.__get_device_state_reply_cb,
- error_handler=self.__get_device_state_error_cb)
- self._device.Get(_NM_WIRELESS_IFACE, 'WirelessCapabilities',
- reply_handler=self.__get_device_caps_reply_cb,
- error_handler=self.__get_device_caps_error_cb)
- self._device.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
- reply_handler=self.__get_active_ap_reply_cb,
- error_handler=self.__get_active_ap_error_cb)
+ interface_props = dbus.Interface(self._device,
+ 'org.freedesktop.DBus.Properties')
+ interface_props.Get(_NM_DEVICE_IFACE, 'State',
+ reply_handler=self.__get_device_state_reply_cb,
+ error_handler=self.__get_device_state_error_cb)
+ interface_props.Get(_NM_WIRELESS_IFACE, 'WirelessCapabilities',
+ reply_handler=self.__get_device_caps_reply_cb,
+ error_handler=self.__get_device_caps_error_cb)
+ interface_props.Get(_NM_WIRELESS_IFACE, 'ActiveAccessPoint',
+ reply_handler=self.__get_active_ap_reply_cb,
+ error_handler=self.__get_active_ap_error_cb)
self._bus.add_signal_receiver(self.__device_state_changed_cb,
signal_name='StateChanged',
@@ -167,7 +171,7 @@ class AccessPointView(CanvasPulsingIcon):
if 'Mode' in properties:
self._mode = properties['Mode']
- sh = sha.new()
+ sh = hashlib.sha1()
data = self._name + hex(self._flags)
sh.update(data)
h = hash(sh.digest())
@@ -196,7 +200,7 @@ class AccessPointView(CanvasPulsingIcon):
self._update()
def __get_device_state_error_cb(self, err):
- logging.debug('Error getting the access point properties: %s', err)
+ logging.debug('Error getting the device state: %s', err)
def __get_all_props_reply_cb(self, properties):
self._update_properties(properties)
@@ -226,7 +230,8 @@ class AccessPointView(CanvasPulsingIcon):
if state == network.DEVICE_STATE_ACTIVATED:
connection = network.find_connection(self._name)
if connection:
- connection.set_connected()
+ if self._mode == network.NM_802_11_MODE_INFRA:
+ connection.set_connected()
icon_name = '%s-connected' % _ICON_NAME
else:
@@ -351,6 +356,14 @@ class AccessPointView(CanvasPulsingIcon):
settings.connection.type = '802-11-wireless'
settings.wireless.ssid = self._name
+ if self._mode == network.NM_802_11_MODE_INFRA:
+ settings.wireless.mode = 'infrastructure'
+ elif self._mode == network.NM_802_11_MODE_ADHOC:
+ settings.wireless.mode = 'adhoc'
+ settings.wireless.band = 'bg'
+ settings.ip4_config = IP4Config()
+ settings.ip4_config.method = 'shared'
+
wireless_security = self._get_security()
settings.wireless_security = wireless_security
diff --git a/src/jarabe/desktop/proc_smaps.py b/src/jarabe/desktop/proc_smaps.py
deleted file mode 100755
index 090a4cf..0000000
--- a/src/jarabe/desktop/proc_smaps.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# Copyright (C) 2007 Red Hat, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
-# USA
-
-import os
-
-# /proc/PID/maps consists of a number of lines like this:
-# 00400000-004b1000 r-xp 00000000 fd:00 5767206 /bin/bash
-# 006b1000-006bb000 rw-p 000b1000 fd:00 5767206 /bin/bash
-# 006bb000-006c0000 rw-p 006bb000 00:00 0
-# ...
-# The fields are: address, permissions, offset, device, inode, and
-# (for non-anonymous mappings) pathname.
-#
-# /proc/PID/smaps gives additional information for each mapping:
-# 00400000-004b1000 r-xp 00000000 fd:00 5767206 /bin/bash
-# Size: 708 kB
-# Rss: 476 kB
-# Shared_Clean: 468 kB
-# Shared_Dirty: 0 kB
-# Private_Clean: 8 kB
-# Private_Dirty: 0 kB
-# Referenced: 0 kb
-#
-# The "Referenced" line only appears in kernel 2.6.22 and later.
-
-def get_shared_mapping_names(pid):
- """Returns a set of the files for which PID has a shared mapping"""
-
- mappings = set()
- infile = open("/proc/%s/maps" % pid, "r")
- for line in infile:
- # sharable mappings are non-anonymous and either read-only
- # (permissions "r-..") or writable but explicitly marked
- # shared ("rw.s")
- fields = line.split()
- if len(fields) < 6 or not fields[5].startswith('/'):
- continue
- if fields[1][0] != 'r' or (fields[1][1] == 'w' and fields[1][3] != 's'):
- continue
- mappings.add(fields[5])
- infile.close()
- return mappings
-
-_smaps_lines_per_entry = None
-
-def get_mappings(pid, ignored_shared_mappings):
- """Returns a list of (name, private, shared) tuples describing the
- memory mappings of PID. Shared mappings named in
- ignored_shared_mappings are ignored
- """
-
- global _smaps_lines_per_entry
- if _smaps_lines_per_entry is None:
- if os.path.isfile('/proc/%s/clear_refs' % os.getpid()):
- _smaps_lines_per_entry = 8
- else:
- _smaps_lines_per_entry = 7
-
- mappings = []
-
- smapfile = "/proc/%s/smaps" % pid
- infile = open(smapfile, "r")
- data = infile.read()
- infile.close()
- lines = data.splitlines()
-
- for line_idx in range(0, len(lines), _smaps_lines_per_entry):
- name_idx = lines[line_idx].find('/')
- if name_idx == -1:
- name = None
- else:
- name = lines[line_idx][name_idx:]
-
- private_clean = int(lines[line_idx + 5][14:-3])
- private_dirty = int(lines[line_idx + 6][14:-3])
- if name in ignored_shared_mappings:
- shared_clean = 0
- shared_dirty = 0
- else:
- shared_clean = int(lines[line_idx + 3][14:-3])
- shared_dirty = int(lines[line_idx + 4][14:-3])
-
- mapping = Mapping(name, private_clean + private_dirty,
- shared_clean + shared_dirty)
- mappings.append (mapping)
-
- return mappings
-
-class Mapping:
- def __init__ (self, name, private, shared):
- self.name = name
- self.private = private
- self.shared = shared
diff --git a/src/jarabe/frame/activitiestray.py b/src/jarabe/frame/activitiestray.py
index 9c5aae7..1e2b8e8 100644
--- a/src/jarabe/frame/activitiestray.py
+++ b/src/jarabe/frame/activitiestray.py
@@ -20,6 +20,7 @@ from gettext import gettext as _
import tempfile
import os
+import gobject
import gconf
import dbus
import gio
@@ -165,6 +166,13 @@ class ActivityInviteButton(BaseInviteButton):
def _launch(self):
"""Join the activity in the invite."""
+
+ shell_model = shell.get_model()
+ activity = shell_model.get_activity_by_id(self._activity_model.get_id())
+ if activity:
+ activity.get_window().activate(gtk.get_current_event_time())
+ return
+
registry = bundleregistry.get_registry()
bundle = registry.get_bundle(self._bundle_id)
@@ -429,8 +437,12 @@ class ActivitiesTray(HTray):
class BaseTransferButton(ToolButton):
"""Button with a notification attached
"""
- def __init__(self):
+ def __init__(self, file_transfer):
ToolButton.__init__(self)
+
+ self.file_transfer = file_transfer
+ file_transfer.connect('notify::state', self.__notify_state_cb)
+
icon = Icon()
self.props.icon_widget = icon
icon.show()
@@ -445,18 +457,31 @@ class BaseTransferButton(ToolButton):
frame.remove_notification(self.notif_icon)
self.notif_icon = None
+ def remove(self):
+ frame = jarabe.frame.get_view()
+ frame.remove_notification(self.notif_icon)
+ self.props.parent.remove(self)
+
+ def __notify_state_cb(self, file_transfer, pspec):
+ logging.debug('_update state: %r %r' % (file_transfer.props.state,
+ file_transfer.reason_last_change))
+ if file_transfer.props.state == filetransfer.FT_STATE_CANCELLED:
+ if file_transfer.reason_last_change == \
+ filetransfer.FT_REASON_LOCAL_STOPPED:
+ self.remove()
+
class IncomingTransferButton(BaseTransferButton):
"""UI element representing an ongoing incoming file transfer
"""
def __init__(self, file_transfer):
- BaseTransferButton.__init__(self)
+ BaseTransferButton.__init__(self, file_transfer)
self._object_id = None
self._metadata = {}
- self._file_transfer = file_transfer
- self._file_transfer.connect('notify::state', self.__notify_state_cb)
- self._file_transfer.connect('notify::transferred-bytes',
- self.__notify_transferred_bytes_cb)
+
+ file_transfer.connect('notify::state', self.__notify_state_cb)
+ file_transfer.connect('notify::transferred-bytes',
+ self.__notify_transferred_bytes_cb)
icons = gio.content_type_get_icon(file_transfer.mime_type).props.names
icons.append('application-octet-stream')
@@ -477,7 +502,8 @@ class IncomingTransferButton(BaseTransferButton):
gtk.CORNER_TOP_LEFT)
def create_palette(self):
- palette = IncomingTransferPalette(self._file_transfer)
+ palette = IncomingTransferPalette(self.file_transfer)
+ palette.connect('dismiss-clicked', self.__dismiss_clicked_cb)
palette.props.invoker = FrameWidgetInvoker(self)
palette.set_group_id('frame')
return palette
@@ -544,13 +570,14 @@ class IncomingTransferButton(BaseTransferButton):
def __error_handler_cb(self, error):
logging.debug('__error_handler_cb %r %s' % (self._object_id, error))
+ def __dismiss_clicked_cb(self, palette):
+ self.remove()
+
class OutgoingTransferButton(BaseTransferButton):
"""UI element representing an ongoing outgoing file transfer
"""
def __init__(self, file_transfer):
- BaseTransferButton.__init__(self)
-
- self._file_transfer = file_transfer
+ BaseTransferButton.__init__(self, file_transfer)
icons = gio.content_type_get_icon(file_transfer.mime_type).props.names
icons.append('application-octet-stream')
@@ -572,14 +599,25 @@ class OutgoingTransferButton(BaseTransferButton):
gtk.CORNER_TOP_LEFT)
def create_palette(self):
- palette = OutgoingTransferPalette(self._file_transfer)
+ palette = OutgoingTransferPalette(self.file_transfer)
+ palette.connect('dismiss-clicked', self.__dismiss_clicked_cb)
palette.props.invoker = FrameWidgetInvoker(self)
palette.set_group_id('frame')
return palette
+ def __dismiss_clicked_cb(self, palette):
+ self.remove()
+
class BaseTransferPalette(Palette):
"""Base palette class for frame or notification icon for file transfers
"""
+ __gtype_name__ = "SugarBaseTransferPalette"
+
+ __gsignals__ = {
+ 'dismiss-clicked': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([])),
+ }
+
def __init__(self, file_transfer):
Palette.__init__(self, file_transfer.title)
@@ -635,6 +673,7 @@ class BaseTransferPalette(Palette):
class IncomingTransferPalette(BaseTransferPalette):
"""Palette for frame or notification icon for incoming file transfers
"""
+ __gtype_name__ = "SugarIncomingTransferPalette"
def __init__(self, file_transfer):
BaseTransferPalette.__init__(self, file_transfer)
@@ -704,10 +743,21 @@ class IncomingTransferPalette(BaseTransferPalette):
self.update_progress()
elif self.file_transfer.props.state == filetransfer.FT_STATE_COMPLETED:
- # TODO: What to do here?
+
+ for item in self.menu.get_children():
+ self.menu.remove(item)
+
+ menu_item = MenuItem(_('Dismiss'), icon_name='dialog-cancel')
+ menu_item.connect('activate', self.__dismiss_activate_cb)
+ self.menu.append(menu_item)
+ menu_item.show()
+
self.update_progress()
elif self.file_transfer.props.state == filetransfer.FT_STATE_CANCELLED:
+ for item in self.menu.get_children():
+ self.menu.remove(item)
+
menu_item = MenuItem(_('Resume'), icon_name='dialog-cancel')
menu_item.connect('activate', self.__resume_activate_cb)
self.menu.append(menu_item)
@@ -732,7 +782,7 @@ class IncomingTransferPalette(BaseTransferPalette):
return file_name
def __decline_activate_cb(self, menu_item):
- self.file_transfer.decline()
+ self.file_transfer.cancel()
def __cancel_activate_cb(self, menu_item):
self.file_transfer.cancel()
@@ -740,9 +790,14 @@ class IncomingTransferPalette(BaseTransferPalette):
def __resume_activate_cb(self, menu_item):
self.file_transfer.resume()
+ def __dismiss_activate_cb(self, menu_item):
+ self.emit('dismiss-clicked')
+
class OutgoingTransferPalette(BaseTransferPalette):
"""Palette for frame or notification icon for outgoing file transfers
"""
+ __gtype_name__ = "SugarOutgoingTransferPalette"
+
def __init__(self, file_transfer):
BaseTransferPalette.__init__(self, file_transfer)
@@ -811,12 +866,20 @@ class OutgoingTransferPalette(BaseTransferPalette):
self.update_progress()
elif self.file_transfer.props.state == filetransfer.FT_STATE_COMPLETED:
- # TODO: What to do here?
- self.update_progress()
- elif self.file_transfer.props.state == filetransfer.FT_STATE_CANCELLED:
- # TODO: What to do here?
+
+ for item in self.menu.get_children():
+ self.menu.remove(item)
+
+ menu_item = MenuItem(_('Dismiss'), icon_name='dialog-cancel')
+ menu_item.connect('activate', self.__dismiss_activate_cb)
+ self.menu.append(menu_item)
+ menu_item.show()
+
self.update_progress()
def __cancel_activate_cb(self, menu_item):
self.file_transfer.cancel()
+ def __dismiss_activate_cb(self, menu_item):
+ self.emit('dismiss-clicked')
+
diff --git a/src/jarabe/frame/clipboardobject.py b/src/jarabe/frame/clipboardobject.py
index ccbaf8e..38da151 100644
--- a/src/jarabe/frame/clipboardobject.py
+++ b/src/jarabe/frame/clipboardobject.py
@@ -51,7 +51,14 @@ class ClipboardObject(object):
return name
def get_icon(self):
- icons = gio.content_type_get_icon(self.get_mime_type())
+ mime_type = self.get_mime_type()
+
+ generic_types = mime.get_all_generic_types()
+ for generic_type in generic_types:
+ if mime_type in generic_type.mime_types:
+ return generic_type.icon
+
+ icons = gio.content_type_get_icon(mime_type)
icon_name = None
if icons is not None:
icon_theme = gtk.icon_theme_get_default()
@@ -60,12 +67,9 @@ class ClipboardObject(object):
gtk.ICON_SIZE_LARGE_TOOLBAR, 0)
if icon_info is not None:
icon_info.free()
- break
-
- if icon_name is None:
- icon_name = 'application-octet-stream'
+ return icon_name
- return icon_name
+ return 'application-octet-stream'
def get_preview(self):
for mime_type in ['text/plain']:
diff --git a/src/jarabe/frame/framewindow.py b/src/jarabe/frame/framewindow.py
index 02bb131..87eefb9 100644
--- a/src/jarabe/frame/framewindow.py
+++ b/src/jarabe/frame/framewindow.py
@@ -93,7 +93,8 @@ class FrameWindow(gtk.Window):
self.resize(self.size, gtk.gdk.screen_height())
def _realize_cb(self, widget):
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
+ self.window.set_override_redirect(True)
+ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
self.window.set_accept_focus(False)
def _enter_notify_cb(self, window, event):
diff --git a/src/jarabe/frame/friendstray.py b/src/jarabe/frame/friendstray.py
index 7e15f14..c9af585 100644
--- a/src/jarabe/frame/friendstray.py
+++ b/src/jarabe/frame/friendstray.py
@@ -27,11 +27,10 @@ class FriendIcon(TrayIcon):
TrayIcon.__init__(self, icon_name='computer-xo',
xo_color=buddy.get_color())
- palette = BuddyMenu(buddy)
- palette.props.icon_visible = False
- self.set_palette(palette)
- palette.set_group_id('frame')
- palette.props.invoker = FrameWidgetInvoker(self)
+ self.set_palette_invoker(FrameWidgetInvoker(self))
+ self.palette = BuddyMenu(buddy)
+ self.palette.props.icon_visible = False
+ self.palette.set_group_id('frame')
class FriendsTray(VTray):
def __init__(self):
diff --git a/src/jarabe/intro/window.py b/src/jarabe/intro/window.py
index 3975900..0e0cbb3 100644
--- a/src/jarabe/intro/window.py
+++ b/src/jarabe/intro/window.py
@@ -241,6 +241,9 @@ class IntroWindow(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
+ self.props.decorated = False
+ self.maximize()
+
self._canvas = hippo.Canvas()
self._intro_box = _IntroBox()
self._intro_box.connect('done', self._done_cb)
diff --git a/src/jarabe/journal/Makefile.am b/src/jarabe/journal/Makefile.am
index 5f66480..f4bf273 100644
--- a/src/jarabe/journal/Makefile.am
+++ b/src/jarabe/journal/Makefile.am
@@ -1,13 +1,13 @@
sugardir = $(pythondir)/jarabe/journal
sugar_PYTHON = \
__init__.py \
- collapsedentry.py \
detailview.py \
expandedentry.py \
journalactivity.py \
journalentrybundle.py \
journaltoolbox.py \
keepicon.py \
+ listmodel.py \
listview.py \
misc.py \
modalalert.py \
diff --git a/src/jarabe/journal/collapsedentry.py b/src/jarabe/journal/collapsedentry.py
deleted file mode 100644
index 3eeb087..0000000
--- a/src/jarabe/journal/collapsedentry.py
+++ /dev/null
@@ -1,397 +0,0 @@
-# Copyright (C) 2007, One Laptop Per Child
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-from gettext import gettext as _
-
-import gobject
-import gtk
-import hippo
-import cjson
-
-from sugar.graphics.icon import CanvasIcon
-from sugar.graphics.xocolor import XoColor
-from sugar.graphics import style
-from sugar.graphics.entry import CanvasEntry
-
-from jarabe.journal.keepicon import KeepIcon
-from jarabe.journal.palettes import ObjectPalette, BuddyPalette
-from jarabe.journal import misc
-from jarabe.journal import model
-
-class BuddyIcon(CanvasIcon):
- def __init__(self, buddy, **kwargs):
- CanvasIcon.__init__(self, **kwargs)
- self._buddy = buddy
-
- def create_palette(self):
- return BuddyPalette(self._buddy)
-
-class BuddyList(hippo.CanvasBox):
- def __init__(self, buddies, width):
- hippo.CanvasBox.__init__(self,
- orientation=hippo.ORIENTATION_HORIZONTAL,
- box_width=width,
- xalign=hippo.ALIGNMENT_START)
- self.set_buddies(buddies)
-
- def set_buddies(self, buddies):
- for item in self.get_children():
- self.remove(item)
-
- for buddy in buddies[0:3]:
- nick_, color = buddy
- icon = BuddyIcon(buddy,
- icon_name='computer-xo',
- xo_color=XoColor(color),
- cache=True)
- self.append(icon)
-
-class EntryIcon(CanvasIcon):
-
- __gtype_name__ = 'EntryIcon'
-
- __gsignals__ = {
- 'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([]))
- }
-
- def __init__(self, **kwargs):
- CanvasIcon.__init__(self, **kwargs)
- self._metadata = None
-
- def set_metadata(self, metadata):
- self._metadata = metadata
- self.props.file_name = misc.get_icon_name(metadata)
- self.palette = None
-
- def create_palette(self):
- if self.show_palette:
- palette = ObjectPalette(self._metadata, detail=True)
- palette.connect('detail-clicked',
- self.__detail_clicked_cb)
- return palette
- else:
- return None
-
- def __detail_clicked_cb(self, event):
- self.emit('detail-clicked')
-
- show_palette = gobject.property(type=bool, default=False)
-
-class BaseCollapsedEntry(hippo.CanvasBox):
- __gtype_name__ = 'BaseCollapsedEntry'
-
- _DATE_COL_WIDTH = style.GRID_CELL_SIZE * 3
- _BUDDIES_COL_WIDTH = style.GRID_CELL_SIZE * 3
- _PROGRESS_COL_WIDTH = style.GRID_CELL_SIZE * 5
-
- def __init__(self):
- hippo.CanvasBox.__init__(self,
- spacing=style.DEFAULT_SPACING,
- padding_top=style.DEFAULT_PADDING,
- padding_bottom=style.DEFAULT_PADDING,
- padding_left=style.DEFAULT_PADDING * 2,
- padding_right=style.DEFAULT_PADDING * 2,
- box_height=style.GRID_CELL_SIZE,
- orientation=hippo.ORIENTATION_HORIZONTAL)
-
- self._metadata = None
- self._is_selected = False
-
- self.keep_icon = self._create_keep_icon()
- self.append(self.keep_icon)
-
- self.icon = self._create_icon()
- self.append(self.icon)
-
- self.title = self._create_title()
- self.append(self.title, hippo.PACK_EXPAND)
-
- self.buddies_list = self._create_buddies_list()
- self.append(self.buddies_list)
-
- self.date = self._create_date()
- self.append(self.date)
-
- # Progress controls
- self.progress_bar = self._create_progress_bar()
- self.append(self.progress_bar)
-
- self.cancel_button = self._create_cancel_button()
- self.append(self.cancel_button)
-
- def _create_keep_icon(self):
- keep_icon = KeepIcon(False)
- keep_icon.connect('button-release-event',
- self.__keep_icon_button_release_event_cb)
- return keep_icon
-
- def _create_date(self):
- date = hippo.CanvasText(text='',
- xalign=hippo.ALIGNMENT_START,
- font_desc=style.FONT_NORMAL.get_pango_desc(),
- box_width=self._DATE_COL_WIDTH)
- return date
-
- def _create_icon(self):
- icon = EntryIcon(size=style.STANDARD_ICON_SIZE, cache=True)
- return icon
-
- def _create_title(self):
- # TODO: We'd prefer to ellipsize in the middle
- title = hippo.CanvasText(text='',
- xalign=hippo.ALIGNMENT_START,
- font_desc=style.FONT_BOLD.get_pango_desc(),
- size_mode=hippo.CANVAS_SIZE_ELLIPSIZE_END)
- return title
-
- def _create_buddies_list(self):
- return BuddyList([], self._BUDDIES_COL_WIDTH)
-
- def _create_progress_bar(self):
- progress_bar = gtk.ProgressBar()
- return hippo.CanvasWidget(widget=progress_bar,
- yalign=hippo.ALIGNMENT_CENTER,
- box_width=self._PROGRESS_COL_WIDTH)
-
- def _create_cancel_button(self):
- button = CanvasIcon(icon_name='activity-stop',
- size=style.SMALL_ICON_SIZE,
- box_width=style.GRID_CELL_SIZE)
- button.connect('button-release-event',
- self._cancel_button_release_event_cb)
- return button
-
- def _decode_buddies(self):
- if self.metadata.has_key('buddies') and \
- self.metadata['buddies']:
- buddies = cjson.decode(self.metadata['buddies']).values()
- else:
- buddies = []
- return buddies
-
- def update_visibility(self):
- in_process = self.is_in_progress()
-
- self.buddies_list.set_visible(not in_process)
- self.date.set_visible(not in_process)
-
- self.progress_bar.set_visible(in_process)
- self.cancel_button.set_visible(in_process)
-
- # TODO: determine the appearance of in-progress entries
- def _update_color(self):
- if self.is_in_progress():
- self.props.background_color = style.COLOR_WHITE.get_int()
- else:
- self.props.background_color = style.COLOR_WHITE.get_int()
-
- def is_in_progress(self):
- return self.metadata.has_key('progress') and \
- int(self.metadata['progress']) < 100
-
- def get_keep(self):
- keep = int(self.metadata.get('keep', 0))
- return keep == 1
-
- def __keep_icon_button_release_event_cb(self, button, event):
- logging.debug('__keep_icon_button_release_event_cb')
- metadata = model.get(self._metadata['uid'])
- if self.get_keep():
- metadata['keep'] = 0
- else:
- metadata['keep'] = 1
- model.write(metadata, update_mtime=False)
-
- self.keep_icon.props.keep = self.get_keep()
- self._update_color()
-
- return True
-
- def _cancel_button_release_event_cb(self, button, event):
- logging.debug('_cancel_button_release_event_cb')
- model.delete(self._metadata['uid'])
- return True
-
- def set_selected(self, is_selected):
- self._is_selected = is_selected
- self._update_color()
-
- def set_metadata(self, metadata):
- self._metadata = metadata
- self._is_selected = False
-
- self.keep_icon.props.keep = self.get_keep()
-
- self.date.props.text = misc.get_date(metadata)
-
- self.icon.set_metadata(metadata)
- if misc.is_activity_bundle(metadata):
- self.icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
- self.icon.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
- else:
- if metadata.has_key('icon-color') and \
- metadata['icon-color']:
- self.icon.props.xo_color = XoColor( \
- metadata['icon-color'])
- else:
- self.icon.props.xo_color = None
-
- if metadata.get('title', ''):
- title_text = metadata['title']
- else:
- title_text = _('Untitled')
- self.title.props.text = title_text
-
- self.buddies_list.set_buddies(self._decode_buddies())
-
- if metadata.has_key('progress'):
- self.progress_bar.props.widget.props.fraction = \
- int(metadata['progress']) / 100.0
-
- self.update_visibility()
- self._update_color()
-
- def get_metadata(self):
- return self._metadata
-
- metadata = property(get_metadata, set_metadata)
-
- def update_date(self):
- self.date.props.text = misc.get_date(self._metadata)
-
-class CollapsedEntry(BaseCollapsedEntry):
- __gtype_name__ = 'CollapsedEntry'
-
- __gsignals__ = {
- 'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([]))
- }
-
- def __init__(self):
- BaseCollapsedEntry.__init__(self)
-
- self.icon.props.show_palette = True
- self.icon.connect('button-release-event',
- self.__icon_button_release_event_cb)
- self.icon.connect('detail-clicked',
- self.__detail_clicked_palette_cb)
-
- self.title.connect('button_release_event',
- self.__title_button_release_event_cb)
-
- self._title_entry = self._create_title_entry()
- self.insert_after(self._title_entry, self.title, hippo.PACK_EXPAND)
- self._title_entry.set_visible(False)
-
- self._detail_button = self._create_detail_button()
- self._detail_button.connect('motion-notify-event',
- self.__detail_button_motion_notify_event_cb)
- self.append(self._detail_button)
-
- if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
- self.reverse()
-
- def _create_title_entry(self):
- title_entry = CanvasEntry()
- title_entry.set_background(style.COLOR_WHITE.get_html())
- title_entry.props.widget.connect('focus-out-event',
- self.__title_entry_focus_out_event_cb)
- title_entry.props.widget.connect('activate',
- self.__title_entry_activate_cb)
- title_entry.connect('key-press-event',
- self.__title_entry_key_press_event_cb)
- return title_entry
-
- def _create_detail_button(self):
- button = CanvasIcon(icon_name='go-right',
- size=style.SMALL_ICON_SIZE,
- box_width=style.GRID_CELL_SIZE * 3 / 5,
- fill_color=style.COLOR_BUTTON_GREY.get_svg())
- button.connect('button-release-event',
- self.__detail_button_release_event_cb)
- return button
-
- def update_visibility(self):
- BaseCollapsedEntry.update_visibility(self)
- self._detail_button.set_visible(not self.is_in_progress())
-
- def set_metadata(self, metadata):
- BaseCollapsedEntry.set_metadata(self, metadata)
- self._title_entry.props.text = self.title.props.text
-
- metadata = property(BaseCollapsedEntry.get_metadata, set_metadata)
-
- def _detail_clicked(self):
- if not self.is_in_progress():
- self.emit('detail-clicked')
-
- def __detail_clicked_palette_cb(self, entry):
- self._detail_clicked()
-
- def __detail_button_release_event_cb(self, button, event):
- logging.debug('_detail_button_release_event_cb')
- self._detail_clicked()
- return True
-
- def __detail_button_motion_notify_event_cb(self, button, event):
- if event.detail == hippo.MOTION_DETAIL_ENTER:
- button.props.fill_color = style.COLOR_TOOLBAR_GREY.get_svg()
- elif event.detail == hippo.MOTION_DETAIL_LEAVE:
- button.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
-
- def __icon_button_release_event_cb(self, button, event):
- logging.debug('__icon_button_release_event_cb')
- misc.resume(self.metadata)
- return True
-
- def __title_button_release_event_cb(self, button, event):
- self.title.set_visible(False)
- self._title_entry.set_visible(True)
- self._title_entry.props.widget.grab_focus()
-
- def __title_entry_focus_out_event_cb(self, entry, event):
- self._apply_title_change(entry.props.text)
-
- def __title_entry_activate_cb(self, entry):
- self._apply_title_change(entry.props.text)
-
- def __title_entry_key_press_event_cb(self, entry, event):
- if event.key == hippo.KEY_ESCAPE:
- self._cancel_title_change()
-
- def _apply_title_change(self, title):
- self._title_entry.set_visible(False)
- self.title.set_visible(True)
-
- if title == '':
- self._cancel_title_change()
- elif self.title.props.text != title:
- self.title.props.text = title
-
- self._metadata = model.get(self._metadata['uid'])
- self._metadata['title'] = title
- self._metadata['title_set_by_user'] = '1'
- model.write(self._metadata, update_mtime=False)
-
- def _cancel_title_change(self):
- self._title_entry.props.text = self.title.props.text
- self._title_entry.set_visible(False)
- self.title.set_visible(True)
-
diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
index 4f4d320..80204a1 100644
--- a/src/jarabe/journal/journalactivity.py
+++ b/src/jarabe/journal/journalactivity.py
@@ -185,8 +185,8 @@ class JournalActivity(Window):
if keyname == 'Escape':
self.show_main_view()
- def __detail_clicked_cb(self, list_view, entry):
- self._show_secondary_view(entry.metadata)
+ def __detail_clicked_cb(self, list_view, object_id):
+ self._show_secondary_view(object_id)
def __clear_clicked_cb(self, list_view):
self._main_toolbox.search_toolbar.clear_query()
@@ -207,9 +207,8 @@ class JournalActivity(Window):
self.set_canvas(self._main_view)
self._main_view.show()
- def _show_secondary_view(self, metadata):
- # Need to get the full set of properties
- metadata = model.get(metadata['uid'])
+ def _show_secondary_view(self, object_id):
+ metadata = model.get(object_id)
try:
self._detail_toolbox.entry_toolbar.set_metadata(metadata)
except Exception:
@@ -233,7 +232,7 @@ class JournalActivity(Window):
if metadata is None:
return False
else:
- self._show_secondary_view(metadata)
+ self._show_secondary_view(object_id)
return True
def __volume_changed_cb(self, volume_toolbar, mount_point):
@@ -277,16 +276,18 @@ class JournalActivity(Window):
return
if registry.is_installed(bundle):
+ logging.debug('_check_for_bundle bundle already installed')
return
try:
registry.install(bundle)
- except (ZipExtractException, RegistrationException), e:
- logging.warning('Could not install bundle %s: %r' %
- (bundle.get_path(), e))
+ except (ZipExtractException, RegistrationException):
+ logging.warning('Could not install bundle %s:\n%s' % \
+ (bundle.get_path(), traceback.format_exc()))
return
if metadata['mime_type'] == JournalEntryBundle.MIME_TYPE:
model.delete(object_id)
+ return
metadata['bundle_id'] = bundle.get_bundle_id()
model.write(metadata)
diff --git a/src/jarabe/journal/journalentrybundle.py b/src/jarabe/journal/journalentrybundle.py
index 5d4086c..ebe7ec3 100644
--- a/src/jarabe/journal/journalentrybundle.py
+++ b/src/jarabe/journal/journalentrybundle.py
@@ -40,7 +40,7 @@ class JournalEntryBundle(Bundle):
def __init__(self, path):
Bundle.__init__(self, path)
- def install(self):
+ def install(self, install_path):
if os.environ.has_key('SUGAR_ACTIVITY_ROOT'):
install_dir = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],
'data')
@@ -62,6 +62,9 @@ class JournalEntryBundle(Bundle):
finally:
shutil.rmtree(bundle_dir, ignore_errors=True)
+ def get_bundle_id(self):
+ return None
+
def _read_metadata(self, bundle_dir):
metadata_path = os.path.join(bundle_dir, '_metadata.json')
if not os.path.exists(metadata_path):
diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
new file mode 100644
index 0000000..a5586b7
--- /dev/null
+++ b/src/jarabe/journal/listmodel.py
@@ -0,0 +1,204 @@
+# Copyright (C) 2009, Tomeu Vizoso
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+import logging
+
+import cjson
+import gobject
+import gtk
+
+from sugar.graphics.xocolor import XoColor
+from sugar.graphics import style
+from sugar import util
+
+from jarabe.journal import model
+from jarabe.journal import misc
+
+DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore'
+DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
+DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+
+class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource):
+ __gtype_name__ = 'JournalListModel'
+
+ __gsignals__ = {
+ 'ready': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([])),
+ 'progress': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([])),
+ }
+
+ COLUMN_UID = 0
+ COLUMN_FAVORITE = 1
+ COLUMN_ICON = 2
+ COLUMN_ICON_COLOR = 3
+ COLUMN_TITLE = 4
+ COLUMN_DATE = 5
+ COLUMN_PROGRESS = 6
+ COLUMN_BUDDY_1 = 7
+ COLUMN_BUDDY_2 = 8
+ COLUMN_BUDDY_3 = 9
+
+ _COLUMN_TYPES = {COLUMN_UID: str,
+ COLUMN_FAVORITE: bool,
+ COLUMN_ICON: str,
+ COLUMN_ICON_COLOR: object,
+ COLUMN_TITLE: str,
+ COLUMN_DATE: str,
+ COLUMN_PROGRESS: int,
+ COLUMN_BUDDY_1: object,
+ COLUMN_BUDDY_3: object,
+ COLUMN_BUDDY_2: object}
+
+ _PAGE_SIZE = 10
+
+ def __init__(self, query):
+ gobject.GObject.__init__(self)
+
+ self._last_requested_index = None
+ self._cached_row = None
+ self._result_set = model.find(query, ListModel._PAGE_SIZE)
+ self._temp_drag_file_path = None
+
+ # HACK: The view will tell us that it is resizing so the model can
+ # avoid hitting D-Bus and disk.
+ self.view_is_resizing = False
+
+ self._result_set.ready.connect(self.__result_set_ready_cb)
+ self._result_set.progress.connect(self.__result_set_progress_cb)
+
+ def __result_set_ready_cb(self, **kwargs):
+ self.emit('ready')
+
+ def __result_set_progress_cb(self, **kwargs):
+ self.emit('progress')
+
+ def setup(self):
+ self._result_set.setup()
+
+ def stop(self):
+ self._result_set.stop()
+
+ def get_metadata(self, path):
+ return model.get(self[path][ListModel.COLUMN_UID])
+
+ def on_get_n_columns(self):
+ return len(ListModel._COLUMN_TYPES)
+
+ def on_get_column_type(self, index):
+ return ListModel._COLUMN_TYPES[index]
+
+ def on_iter_n_children(self, iter):
+ if iter == None:
+ return self._result_set.length
+ else:
+ return 0
+
+ def on_get_value(self, index, column):
+ if self.view_is_resizing:
+ return None
+
+ if index == self._last_requested_index:
+ return self._cached_row[column]
+
+ if index >= self._result_set.length:
+ return None
+
+ self._result_set.seek(index)
+ metadata = self._result_set.read()
+
+ self._last_requested_index = index
+ self._cached_row = []
+ self._cached_row.append(metadata['uid'])
+ self._cached_row.append(metadata.get('keep', '0') == '1')
+ self._cached_row.append(misc.get_icon_name(metadata))
+
+ if misc.is_activity_bundle(metadata):
+ xo_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(),
+ style.COLOR_TRANSPARENT.get_svg()))
+ else:
+ if metadata.get('icon-color', ''):
+ xo_color = XoColor(metadata['icon-color'])
+ else:
+ xo_color = None
+ self._cached_row.append(xo_color)
+
+ title = gobject.markup_escape_text(metadata.get('title', None))
+ self._cached_row.append('<b>%s</b>' % title)
+
+ timestamp = int(metadata.get('timestamp', 0))
+ self._cached_row.append(util.timestamp_to_elapsed_string(timestamp))
+
+ self._cached_row.append(int(metadata.get('progress', 100)))
+
+ if metadata.get('buddies', ''):
+ buddies = cjson.decode(metadata['buddies']).values()
+ else:
+ buddies = []
+
+ for n in xrange(0, 3):
+ if buddies:
+ nick, color = buddies.pop(0)
+ self._cached_row.append((nick, XoColor(color)))
+ else:
+ self._cached_row.append(None)
+
+ return self._cached_row[column]
+
+ def on_iter_nth_child(self, iter, n):
+ return n
+
+ def on_get_path(self, iter):
+ return (iter)
+
+ def on_get_iter(self, path):
+ return path[0]
+
+ def on_iter_next(self, iter):
+ if iter != None:
+ if iter >= self._result_set.length - 1:
+ return None
+ return iter + 1
+ return None
+
+ def on_get_flags(self):
+ return gtk.TREE_MODEL_ITERS_PERSIST | gtk.TREE_MODEL_LIST_ONLY
+
+ def on_iter_children(self, iter):
+ return None
+
+ def on_iter_has_child(self, iter):
+ return False
+
+ def on_iter_parent(self, iter):
+ return None
+
+ def do_drag_data_get(self, path, selection):
+ uid = self[path][ListModel.COLUMN_UID]
+ if selection.target == 'text/uri-list':
+ # Get hold of a reference so the temp file doesn't get deleted
+ self._temp_drag_file_path = model.get_file(uid)
+ logging.debug('putting %r in selection' % self._temp_drag_file_path)
+ selection.set(selection.target, 8, self._temp_drag_file_path)
+ return True
+ elif selection.target == 'journal-object-id':
+ selection.set(selection.target, 8, uid)
+ return True
+
+ return False
+
diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
index 9358036..4b325f9 100644
--- a/src/jarabe/journal/listview.py
+++ b/src/jarabe/journal/listview.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2007, One Laptop Per Child
+# Copyright (C) 2009, Tomeu Vizoso
#
# 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
@@ -20,28 +20,47 @@ import sys
from gettext import gettext as _
import time
-import hippo
import gobject
import gtk
-import dbus
+import hippo
+import gconf
+import pango
from sugar.graphics import style
-from sugar.graphics.icon import CanvasIcon, Icon
+from sugar.graphics.icon import CanvasIcon, Icon, CellRendererIcon
+from sugar.graphics.xocolor import XoColor
+from sugar import util
-from jarabe.journal.collapsedentry import CollapsedEntry
+from jarabe.journal.listmodel import ListModel
+from jarabe.journal.palettes import ObjectPalette, BuddyPalette
from jarabe.journal import model
-
-DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore'
-DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
-DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+from jarabe.journal import misc
UPDATE_INTERVAL = 300
-EMPTY_JOURNAL = _("Your Journal is empty")
-NO_MATCH = _("No matching entries ")
+MESSAGE_EMPTY_JOURNAL = 0
+MESSAGE_NO_MATCH = 1
-class BaseListView(gtk.HBox):
- __gtype_name__ = 'BaseListView'
+class TreeView(gtk.TreeView):
+ __gtype_name__ = 'JournalTreeView'
+
+ def __init__(self):
+ gtk.TreeView.__init__(self)
+
+ def do_size_request(self, requisition):
+ # HACK: We tell the model that the view is just resizing so it can avoid
+ # hitting both D-Bus and disk.
+ model = self.get_model()
+ if model is not None:
+ model.view_is_resizing = True
+ try:
+ gtk.TreeView.do_size_request(self, requisition)
+ finally:
+ if model is not None:
+ model.view_is_resizing = False
+
+class BaseListView(gtk.Bin):
+ __gtype_name__ = 'JournalBaseListView'
__gsignals__ = {
'clear-clicked': (gobject.SIGNAL_RUN_FIRST,
@@ -51,57 +70,35 @@ class BaseListView(gtk.HBox):
def __init__(self):
self._query = {}
- self._result_set = None
- self._entries = []
- self._page_size = 0
- self._reflow_sid = 0
- self._do_scroll_hid = None
+ self._model = None
self._progress_bar = None
self._last_progress_bar_pulse = None
- gtk.HBox.__init__(self)
- self.set_flags(gtk.HAS_FOCUS|gtk.CAN_FOCUS)
- self.connect('key-press-event', self._key_press_event_cb)
-
- self._box = hippo.CanvasBox(
- orientation=hippo.ORIENTATION_VERTICAL,
- background_color=style.COLOR_WHITE.get_int())
+ gobject.GObject.__init__(self)
- self._canvas = hippo.Canvas()
- self._canvas.set_root(self._box)
+ self.connect('destroy', self.__destroy_cb)
- self.pack_start(self._canvas)
- self._canvas.show()
+ self._scrolled_window = gtk.ScrolledWindow()
+ self._scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ self.add(self._scrolled_window)
+ self._scrolled_window.show()
- self._vadjustment = gtk.Adjustment(value=0, lower=0, upper=0,
- step_incr=1, page_incr=0,
- page_size=0)
- self._vadjustment.connect('value-changed',
- self._vadjustment_value_changed_cb)
- self._vadjustment.connect('changed', self._vadjustment_changed_cb)
+ self.tree_view = TreeView()
+ self.tree_view.props.fixed_height_mode = True
+ self.tree_view.modify_base(gtk.STATE_NORMAL,
+ style.COLOR_WHITE.get_gdk_color())
+ self._scrolled_window.add(self.tree_view)
+ self.tree_view.show()
- self._vscrollbar = gtk.VScrollbar(self._vadjustment)
- self.pack_end(self._vscrollbar, expand=False, fill=False)
- self._vscrollbar.show()
-
- self.connect('scroll-event', self._scroll_event_cb)
- self.connect('destroy', self.__destroy_cb)
+ self.cell_title = None
+ self.cell_icon = None
+ self._title_column = None
+ self._add_columns()
- # DND stuff
- self._temp_file_path = None
- self._pressed_button = None
- self._press_start_x = None
- self._press_start_y = None
- self._last_clicked_entry = None
- self._canvas.drag_source_set(0, [], 0)
- self._canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK |
- gtk.gdk.POINTER_MOTION_HINT_MASK)
- self._canvas.connect_after("motion_notify_event",
- self._canvas_motion_notify_event_cb)
- self._canvas.connect("button_press_event",
- self._canvas_button_press_event_cb)
- self._canvas.connect("drag_end", self._drag_end_cb)
- self._canvas.connect("drag_data_get", self._drag_data_get_cb)
+ self.tree_view.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
+ [('text/uri-list', 0, 0),
+ ('journal-object-id', 0, 0)],
+ gtk.gdk.ACTION_COPY)
# Auto-update stuff
self._fully_obscured = True
@@ -109,123 +106,203 @@ class BaseListView(gtk.HBox):
self._refresh_idle_handler = None
self._update_dates_timer = None
- bus = dbus.SessionBus()
- datastore = dbus.Interface(
- bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH), DS_DBUS_INTERFACE)
- self._datastore_created_handler = \
- datastore.connect_to_signal('Created',
- self.__datastore_created_cb)
- self._datastore_updated_handler = \
- datastore.connect_to_signal('Updated',
- self.__datastore_updated_cb)
-
- self._datastore_deleted_handler = \
- datastore.connect_to_signal('Deleted',
- self.__datastore_deleted_cb)
-
- def __destroy_cb(self, widget):
- self._datastore_created_handler.remove()
- self._datastore_updated_handler.remove()
- self._datastore_deleted_handler.remove()
+ model.created.connect(self.__model_created_cb)
+ model.updated.connect(self.__model_updated_cb)
+ model.deleted.connect(self.__model_deleted_cb)
- def _vadjustment_changed_cb(self, vadjustment):
- if vadjustment.props.upper > self._page_size:
- self._vscrollbar.show()
- else:
- self._vscrollbar.hide()
+ def __model_created_cb(self, sender, **kwargs):
+ self._set_dirty()
- def _vadjustment_value_changed_cb(self, vadjustment):
- if self._do_scroll_hid is None:
- self._do_scroll_hid = gobject.idle_add(self._do_scroll)
+ def __model_updated_cb(self, sender, **kwargs):
+ self._set_dirty()
- def _do_scroll(self):
- current_position = int(self._vadjustment.props.value)
+ def __model_deleted_cb(self, sender, **kwargs):
+ self._set_dirty()
- self._result_set.seek(current_position)
- metadata_list = self._result_set.read(self._page_size)
+ def _add_columns(self):
+ cell_favorite = CellRendererFavorite(self.tree_view)
+ cell_favorite.connect('clicked', self.__favorite_clicked_cb)
+
+ column = gtk.TreeViewColumn('')
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ column.props.fixed_width = cell_favorite.props.width
+ column.pack_start(cell_favorite)
+ column.set_cell_data_func(cell_favorite, self.__favorite_set_data_cb)
+ self.tree_view.append_column(column)
+
+ self.cell_icon = CellRendererActivityIcon(self.tree_view)
+
+ column = gtk.TreeViewColumn('')
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ column.props.fixed_width = self.cell_icon.props.width
+ column.pack_start(self.cell_icon)
+ column.add_attribute(self.cell_icon, 'file-name', ListModel.COLUMN_ICON)
+ column.add_attribute(self.cell_icon, 'xo-color', ListModel.COLUMN_ICON_COLOR)
+ self.tree_view.append_column(column)
+
+ self.cell_title = gtk.CellRendererText()
+ self.cell_title.props.ellipsize = pango.ELLIPSIZE_MIDDLE
+ self.cell_title.props.ellipsize_set = True
+
+ self._title_column = gtk.TreeViewColumn(_('Title'))
+ self._title_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ self._title_column.props.expand = True
+ self._title_column.props.clickable = True
+ self._title_column.pack_start(self.cell_title)
+ self._title_column.add_attribute(self.cell_title, 'markup',
+ ListModel.COLUMN_TITLE)
+ self._title_column.connect('clicked', self.__header_clicked_cb)
+ self.tree_view.append_column(self._title_column)
+
+ buddies_column = gtk.TreeViewColumn('')
+ buddies_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ self.tree_view.append_column(buddies_column)
+
+ for column_index in [ListModel.COLUMN_BUDDY_1, ListModel.COLUMN_BUDDY_2,
+ ListModel.COLUMN_BUDDY_3]:
+ cell_icon = CellRendererBuddy(self.tree_view,
+ column_index=column_index)
+ buddies_column.pack_start(cell_icon)
+ buddies_column.props.fixed_width += cell_icon.props.width
+ buddies_column.add_attribute(cell_icon, 'buddy', column_index)
+
+ cell_text = gtk.CellRendererText()
+ cell_text.props.xalign = 1
+
+ # Measure the required width for a date in the form of "10 hours, 10
+ # minutes ago"
+ timestamp = time.time() - 10 * 60 - 10 * 60 * 60
+ date = util.timestamp_to_elapsed_string(timestamp)
+ date_width = self._get_width_for_string(date)
+
+ self.date_column = gtk.TreeViewColumn(_('Date'))
+ self.date_column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ self.date_column.props.fixed_width = date_width
+ self.date_column.set_alignment(1)
+ self.date_column.props.resizable = True
+ self.date_column.props.clickable = True
+ self.date_column.props.sort_indicator = True
+ self.date_column.props.sort_order = gtk.SORT_ASCENDING
+ self.date_column.pack_start(cell_text)
+ self.date_column.add_attribute(cell_text, 'text', ListModel.COLUMN_DATE)
+ self.date_column.connect('clicked', self.__header_clicked_cb)
+ self.tree_view.append_column(self.date_column)
+
+ def __header_clicked_cb(self, column_clicked):
+ if column_clicked == self._title_column:
+ if self._title_column.props.sort_indicator:
+ if self._title_column.props.sort_order == gtk.SORT_DESCENDING:
+ self._query['order_by'] = ['+title']
+ else:
+ self._query['order_by'] = ['-title']
+ else:
+ self._query['order_by'] = ['+title']
+ elif column_clicked == self.date_column:
+ if self.date_column.props.sort_indicator:
+ if self.date_column.props.sort_order == gtk.SORT_DESCENDING:
+ self._query['order_by'] = ['+timestamp']
+ else:
+ self._query['order_by'] = ['-timestamp']
+ else:
+ self._query['order_by'] = ['+timestamp']
- if self._result_set.length != self._vadjustment.props.upper:
- self._vadjustment.props.upper = self._result_set.length
- self._vadjustment.changed()
+ self.refresh()
- self._refresh_view(metadata_list)
- self._dirty = False
+ # Need to update the column indicators after the model has been reset
+ if self._query['order_by'] == ['-timestamp']:
+ self.date_column.props.sort_indicator = True
+ self._title_column.props.sort_indicator = False
+ self.date_column.props.sort_order = gtk.SORT_DESCENDING
+ elif self._query['order_by'] == ['+timestamp']:
+ self.date_column.props.sort_indicator = True
+ self._title_column.props.sort_indicator = False
+ self.date_column.props.sort_order = gtk.SORT_ASCENDING
+ elif self._query['order_by'] == ['-title']:
+ self.date_column.props.sort_indicator = False
+ self._title_column.props.sort_indicator = True
+ self._title_column.props.sort_order = gtk.SORT_DESCENDING
+ elif self._query['order_by'] == ['+title']:
+ self.date_column.props.sort_indicator = False
+ self._title_column.props.sort_indicator = True
+ self._title_column.props.sort_order = gtk.SORT_ASCENDING
+
+ def _get_width_for_string(self, text):
+ # Add some extra margin
+ text = text + 'aaaaa'
+
+ widget = gtk.Label('')
+ context = widget.get_pango_context()
+ layout = pango.Layout(context)
+ layout.set_text(text)
+ width, height = layout.get_size()
+ return pango.PIXELS(width)
- self._do_scroll_hid = None
- return False
+ def do_size_allocate(self, allocation):
+ self.allocation = allocation
+ self.child.size_allocate(allocation)
- def _refresh_view(self, metadata_list):
- logging.debug('ListView %r' % self)
- # Indicate when the Journal is empty
- if len(metadata_list) == 0:
- if self._is_query_empty():
- self._show_message(EMPTY_JOURNAL)
- else:
- self._show_message(NO_MATCH)
- return
+ def do_size_request(self, requisition):
+ requisition.width, requisition.height = self.child.size_request()
- # Refresh view and create the entries if they don't exist yet.
- for i in range(0, self._page_size):
- try:
- if i < len(metadata_list):
- if i >= len(self._entries):
- entry = self.create_entry()
- self._box.append(entry)
- self._entries.append(entry)
- entry.metadata = metadata_list[i]
- else:
- entry = self._entries[i]
- entry.metadata = metadata_list[i]
- entry.set_visible(True)
- elif i < len(self._entries):
- entry = self._entries[i]
- entry.set_visible(False)
- except Exception:
- logging.error('Exception while displaying entry:\n' + \
- ''.join(traceback.format_exception(*sys.exc_info())))
-
- def create_entry(self):
- """ Create a descendant of BaseCollapsedEntry
- """
- raise NotImplementedError
+ def __destroy_cb(self, widget):
+ if self._model is not None:
+ self._model.destroy()
+
+ def __favorite_set_data_cb(self, column, cell, tree_model, tree_iter):
+ favorite = self._model[tree_iter][ListModel.COLUMN_FAVORITE]
+ if favorite:
+ client = gconf.client_get_default()
+ color = XoColor(client.get_string('/desktop/sugar/user/color'))
+ cell.props.xo_color = color
+ else:
+ cell.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ cell.props.fill_color = style.COLOR_WHITE.get_svg()
+
+ def __favorite_clicked_cb(self, cell, path):
+ row = self._model[path]
+ metadata = model.get(row[ListModel.COLUMN_UID])
+ if metadata['keep'] == '1':
+ metadata['keep'] = '0'
+ else:
+ metadata['keep'] = '1'
+ model.write(metadata, update_mtime=False)
def update_with_query(self, query_dict):
logging.debug('ListView.update_with_query')
self._query = query_dict
- if self._page_size > 0:
- self.refresh()
+
+ if 'order_by' not in self._query:
+ self._query['order_by'] = ['+timestamp']
+
+ self.refresh()
def refresh(self):
logging.debug('ListView.refresh query %r' % self._query)
self._stop_progress_bar()
self._start_progress_bar()
- if self._result_set is not None:
- self._result_set.stop()
- self._result_set = model.find(self._query, self._page_size)
- self._result_set.ready.connect(self.__result_set_ready_cb)
- self._result_set.progress.connect(self.__result_set_progress_cb)
- self._result_set.setup()
+ if self._model is not None:
+ self._model.stop()
- def __result_set_ready_cb(self, **kwargs):
- if kwargs['sender'] != self._result_set:
- return
+ self._model = ListModel(self._query)
+ self._model.connect('ready', self.__model_ready_cb)
+ self._model.connect('progress', self.__model_progress_cb)
+ self._model.setup()
+ def __model_ready_cb(self, model):
self._stop_progress_bar()
- self._vadjustment.props.upper = self._result_set.length
- self._vadjustment.changed()
+ # Cannot set it up earlier because will try to access the model and it
+ # needs to be ready.
+ self.tree_view.set_model(self._model)
- self._vadjustment.props.value = min(self._vadjustment.props.value,
- self._result_set.length - self._page_size)
- if self._result_set.length == 0:
+ if len(model) == 0:
if self._is_query_empty():
- self._show_message(EMPTY_JOURNAL)
+ self._show_message(MESSAGE_EMPTY_JOURNAL)
else:
- self._show_message(NO_MATCH)
+ self._show_message(MESSAGE_NO_MATCH)
else:
self._clear_message()
- self._do_scroll()
def _is_query_empty(self):
# FIXME: This is a hack, we shouldn't have to update this every time
@@ -237,18 +314,16 @@ class BaseListView(gtk.HBox):
else:
return True
- def __result_set_progress_cb(self, **kwargs):
+ def __model_progress_cb(self, tree_model):
if time.time() - self._last_progress_bar_pulse > 0.05:
if self._progress_bar is not None:
self._progress_bar.pulse()
self._last_progress_bar_pulse = time.time()
def _start_progress_bar(self):
- self.remove(self._canvas)
- self.remove(self._vscrollbar)
-
alignment = gtk.Alignment(xalign=0.5, yalign=0.5, xscale=0.5)
- self.pack_start(alignment)
+ self.remove(self.child)
+ self.add(alignment)
alignment.show()
self._progress_bar = gtk.ProgressBar()
@@ -258,101 +333,23 @@ class BaseListView(gtk.HBox):
self._progress_bar.show()
def _stop_progress_bar(self):
- for widget in self.get_children():
- self.remove(widget)
- self._progress_bar = None
-
- self.pack_start(self._canvas)
- self.pack_end(self._vscrollbar, expand=False, fill=False)
-
- def _scroll_event_cb(self, hbox, event):
- if event.direction == gtk.gdk.SCROLL_UP:
- if self._vadjustment.props.value > self._vadjustment.props.lower:
- self._vadjustment.props.value -= 1
- elif event.direction == gtk.gdk.SCROLL_DOWN:
- max_value = self._result_set.length - self._page_size
- if self._vadjustment.props.value < max_value:
- self._vadjustment.props.value += 1
-
- def do_focus(self, direction):
- if not self.is_focus():
- self.grab_focus()
- return True
- return False
-
- def _key_press_event_cb(self, widget, event):
- keyname = gtk.gdk.keyval_name(event.keyval)
-
- if keyname == 'Up':
- if self._vadjustment.props.value > self._vadjustment.props.lower:
- self._vadjustment.props.value -= 1
- elif keyname == 'Down':
- max_value = self._result_set.length - self._page_size
- if self._vadjustment.props.value < max_value:
- self._vadjustment.props.value += 1
- elif keyname == 'Page_Up' or keyname == 'KP_Page_Up':
- new_position = max(0,
- self._vadjustment.props.value - self._page_size)
- if new_position != self._vadjustment.props.value:
- self._vadjustment.props.value = new_position
- elif keyname == 'Page_Down' or keyname == 'KP_Page_Down':
- new_position = min(self._result_set.length - self._page_size,
- self._vadjustment.props.value + self._page_size)
- if new_position != self._vadjustment.props.value:
- self._vadjustment.props.value = new_position
- elif keyname == 'Home' or keyname == 'KP_Home':
- new_position = 0
- if new_position != self._vadjustment.props.value:
- self._vadjustment.props.value = new_position
- elif keyname == 'End' or keyname == 'KP_End':
- new_position = max(0, self._result_set.length - self._page_size)
- if new_position != self._vadjustment.props.value:
- self._vadjustment.props.value = new_position
- else:
- return False
-
- return True
-
- def do_size_allocate(self, allocation):
- gtk.HBox.do_size_allocate(self, allocation)
- new_page_size = int(allocation.height / style.GRID_CELL_SIZE)
-
- logging.debug("do_size_allocate: %r" % new_page_size)
-
- if new_page_size != self._page_size:
- self._page_size = new_page_size
- self._queue_reflow()
-
- def _queue_reflow(self):
- if not self._reflow_sid:
- self._reflow_sid = gobject.idle_add(self._reflow_idle_cb)
-
- def _reflow_idle_cb(self):
- self._box.clear()
- self._entries = []
-
- self._vadjustment.props.page_size = self._page_size
- self._vadjustment.props.page_increment = self._page_size
- self._vadjustment.changed()
-
- if self._result_set is None:
- self._result_set = model.find(self._query, self._page_size)
-
- max_value = max(0, self._result_set.length - self._page_size)
- if self._vadjustment.props.value > max_value:
- self._vadjustment.props.value = max_value
- else:
- self._do_scroll()
-
- self._reflow_sid = 0
+ if self.child != self._progress_bar:
+ return
+ self.remove(self.child)
+ self.add(self._scrolled_window)
def _show_message(self, message):
+ canvas = hippo.Canvas()
+ self.remove(self.child)
+ self.add(canvas)
+ canvas.show()
+
box = hippo.CanvasBox(orientation=hippo.ORIENTATION_VERTICAL,
background_color=style.COLOR_WHITE.get_int(),
yalign=hippo.ALIGNMENT_CENTER,
spacing=style.DEFAULT_SPACING,
padding_bottom=style.GRID_CELL_SIZE)
- self._canvas.set_root(box)
+ canvas.set_root(box)
icon = CanvasIcon(size=style.LARGE_ICON_SIZE,
icon_name='activity-journal',
@@ -360,141 +357,65 @@ class BaseListView(gtk.HBox):
fill_color = style.COLOR_TRANSPARENT.get_svg())
box.append(icon)
- text = hippo.CanvasText(text=message,
+ if message == MESSAGE_EMPTY_JOURNAL:
+ text = _('Your Journal is empty')
+ elif message == MESSAGE_NO_MATCH:
+ text = _('No matching entries')
+ else:
+ raise ValueError('Invalid message')
+
+ text = hippo.CanvasText(text=text,
xalign=hippo.ALIGNMENT_CENTER,
font_desc=style.FONT_BOLD.get_pango_desc(),
color = style.COLOR_BUTTON_GREY.get_int())
box.append(text)
- button = gtk.Button(label=_('Clear search'))
- button.connect('clicked', self.__clear_button_clicked_cb)
- button.props.image = Icon(icon_name='dialog-cancel',
- icon_size=gtk.ICON_SIZE_BUTTON)
- canvas_button = hippo.CanvasWidget(widget=button,
- xalign=hippo.ALIGNMENT_CENTER)
- box.append(canvas_button)
+ if message == MESSAGE_NO_MATCH:
+ button = gtk.Button(label=_('Clear search'))
+ button.connect('clicked', self.__clear_button_clicked_cb)
+ button.props.image = Icon(icon_name='dialog-cancel',
+ icon_size=gtk.ICON_SIZE_BUTTON)
+ canvas_button = hippo.CanvasWidget(widget=button,
+ xalign=hippo.ALIGNMENT_CENTER)
+ box.append(canvas_button)
def __clear_button_clicked_cb(self, button):
self.emit('clear-clicked')
def _clear_message(self):
- self._canvas.set_root(self._box)
-
- # TODO: Dnd methods. This should be merged somehow inside hippo-canvas.
- def _canvas_motion_notify_event_cb(self, widget, event):
- if not self._pressed_button:
- return True
-
- # if the mouse button is not pressed, no drag should occurr
- if not event.state & gtk.gdk.BUTTON1_MASK:
- self._pressed_button = None
- return True
-
- logging.debug("motion_notify_event_cb")
-
- if event.is_hint:
- x, y, state_ = event.window.get_pointer()
- else:
- x = event.x
- y = event.y
-
- if widget.drag_check_threshold(int(self._press_start_x),
- int(self._press_start_y),
- int(x),
- int(y)):
- context_ = widget.drag_begin([('text/uri-list', 0, 0),
- ('journal-object-id', 0, 0)],
- gtk.gdk.ACTION_COPY,
- 1,
- event)
- return True
-
- def _drag_end_cb(self, widget, drag_context):
- logging.debug("drag_end_cb")
- self._pressed_button = None
- self._press_start_x = None
- self._press_start_y = None
- self._last_clicked_entry = None
-
- # Release and delete the temp file
- self._temp_file_path = None
-
- def _drag_data_get_cb(self, widget, context, selection, target_type,
- event_time):
- logging.debug("drag_data_get_cb: requested target " + selection.target)
-
- metadata = self._last_clicked_entry.metadata
- if selection.target == 'text/uri-list':
- # Get hold of a reference so the temp file doesn't get deleted
- self._temp_file_path = model.get_file(metadata['uid'])
- selection.set(selection.target, 8, self._temp_file_path)
- elif selection.target == 'journal-object-id':
- selection.set(selection.target, 8, metadata['uid'])
-
- def _canvas_button_press_event_cb(self, widget, event):
- logging.debug("button_press_event_cb")
-
- if event.button == 1 and event.type == gtk.gdk.BUTTON_PRESS:
- self._last_clicked_entry = \
- self._get_entry_at_coords(event.x, event.y)
- if self._last_clicked_entry:
- self._pressed_button = event.button
- self._press_start_x = event.x
- self._press_start_y = event.y
-
- return False
-
- def _get_entry_at_coords(self, x, y):
- for entry in self._box.get_children():
- entry_x, entry_y = entry.get_context().translate_to_widget(entry)
- entry_width, entry_height = entry.get_allocation()
-
- if (x >= entry_x ) and (x <= entry_x + entry_width) and \
- (y >= entry_y ) and (y <= entry_y + entry_height):
- return entry
- return None
+ self.remove(self.child)
+ self.add(self._scrolled_window)
+ self._scrolled_window.show()
def update_dates(self):
logging.debug('ListView.update_dates')
- for entry in self._entries:
- if entry.get_visible():
- entry.update_date()
-
- def __datastore_created_cb(self, uid):
- self._set_dirty()
-
- def __datastore_updated_cb(self, uid):
- self._set_dirty()
-
- def __datastore_deleted_cb(self, uid):
- self._set_dirty()
+ visible_range = self.tree_view.get_visible_range()
+ if visible_range is None:
+ return
+ path, end_path = visible_range
+ while True:
+ x, y, width, height = self.tree_view.get_cell_area(path,
+ self.date_column)
+ x, y = self.tree_view.convert_tree_to_widget_coords(x, y)
+ self.tree_view.queue_draw_area(x, y, width, height)
+ if path == end_path:
+ break
+ else:
+ next_iter = self._model.iter_next(self._model.get_iter(path))
+ path = self._model.get_path(next_iter)
def _set_dirty(self):
if self._fully_obscured:
self._dirty = True
else:
- self._schedule_refresh()
-
- def _schedule_refresh(self):
- if self._refresh_idle_handler is None:
- logging.debug('Add refresh idle callback')
- self._refresh_idle_handler = \
- gobject.idle_add(self.__refresh_idle_cb)
-
- def __refresh_idle_cb(self):
- self.refresh()
- if self._refresh_idle_handler is not None:
- logging.debug('Remove refresh idle callback')
- gobject.source_remove(self._refresh_idle_handler)
- self._refresh_idle_handler = None
- return False
+ self.refresh()
def set_is_visible(self, visible):
logging.debug('canvas_visibility_notify_event_cb %r' % visible)
if visible:
self._fully_obscured = False
if self._dirty:
- self._schedule_refresh()
+ self.refresh()
if self._update_dates_timer is None:
logging.debug('Adding date updating timer')
self._update_dates_timer = \
@@ -512,7 +433,7 @@ class BaseListView(gtk.HBox):
return True
class ListView(BaseListView):
- __gtype_name__ = 'ListView'
+ __gtype_name__ = 'JournalListView'
__gsignals__ = {
'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
@@ -523,11 +444,142 @@ class ListView(BaseListView):
def __init__(self):
BaseListView.__init__(self)
- def create_entry(self):
- entry = CollapsedEntry()
- entry.connect('detail-clicked', self.__entry_activated_cb)
- return entry
+ self.cell_title.props.editable = True
+ self.cell_title.connect('edited', self.__cell_title_edited_cb)
+
+ self.cell_icon.connect('clicked', self.__icon_clicked_cb)
+ self.cell_icon.connect('detail-clicked', self.__detail_clicked_cb)
+
+ cell_detail = CellRendererDetail(self.tree_view)
+ cell_detail.connect('clicked', self.__detail_cell_clicked_cb)
+
+ column = gtk.TreeViewColumn('')
+ column.props.sizing = gtk.TREE_VIEW_COLUMN_FIXED
+ column.props.fixed_width = cell_detail.props.width
+ column.pack_start(cell_detail)
+ self.tree_view.append_column(column)
+
+ def __detail_cell_clicked_cb(self, cell, path):
+ row = self.tree_view.get_model()[path]
+ self.emit('detail-clicked', row[ListModel.COLUMN_UID])
+
+ def __detail_clicked_cb(self, cell, uid):
+ self.emit('detail-clicked', uid)
+
+ def __icon_clicked_cb(self, cell, path):
+ row = self.tree_view.get_model()[path]
+ metadata = model.get(row[ListModel.COLUMN_UID])
+ misc.resume(metadata)
+
+ def __cell_title_edited_cb(self, cell, path, new_text):
+ row = self._model[path]
+ metadata = model.get(row[ListModel.COLUMN_UID])
+ metadata['title'] = new_text
+ model.write(metadata, update_mtime=False)
+
+class CellRendererFavorite(CellRendererIcon):
+ __gtype_name__ = 'JournalCellRendererFavorite'
+
+ def __init__(self, tree_view):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.SMALL_ICON_SIZE
+ self.props.icon_name = 'emblem-favorite'
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+ self.props.prelit_stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.prelit_fill_color = style.COLOR_BUTTON_GREY.get_svg()
+
+class CellRendererDetail(CellRendererIcon):
+ __gtype_name__ = 'JournalCellRendererDetail'
+
+ def __init__(self, tree_view):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.SMALL_ICON_SIZE
+ self.props.icon_name = 'go-right'
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+ self.props.stroke_color = style.COLOR_TRANSPARENT.get_svg()
+ self.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.prelit_stroke_color = style.COLOR_TRANSPARENT.get_svg()
+ self.props.prelit_fill_color = style.COLOR_BLACK.get_svg()
+
+class CellRendererActivityIcon(CellRendererIcon):
+ __gtype_name__ = 'JournalCellRendererActivityIcon'
+
+ __gsignals__ = {
+ 'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([str])),
+ }
+
+ def __init__(self, tree_view):
+ self._show_palette = True
+
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.GRID_CELL_SIZE
+ self.props.height = style.GRID_CELL_SIZE
+ self.props.size = style.STANDARD_ICON_SIZE
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+
+ self.tree_view = tree_view
+
+ def create_palette(self):
+ if not self._show_palette:
+ return None
+
+ tree_model = self.tree_view.get_model()
+ metadata = tree_model.get_metadata(self.props.palette_invoker.path)
+
+ palette = ObjectPalette(metadata, detail=True)
+ palette.connect('detail-clicked',
+ self.__detail_clicked_cb)
+ return palette
+
+ def __detail_clicked_cb(self, palette, uid):
+ self.emit('detail-clicked', uid)
+
+ def set_show_palette(self, show_palette):
+ self._show_palette = show_palette
+
+ show_palette = gobject.property(type=bool, default=True,
+ setter=set_show_palette)
+
+class CellRendererBuddy(CellRendererIcon):
+ __gtype_name__ = 'JournalCellRendererBuddy'
+
+ def __init__(self, tree_view, column_index):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.STANDARD_ICON_SIZE
+ self.props.height = style.STANDARD_ICON_SIZE
+ self.props.size = style.STANDARD_ICON_SIZE
+ self.props.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
+
+ self.tree_view = tree_view
+ self._model_column_index = column_index
+
+ def create_palette(self):
+ model = self.tree_view.get_model()
+ row = model[self.props.palette_invoker.path]
+
+ if row[self._model_column_index] is not None:
+ nick, xo_color = row[self._model_column_index]
+ return BuddyPalette((nick, xo_color.to_string()))
+ else:
+ return None
+
+ def set_buddy(self, buddy):
+ if buddy is None:
+ self.props.icon_name = None
+ else:
+ nick_, xo_color = buddy
+ self.props.icon_name = 'computer-xo'
+ self.props.xo_color = xo_color
- def __entry_activated_cb(self, entry):
- self.emit('detail-clicked', entry)
+ buddy = gobject.property(type=object, setter=set_buddy)
diff --git a/src/jarabe/journal/misc.py b/src/jarabe/journal/misc.py
index 52a86fa..b29b744 100644
--- a/src/jarabe/journal/misc.py
+++ b/src/jarabe/journal/misc.py
@@ -65,17 +65,20 @@ def get_icon_name(metadata):
if file_name is None and is_activity_bundle(metadata):
file_path = model.get_file(metadata['uid'])
- if os.path.exists(file_path):
+ if file_path is not None and os.path.exists(file_path):
try:
bundle = ActivityBundle(file_path)
file_name = bundle.get_icon()
- except Exception:
+ except:
logging.warning('Could not read bundle:\n' + \
- ''.join(traceback.format_exception(*sys.exc_info())))
+ traceback.format_exc())
if file_name is None:
file_name = _get_icon_for_mime(metadata.get('mime_type', ''))
+ if file_name is None:
+ file_name = get_icon_file_name('application-octet-stream')
+
return file_name
def get_date(metadata):
@@ -122,7 +125,9 @@ def _get_activities_for_mime(mime_type):
result = registry.get_activities_for_type(mime_type)
if not result:
for parent_mime in mime.get_mime_parents(mime_type):
- result.extend(registry.get_activities_for_type(parent_mime))
+ for activity in registry.get_activities_for_type(parent_mime):
+ if activity not in result:
+ result.append(activity)
return result
def get_activities(metadata):
@@ -138,7 +143,7 @@ def get_activities(metadata):
if mime_type:
activities_info = _get_activities_for_mime(mime_type)
for activity_info in activities_info:
- if activity_info.get_bundle_id() != bundle_id:
+ if activity_info not in activities:
activities.append(activity_info)
return activities
diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
index 054de7d..7517d78 100644
--- a/src/jarabe/journal/model.py
+++ b/src/jarabe/journal/model.py
@@ -39,9 +39,10 @@ DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
# Properties the journal cares about.
PROPERTIES = ['uid', 'title', 'mtime', 'timestamp', 'keep', 'buddies',
'icon-color', 'mime_type', 'progress', 'activity', 'mountpoint',
- 'activity_id']
+ 'activity_id', 'bundle_id']
-PAGES_TO_CACHE = 5
+MIN_PAGES_TO_CACHE = 3
+MAX_PAGES_TO_CACHE = 5
class _Cache(object):
@@ -64,11 +65,10 @@ class _Cache(object):
self._dict[entry['uid']] = entry
def remove_all(self, entries):
- entries = entries[:]
- for entry in entries:
- obj = self._dict[entry['uid']]
+ for uid in [entry['uid'] for entry in entries]:
+ obj = self._dict[uid]
self._array.remove(obj)
- del self._dict[entry['uid']]
+ del self._dict[uid]
def __len__(self):
return len(self._array)
@@ -83,11 +83,11 @@ class BaseResultSet(object):
"""Encapsulates the result of a query
"""
- def __init__(self, query, cache_limit):
+ def __init__(self, query, page_size):
self._total_count = -1
self._position = -1
self._query = query
- self._cache_limit = cache_limit
+ self._page_size = page_size
self._offset = 0
self._cache = _Cache()
@@ -104,7 +104,7 @@ class BaseResultSet(object):
def get_length(self):
if self._total_count == -1:
query = self._query.copy()
- query['limit'] = self._cache_limit
+ query['limit'] = self._page_size * MIN_PAGES_TO_CACHE
entries, self._total_count = self.find(query)
self._cache.append_all(entries)
self._offset = 0
@@ -118,13 +118,8 @@ class BaseResultSet(object):
def seek(self, position):
self._position = position
- def read(self, max_count):
- logging.debug('ResultSet.read position: %r' % self._position)
-
- if max_count * PAGES_TO_CACHE > self._cache_limit:
- raise RuntimeError(
- 'max_count (%i) too big for self._cache_limit'
- ' (%i).' % (max_count, self._cache_limit))
+ def read(self):
+ #logging.debug('ResultSet.read position: %r' % self._position)
if self._position == -1:
self.seek(0)
@@ -142,31 +137,29 @@ class BaseResultSet(object):
last_cached_entry = self._offset + len(self._cache)
- if (remaining_forward_entries <= 0 and
- remaining_backwards_entries <= 0) or \
- max_count > self._cache_limit:
+ if remaining_forward_entries <= 0 and remaining_backwards_entries <= 0:
# Total cache miss: remake it
- offset = max(0, self._position - max_count)
+ limit = self._page_size * MIN_PAGES_TO_CACHE
+ offset = max(0, self._position - limit / 2)
logging.debug('remaking cache, offset: %r limit: %r' % \
- (offset, max_count * 2))
+ (offset, limit))
query = self._query.copy()
- query['limit'] = self._cache_limit
+ query['limit'] = limit
query['offset'] = offset
entries, self._total_count = self.find(query)
- self._cache.remove_all(self._cache)
+ self._cache.remove_all(self._cache._array)
self._cache.append_all(entries)
self._offset = offset
-
- elif remaining_forward_entries < 2 * max_count and \
- last_cached_entry < self._total_count:
+
+ elif remaining_forward_entries <= 0 and remaining_backwards_entries > 0:
# Add one page to the end of cache
logging.debug('appending one more page, offset: %r' % \
last_cached_entry)
query = self._query.copy()
- query['limit'] = max_count
+ query['limit'] = self._page_size
query['offset'] = last_cached_entry
entries, self._total_count = self.find(query)
@@ -174,21 +167,23 @@ class BaseResultSet(object):
self._cache.append_all(entries)
# apply the cache limit
- objects_excess = len(self._cache) - self._cache_limit
+ cache_limit = self._page_size * MAX_PAGES_TO_CACHE
+ objects_excess = len(self._cache) - cache_limit
if objects_excess > 0:
self._offset += objects_excess
self._cache.remove_all(self._cache[:objects_excess])
- elif remaining_backwards_entries < 2 * max_count and self._offset > 0:
+ elif remaining_forward_entries > 0 and \
+ remaining_backwards_entries <= 0 and self._offset > 0:
# Add one page to the beginning of cache
- limit = min(self._offset, max_count)
- self._offset = max(0, self._offset - max_count)
+ limit = min(self._offset, self._page_size)
+ self._offset = max(0, self._offset - limit)
logging.debug('prepending one more page, offset: %r limit: %r' %
(self._offset, limit))
query = self._query.copy()
- query['limit'] = limit
+ query['limit'] = self._page_size
query['offset'] = self._offset
entries, self._total_count = self.find(query)
@@ -196,20 +191,19 @@ class BaseResultSet(object):
self._cache.prepend_all(entries)
# apply the cache limit
- objects_excess = len(self._cache) - self._cache_limit
+ cache_limit = self._page_size * MAX_PAGES_TO_CACHE
+ objects_excess = len(self._cache) - cache_limit
if objects_excess > 0:
self._cache.remove_all(self._cache[-objects_excess:])
- else:
- logging.debug('cache hit and no need to grow the cache')
+ #else:
+ # logging.debug('cache hit and no need to grow the cache')
- first_pos = self._position - self._offset
- last_pos = self._position - self._offset + max_count
- return self._cache[first_pos:last_pos]
+ return self._cache[self._position - self._offset]
class DatastoreResultSet(BaseResultSet):
"""Encapsulates the result of a query on the datastore
"""
- def __init__(self, query, cache_limit):
+ def __init__(self, query, page_size):
if query.get('query', '') and not query['query'].startswith('"'):
query_text = ''
@@ -222,7 +216,7 @@ class DatastoreResultSet(BaseResultSet):
query['query'] = query_text
- BaseResultSet.__init__(self, query, cache_limit)
+ BaseResultSet.__init__(self, query, page_size)
def find(self, query):
entries, total_count = _get_datastore().find(query, PROPERTIES,
@@ -236,8 +230,8 @@ class DatastoreResultSet(BaseResultSet):
class InplaceResultSet(BaseResultSet):
"""Encapsulates the result of a query on a mount point
"""
- def __init__(self, query, cache_limit, mount_point):
- BaseResultSet.__init__(self, query, cache_limit)
+ def __init__(self, query, page_size, mount_point):
+ BaseResultSet.__init__(self, query, page_size)
self._mount_point = mount_point
self._file_list = None
self._pending_directories = 0
@@ -389,11 +383,10 @@ def find(query, page_size):
if mount_points is None or len(mount_points) != 1:
raise ValueError('Exactly one mount point must be specified')
- cache_limit = page_size * PAGES_TO_CACHE
if mount_points[0] == '/':
- return DatastoreResultSet(query, cache_limit)
+ return DatastoreResultSet(query, page_size)
else:
- return InplaceResultSet(query, cache_limit, mount_points[0])
+ return InplaceResultSet(query, page_size, mount_points[0])
def _get_mount_point(path):
dir_path = os.path.dirname(path)
@@ -490,9 +483,11 @@ def write(metadata, file_path='', update_mtime=True):
def _get_file_name(title, mime_type):
file_name = title
- extension = '.' + mime.get_primary_extension(mime_type)
- if not file_name.endswith(extension):
- file_name += extension
+ extension = mime.get_primary_extension(mime_type)
+ if extension is not None and extension:
+ extension = '.' + extension
+ if not file_name.endswith(extension):
+ file_name += extension
# Invalid characters in VFAT filenames. From
# http://en.wikipedia.org/wiki/File_Allocation_Table
@@ -505,7 +500,7 @@ def _get_file_name(title, mime_type):
max_len = 250
if len(file_name) > max_len:
name, extension = os.path.splitext(file_name)
- file_name = name[0:max_len - extension] + extension
+ file_name = name[0:max_len - len(extension)] + extension
return file_name
diff --git a/src/jarabe/journal/objectchooser.py b/src/jarabe/journal/objectchooser.py
index b70cf72..0e6de27 100644
--- a/src/jarabe/journal/objectchooser.py
+++ b/src/jarabe/journal/objectchooser.py
@@ -25,8 +25,8 @@ import wnck
from sugar.graphics import style
from sugar.graphics.toolbutton import ToolButton
-from jarabe.journal.listview import ListView
-from jarabe.journal.collapsedentry import BaseCollapsedEntry
+from jarabe.journal.listview import BaseListView
+from jarabe.journal.listmodel import ListModel
from jarabe.journal.journaltoolbox import SearchToolbar
from jarabe.journal.volumestoolbar import VolumesToolbar
@@ -107,8 +107,8 @@ class ObjectChooser(gtk.Window):
if window.get_xid() == parent.xid:
self.destroy()
- def __entry_activated_cb(self, list_view, entry):
- self._selected_object_id = entry.metadata['uid']
+ def __entry_activated_cb(self, list_view, uid):
+ self._selected_object_id = uid
self.emit('response', gtk.RESPONSE_ACCEPT)
def __delete_event_cb(self, chooser, event):
@@ -163,44 +163,23 @@ class TitleBox(VolumesToolbar):
self.insert(tool_item, -1)
tool_item.show()
-class ChooserCollapsedEntry(BaseCollapsedEntry):
- __gtype_name__ = 'ChooserCollapsedEntry'
+class ChooserListView(BaseListView):
+ __gtype_name__ = 'ChooserListView'
__gsignals__ = {
'entry-activated': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
- ([]))
+ ([str])),
}
def __init__(self):
- BaseCollapsedEntry.__init__(self)
-
- self.connect_after('button-release-event',
- self.__button_release_event_cb)
- self.connect('motion-notify-event', self.__motion_notify_event_cb)
+ BaseListView.__init__(self)
- def __button_release_event_cb(self, entry, event):
- self.emit('entry-activated')
- return True
+ self.cell_icon.props.show_palette = False
+ self.tree_view.props.hover_selection = True
- def __motion_notify_event_cb(self, entry, event):
- if event.detail == hippo.MOTION_DETAIL_ENTER:
- self.props.background_color = style.COLOR_PANEL_GREY.get_int()
- elif event.detail == hippo.MOTION_DETAIL_LEAVE:
- self.props.background_color = style.COLOR_WHITE.get_int()
- return False
-
-class ChooserListView(ListView):
- __gtype_name__ = 'ChooserListView'
-
- __gsignals__ = {
- 'entry-activated': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([object]))
- }
-
- def __init__(self):
- ListView.__init__(self)
+ self.tree_view.connect('button-release-event',
+ self.__button_release_event_cb)
def create_entry(self):
entry = ChooserCollapsedEntry()
@@ -210,3 +189,17 @@ class ChooserListView(ListView):
def __entry_activated_cb(self, entry):
self.emit('entry-activated', entry)
+ def __button_release_event_cb(self, tree_view, event):
+ if event.window != tree_view.get_bin_window():
+ return False
+
+ pos = tree_view.get_path_at_pos(event.x, event.y)
+ if pos is None:
+ return False
+
+ path, column_, x_, y_ = pos
+ uid = tree_view.get_model()[path][ListModel.COLUMN_UID]
+ self.emit('entry-activated', uid)
+
+ return False
+
diff --git a/src/jarabe/journal/palettes.py b/src/jarabe/journal/palettes.py
index 2c15591..341a09f 100644
--- a/src/jarabe/journal/palettes.py
+++ b/src/jarabe/journal/palettes.py
@@ -41,7 +41,7 @@ class ObjectPalette(Palette):
__gsignals__ = {
'detail-clicked': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
- ([]))
+ ([str])),
}
def __init__(self, metadata, detail=False):
@@ -61,7 +61,7 @@ class ObjectPalette(Palette):
style.COLOR_TRANSPARENT.get_svg()))
if metadata.has_key('title'):
- title = metadata['title']
+ title = gobject.markup_escape_text(metadata['title'])
else:
title = _('Untitled')
@@ -142,7 +142,7 @@ class ObjectPalette(Palette):
model.delete(self._metadata['uid'])
def __detail_activate_cb(self, menu_item):
- self.emit('detail-clicked')
+ self.emit('detail-clicked', self._metadata['uid'])
def __friend_selected_cb(self, menu_item, buddy):
logging.debug('__friend_selected_cb')
diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/volumestoolbar.py
index 32c8f68..b21832e 100644
--- a/src/jarabe/journal/volumestoolbar.py
+++ b/src/jarabe/journal/volumestoolbar.py
@@ -145,8 +145,18 @@ class VolumeButton(BaseButton):
mount_point = mount.get_root().get_path()
BaseButton.__init__(self, mount_point)
- # TODO: fallback to the more generic icons when needed
- self.props.named_icon = mount.get_icon().props.names[0]
+ icon_name = None
+ icon_theme = gtk.icon_theme_get_default()
+ for icon_name in mount.get_icon().props.names:
+ icon_info = icon_theme.lookup_icon(icon_name,
+ gtk.ICON_SIZE_LARGE_TOOLBAR, 0)
+ if icon_info is not None:
+ break
+
+ if icon_name is None:
+ icon_name = 'drive'
+
+ self.props.named_icon = icon_name
# TODO: retrieve the colors from the owner of the device
client = gconf.client_get_default()
diff --git a/src/jarabe/model/buddy.py b/src/jarabe/model/buddy.py
index b51b808..1fa9e2c 100644
--- a/src/jarabe/model/buddy.py
+++ b/src/jarabe/model/buddy.py
@@ -35,6 +35,9 @@ class BuddyModel(gobject.GObject):
'icon-changed': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
([])),
+ 'tags-changed': (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT])),
'current-activity-changed': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
([gobject.TYPE_PYOBJECT]))
@@ -47,6 +50,7 @@ class BuddyModel(gobject.GObject):
gobject.GObject.__init__(self)
self._color = None
+ self._tags = None
self._ba_handler = None
self._pc_handler = None
self._dis_handler = None
@@ -99,6 +103,9 @@ class BuddyModel(gobject.GObject):
def get_color(self):
return self._color
+ def get_tags(self):
+ return self._tags
+
def get_buddy(self):
return self._buddy
@@ -124,6 +131,7 @@ class BuddyModel(gobject.GObject):
self._buddy = buddy
self._key = self._buddy.props.key
self._nick = self._buddy.props.nick
+ self._tags = self._buddy.props.tags
self._set_color_from_string(self._buddy.props.color)
self._pc_handler = self._buddy.connect('property-changed',
@@ -155,6 +163,9 @@ class BuddyModel(gobject.GObject):
if 'nick' in keys:
self._nick = self._buddy.props.nick
self.emit('nick-changed', self.get_nick())
+ if 'tags' in keys:
+ self._tags = self._buddy.props.tags
+ self.emit('tags-changed', self.get_tags())
def _buddy_disappeared_cb(self, buddy):
if buddy != self._buddy:
diff --git a/src/jarabe/model/bundleregistry.py b/src/jarabe/model/bundleregistry.py
index 62ac6e2..2155208 100644
--- a/src/jarabe/model/bundleregistry.py
+++ b/src/jarabe/model/bundleregistry.py
@@ -1,4 +1,5 @@
# Copyright (C) 2006-2007 Red Hat, Inc.
+# Copyright (C) 2009 Aleksey Lim
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -24,6 +25,8 @@ import gio
import cjson
from sugar.bundle.activitybundle import ActivityBundle
+from sugar.bundle.contentbundle import ContentBundle
+from jarabe.journal.journalentrybundle import JournalEntryBundle
from sugar.bundle.bundle import MalformedBundleException, \
AlreadyInstalledException, RegistrationException
from sugar import env
@@ -49,12 +52,16 @@ class BundleRegistry(gobject.GObject):
self._mime_defaults = self._load_mime_defaults()
self._bundles = []
+ # hold a reference to the monitors so they don't get disposed
+ self._gio_monitors = []
+
user_path = env.get_user_activities_path()
for activity_dir in [user_path, config.activities_path]:
self._scan_directory(activity_dir)
directory = gio.File(activity_dir)
monitor = directory.monitor_directory()
monitor.connect('changed', self.__file_monitor_changed_cb)
+ self._gio_monitors.append(monitor)
self._last_defaults_mtime = -1
self._favorite_bundles = {}
@@ -72,15 +79,7 @@ class BundleRegistry(gobject.GObject):
if not one_file.get_path().endswith('.activity'):
return
if event_type == gio.FILE_MONITOR_EVENT_CREATED:
- try:
- bundle = ActivityBundle(one_file.get_path())
- except MalformedBundleException:
- logging.error('Error loading bundle %r:\n%s' % (
- one_file.get_path(),
- ''.join(traceback.format_exception(*sys.exc_info()))))
- return
- if not self.is_installed(bundle):
- self.add_bundle(one_file.get_path())
+ self.add_bundle(one_file.get_path(), install_mime_type=True)
elif event_type == gio.FILE_MONITOR_EVENT_DELETED:
self.remove_bundle(one_file.get_path())
@@ -196,8 +195,8 @@ class BundleRegistry(gobject.GObject):
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)
+ def add_bundle(self, bundle_path, install_mime_type=False):
+ bundle = self._add_bundle(bundle_path, install_mime_type)
if bundle is not None:
self._set_bundle_favorite(bundle.get_bundle_id(),
bundle.get_activity_version(),
@@ -207,15 +206,20 @@ class BundleRegistry(gobject.GObject):
else:
return False
- def _add_bundle(self, bundle_path):
+ def _add_bundle(self, bundle_path, install_mime_type=False):
logging.debug('STARTUP: Adding bundle %r' % bundle_path)
try:
bundle = ActivityBundle(bundle_path)
+ if install_mime_type:
+ bundle.install_mime_type(bundle_path)
except MalformedBundleException:
logging.error('Error loading bundle %r:\n%s' % (bundle_path,
''.join(traceback.format_exception(*sys.exc_info()))))
return None
+ if self.get_bundle(bundle.get_bundle_id()):
+ return None
+
self._bundles.append(bundle)
return bundle
@@ -310,20 +314,55 @@ class BundleRegistry(gobject.GObject):
open(path, 'w').write(cjson.encode(favorites_data))
def is_installed(self, bundle):
- return self.get_bundle(bundle.get_bundle_id()) is not None
+ # TODO treat ContentBundle in special way
+ # needs rethinking while fixing ContentBundle support
+ if isinstance(bundle, ContentBundle) or \
+ isinstance(bundle, JournalEntryBundle):
+ return bundle.is_installed()
+
+ for installed_bundle in self._bundles:
+ if bundle.get_bundle_id() == installed_bundle.get_bundle_id() and \
+ bundle.get_activity_version() == \
+ installed_bundle.get_activity_version():
+ return True
+ return False
def install(self, bundle):
activities_path = env.get_user_activities_path()
- if self.is_installed(bundle):
+
+ if self.get_bundle(bundle.get_bundle_id()):
raise AlreadyInstalledException
+ for installed_bundle in self._bundles:
+ if bundle.get_bundle_id() == installed_bundle.get_bundle_id() and \
+ bundle.get_activity_version() == \
+ installed_bundle.get_activity_version():
+ raise AlreadyInstalledException
+ elif bundle.get_bundle_id() == installed_bundle.get_bundle_id():
+ self.uninstall(installed_bundle, force=True)
+
install_dir = env.get_user_activities_path()
install_path = bundle.install(install_dir)
- if not self.add_bundle(install_path):
+ # TODO treat ContentBundle in special way
+ # needs rethinking while fixing ContentBundle support
+ if isinstance(bundle, ContentBundle) or \
+ isinstance(bundle, JournalEntryBundle):
+ pass
+ elif not self.add_bundle(install_path):
raise RegistrationException
def uninstall(self, bundle, force=False):
+ # TODO treat ContentBundle in special way
+ # needs rethinking while fixing ContentBundle support
+ if isinstance(bundle, ContentBundle) or \
+ isinstance(bundle, JournalEntryBundle):
+ if bundle.is_installed():
+ bundle.uninstall()
+ else:
+ logging.warning('Not uninstalling, bundle is not installed')
+ return
+
act = self.get_bundle(bundle.get_bundle_id())
if not force and \
act.get_activity_version() != bundle.get_activity_version():
@@ -344,6 +383,9 @@ class BundleRegistry(gobject.GObject):
act = self.get_bundle(bundle.get_bundle_id())
if act is None:
logging.warning('Activity not installed')
+ elif act.get_activity_version() == bundle.get_activity_version():
+ logging.debug('No upgrade needed, same version already installed.')
+ return
elif act.get_path().startswith(env.get_user_activities_path()):
try:
self.uninstall(bundle, force=True)
diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py
index 997fcc3..6419f28 100644
--- a/src/jarabe/model/filetransfer.py
+++ b/src/jarabe/model/filetransfer.py
@@ -39,12 +39,20 @@ FT_STATE_OPEN = 3
FT_STATE_COMPLETED = 4
FT_STATE_CANCELLED = 5
+FT_REASON_NONE = 0
+FT_REASON_REQUESTED = 1
+FT_REASON_LOCAL_STOPPED = 2
+FT_REASON_REMOTE_STOPPED = 3
+FT_REASON_LOCAL_ERROR = 4
+FT_REASON_LOCAL_ERROR = 5
+FT_REASON_REMOTE_ERROR = 6
+
# FIXME: use constants from tp-python once the spec is undrafted
CHANNEL_TYPE_FILE_TRANSFER = \
'org.freedesktop.Telepathy.Channel.Type.FileTransfer'
class StreamSplicer(gobject.GObject):
- _CHUNK_SIZE = 1024 # 1K
+ _CHUNK_SIZE = 10240 # 10K
__gsignals__ = {
'finished': (gobject.SIGNAL_RUN_FIRST,
gobject.TYPE_NONE,
@@ -63,18 +71,15 @@ class StreamSplicer(gobject.GObject):
def __read_async_cb(self, input_stream, result):
data = input_stream.read_finish(result)
- #logging.debug('__read_async_cb %r' % len(data))
- if data:
- self._pending_buffers.append(data)
- if len(data) == self._CHUNK_SIZE:
- self._input_stream.read_async(self._CHUNK_SIZE,
- self.__read_async_cb,
- gobject.PRIORITY_LOW)
- if not data or len(data) < self._CHUNK_SIZE:
+ if not data:
logging.debug('closing input stream')
self._input_stream.close()
-
+ else:
+ self._pending_buffers.append(data)
+ self._input_stream.read_async(self._CHUNK_SIZE,
+ self.__read_async_cb,
+ gobject.PRIORITY_LOW)
self._write_next_buffer()
def __write_async_cb(self, output_stream, result, user_data):
@@ -113,6 +118,7 @@ class BaseFileTransfer(gobject.GObject):
self.description = None
self.mime_type = None
self.initial_offset = 0
+ self.reason_last_change = FT_REASON_NONE
def set_channel(self, channel):
self.channel = channel
@@ -158,6 +164,7 @@ class BaseFileTransfer(gobject.GObject):
def __state_changed_cb(self, state, reason):
logging.debug('__state_changed_cb %r %r' % (state, reason))
+ self.reason_last_change = reason
self.props.state = state
def _set_state(self, state):
@@ -194,10 +201,7 @@ class IncomingFileTransfer(BaseFileTransfer):
channel_ft = self.channel[CHANNEL_TYPE_FILE_TRANSFER]
self._socket_address = channel_ft.AcceptFile(SOCKET_ADDRESS_TYPE_UNIX,
- SOCKET_ACCESS_CONTROL_LOCALHOST, '', 0)
-
- def decline(self):
- self.channel[CHANNEL].Close()
+ SOCKET_ACCESS_CONTROL_LOCALHOST, '', 0, byte_arrays=True)
def __notify_state_cb(self, file_transfer, pspec):
logging.debug('__notify_state_cb %r' % self.props.state)
@@ -259,7 +263,8 @@ class OutgoingFileTransfer(BaseFileTransfer):
channel_file_transfer = self.channel[CHANNEL_TYPE_FILE_TRANSFER]
self._socket_address = channel_file_transfer.ProvideFile(
- SOCKET_ADDRESS_TYPE_UNIX, SOCKET_ACCESS_CONTROL_LOCALHOST, '')
+ SOCKET_ADDRESS_TYPE_UNIX, SOCKET_ACCESS_CONTROL_LOCALHOST, '',
+ byte_arrays=True)
def _get_buddy_handle(self):
object_path = self.buddy.object_path()
@@ -309,18 +314,23 @@ def _new_channels_cb(connection, channels):
new_file_transfer.send(None, file_transfer=incoming_file_transfer)
def _monitor_connection(connection):
+ logging.debug('connection added %r' % connection)
connection[CONNECTION_INTERFACE_REQUESTS].connect_to_signal('NewChannels',
lambda channels: _new_channels_cb(connection, channels))
def _connection_addded_cb(conn_watcher, connection):
_monitor_connection(connection)
+def _connection_removed_cb(conn_watcher, connection):
+ logging.debug('connection removed %r' % connection)
+
_conn_watcher = None
def init():
global _conn_watcher
_conn_watcher = connection_watcher.ConnectionWatcher()
_conn_watcher.connect('connection-added', _connection_addded_cb)
+ _conn_watcher.connect('connection-removed', _connection_removed_cb)
for connection in _conn_watcher.get_connections():
_monitor_connection(connection)
@@ -350,3 +360,16 @@ def file_transfer_available():
new_file_transfer = dispatch.Signal()
+if __name__ == '__main__':
+ import tempfile
+
+ input_stream = gio.File('/home/tomeu/isos/Soas2-200904031934.iso').read()
+ output_stream = gio.File(tempfile.mkstemp()[1]).append_to()
+
+ # TODO: Use splice_async when it gets implemented
+ splicer = StreamSplicer(input_stream, output_stream)
+ splicer.start()
+
+ loop = gobject.MainLoop()
+ loop.run()
+
diff --git a/src/jarabe/model/network.py b/src/jarabe/model/network.py
index bd4b7d1..2607005 100644
--- a/src/jarabe/model/network.py
+++ b/src/jarabe/model/network.py
@@ -1,4 +1,5 @@
# Copyright (C) 2008 Red Hat, Inc.
+# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -102,11 +103,17 @@ class Wireless(object):
def __init__(self):
self.ssid = None
self.security = None
+ self.mode = None
+ self.band = None
def get_dict(self):
wireless = {'ssid': self.ssid}
if self.security:
wireless['security'] = self.security
+ if self.mode:
+ wireless['mode'] = self.mode
+ if self.band:
+ wireless['band'] = self.band
return wireless
class Connection(object):
@@ -126,10 +133,21 @@ class Connection(object):
connection['timestamp'] = self.timestamp
return connection
+class IP4Config(object):
+ def __init__(self):
+ self.method = None
+
+ def get_dict(self):
+ ip4_config = {}
+ if self.method is not None:
+ ip4_config['method'] = self.method
+ return ip4_config
+
class Settings(object):
def __init__(self):
self.connection = Connection()
self.wireless = Wireless()
+ self.ip4_config = None
self.wireless_security = None
def get_dict(self):
@@ -139,6 +157,8 @@ class Settings(object):
if self.wireless_security is not None:
settings['802-11-wireless-security'] = \
self.wireless_security.get_dict()
+ if self.ip4_config is not None:
+ settings['ipv4'] = self.ip4_config.get_dict()
return settings
class Secrets(object):
@@ -215,9 +235,10 @@ class NMSettingsConnection(dbus.service.Object):
self._secrets = secrets
def set_connected(self):
- self._settings.connection.autoconnect = True
- self._settings.connection.timestamp = int(time.time())
- self.save()
+ if not self._settings.connection.autoconnect:
+ self._settings.connection.autoconnect = True
+ self._settings.connection.timestamp = int(time.time())
+ self.save()
def set_secrets(self, secrets):
self._secrets = secrets
@@ -245,9 +266,9 @@ class NMSettingsConnection(dbus.service.Object):
config.set(identifier, 'uuid', self._settings.connection.uuid)
config.set(identifier, 'autoconnect',
self._settings.connection.autoconnect)
- config.set(identifier, 'timestamp',
- self._settings.connection.timestamp)
-
+ if self._settings.connection.timestamp is not None:
+ config.set(identifier, 'timestamp',
+ self._settings.connection.timestamp)
if self._settings.wireless_security is not None:
if self._settings.wireless_security.key_mgmt is not None:
config.set(identifier, 'key-mgmt',
@@ -362,8 +383,10 @@ def load_connections():
settings.connection.type = nmtype
autoconnect = bool(config.get(section, 'autoconnect'))
settings.connection.autoconnect = autoconnect
- timestamp = int(config.get(section, 'timestamp'))
- settings.connection.timestamp = timestamp
+
+ if config.has_option(section, 'timestamp'):
+ timestamp = int(config.get(section, 'timestamp'))
+ settings.connection.timestamp = timestamp
secrets = None
if config.has_option(section, 'key-mgmt'):
diff --git a/src/jarabe/model/owner.py b/src/jarabe/model/owner.py
index bdfd9a8..2075f08 100644
--- a/src/jarabe/model/owner.py
+++ b/src/jarabe/model/owner.py
@@ -62,8 +62,8 @@ class Owner(gobject.GObject):
raise RuntimeError("invalid buddy icon")
# Get the icon's hash
- import md5
- digest = md5.new(self._icon).digest()
+ import hashlib
+ digest = hashlib.md5(self._icon).digest()
self._icon_hash = util.printable_hash(digest)
self._pservice = presenceservice.get_instance()
diff --git a/src/jarabe/model/shell.py b/src/jarabe/model/shell.py
index 561cbf6..d7810ba 100644
--- a/src/jarabe/model/shell.py
+++ b/src/jarabe/model/shell.py
@@ -77,7 +77,7 @@ class Activity(gobject.GObject):
self._activity_id = activity_id
self._activity_info = activity_info
self._launch_time = time.time()
- self._launching = False
+ self._launching = True
if window is not None:
self.set_window(window)
@@ -457,6 +457,12 @@ class ShellModel(gobject.GObject):
if activity_id:
home_activity = self.get_activity_by_id(activity_id)
+ xid = window.get_xid()
+ gdk_window = gtk.gdk.window_foreign_new(xid)
+ gdk_window.set_decorations(0)
+
+ window.maximize()
+
if not home_activity:
home_activity = Activity(activity_info, activity_id, window)
self._add_activity(home_activity)
@@ -467,16 +473,17 @@ class ShellModel(gobject.GObject):
home_activity.props.launching = False
self.emit('launch-completed', home_activity)
- startup_time = time.time() - home_activity.get_launch_time()
- logging.debug('%s launched in %f seconds.' %
- (home_activity.get_type(), startup_time))
+ startup_time = time.time() - home_activity.get_launch_time()
+ logging.debug('%s launched in %f seconds.' %
+ (home_activity.get_type(), startup_time))
if self._active_activity is None:
self._set_active_activity(home_activity)
def _window_closed_cb(self, screen, window):
if window.get_window_type() == wnck.WINDOW_NORMAL:
- self._remove_activity_by_xid(window.get_xid())
+ if self._get_activity_by_xid(window.get_xid()) is not None:
+ self._remove_activity_by_xid(window.get_xid())
def _get_activity_by_xid(self, xid):
for home_activity in self._activities:
diff --git a/src/jarabe/view/keyhandler.py b/src/jarabe/view/keyhandler.py
index 08856c0..5634ef4 100644
--- a/src/jarabe/view/keyhandler.py
+++ b/src/jarabe/view/keyhandler.py
@@ -22,6 +22,7 @@ import errno
import traceback
import sys
+import gconf
import dbus
import gtk
@@ -86,6 +87,8 @@ class KeyHandler(object):
self._keystate_pressed = 0
self._speech_proxy = None
+ self._ungrab_metacity_keys()
+
self._key_grabber = KeyGrabber()
self._key_grabber.connect('key-pressed',
self._key_pressed_cb)
@@ -111,6 +114,15 @@ class KeyHandler(object):
self._key_grabber.grab_keys(_actions_table.keys())
+ def _ungrab_metacity_keys(self):
+ """So we can grab those instead.
+ """
+ client = gconf.client_get_default()
+ for key in ['run_command_screenshot', 'switch_windows',
+ 'cycle_windows']:
+ key = '/apps/metacity/global_keybindings/' + key
+ client.set_string(key, 'disabled')
+
def _change_volume(self, step=None, value=None):
if step is not None:
volume = sound.get_volume() + step
@@ -154,69 +166,69 @@ class KeyHandler(object):
self._get_speech_proxy().SayText(text, reply_handler=lambda: None, \
error_handler=self._on_speech_err)
- def handle_say_text(self):
+ def handle_say_text(self, event_time):
clipboard = gtk.clipboard_get(selection="PRIMARY")
clipboard.request_text(self._primary_selection_cb)
- def handle_previous_window(self):
- self._tabbing_handler.previous_activity()
+ def handle_previous_window(self, event_time):
+ self._tabbing_handler.previous_activity(event_time)
- def handle_next_window(self):
- self._tabbing_handler.next_activity()
+ def handle_next_window(self, event_time):
+ self._tabbing_handler.next_activity(event_time)
- def handle_close_window(self):
+ def handle_close_window(self, event_time):
active_activity = shell.get_model().get_active_activity()
if active_activity.is_journal():
return
active_activity.get_window().close()
- def handle_zoom_mesh(self):
+ def handle_zoom_mesh(self, event_time):
shell.get_model().zoom_level = ShellModel.ZOOM_MESH
- def handle_zoom_group(self):
+ def handle_zoom_group(self, event_time):
shell.get_model().zoom_level = ShellModel.ZOOM_GROUP
- def handle_zoom_home(self):
+ def handle_zoom_home(self, event_time):
shell.get_model().zoom_level = ShellModel.ZOOM_HOME
- def handle_zoom_activity(self):
+ def handle_zoom_activity(self, event_time):
shell.get_model().zoom_level = ShellModel.ZOOM_ACTIVITY
- def handle_brightness_max(self):
+ def handle_brightness_max(self, event_time):
self._change_brightness(value=_BRIGHTNESS_MAX)
- def handle_brightness_min(self):
+ def handle_brightness_min(self, event_time):
self._change_brightness(value=0)
- def handle_volume_max(self):
+ def handle_volume_max(self, event_time):
self._change_volume(value=_VOLUME_MAX)
- def handle_volume_min(self):
+ def handle_volume_min(self, event_time):
self._change_volume(value=0)
- def handle_brightness_up(self):
+ def handle_brightness_up(self, event_time):
self._change_brightness(step=_BRIGHTNESS_STEP)
- def handle_brightness_down(self):
+ def handle_brightness_down(self, event_time):
self._change_brightness(step=-_BRIGHTNESS_STEP)
- def handle_volume_mute(self):
+ def handle_volume_mute(self, event_time):
if sound.get_muted() is True:
sound.set_muted(False)
else:
sound.set_muted(True)
- def handle_volume_up(self):
+ def handle_volume_up(self, event_time):
self._change_volume(step=_VOLUME_STEP)
- def handle_volume_down(self):
+ def handle_volume_down(self, event_time):
self._change_volume(step=-_VOLUME_STEP)
- def handle_frame(self):
+ def handle_frame(self, event_time):
self._frame.notify_key_press()
- def handle_rotate(self):
+ def handle_rotate(self, event_time):
"""
Handles rotation of the display (using xrandr) and of the d-pad.
@@ -256,13 +268,13 @@ class KeyHandler(object):
if e.errno != errno.EINTR:
raise
- def handle_quit_emulator(self):
+ def handle_quit_emulator(self, event_time):
session.get_session_manager().shutdown()
- def handle_open_search(self):
+ def handle_open_search(self, event_time):
journalactivity.get_journal().focus_search()
- def _key_pressed_cb(self, grabber, keycode, state):
+ def _key_pressed_cb(self, grabber, keycode, state, event_time):
key = grabber.get_key(keycode, state)
logging.debug('_key_pressed_cb: %i %i %s' % (keycode, state, key))
if key:
@@ -275,14 +287,14 @@ class KeyHandler(object):
# Only accept window tabbing events, everything else
# cancels the tabbing operation.
if not action in ["next_window", "previous_window"]:
- self._tabbing_handler.stop()
+ self._tabbing_handler.stop(event_time)
return True
if hasattr(action, 'handle_key_press'):
action.handle_key_press(key)
elif isinstance(action, basestring):
method = getattr(self, 'handle_' + action)
- method()
+ method(event_time)
else:
raise TypeError('Invalid action %r' % action)
@@ -291,17 +303,17 @@ class KeyHandler(object):
# If this is not a registered key, then cancel tabbing.
if self._tabbing_handler.is_tabbing():
if not grabber.is_modifier(keycode):
- self._tabbing_handler.stop()
+ self._tabbing_handler.stop(event_time)
return True
return False
- def _key_released_cb(self, grabber, keycode, state):
+ def _key_released_cb(self, grabber, keycode, state, event_time):
if self._tabbing_handler.is_tabbing():
# We stop tabbing and switch to the new window as soon as the
# modifier key is raised again.
if grabber.is_modifier(keycode, mask=_TABBING_MODIFIER):
- self._tabbing_handler.stop()
+ self._tabbing_handler.stop(event_time)
return True
return False
diff --git a/src/jarabe/view/launcher.py b/src/jarabe/view/launcher.py
index 6ddb04a..83a141a 100644
--- a/src/jarabe/view/launcher.py
+++ b/src/jarabe/view/launcher.py
@@ -28,14 +28,21 @@ from sugar.graphics.xocolor import XoColor
from jarabe.model import shell
from jarabe.view.pulsingicon import CanvasPulsingIcon
-class LaunchWindow(hippo.CanvasWindow):
+class LaunchWindow(gtk.Window):
def __init__(self, activity_id, icon_path, icon_color):
- gobject.GObject.__init__(
- self, type_hint=gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
+ gobject.GObject.__init__(self)
+
+ self.props.type_hint = gtk.gdk.WINDOW_TYPE_HINT_NORMAL
+ self.props.decorated = False
+
+ canvas = hippo.Canvas()
+ canvas.modify_bg(gtk.STATE_NORMAL, style.COLOR_WHITE.get_gdk_color())
+ self.add(canvas)
+ canvas.show()
self._activity_id = activity_id
self._box = LaunchBox(activity_id, icon_path, icon_color)
- self.set_root(self._box)
+ canvas.set_root(self._box)
self.connect('realize', self.__realize_cb)
@@ -61,8 +68,7 @@ class LaunchWindow(hippo.CanvasWindow):
class LaunchBox(hippo.CanvasBox):
def __init__(self, activity_id, icon_path, icon_color):
- gobject.GObject.__init__(self, orientation=hippo.ORIENTATION_VERTICAL,
- background_color=style.COLOR_WHITE.get_int())
+ gobject.GObject.__init__(self, orientation=hippo.ORIENTATION_VERTICAL)
self._activity_id = activity_id
self._activity_icon = CanvasPulsingIcon(
diff --git a/src/jarabe/view/palettes.py b/src/jarabe/view/palettes.py
index 6124577..9d45eb5 100644
--- a/src/jarabe/view/palettes.py
+++ b/src/jarabe/view/palettes.py
@@ -109,7 +109,7 @@ class ActivityPalette(Palette):
__gsignals__ = {
'erase-activated' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
+ gobject.TYPE_NONE, ([str]))
}
def __init__(self, activity_info):
@@ -155,6 +155,9 @@ class ActivityPalette(Palette):
self.menu.append(menu_item)
menu_item.show()
+ if not os.access(self._bundle.get_path(), os.W_OK):
+ menu_item.props.sensitive = False
+
registry = bundleregistry.get_registry()
self._activity_changed_sid = registry.connect('bundle_changed',
self.__activity_changed_cb)
@@ -207,7 +210,7 @@ class ActivityPalette(Palette):
self._update_favorite_item()
def __erase_activate_cb(self, menu_item):
- self.emit('erase-activated')
+ self.emit('erase-activated', self._bundle_id)
class JournalPalette(BasePalette):
def __init__(self, home_activity):
@@ -295,8 +298,9 @@ class VolumePalette(Palette):
def __unmount_activate_cb(self, menu_item):
self._mount.unmount(self.__unmount_cb)
- def __unmount_cb(self, source, result):
- logging.debug('__unmount_cb %r %r' % (source, result))
+ def __unmount_cb(self, mount, result):
+ logging.debug('__unmount_cb %r %r' % (mount, result))
+ mount.unmount_finish(result)
def __popup_cb(self, palette):
mount_point = self._mount.get_root().get_path()
diff --git a/src/jarabe/view/service.py b/src/jarabe/view/service.py
index 5a08061..ef225bf 100644
--- a/src/jarabe/view/service.py
+++ b/src/jarabe/view/service.py
@@ -76,10 +76,15 @@ class UIService(dbus.service.Object):
@dbus.service.method(_DBUS_SHELL_IFACE,
in_signature="s", out_signature="b")
def ActivateActivity(self, activity_id):
+ """Switch to the window related to this activity_id and return a boolean
+ indicating if there is a real (ie. not a launcher window) activity
+ already open.
+ """
activity = self._shell_model.get_activity_by_id(activity_id)
- if activity:
+
+ if activity is not None and activity.get_window() is not None:
activity.get_window().activate(gtk.get_current_event_time())
- return True
+ return not activity.props.launching
return False
diff --git a/src/jarabe/view/tabbinghandler.py b/src/jarabe/view/tabbinghandler.py
index b1c85c6..bb95c26 100644
--- a/src/jarabe/view/tabbinghandler.py
+++ b/src/jarabe/view/tabbinghandler.py
@@ -15,8 +15,10 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import logging
-import gtk
+import time
+
import gobject
+import gtk
from jarabe.model import shell
@@ -57,27 +59,28 @@ class TabbingHandler(object):
else:
self._frame.show(self._frame.MODE_NON_INTERACTIVE)
- def __timeout_cb(self):
- self._activate_current()
+ def __timeout_cb(self, event_time):
+ self._activate_current(event_time)
self._timeout = None
return False
- def _start_timeout(self):
+ def _start_timeout(self, event_time):
self._cancel_timeout()
- self._timeout = gobject.timeout_add(_RAISE_DELAY, self.__timeout_cb)
+ self._timeout = gobject.timeout_add(_RAISE_DELAY,
+ lambda: self.__timeout_cb(event_time))
def _cancel_timeout(self):
if self._timeout:
gobject.source_remove(self._timeout)
self._timeout = None
- def _activate_current(self):
+ def _activate_current(self, event_time):
home_model = shell.get_model()
activity = home_model.get_tabbing_activity()
if activity and activity.get_window():
- activity.get_window().activate(1)
+ activity.get_window().activate(event_time)
- def next_activity(self):
+ def next_activity(self, event_time):
if not self._tabbing:
first_switch = True
self._start_tabbing()
@@ -96,11 +99,11 @@ class TabbingHandler(object):
activity = shell_model.get_next_activity(current=activity)
shell_model.set_tabbing_activity(activity)
- self._start_timeout()
+ self._start_timeout(event_time)
else:
- self._activate_next_activity()
+ self._activate_next_activity(event_time)
- def previous_activity(self):
+ def previous_activity(self, event_time):
if not self._tabbing:
first_switch = True
self._start_tabbing()
@@ -119,16 +122,16 @@ class TabbingHandler(object):
activity = shell_model.get_previous_activity(current=activity)
shell_model.set_tabbing_activity(activity)
- self._start_timeout()
+ self._start_timeout(event_time)
else:
- self._activate_next_activity()
+ self._activate_next_activity(event_time)
- def _activate_next_activity(self):
+ def _activate_next_activity(self, event_time):
next_activity = shell.get_model().get_next_activity()
if next_activity:
- next_activity.get_window().activate(gtk.get_current_event_time())
+ next_activity.get_window().activate(event_time)
- def stop(self):
+ def stop(self, event_time):
gtk.gdk.keyboard_ungrab()
gtk.gdk.pointer_ungrab()
self._tabbing = False
@@ -136,7 +139,7 @@ class TabbingHandler(object):
self._frame.hide()
self._cancel_timeout()
- self._activate_current()
+ self._activate_current(event_time)
home_model = shell.get_model()
home_model.set_tabbing_activity(None)
diff --git a/src/jarabe/view/viewsource.py b/src/jarabe/view/viewsource.py
index 1d44ac3..870b176 100644
--- a/src/jarabe/view/viewsource.py
+++ b/src/jarabe/view/viewsource.py
@@ -37,7 +37,7 @@ from sugar.bundle.activitybundle import ActivityBundle
from sugar.datastore import datastore
from sugar import mime
-_SOURCE_FONT = pango.FontDescription('Monospace %d' % style.zoom(6))
+_SOURCE_FONT = pango.FontDescription('Monospace %d' % style.FONT_SIZE)
_logger = logging.getLogger('ViewSource')
map_activity_to_window = {}