diff options
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 @@ -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 ", " @@ -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." @@ -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 :" @@ -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" @@ -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 "暗号タイプ:" @@ -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 "टाँस" @@ -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" @@ -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:" @@ -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:" @@ -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 = {} |