specto-0.3.1/0000755000175000017500000000000011226433142011414 5ustar jeffjeffspecto-0.3.1/data/0000755000175000017500000000000011226433142012325 5ustar jeffjeffspecto-0.3.1/data/doc/0000755000175000017500000000000011226433142013072 5ustar jeffjeffspecto-0.3.1/data/doc/INSTALL0000644000175000017500000000053711041474547014141 0ustar jeffjeffInstallation Instructions ************************* Basic Installation ================== You could run $ sudo python setup.py install to install specto on your computer if you have administrative privileges. However, we recommend simply running Specto from the folder you extracted or grabbed from our repository. To do that, just run launch.sh specto-0.3.1/data/doc/COPYING0000644000175000017500000004310311131421455014125 0ustar jeffjeff GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. , 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 Library General Public License instead of this License. specto-0.3.1/data/doc/ChangeLog0000644000175000017500000003741011226432534014655 0ustar jeffjeff"Release changes log" for Specto Individual entries in these release notes are alphabetical, not chronological. This file is updated only at "release time". Specto 0.3.1: 2009 07 12 ====================== This is a small bug-fixing release, solving the following problems. Bug fixes * Issue #255: entity problem for extra information pane * Issue #258: Use os.path.join in the About dialog Maintainability * Clarify the sorting methods' names, and various code cleanups * Standardize our HTML entities sanitization using the CGI module, extend it to all watches * Use os.path.join everywhere to prevent problems Specto 0.3: 2009 06 06 ====================== Upgrading to this release is strongly recommended, as it solves a huge amount of issues reported in the 0.2.x series, is more stable, implements new features, is more secure and easier to maintain. This release contains lots of architectural changes. The watch system is now a plugin system, the watch list has changed, GNOME keyring is now used for encrypting passwords by default (though you can disable it), and the configuration/cache directories are now based on the XDG user directory specification. As such, you will need to import your watch list if upgrading from Specto 0.2.x. You may also need to reset (overwrite) your passwords, or convert them to plain text before upgrading. Features * Ability to run a command when a watch is cleared * Ability to run a command when a watch is updated * Action button for libnotify balloons (patch by Matias Torres) * Add a balloon text for the process watch, and make it translatable * Add a "clear" button in the edit menu * Add a "Mark as read" menu to the notification icon popup-menu * Add a "Refresh all" button to the trayicon menu * Add an optional "Label" field for GMail watches * Adding watches is now done from the menubar or a menu from the toolbar * A dialog with debug info appears when a system/programming error occurs * Clarify the labels in the preferences * Clear the watch when you open it using the balloon * Console mode (specto --console or specto --console --help) * Disable renaming watches in the listview, make it a "Jump To" instead * Error log tab in notifier window * Gmail watch now shows more error information * Issue #12: Provide more information * Issue #13: Watch list importing and exporting * Issue #33: Ability to run a command instead of notifying * Issue #51: Integrate with GNOME Keyring for password encryption * Issue #54: FreeDesktop-compliant user directories * Issue #117: show more information for errors * Issue #128: Allow setting a port for mail watches (add 'port = 323' to your watch config) * Issue #135: Proxy support * Issue #136: Allow checking a specific IMAP folder * Issue #142: Don't scroll the notifier list view column headers * Issue #146: Per-watch option to prevent URL redirects; To use this option add "redirect = True" to the watch that is allowed to redirect * Issue #166: Add a checkbox in the preferences for gnome-keyring usage * Issue #178: Add direct access to the "remove" functionnality * Issue #180: keyring vs plaintext conversion should be smart and automatic * Issue #190: Insanely faster startup (performance profiling) * Issue #212: when adding a watch, focus the name entry * Major changes in terminology, as discussed on the mailing list * Make some watch names clearer * More error-handling * More space for the extra information in the info panel * Moved some code so the file dialog will show faster * New watch type: Bazaar (version control) * New watch type: Facebook (messages, notifications, requests, wall posts) * New watch type: Google Reader (issue #63) * Require all mandatory fields to be filled (add/edit watch) * Show/hide the notifier's scrollbar automatically * Show simple diff from webpage difference * The error log now shows the lines in color according to the severity * The GMail watch now saves what unread mails there already were last time * Watch importing from Specto 0.2 * Watch menu when you right-click a watch entry in the notifier window Bug fixes * Added a timeout in web_proxy * A watch will be marked updated when you didn't clear it on quit * Check on maximum port number (65535) * Do not crash when trying to create a broken plugin * Fix a division error when the old filesize is 0 * Fix error log filtering for "All" (level 0) * Fix the logic for showing/hiding deactivated watches * Hack that shows the menu correctly positionned, when clicking Add button * Issue #1: Add a 10 seconds timeout for web watches to prevent hangs * Issue #3: startup quit warning dialog crashes if you click cancel * Issue #37: Save the filesize in a cache file (not in watches.list) * Issue #52: Ampersands in watch names in add_watch window * Issue #56: Ampersands in URLs pass a truncated address to browser * Issue #58: Redirected URLs should not be saved * Issue #63: Google Reader watch does not support more than 20 items * Issue #67: Update info pane if the unread message count goes down * Issue #69: Startup fails due to wrong glade file path * Issue #72: "Show in window list" preference is not saved * Issue #73: Brackets in watch name lead to startup crash * Issue #77: Don't mess up if ekiga's sound files are not present * Issue #93: Gmail library can support no more than 19 new mails * Issue #95: Statusbar should show something else when updates are done * Issue #100: Point to the right domain when using gmail with google apps * Issue #101: Show the import dialog after the file chooser * Issue #112: Hide error log tabs when debug mode is deactivated * Issue #114: Removing a watch should show a confirmation dialog * Issue #118: Add http:// and @ automatically if needed * Issue #119: Don't let the log file get huge * Issue #122: the quit warning dialog should not block the UI and watch check process * Issue #131: Bombs on special characters * Issue #132: Removing a watch should remove its cache files * Issue #134: Harmonized colors * Issue #143: Site adress in "About" box is not clickable * Issue #145: Abnormal behavior with ampersands in a web watch * Issue #150: Gmail.com is disabled in Germany, use mail.google.com * Issue #161: Process names are truncated (partial fix) * Issue #164: Icon is transparent in error libnotify balloon * Issue #169: Error log window filtering is wonky * Issue #172: Error balloons must not be attached to the notification area * Issue #174: GTK warnings about using the same menu twice * Issue #177: D-BUS error string not translated * Issue #181: "mark as read" button becomes insensitive after global watch refresh * Issue #185: network-manager 0.7 compatibility * Issue #222: folder-specific IMAP watch does not clear itself * Issue #225: "jump to" button for IMAP watches does not call the mail client by default * Issue #232: Gmail "jump to" doesn't work * Issue #250: Actually check for the user setting before using notification balloons * Issue #241: Facebook watch not working anymore * Prevent fuzzy text in the notifier on startup, using pango.WEIGHT_NORMAL * Slight label alignment adjustment in the log viewer * Touch up the notification balloon punctuation for multiple items watches Maintainability * Add a method in i18n.py for plurals, untested * Better file size cache name * Catch untranslated "No updates yet" strings from the watch list * Change "Clear" to "Mark as read" and "Clear All" to "Mark all read" * Clarify the process watch's code * Clean up about.py so that it reads AUTHORS directly * Clean up the copyright string in about.py * Fields in the add and edit windows are now dynamic; when creating a new watch plugin, you don't have to write all the gui code anymore * Fix the gconf key for show_deactivated_watches, which was not used everywhere * Full PEP-8 compliance, except line lengths * gtkutil module to define widgets for the edit and add watch windows * Huge overall code cleanup * Issue #20: Code modularization * Issue #39: POP3 & IMAP watches not on par with gmail watch's message counting logic * Issue #176: Clean up translatable logger strings * Issue #211: remove the --help commandline parameter * Issue #215: remove balloon duration and action features to conform to notify-osd * Issue #221: error notifications should be meaningful * Issue #244: License 'error' * Move copyright headers to AUTHORS file to ease maintenance and relevance * New "watches as plugins" system * Refactor this ChangeLog to make it as release notes only * Remove double call to refresh the watch info * Remove prints and replace them by logger function calls * Remove pygettext.py, since it's provided by Python systemwide * Remove some garbage characters in the COPYING file * Remove the class name from the logger * Remove the description of the debug mode, it's redundant. * Remove the gnomevfs depency (xdg-open is now used) * Remove useless labels, alignments and methods from the Add Watch dialog * Standardize the "Unexpected error" strings * Standardize translatable strings Specto 0.2.2: 2007-06-19 ======================== Features * Add a hidden gconf key, "follow_website_redirects" (Issue #58) * Add a translatable "translator-credits" string for the about dialog * A statusbar tells the user if no network connection is detected Bug fixes * Add a short delay to prevent misplaced balloons * Changes to the email counting logic, and more info for POP3 watches * Don't crash on corrupt watch list * Don't screw up when opening files/folders with spaces * Issue #4: info pane contents are not left aligned (patch by Yevgen Muntyan) * Issue #27: items jumping around the notifier's list (patch by Yevgen Muntyan) * Issue #29: murder dialog's cancel action makes Specto crash * Issue #59: invalid Specto.desktop file (patch by Dean Sas) * More error checking/reporting for web watch * Update the notification area icon before notifying * Work around evolution being braindead (refusing to start with %s). This somewhat fixes the "go to" button with POP3 and IMAP watches Maintainability * Fix 'help' URLs that still pointed to the old wiki * Fix remaining bits of modules that still wanted to use the old icons * Flip the gconf keys in the right direction ("show_toolbar" instead of "hide_toolbar" which was an unelegant hack) * Issue #41: check if gconf values are set or not. Who needs stinking gconf schemas? * Kill the gconf subfolders '/apps/Specto/preferences/' and '/apps/Specto/ui/' by merging them in '/apps/Specto/' * Make some keys more obvious ("show_notifier" instead of "notifier_state") * Make use of transparency everywhere. Remove useless code and comments * Now possible to make icons transparent * Remove remaining "territory marks" (as per previous discussion) * Remove shebangs from non-scripts * Remove useless icons since we can now make stock icons transparent Specto 0.2.1: 2007-04-22 ======================== Features * New watch type: port watch (issue #32) * Usability and code fixes for the export dialog * Use SVG for the notification area icon * Use SVG for the notifier window titlebar (looks better with Avant Window Navigator) * Use the GTK theme icons for pretty much everything Bug fixes * Added import_export.glade * HIG compliance for the "murder dialog" * Issue #45: "@gmail.com" appended to Gmail for your domain addresses. * Issue #50: update the notifier infopane automatically * Updated watch_port so it works with ipv6 (or ssh localhost) Maintainability * Clean up, rewrite a portion of port watch into something simpler * More themable icons * New GConf module * Revert the port watch to (safer) original code Specto 0.2: 2007-02-08 ====================== Features * Ability to hide the notifier from the window list applet in the panel * Add network connection icons for a possible network watch * Display a libnotify balloon when something goes wrong with a watch * Do not make the notification icon persistent by default, as per HIG * Issue #7: Ability to set the duration for balloons in the preferences * Issue #8: Kill libegg and use PyGTK's gtk.StatusIcon instead * Issue #9: Specto can now be fully translated, including glade files * Issue #10: Use threads to update watches * Issue #22: SSL support for mail watches * Libnotify balloons are now attached to the tray icon * Make the blue icon lighter again * Make the google-pinger smarter (once every 10 minutes, and assume that the network is still in the previous state between pings). * Make the utils module return absolute paths * Make the web and email watches network-aware * Network-Manager support * New watch type: process watch * Specto can now be launched without installing * Watch exporting Bug fixes * Fix a traceback when you editing a gmail watch because main.py tried to grab the Host * Fix the y position of the balloons appearing from the notification area * Issue #2: watches.list would mess up if you cleared all watches after removing one, or if you removed a watch during the first update process. * Issue #3: a dialog is shown with the question to kill Specto * Issue #4: content is left aligned * Issue #5: sounds keep playing (new variable: self.actually_updated) * Issue #16: icons do not show in balloons * Issue #23: prevent other apps from impersonating our process ID * Issue #25: install icons into the hicolor theme. You may need to sudo gtk-update-icon-cache -f /usr/share/icons/hicolor. If you are a package maintainer, please include that post-install task. * Issue #26: add the executable bit to the file "Specto" * Issue #30: sorting order changes on startup, and fix a gmail watch bug * Issue #30: sort order is incorrectly saved * Issue #34: "display all watches" is checked at startup * Make all the watches display by default (reverse the display_all gconf key) Maintainability * Killed the traypopup module, merged with trayicon * Remove prints from watch.py (used to debug issue #40) * Use Pango to ellipsize (truncate) labels. Better results, less hacks. Specto 0.1: 2006-10-26 ====================== Features * Ability to play sounds on updates * Checkbox is checked before the update from the watch when you activate it * Display the number of unread gmail messages * Error icon is shown when there was an error in the update * File watch * Gettext support, so that Specto can be translated * GMail watches clear themselves when unread message count reaches zero * Log file can be opened and cleared from the preferences dialog * Proper libnotify support with python-notify * Sorting choice is stored in a gconf key * SSL support for POP3/IMAP email watches * Watches are always updated top-down * When you add a web watch,"http://" is added if necessary Bug fixes * Bug #49616: warning dialog if you try to quitting during the initial refresh * Bug #49811: when watching a syndication feed, point to the correct URL * Bug #54275: better gmail unread message counting * Bug #54463: truncate the URLs if they are too long to be displayed in notifier * Bug #55324: display the toolbar by default * Bug #60261: mime is used when you open a file watch * Bug #60261: no action associated with file watch - it now opens the parent directory containing the file * Bug #65931: removing a watch did not remove "updated = False", which caused crashes and corruption specto-0.3.1/data/doc/AUTHORS0000644000175000017500000000054611123240767014154 0ustar jeffjeffProject and copyright owners ---------------------------- Jean-François "Kiddo" Fortin Tam Wout Clymans Developers ----------- Jean-François "Kiddo" Fortin Tam Wout Clymans Past contributors ----------------- Christopher Halse Rogers Pascal Potvin Giulio "Dullboy" Lotti Thomas McColgan Conor "Majikstreet" Callahan "Trygvebw" Adrian "Hikaru79" Petrescu specto-0.3.1/data/doc/VERSION0000644000175000017500000000000611226432573014145 0ustar jeffjeff0.3.1 specto-0.3.1/data/icons/0000755000175000017500000000000011226433142013440 5ustar jeffjeffspecto-0.3.1/data/icons/specto_tray_2.png0000644000175000017500000000202711041474547016735 0ustar jeffjeffPNG  IHDRw=sBIT|dtEXtSoftwarewww.inkscape.org<IDATH[h\eg6knͥ o"*ƆXR5XjmjE( bCj " 5}DMdI6!I6V37|wavh<]mh]ePT2~.4!P}{{&~Ýg=~{pYAxu;ǒϟ WW8NGchP=通8ܭfaf+yh p~͐#g%.]JKhw$.\{dn[3MJ4SL!ߋg2f'wLᇁqۃ$v_FlUh< xWsŁIZNP׉Ԯx]*/U簵rM*u&#m~S㩚?]X0<5=W6[%ϧ gZ ̅CPy V?q 2|LEÈ tt}AxL|م؉Ibc*;ZcuE֪,4$'Bx\ T_=Yx֘7!=wsc)nEDeM_PazIv ?A{:,_6b'p\8p?؟'- ۛ7!OC7)`0fQۦ8>'NqvRWϋh>1ʏWbK?KG^ֈ4@DxA [TZXgMX\-/֞ I"ORg)O\ дݪ޸AQ@>ڴ<_o@Dxyڰls'jͯ^ZVMhX^ ;^ %Xj9ʥjoX0c|p8:ښ ;IENDB`specto-0.3.1/data/icons/specto_tray_1.png0000644000175000017500000000167711041474547016746 0ustar jeffjeffPNG  IHDRĴl;sBIT|dtEXtSoftwarewww.inkscape.org<QIDAT8mhe}?/};gl&9mEBQP!?0[IL҂HEH$rj4r:a;g;m=vw\ESJTl:pqI#oم~-l=P_5 /;X m5#@S `h7$o&ªAFњٛEW7[)[tST+:oMyJuO~a%?;¥C(7C~ ̗?w@<1RRĄ)E Jױ4iZf0H6R];{aVo?s_5x^> shD2]+fo>ڪXLvG=s2Kq ]o{=\U.nmѣl||M2@n#0.PG!ʦKս4#Xԥ9 ڠSfVT5%֙IIrc7nQzx,D,j t^#2ńU ǞaC@pfz@JG+==ϧI]xMϟ@7!HRݺ[wbFLr3ǭE[ʯ]?JֵiS Y~>WXwsoqgb_ZcRhٱ&x[f4ؿM]ϼ )@)RڶִvMy[UH);5*TQV7?D(b _OZPVzp(Z3P<=?>ezM 'kuMdPȷ, }zȇg2.+br'4Z6bYX,l`/+I(ƀf~ܩfy!т |V<;v#֍ڑU>4c7z_t"3XIENDB`specto-0.3.1/data/icons/specto_about.png0000644000175000017500000001554111041474547016654 0ustar jeffjeffPNG  IHDR6bKGD pHYs  tIME0612IDATxYs#}_/@7Xp~$.ي(EYUt T&UN,K6/RdI)%8̜NX{w.f O $1O?!?UR)i @Z4000 l4Wԇ!YH9ITT*CR_RRd! &PR 24P@f P*CJC@Ð,ݤ*C*C! (yV Ce:Vե2;2 C6̻/CⅡtڶG;{ ,C8Wv^Ð4,|>+˲.=ڜj-T1XIqGR=)n_ddi3-TT,:;^_:<5ؗZ߹!Oǚ[ xK5q|';": *Cܝ+)<9|޶]p/+ZYϴ{t`80RW3ZMx  {zQR6kUkm&Ϩ 1{ϤH -> ݾ8ZAbvaXo]q-$RR}.٫B7!ie%e:4& ( MI\.v0$ q JKgw7ŸԬ.l3$KΘZYln6K AN`꟧2-/5/ ERRے[Ȧ%g6; x{p-r;lL3ĔԑߙCQ=~&cic60͎m*~*&t4<lKJo,Ts\LisǨ>zFv!$iwOCnITwFu/wh|DpW?T5s A@sGW '3:XjOtHٕ)=: ?t0t_XTTw`R{ Hj BI2=Usf2ėbge,y*96亖j}򩸜7w3/h\-  9tT i pWlF[4aU _KEsSTWmԬ|NȔ!G5ܒ95hR iI$/fwI tcH?+0qTu3: QSV2wa#zLS T+=(|W*{sVkaHi8.4T*ufq4Ы_vA}rWoIeM!p'Zn0W*,{2-CqL˶U,~C ~jXRTMk[{U ,2ĸz|VaH;mp^OGx{p8Z .S)f *4.p^ԕ:/{h9̞ʐmiɻMzQ^.KXpKC0^C^.OoMta"%=}q &^2QGZ#'+r۶GڭюZxVʾrNvd ?H1$y{[ r!*w#FQO_VsVl!6%c}sYōm}5PҖaZA{5 ai2ͤpdlm__'xOo<4 =^+mئl:7!sdoV~N`W=L7aNa^9h@\{F?)& {^NsfzaQSaO!qGyVg4iaűkySlL?0LW9'swvOj;;'A[Z)yZ){3_k{"e3M ZflS\n2x0_ۣ~ZfrSmtT٧\ٞ:Gk6Tg0Woozu%_˥^]eIPR;гWZ_o=hIj?ږ vc_t 4sz_lNwEq^nU3 ]H[~G,4( ;l­Yt:($Q]x(M(vV?0 *7߫^څT,8Hv.ɤe )x΍ycTZ2\%üz2J-QSNVwUe^[\Fc6]EYץᅆ:9h$;+~.hhdsdLi*=EQ(5F8~!imٿrivUDxe0_W5T9 FWe4k[t\TZ)ű9amiZ ;}mԮ<6Wi*fT\spCmŽB܌CbFa@= W>tp<V?k d٦1Yi?>uT탺>\01|j|`.  #ح!xsBzWU|n =apq:m'%uq}6pH;uNm2l]F HQ |!nQW=4XmD;aVmSmS!..K'o>~=SZ= ,Xҫ Xq:OIsx[\+ 9ٌqxK#/hQMeH ֖|Y0K6:B,hI= oc,NPbC,x ڽ^Wxm"Ұ' v|GMqc}oؒvJ{1Ӣ큷!=:ڒr' 1k^מӢ5 FWRܜl<BXaOW v2fdJt~ԕ}<ar]L 9)[>{*.!t䆋䦭7r$w% Lv h2JvS?  c =|(V١2nJ܊?'WH[sN_[u ԝk{uLnHR)$[cq(a5Au&bjpnsE!7ϒ$Q8Gdeh'`(ҋZZIOC;n@E=,IɏYjs5/]06^4#1|֭<% 8qC%c0` Hh8axuPxۘ+>JIn6C rI(>N*Gda լT`IY6a $Kcqa TP*$?29!6`z8Rr5V>Igd!cRʹ5V>$m@Zf25'Ij&O0]XQ0~Er!+l6!  {I#@|KI@zH@ڹ%iI8KaeeppCGIŸ%. zIx:6CHM(> Fo0sR$ KKH@YYT~_*{Rʹ%=$d*CH[> H]r[`pa )^r$  l\8*vRaڴ5 G;|=}'t00qoYɰ4iX0 P0 !!!!!!!!!!!!!!!!!)g}u IENDB`specto-0.3.1/data/icons/bazaar.svg0000644000175000017500000001572511123240767015440 0ustar jeffjeff image/svg+xml specto-0.3.1/data/icons/hicolor/0000755000175000017500000000000011226433142015077 5ustar jeffjeffspecto-0.3.1/data/icons/hicolor/scalable/0000755000175000017500000000000011226433142016645 5ustar jeffjeffspecto-0.3.1/data/icons/hicolor/scalable/specto.svg0000644000175000017500000002127611041474547020704 0ustar jeffjeff image/svg+xml specto-0.3.1/data/icons/specto_tray_2.svg0000644000175000017500000002130411041474547016747 0ustar jeffjeff image/svg+xml specto-0.3.1/data/icons/specto_window_icon.svg0000644000175000017500000001105611041474550020063 0ustar jeffjeff image/svg+xml specto-0.3.1/data/icons/specto_tray_1.svg0000644000175000017500000002127011041474547016750 0ustar jeffjeff image/svg+xml specto-0.3.1/data/icons/facebook.svg0000644000175000017500000000046111123240767015740 0ustar jeffjeff specto-0.3.1/data/glade/0000755000175000017500000000000011226433142013401 5ustar jeffjeffspecto-0.3.1/data/glade/add_watch.glade0000644000175000017500000004710711162727417016340 0ustar jeffjeff True 12 Add a Watch GTK_WIN_POS_CENTER GDK_WINDOW_TYPE_HINT_DIALOG True 24 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True 6 3 2 6 6 True 6 True True 0 0 100 1 10 0 True Seconds Minutes Hours Days False False 1 1 2 2 3 True 0 0 Refresh Interval: 2 3 GTK_FILL True True * 1 2 GTK_FILL True 0 0 Name: GTK_FILL True 6 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General options tab False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 6 True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 3 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK When this watch has changed 0 True 1 2 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Run a custom command:</b> True 6 False 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK When you open this watch 0 True 6 True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 6 6 False 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Advanced options tab 1 False 2 True GTK_BUTTONBOX_END True True True gtk-help True -11 True True True gtk-cancel True -6 1 True True True True gtk-add True 0 2 False GTK_PACK_END 12 The watch name is already in use GTK_WIN_POS_CENTER True GDK_WINDOW_TYPE_HINT_DIALOG True True 0 0 The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name. True False False 2 True GTK_BUTTONBOX_END True True True Edit existing watch True 0 True True True Choose an other name True 1 1 False GTK_PACK_END specto-0.3.1/data/glade/preferences.glade.h0000644000175000017500000000202511162731130017122 0ustar jeffjeffchar *s = N_("Debugging and Logging"); char *s = N_("Display"); char *s = N_("Security"); char *s = N_("Sounds"); char *s = N_("Always show the icon in the notification area"); char *s = N_("Display the notification window in the window list"); char *s = N_("Enable debug mode and logging"); char *s = N_("If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs."); char *s = N_("It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account."); char *s = N_("Play this sound when a problem occurs:"); char *s = N_("Play this sound when a watch has changed:"); char *s = N_("Preferences"); char *s = N_("Select a File"); char *s = N_("Show notifications when a watch has changed"); char *s = N_("Use GNOME keyring to store passwords in encrypted format"); specto-0.3.1/data/glade/add_watch.glade.h0000644000175000017500000000143511162731130016543 0ustar jeffjeffchar *s = N_("Run a custom command:"); char *s = N_("Add a Watch"); char *s = N_("Advanced options"); char *s = N_("Choose \n" "an other name"); char *s = N_("Edit existing\n" "watch"); char *s = N_("General options"); char *s = N_("Name:"); char *s = N_("Refresh Interval:"); char *s = N_("Seconds\n" "Minutes\n" "Hours\n" "Days"); char *s = N_("The watch name is already in use"); char *s = N_("The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name."); char *s = N_("When this watch has changed"); char *s = N_("When you open this watch"); specto-0.3.1/data/glade/notifier (copie).glade0000644000175000017500000010023211063276114017420 0ustar jeffjeff Notifications gtk-dialog-info True True True _File True True _Import Watches True True 0 0 gtk-open 1 True _Export Watches True True 0 0 gtk-save-as 1 True True gtk-close True True True _Edit True True gtk-add True True True gtk-remove True True True gtk-edit True True True Mark as read True True True gtk-preferences True True True _View True True gtk-refresh True True True _Mark all read True True 0 0 gtk-clear 1 True True _Error Log True True True Sorting True True By Watch Type True True True By Name True by_watch_type True By Active True by_watch_type True 0 0 gtk-sort-ascending 1 True True Display _All Watches True True Display _Toolbar True True True _Help True True gtk-help True True True gtk-about True True False False True True True _Refresh All True gtk-refresh False True True _Mark all read True gtk-clear False True True gtk-add False False False False 1 True True GTK_POLICY_NEVER True True True True False 2 145 True 6 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-info False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General tab False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 6 6 True PANGO_WRAP_CHAR PANGO_ELLIPSIZE_END 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Extra information tab 1 False -1 True 6 GTK_BUTTONBOX_START True True True gtk-jump-to True 0 True True True Mark as read 0 1 True True True gtk-edit True 0 2 False GTK_PACK_END 1 False False 3 False 4 Error False GTK_WIN_POS_CENTER_ON_PARENT True 6 True True gtk-missing-image True 6 1 False False 6 True True True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC 200 True True True Debug information label_item 6 1 True False 6 2 True True True True Visit the issue tracker 0 6 True 6 1 True 2 True True True gtk-ok True 0 6 3 False False 6 3 specto-0.3.1/data/glade/notifier.glade0000644000175000017500000010003611071657115016224 0ustar jeffjeff Notifications gtk-dialog-info True True True _File True True _Import Watches True True 0 0 gtk-open 1 True _Export Watches True True 0 0 gtk-save-as 1 True True gtk-close True True True _Edit True True gtk-add True True True gtk-remove True True True gtk-edit True True True Mark as read True True True gtk-preferences True True True _View True True gtk-refresh True True True _Mark all read True True 0 0 gtk-clear 1 True True _Error Log True True True Sorting True True By Watch Type True True True By Name True by_watch_type True By Active True by_watch_type True 0 0 gtk-sort-ascending 1 True True Display _All Watches True True Display _Toolbar True True True _Help True True gtk-help True True True gtk-about True True False False True True True _Refresh All True gtk-refresh False True True _Mark all read True gtk-clear False True True gtk-add False False False False 1 True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True True False 2 145 True 6 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-info False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General tab False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 6 6 True PANGO_WRAP_CHAR PANGO_ELLIPSIZE_END 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Extra information tab 1 False -1 True 6 GTK_BUTTONBOX_START True True True gtk-jump-to True 0 True True True Mark as read 0 1 True True True gtk-edit True 0 2 False GTK_PACK_END 1 False False 3 False 4 Error False GTK_WIN_POS_CENTER_ON_PARENT True 6 True True gtk-missing-image True 6 1 False False 6 True True True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC 200 True True True Debug information label_item 6 1 True False 6 2 True True True True Visit the issue tracker 0 6 True 6 1 True 2 True True True gtk-ok True 0 6 3 False False 6 3 specto-0.3.1/data/glade/notifier.glade.h0000644000175000017500000000121011162731130016433 0ustar jeffjeffchar *s = N_("By Active"); char *s = N_("By Name"); char *s = N_("By Watch Type"); char *s = N_("Debug information"); char *s = N_("Display _All Watches"); char *s = N_("Display _Toolbar"); char *s = N_("Error"); char *s = N_("Extra information"); char *s = N_("General"); char *s = N_("Mark as read"); char *s = N_("Notifications"); char *s = N_("Sorting"); char *s = N_("Visit the issue tracker"); char *s = N_("_Edit"); char *s = N_("_Error Log"); char *s = N_("_Export Watches"); char *s = N_("_File"); char *s = N_("_Help"); char *s = N_("_Import Watches"); char *s = N_("_Mark all read"); char *s = N_("_Refresh All"); char *s = N_("_View"); specto-0.3.1/data/glade/log_dialog.glade.h0000644000175000017500000000032411162731130016721 0ustar jeffjeffchar *s = N_("All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical"); char *s = N_("Filter:"); char *s = N_("Logs"); char *s = N_("Save As"); specto-0.3.1/data/glade/import_export.glade0000644000175000017500000001455711041474547017337 0ustar jeffjeff True 12 dialog1 150 GDK_WINDOW_TYPE_HINT_DIALOG False True 12 250 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN True True 1 True GTK_BUTTONBOX_END True True True Select all True True True True Deselect all True 1 True True True gtk-close True -7 2 True gtk-save-as True 3 False GTK_PACK_END True GDK_WINDOW_TYPE_HINT_DIALOG True 24 True GTK_BUTTONBOX_END True True True gtk-cancel True -6 True True True True gtk-open True -5 1 False GTK_PACK_END specto-0.3.1/data/glade/edit_watch.glade0000644000175000017500000005361411162727417016535 0ustar jeffjeff True 12 Watch $WATCH_NAME GTK_WIN_POS_CENTER GDK_WINDOW_TYPE_HINT_DIALOG True 24 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True 0 0 GTK_SHADOW_NONE True 0 0 12 True 6 2 2 6 6 True 0 0 Name: GTK_FILL True True * 1 2 GTK_FILL True 0 0 Refresh Interval: 2 3 GTK_FILL True 6 True True 60 0 255 1 10 0 1 True Seconds Minutes Hours Days False False 1 1 2 2 3 True 0 0 <b>General settings</b> True label_item False 6 True 0 0 GTK_SHADOW_NONE True 0 0 12 True 6 6 True 0 0 <b>Watch options</b> True label_item 6 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK General options tab False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 3 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 6 <b>Run a custom command:</b> True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 3 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK When this watch has changed 0 True 1 2 6 False 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 6 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK When you open this watch 0 True 6 False 6 1 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Advanced options tab 1 False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Error log tab 2 False 2 True GTK_BUTTONBOX_END True True True gtk-remove True -11 True True True gtk-cancel True -6 1 True True True True gtk-save True 0 2 False GTK_PACK_END specto-0.3.1/data/glade/log_dialog.glade0000644000175000017500000002323511071657115016512 0ustar jeffjeff 700 True 12 Logs GDK_WINDOW_TYPE_HINT_DIALOG False True 6 True 6 True 6 True 0 Filter: False False True All Debug Info Warning Error Critical True 1 True True gtk-find True 0 False False 2 False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN 115 490 True True False False False 1 1 True GTK_BUTTONBOX_END True True True gtk-help True -11 True True True gtk-save-as True 0 1 True True True gtk-clear True 0 2 True True True gtk-close True -7 3 False GTK_PACK_END True Save As False GTK_WIN_POS_CENTER GDK_WINDOW_TYPE_HINT_DIALOG GTK_FILE_CHOOSER_ACTION_SAVE True 24 True GTK_BUTTONBOX_END True True True gtk-cancel True -6 True True True True gtk-save True -5 1 False GTK_PACK_END specto-0.3.1/data/glade/preferences.glade0000644000175000017500000005315311162726254016717 0ustar jeffjeff True Preferences False True gtk-preferences GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_CENTER True True 12 6 True 0 0 GTK_SHADOW_NONE True 0 0 12 True 6 3 True True Show notifications when a watch has changed True 0 True True False False True True Display the notification window in the window list True 0 True True False False 1 True True Always show the icon in the notification area True 0 True False False 2 True 0 0 <b>Display</b> True label_item False True 0 0 GTK_SHADOW_NONE True 0 0 12 True 6 2 2 6 6 True True Play this sound when a watch has changed: True 0 True GTK_FILL True True Play this sound when a problem occurs: True 0 True 1 2 GTK_FILL True False Select a File 1 2 GTK_FILL True False Select a File 1 2 1 2 GTK_FILL True 0 0 <b>Sounds</b> True label_item False 1 True 0 GTK_SHADOW_NONE True 12 True 6 6 True 0 It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in <b>plain text, unencrypted</b> in your watch list, and could be read by anyone gaining access to your system user account. True True True True Use GNOME keyring to store passwords in encrypted format 0 True True 1 True <b>Security</b> True label_item 2 True 0 0 GTK_SHADOW_NONE True 0 0 12 True 6 3 True True If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs. Enable debug mode and logging True 0 True True False False 6 True 6 GTK_BUTTONBOX_START True True True gtk-clear True 0 True True True gtk-open True 0 1 1 True 0 0 <b>Debugging and Logging</b> True label_item False 3 False 2 True GTK_BUTTONBOX_END True True True gtk-help True -11 True True True gtk-cancel True -6 1 True True True gtk-ok True -5 2 False GTK_PACK_END specto-0.3.1/data/glade/import_export.glade.h0000644000175000017500000000007211162731130017534 0ustar jeffjeffchar *s = N_("Deselect all"); char *s = N_("Select all"); specto-0.3.1/data/glade/edit_watch.glade.h0000644000175000017500000000075611162731130016745 0ustar jeffjeffchar *s = N_("General settings"); char *s = N_("Run a custom command:"); char *s = N_("Watch options"); char *s = N_("Advanced options"); char *s = N_("Error log"); char *s = N_("General options"); char *s = N_("Name:"); char *s = N_("Refresh Interval:"); char *s = N_("Seconds\n" "Minutes\n" "Hours\n" "Days"); char *s = N_("Watch $WATCH_NAME"); char *s = N_("When this watch has changed"); char *s = N_("When you open this watch"); specto-0.3.1/setup.py0000644000175000017500000000362711210244417013134 0ustar jeffjeff#!/usr/bin/env python import os from distutils.core import setup f=open('data/doc/VERSION', 'r') # Open the VERSION file for reading. # Below, "[:-1]" means we omit the last character, which is "\n". version_string = f.readline()[:-1] f.close def give_files(dir, *extension): files=[] all_files=os.listdir(dir) for file in all_files: ext=(os.path.splitext(file))[1] if ext in extension: files.append(dir + file) return files # List all the languages, separated by one whitespace i18n_languages = "fr cs de es it pt_BR ro ru sv tr zh_CN" def give_mo_file(lang): return "po/" + str(lang) + "/specto.mo" def give_mo_path(lang): return "share/locale/" + str(lang) + "/LC_MESSAGES/" def give_mo_tuples(langs): mo_tuple_list=[] for lang in langs.split(' '): mo_tuple_list.append((give_mo_path(lang), [give_mo_file(lang)])) return mo_tuple_list temp_files = [ # The paths are relative to sys.prefix ('share/doc/specto', give_files('data/doc/', '')), ('share/icons/hicolor/scalable/apps', ['data/icons/hicolor/scalable/specto.svg']), ('share/applications', ['specto.desktop']), ('share/specto/icons', give_files('data/icons/', '.png', '.svg')), ('share/specto/glade', give_files('data/glade/', '.glade'))] for lang_tuple in give_mo_tuples(i18n_languages): temp_files.append(lang_tuple) setup(name = "specto", version = version_string, description = "A desktop application that will watch configurable events (website updates, emails, file and folder changes...)", author = "Jean-Francois Fortin Tam", author_email = "nekohayo at gmail dot com", url = "http://specto.sourceforge.net", packages = [('spectlib'), ('spectlib/plugins'), ('spectlib/tools')], #package_dir = {'': 'src'}, #package_data = {'specto': ['preferences.glade', 'notify.glade']}, scripts = ['specto'], data_files = temp_files) specto-0.3.1/spectlib/0000755000175000017500000000000011226433142013221 5ustar jeffjeffspecto-0.3.1/spectlib/notifier.py0000644000175000017500000012776511225517121015433 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # notifier.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os from random import randrange from datetime import datetime from spectlib.preferences import Preferences from spectlib.add_watch import Add_watch from spectlib.about import About from spectlib.edit_watch import Edit_watch from spectlib.logger import Log_dialog from spectlib.balloons import NotificationToast from spectlib.import_watch import Import_watch from spectlib.export_watch import Export_watch from spectlib.trayicon import Tray import spectlib.util from spectlib.gtkconfig import ErrorDialog from spectlib.i18n import _ try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade import gobject import pango import gnome except: pass class Notifier: """ Class to create the main specto window """ add_w = "" edit_w = "" error_l = "" about = "" export_watch = "" import_watch = "" def __init__(self, specto): """ In this init we are going to display the main notifier window. """ self.specto = specto self.tray = Tray(specto, self) self.balloon = NotificationToast(specto, self) self.preferences_initialized = False gnome.sound_init('localhost') #create tree self.iter = {} gladefile = os.path.join(self.specto.PATH, "glade/notifier.glade") windowname = "notifier" self.wTree = gtk.glade.XML(gladefile, windowname, self.specto.glade_gettext) self.model = gtk.ListStore(gobject.TYPE_BOOLEAN, gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING, pango.Weight) #catch some events dic = { "on_add_activate": self.show_add_watch_menu, "on_edit_activate": self.show_edit_watch, "on_clear_all_activate": self.mark_all_as_read, "on_preferences_activate": self.show_preferences, "on_refresh_activate": self.refresh_all_watches, "on_close_activate": self.delete_event, "on_import_watches_activate": self.import_watches, "on_export_watches_activate": self.export_watches, "on_error_log_activate": self.show_error_log, "on_display_all_watches_activate": self.toggle_show_deactivated_watches, "on_display_toolbar_activate": self.toggle_display_toolbar, "on_help_activate": self.show_help, "on_about_activate": self.show_about, "on_treeview_row_activated": self.open_watch_callback, "on_btnOpen_clicked": self.open_watch_callback, "on_btnClear_clicked": self.mark_watch_as_read, "on_treeview_cursor_changed": self.show_watch_info, "on_btnEdit_clicked": self.show_edit_watch, "on_by_watch_type_activate": self.sort_type, "on_by_name_activate": self.sort_name, "on_by_watch_active_activate": self.sort_active, "on_remove_clicked": self.remove_watch, "on_clear_activate": self._mark_watch_as_read, "on_remove_activate": self.remove_watch} self.wTree.signal_autoconnect(dic) self.notifier = self.wTree.get_widget("notifier") icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.svg")) self.notifier.set_icon(icon) self.specto.notifier_initialized = True self.create_notifier_gui() self.stop_refresh = False def mark_watch_as_read(self, widget, *id): """ Call the main function to mark the watch as read and reset the name in the notifier. If widget == '' then id will be used to mark the watch as read else the selected watch will be marked as read. """ try: id = id[0] except: model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) watch = self.specto.watch_db[id] watch.mark_as_read() self.model.set(self.iter[id], 2, watch.name, 5, pango.WEIGHT_NORMAL) if self.model.iter_is_valid(self.iter[id]) and not watch.error: self.model.set_value(self.iter[id], 1, self.get_icon(watch.icon, 50, False)) if watch.changed == False: self.wTree.get_widget("btnClear").set_sensitive(False) else: self.wTree.get_widget("btnClear").set_sensitive(True) #check if all watches has been marked as read changed_watches = False changes = self.specto.watch_db.count_changed_watches() for changed in changes.values(): if changed > 0: changed_watches = True if changed_watches == False: self.wTree.get_widget("button_clear_all").set_sensitive(False) def mark_all_as_read(self, widget): """ Call the main function to mark all watches as read and reset the name in the notifier. """ self.wTree.get_widget("btnClear").set_sensitive(False) self.wTree.get_widget("button_clear_all").set_sensitive(False) self.wTree.get_widget("clear_all1").set_sensitive(False) for watch in self.specto.watch_db: if self.model.iter_is_valid(self.iter[watch.id]): self.mark_watch_as_read("", watch.id) def refresh_all_watches(self, *widget): """ Call the main funcion to refresh all active watches and change refresh icon to stop. """ if self.wTree.get_widget("button_refresh").get_stock_id() == "gtk-refresh": self.wTree.get_widget("button_refresh").set_stock_id("gtk-stop") #menu item, does not allow changing label self.wTree.get_widget("button_refresh").set_label(_("Stop")) self.wTree.get_widget("button_add").set_sensitive(False) self.wTree.get_widget("btnEdit").set_sensitive(False) for i in self.iter: if self.stop_refresh == True: self.stop_refresh = False break try: iter = self.model.get_iter(i) if self.model.iter_is_valid(iter): model = self.model id = int(model.get_value(iter, 3)) except: break if self.specto.watch_db[id].active == True: try: self.specto.watch_db[id].stop() except: pass self.specto.watch_db[id].start() self.wTree.get_widget("button_refresh").set_stock_id("gtk-refresh") #menu item, does not allow changing label self.wTree.get_widget("button_refresh").set_label(_("Refresh All")) self.wTree.get_widget("button_add").set_sensitive(True) self.wTree.get_widget("btnEdit").set_sensitive(True) else: self.stop_refresh = True def mark_error(self, error_message): error_dialog = ErrorDialog(self.specto, error_message) def mark_watch_status(self, status, id): """ show the right icon for the status from the watch. """ watch = self.specto.watch_db[id] statusbar = self.wTree.get_widget("statusbar1") icon = self.get_icon("error", 50, False) try: if status == "checking": icon = self.get_icon("reload", 0, False) statusbar.push(0, (datetime.today().strftime("%H:%M") + " - " + _('The watch "%s" is checking.') % watch.name)) elif status == "idle": self.tray.show_tooltip() #check if all watches are cleared if watch.changed == True: self.model.set(self.iter[id], 2, "%s" % watch.name, 5, pango.WEIGHT_BOLD) self.wTree.get_widget("button_clear_all").set_sensitive(True) self.wTree.get_widget("clear_all1").set_sensitive(True) icon = self.get_icon(watch.icon, 0, False) else: self.model.set(self.iter[id], 2, "%s" % watch.name, 5, pango.WEIGHT_NORMAL) self.wTree.get_widget("clear_all1").set_sensitive(False) icon = self.get_icon(watch.icon, 50, False) statusbar.push(0, "") # As per HIG, make the status bar empty when nothing is happening elif status == "no-network": statusbar.push(0, (datetime.today().strftime("%H:%M") + " - " + _('The network connection seems to be down, networked watches will not check until then.'))) self.tray.show_tooltip() icon = self.get_icon(watch.icon, 50, False) elif status == "error": statusbar.push(0, (datetime.today().strftime("%H:%M") + " - " + _('The watch "%s" has a problem.') % watch.name)) balloon_icon = self.get_icon("error", 0, True) icon = self.get_icon("error", 50, False) if self.specto.specto_gconf.get_entry("pop_toast") == True: self.balloon.show_toast(watch.error_message, balloon_icon, urgency="critical", summary=(_("%s encountered a problem") % watch.name)) if self.specto.specto_gconf.get_entry("use_problem_sound"): problem_sound = self.specto.specto_gconf.get_entry("problem_sound") gnome.sound_play(problem_sound) elif status == "changed": statusbar.push(0, (datetime.today().strftime("%H:%M") + " - " + _('The watch "%s" has changed.') % watch.name)) self.model.set(self.iter[id], 2, "%s" % watch.name, 5, pango.WEIGHT_BOLD) self.wTree.get_widget("button_clear_all").set_sensitive(True) self.wTree.get_widget("clear_all1").set_sensitive(True) if self.model.iter_is_valid(self.iter[id]): icon = self.get_icon(watch.icon, 0, False) self.tray.show_tooltip() balloon_icon = self.get_icon(watch.icon, 0, True) if self.specto.specto_gconf.get_entry("pop_toast") == True: self.balloon.show_toast(watch.get_balloon_text(), balloon_icon, summary=(_("%s has changed") % watch.name), name=watch.name) icon = self.get_icon(watch.icon, 0, False) if self.specto.specto_gconf.get_entry("use_changed_sound"): changed_sound = self.specto.specto_gconf.get_entry("changed_sound") gnome.sound_play(changed_sound) self.model.set_value(self.iter[id], 1, icon) try: model, iter = self.treeview.get_selection().get_selected() id2 = int(model.get_value(iter, 3)) if id == id2: self.show_watch_info() except: pass except: self.specto.logger.log(_("There was an error marking the watch status"), "error", watch.name) def deactivate(self, id): """ Disable the checkbox from the watch. """ watch = self.specto.watch_db[id] self.model.set_value(self.iter[id], 0, 0)#TODO: make the text label in the "Name" column and the buttons insensitive def activate(self, id): """ enable the checkbox from the watch. """ watch = self.specto.watch_db[id] self.model.set_value(self.iter[id], 0, 1)#TODO: make the text label in the "Name" column and the buttons insensitive def get_icon(self, icon, percent, size): """ Calculate the alpha and return a transparent pixbuf. The input percentage is the 'transparency' percentage. 0 means no transparency. """ if icon == "": icon = "dialog-information" if size == True: size = 64 else: size = 22 try: icon = self.specto.icon_theme.load_icon(icon, size, 0) except gobject.GError: try: icon = gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(self.specto.PATH, ("icons/" + icon + ".svg")), size, size) except: icon = gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(self.specto.PATH, "icons/specto_tray_1.svg"), size, size) icon = icon.add_alpha(False, '0', '0', '0') for row in icon.get_pixels_array(): for pix in row: pix[3] = min(int(pix[3]), 255 - (percent * 0.01 * 255))#note: we must *0.01, NOT /100, otherwise it won't work return icon def add_notifier_entry(self, id): """ Add an entry to the notifier list. """ watch = self.specto.watch_db[id] if watch.active == True: active = 1 else: active = 0 self.iter[id] = self.model.insert_before(None, None) self.model.set_value(self.iter[id], 0, active) self.model.set_value(self.iter[id], 1, self.get_icon(watch.icon, 50, False)) self.model.set_value(self.iter[id], 2, watch.name) self.model.set_value(self.iter[id], 3, watch.id) self.model.set_value(self.iter[id], 4, watch.type) self.model.set(self.iter[id], 5, pango.WEIGHT_NORMAL)#make sure the text is not fuzzy on startup if not self.wTree.get_widget("display_all_watches").active and active == 0: #dont creat the entry self.remove_notifier_entry(id) def remove_notifier_entry(self, id): path = self.model.get_path(self.iter[id]) iter = self.model.get_iter(path) id = int(self.model.get_value(iter, 3)) self.model.remove(iter) def check_clicked(self, object, path, model): """ Call the main function to start/stop the selected watch. """ sel = self.treeview.get_selection() sel.select_path(path) model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) watch = self.specto.watch_db[id] if model.get_value(iter, 0): model.set_value(iter, 0, 0) if watch.changed: self.mark_watch_as_read("", id) self.mark_watch_status("idle", id) watch.stop() if not self.wTree.get_widget("display_all_watches").active: self.remove_notifier_entry(id) else: model.set_value(iter, 0, 1) watch.start() def connected_message(self, connected): return if not connected: self.wTree.get_widget("statusbar1").push(0, _("The network connection seems to be down, networked watches will not check until then.")) self.wTree.get_widget("statusbar1").show() else: self.wTree.get_widget("statusbar1").hide() def show_watch_info(self, *args): """ Show the watch information in the notifier window. """ model, iter = self.treeview.get_selection().get_selected() if iter != None and self.model.iter_is_valid(iter): self.wTree.get_widget("edit").set_sensitive(True) self.wTree.get_widget("remove").set_sensitive(True) if not self.info_table.flags() & gtk.VISIBLE: #hide the tip of the day and show the buttons self.quicktip.hide() self.quicktip_image.hide() self.wTree.get_widget("vbox_panel_buttons").show() self.wTree.get_widget("notebook1").show() self.info_table.show() id = int(model.get_value(iter, 3)) watch = self.specto.watch_db[id] watch_values = watch.get_gui_info() #set the error log field if not self.specto.DEBUG: self.wTree.get_widget("notebook1").remove_page(2) else: if self.wTree.get_widget("notebook1").get_n_pages() == 2: self.wTree.get_widget("notebook1").append_page(self.error_log_window, self.label_error_log) log_text = self.specto.logger.watch_log(watch.name) start = self.log_buffer.get_start_iter() end = self.log_buffer.get_end_iter() self.log_buffer.delete(start, end) iter = self.log_buffer.get_iter_at_offset(0) for line in log_text: self.log_buffer.insert_with_tags_by_name(iter, line[1], line[0]) if watch.changed == False: self.wTree.get_widget("clear").set_sensitive(False) self.wTree.get_widget("btnClear").set_sensitive(False) self.wTree.get_widget("lblExtraInfo").set_label(_("No extra information available.")) else: self.wTree.get_widget("clear").set_sensitive(True) self.wTree.get_widget("btnClear").set_sensitive(True) try: self.extra_info = watch.get_extra_information() if self.extra_info != "": try: self.wTree.get_widget("lblExtraInfo").set_label(self.extra_info) except: self.specto.logger.log(_("Extra information could not be set"), "error", self.specto.watch_db[id].name) except: self.specto.logger.log(_("Extra information could not be set"), "error", self.specto.watch_db[id].name) i = 0 while i < 4: if i >= len(watch_values): self.info_labels[i][0].set_label("") self.info_labels[i][1].set_label("") else: #create label self.info_labels[i][0].set_label("" + str(watch_values[i][0]) + ":") label = str(watch_values[i][1]).replace("&", "&") self.info_labels[i][1].set_label(label) i += 1 image = self.wTree.get_widget("watch_icon") image.set_from_pixbuf(self.get_icon(watch.icon, 0, True)) def open_watch(self, id): """ Open the selected watch. Returns False if the watch failed to open """ res = True try: watch = self.specto.watch_db[id] if watch.open_command != "": self.specto.logger.log(_("Watch opened"), "info", self.specto.watch_db[id].name) os.system(watch.open_command + " &") except: res = False return res def open_watch_callback(self, *args): """ Opens the selected watch and mark it as unchanged """ model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) self.open_watch(id) if self.specto.watch_db[id].changed == True: self.mark_watch_as_read(None, id) def show_watch_popup(self, treeview, event, data=None): if event.button == 3: x = int(event.x) y = int(event.y) time = event.time pthinfo = treeview.get_path_at_pos(x, y) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) menu = self.create_menu(self, self.notifier, None) menu.popup(None, None, None, 3, time) return 1 def _mark_watch_as_read(self, *widget): try: model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) self.mark_watch_as_read(id) except: pass def refresh_watch(self, widget): model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) watch = self.specto.watch_db[id] watch.restart() def edit_watch(self, widget): model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) self.show_edit_watch(self, widget, id) def create_menu(self, window, event, data=None): model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) watch = self.specto.watch_db[id] menu = gtk.Menu() menuItem = gtk.ImageMenuItem(_("Refresh")) image = gtk.Image() image.set_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU) menuItem.set_image(image) menuItem.connect('activate', self.refresh_watch) if watch.active == False: menuItem.set_sensitive(False) menu.append(menuItem) menuItem = gtk.ImageMenuItem(_("Mark as read")) image = gtk.Image() image.set_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) menuItem.set_image(image) menuItem.connect('activate', self._mark_watch_as_read) if watch.changed == False: menuItem.set_sensitive(False) menu.append(menuItem) separator = gtk.SeparatorMenuItem() menu.append(separator) menuItem = gtk.ImageMenuItem(_("Edit")) image = gtk.Image() image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU) menuItem.set_image(image) menuItem.connect('activate', self.edit_watch) menu.append(menuItem) menuItem = gtk.ImageMenuItem(_("Remove")) image = gtk.Image() image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) menuItem.set_image(image) menuItem.connect('activate', self.remove_watch) menu.append(menuItem) menu.show_all() return menu def change_entry_name(self, *args): """ Edit the name from the watch in the notifier window. """ # Change the name in the treeview model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) self.change_name(args[2], id) def change_name(self, new_name, id): if self.specto.watch_db[id].changed == True: weight = pango.WEIGHT_BOLD else: weight = pango.WEIGHT_NORMAL self.model.set(self.iter[id], 2, new_name, 5, weight) # Write the new name in watches.list self.specto.watch_io.replace_name(self.specto.watch_db[id].name, new_name) # Change the name in the database self.specto.watch_db[id].name = new_name self.show_watch_info() ### GUI FUNCTIONS ### def get_quick_tip(self): """Return a random tip of the day to be shown on startup""" tips = [_("You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them."), _("Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising."), _("Single-click an existing watch to display information, and double-click it to open the content."), _("Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.")] chosen_tip = tips[randrange(len(tips))] return chosen_tip def toggle_display_toolbar(self, *args): """ Show or hide the toolbar. """ if self.wTree.get_widget("display_toolbar").active: self.wTree.get_widget("toolbar").show() self.specto.specto_gconf.set_entry("hide_toolbar", False) else: self.wTree.get_widget("toolbar").hide() self.specto.specto_gconf.set_entry("hide_toolbar", True) def toggle_show_deactivated_watches(self, *widget): """ Display only active watches or all watches. """ if self.startup != True: self.startup = False # This is important to prevent *widget from messing with us. If you don't believe me, print startup ;) if self.startup == True: self.startup = False else: if self.wTree.get_widget("display_all_watches").active: for watch in self.specto.watch_db: if watch.active == False: # For each watch that is supposed to be inactive, show it in the notifier but don't activate it if self.startup == False: # Recreate the item because it was deleted self.add_notifier_entry(watch.id) self.specto.specto_gconf.set_entry("show_deactivated_watches", True) else: # Hide the deactivated watches for i in self.iter: if self.model.iter_is_valid(self.iter[i]): path = self.model.get_path(self.iter[i]) iter = self.model.get_iter(path) model = self.model id = int(model.get_value(iter, 3)) if self.specto.watch_db[id].active == False: model.remove(iter) self.specto.specto_gconf.set_entry("show_deactivated_watches", False) def remove_watch(self, *widget): try: model, iter = self.treeview.get_selection().get_selected() id = int(model.get_value(iter, 3)) except: pass else: dialog = spectlib.gtkconfig.RemoveDialog(_("Remove a watch"), (_('Remove the watch "%s"?\nThis operation cannot be undone.') % self.specto.watch_db[id].name)) answer = dialog.show() if answer == True: self.remove_notifier_entry(id) self.specto.watch_db.remove(id) #remove the watch self.specto.watch_io.remove_watch(self.specto.watch_db[id].name) self.tray.show_tooltip() def delete_event(self, *args): """ Return False to destroy the main window. Return True to stop destroying the main window. """ self.save_size_and_position() if self.specto.specto_gconf.get_entry("always_show_icon") == True: self.notifier.hide() self.specto.specto_gconf.set_entry("show_notifier", False)#save the window state for the next time specto starts return True else: self.specto.quit() return True def restore_size_and_position(self): """ Restore the size and the postition from the notifier window. """ saved_window_width = self.specto.specto_gconf.get_entry("window_notifier_width") saved_window_height = self.specto.specto_gconf.get_entry("window_notifier_height") saved_window_x = self.specto.specto_gconf.get_entry("window_notifier_x") saved_window_y = self.specto.specto_gconf.get_entry("window_notifier_y") if self.specto.specto_gconf.get_entry("hide_from_windowlist")==True: self.notifier.set_skip_taskbar_hint(True) # Hide from the window list applet if saved_window_width != None and saved_window_height != None: # Check if the size is not 0 self.wTree.get_widget("notifier").resize(saved_window_width, saved_window_height) if saved_window_x != None and saved_window_y != None: # Check if the position is not 0 self.wTree.get_widget("notifier").move(saved_window_x, saved_window_y) def save_size_and_position(self): """ Save the size and position from the notifier in gconf when the window is closed. """ # Save the size in gconf current_window_size = self.wTree.get_widget("notifier").get_size() current_window_width = current_window_size[0] current_window_height = current_window_size[1] self.specto.specto_gconf.set_entry("window_notifier_width", current_window_width) self.specto.specto_gconf.set_entry("window_notifier_height", current_window_height) # Save the window position in gconf when the window is closed current_window_xy = self.wTree.get_widget("notifier").get_position() current_window_x = current_window_xy[0] current_window_y = current_window_xy[1] self.specto.specto_gconf.set_entry("window_notifier_x", current_window_x) self.specto.specto_gconf.set_entry("window_notifier_y", current_window_y) def get_state(self): """ Return True if the notifier window is visible. """ if self.notifier.flags() & gtk.VISIBLE: return True else: return False def create_notifier_gui(self): """ Create the gui from the notifier. """ self.treeview = self.wTree.get_widget("treeview") self.treeview.set_model(self.model) self.treeview.set_flags(gtk.TREE_MODEL_ITERS_PERSIST) self.treeview.connect("button_press_event", self.show_watch_popup, None) self.wTree.get_widget("button_clear_all").set_sensitive(False) self.wTree.get_widget("clear_all1").set_sensitive(False) if self.specto.specto_gconf.get_entry("show_in_windowlist") == False: self.notifier.set_skip_taskbar_hint(True) ### Initiate the window self.restore_size_and_position() self.show_toolbar = self.specto.specto_gconf.get_entry("show_toolbar") if self.show_toolbar == False: self.wTree.get_widget("display_toolbar").set_active(False) self.toggle_display_toolbar() else: self.wTree.get_widget("display_toolbar").set_active(True) self.toggle_display_toolbar() self.startup = True if self.specto.specto_gconf.get_entry("show_deactivated_watches") == True: self.wTree.get_widget("display_all_watches").set_active(True) else: self.wTree.get_widget("display_all_watches").set_active(False) self.startup = False if self.specto.specto_gconf.get_entry("show_notifier") == True: self.notifier.show() ### Checkbox self.columnCheck_renderer = gtk.CellRendererToggle() self.columnCheck_renderer.set_property("activatable", True) self.columnCheck_renderer.connect("toggled", self.check_clicked, self.model) self.columnCheck = gtk.TreeViewColumn(_("Active"), self.columnCheck_renderer, active=0) self.columnCheck.connect("clicked", self.sort_active_from_treeview_headers) self.columnCheck.set_sort_column_id(0) self.treeview.append_column(self.columnCheck) ### Icon self.columnIcon_renderer = gtk.CellRendererPixbuf() self.columnIcon = gtk.TreeViewColumn(_("Type"), self.columnIcon_renderer, pixbuf=1) self.columnIcon.set_clickable(True) self.columnIcon.connect("clicked", self.sort_type_from_treeview_headers) self.treeview.append_column(self.columnIcon) ### Titre self.columnTitle_renderer = gtk.CellRendererText() #self.columnTitle_renderer.set_property("editable", True) #self.columnTitle_renderer.connect('edited', self.change_entry_name) self.columnTitle = gtk.TreeViewColumn(_("Name"), self.columnTitle_renderer, text=2, weight=5) self.columnTitle.connect("clicked", self.sort_name_from_treeview_headers) self.columnTitle.set_expand(True) self.columnTitle.set_resizable(True) self.columnTitle.set_sort_column_id(2) self.treeview.append_column(self.columnTitle) ### ID self.columnID_renderer = gtk.CellRendererText() self.columnID = gtk.TreeViewColumn(_("ID"), self.columnID_renderer, markup=3) self.columnID.set_visible(False) self.columnID.set_sort_column_id(3) self.treeview.append_column(self.columnID) ### type self.renderer = gtk.CellRendererText() self.columnType = gtk.TreeViewColumn(_("TYPE"), self.renderer, markup=4) self.columnType.set_visible(False) self.columnType.set_sort_column_id(4) self.treeview.append_column(self.columnType) self.get_startup_sort_order() ###Create info-panel vbox_info = self.wTree.get_widget("vbox_info") #show tip of the day self.quicktip = self.get_quick_tip() self.quicktip_image = gtk.Image() self.quicktip_image.set_from_pixbuf(self.get_icon("dialog-information", 0, True)) self.quicktip_image.show() vbox_info.pack_start(self.quicktip_image, False, False, 0) self.quicktip = gtk.Label(("" + _("Tip of the Day:") + " "+ self.quicktip)) self.quicktip.set_line_wrap(True) self.quicktip.set_use_markup(True) self.quicktip.set_alignment(xalign=0.0, yalign=0.5) self.quicktip.show() vbox_info.pack_start(self.quicktip, False, False, 0) #create the info table self.info_table = gtk.Table(rows=4, columns=2, homogeneous=True) self.info_table.set_row_spacings(6) self.info_table.set_col_spacings(6) vbox_watch_info = self.wTree.get_widget("vbox_watch_info") vbox_watch_info.pack_start(self.info_table, False, False, 0) #show the image i = 0 self.info_labels = [] while i < 4: gtk_label = gtk.Label() gtk_label.set_alignment(xalign=0.0, yalign=0.5) gtk_label.set_use_markup(True) gtk_label.set_ellipsize(pango.ELLIPSIZE_END) gtk_label.show() #create value gtk_label1 = gtk.Label() gtk_label1.set_alignment(xalign=0.0, yalign=0.5) gtk_label1.set_use_markup(True) gtk_label1.set_ellipsize(pango.ELLIPSIZE_END) gtk_label1.show() self.info_labels.extend([(gtk_label, gtk_label1)]) self.info_table.attach(self.info_labels[i][1], 1, 2, i, i + 1) self.info_table.attach(self.info_labels[i][0], 0, 1, i, i + 1) i += 1 #create the error log textview and notebook label self.error_log = gtk.TextView() self.log_buffer = self.error_log.get_buffer() self.log_buffer.create_tag("ERROR", foreground="#a40000") self.log_buffer.create_tag("INFO", foreground="#4e9a06") self.log_buffer.create_tag("WARNING", foreground="#c4a000") self.error_log_window = gtk.ScrolledWindow() self.error_log_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.error_log_window.add_with_viewport(self.error_log) self.error_log_window.show() self.label_error_log = gtk.Label(_("Error log")) self.error_log.show() self.label_error_log.show() #hide the buttons self.wTree.get_widget("vbox_panel_buttons").hide() self.wTree.get_widget("edit").set_sensitive(False) self.wTree.get_widget("clear").set_sensitive(False) self.wTree.get_widget("remove").set_sensitive(False) self.wTree.get_widget("statusbar1").show() self.wTree.get_widget("notebook1").hide() self.generate_add_menu() ### Sort functions ### def get_startup_sort_order(self): order = self.get_gconf_sort_order() sort_function = self.specto.specto_gconf.get_entry("sort_function") if sort_function == "name": self.wTree.get_widget("by_name").set_active(True) self.model.set_sort_column_id(2, order) elif sort_function == "type": self.wTree.get_widget("by_watch_type").set_active(True) self.model.set_sort_column_id(4, order) elif sort_function == "active": self.wTree.get_widget("by_watch_active").set_active(True) self.model.set_sort_column_id(0, order) def get_gconf_sort_order(self): """ Get the order (asc, desc) from a gconf key. """ order = self.specto.specto_gconf.get_entry("sort_order") if order == "asc": sort_order = gtk.SORT_ASCENDING else: sort_order = gtk.SORT_DESCENDING return sort_order def set_gconf_sort_order(self, order): """ Set the order (asc, desc) for a gconf keys. """ if order == gtk.SORT_ASCENDING: sort_order = "asc" else: sort_order = "desc" return sort_order def sort_name(self, *args): """ Sort by watch name. """ self.model.set_sort_column_id(2, not self.columnTitle.get_sort_order()) self.specto.specto_gconf.set_entry("sort_function", "name") def sort_type(self, *args): """ Sort by watch type. """ self.model.set_sort_column_id(4, not self.columnType.get_sort_order()) self.specto.specto_gconf.set_entry("sort_function", "type") self.specto.specto_gconf.set_entry("sort_order", self.set_gconf_sort_order(self.columnType.get_sort_order())) def sort_active(self, *args): """ Sort by active watches. """ self.model.set_sort_column_id(0, not self.columnCheck.get_sort_order()) self.specto.specto_gconf.set_entry("sort_function", "active") def sort_name_from_treeview_headers(self, *widget): """When treeview headers are clicked, GTK already does the sorting. Just change the active sorting radio button to 'name' in the menus, save the sorting preference.""" self.wTree.get_widget("by_name").set_active(True) self.specto.specto_gconf.set_entry("sort_order", self.set_gconf_sort_order(not self.columnTitle.get_sort_order())) def sort_type_from_treeview_headers(self, *widget): """When treeview headers are clicked, GTK already does the sorting. Just change the active sorting radio button to 'type' in the menus, save the sorting preference.""" self.wTree.get_widget("by_watch_type").set_active(True) self.sort_type() def sort_active_from_treeview_headers(self, *widget): """When treeview headers are clicked, GTK already does the sorting. Just change the active sorting radio button to 'active' in the menus, save the sorting preference.""" self.wTree.get_widget("by_watch_active").set_active(True) self.specto.specto_gconf.set_entry("sort_order", self.set_gconf_sort_order(not self.columnCheck.get_sort_order())) def recreate_tray(self, *args): """ Recreate a tray icon if the notification area unexpectedly quits. """ try: self.tray.destroy() except: pass self.tray = "" self.tray = Tray(self.specto, self) self.specto.watch_db.count_changed_watches() def show_preferences(self, *args): """ Show the preferences window. """ if not self.preferences_initialized or self.preferences.get_state() == True: self.pref = Preferences(self.specto, self) else: self.pref.show() def generate_add_menu(self): """ Creates two "Add watch" submenus for the toplevel menu and the toolbar """ menu_dict = self.specto.watch_db.plugin_menu self.add_menu = gtk.Menu() self.add_menu_ = gtk.Menu() for parent in menu_dict.keys(): menuItem = gtk.MenuItem(parent) menuItem.show() menuItem_ = gtk.MenuItem(parent) menuItem_.show() self.add_menu.append(menuItem) self.add_menu_.append(menuItem_) childmenu = gtk.Menu() childmenu_ = gtk.Menu() for child in menu_dict[parent]: # Create an entry for the popup add menu childmenuItem = gtk.ImageMenuItem(child[0]) childmenu.append(childmenuItem) img = gtk.Image() image = self.get_icon(child[1], 0, False) img.set_from_pixbuf(image) childmenuItem.set_image(img) childmenuItem.connect('button-press-event', self.show_add_watch, child[2]) #FIXME: doesn't work with the keyboard childmenuItem.show() # Create an entry for the "edit -> add" submenu childmenuItem_ = gtk.ImageMenuItem(child[0]) childmenu_.append(childmenuItem_) img = gtk.Image() image = self.get_icon(child[1], 0, False) img.set_from_pixbuf(image) childmenuItem_.set_image(img) childmenuItem_.connect('button-press-event', self.show_add_watch, child[2]) childmenuItem_.show() menuItem.set_submenu(childmenu) menuItem_.set_submenu(childmenu_) self.wTree.get_widget("button_add").set_menu(self.add_menu) self.wTree.get_widget("add").set_submenu(self.add_menu_) def position_add_watch_menu_correctly(self, *args): """ This is a hack, so that the popup menu appears left-aligned, right below the Add button """ current_window_xy = self.wTree.get_widget("notifier").window.get_origin()#here's the trick to not getting screwed by the window manager. get_origin from the window property returns the root x coordinates current_window_x = current_window_xy[0] current_window_y = current_window_xy[1] button_x = self.wTree.get_widget("button_add").get_allocation().x button_y = self.wTree.get_widget("button_add").get_allocation().y button_height = self.wTree.get_widget("button_add").get_allocation().height coordinates = (current_window_x+button_x, current_window_y+button_y+button_height, False) return coordinates def show_add_watch_menu(self, *args): """ When the user clicks on the button part of the GTK Toolbar Menu Button, show the menu instead """ self.add_menu.popup(None, None, self.position_add_watch_menu_correctly, 3, 0) return 1 def show_add_watch(self, event, *args): """ Show the add watch window. """ watch_type = args[1] if self.add_w == "": self.add_w = Add_watch(self.specto, self, watch_type) elif self.add_w.add_watch.flags() & gtk.MAPPED: pass else: self.add_w = Add_watch(self.specto, self, watch_type) def show_edit_watch(self, widget, *args): """ Show the edit watch window. """ selected = "" try: model, iter = self.treeview.get_selection().get_selected() if model.iter_is_valid(iter): id = int(model.get_value(iter, 3)) except: for watch in self.specto.watch_db: try: if watch.name == args[0]: id = watch.id break except: return if self.edit_w == "": self.edit_w = Edit_watch(self.specto, self, id) elif self.edit_w.edit_watch.flags() & gtk.MAPPED: pass else: self.edit_w = Edit_watch(self.specto, self, id) def show_error_log(self, *widget): """ Call the main function to show the log window. """ if self.error_l == "": self.error_l = Log_dialog(self.specto, self) elif self.error_l.log_dialog.flags() & gtk.MAPPED: pass else: self.error_l = Log_dialog(self.specto, self) def show_help(self, *args): """ Call the main function to show the help. """ self.specto.util.show_webpage("http://code.google.com/p/specto/w/list") def show_about(self, *args): """ Call the main function to show the about window. """ if self.about == "": self.about = About(self.specto) elif self.about.about.flags() & gtk.MAPPED: pass else: self.about = About(self.specto) def import_watches(self, *widget): if self.import_watch == "": self.import_watch = Import_watch(self.specto, self) elif self.import_watch.open.open_dialog.flags() & gtk.MAPPED: pass else: self.import_watch = Import_watch(self.specto, self) def export_watches(self, *widget): if self.export_watch == "": self.export_watch = Export_watch(self.specto, self) elif self.export_watch.export_watch.flags() & gtk.MAPPED: pass else: self.export_watch = Export_watch(self.specto, self) if __name__ == "__main__": #run the gui app = Notifier() gtk.main() specto-0.3.1/spectlib/config.py0000644000175000017500000000510411210244417015036 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # config.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. class Integer(): """A config node containing a integer value. Supports restricting the valid values to a range. """ def __init__(self, mandatory, low=None, high=None): self.mandatory = mandatory self.low = low self.high = high def checkRestrictions(self, value): try: val = int(value) except ValueError: return False, -1 return True, val def getStandardValue(self): return -1 class String(): """A config node containing a string value.""" def __init__(self, mandatory): self.mandatory = mandatory def checkRestrictions(self, value): try: val = str(value) except ValueError: return False return True, val def getStandardValue(self): return "" class Dec(): """ A config node containing a decimal value. """ def __init__(self, mandatory): self.mandatory = mandatory def checkRestrictions(self, value): try: val = float(value) except ValueError: return False return True, val def getStandardValue(self): return -1 class Boolean(): """ A config node containing a boolean value. """ def __init__(self, mandatory): self.mandatory = mandatory def checkRestrictions(self, value): valid = False if value == "True" or value == 1 or value == True: val = True valid = True if value == "False" or value == 0 or value == False: val = False valid = True if valid == False: return False, "" else: return True, val def getStandardValue(self): return False specto-0.3.1/spectlib/about.py0000644000175000017500000000652211217006272014712 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # about.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os import pygtk pygtk.require("2.0") import gtk import spectlib.util from spectlib.i18n import _ class About: """ Class to create a window with the credits and licensing information about Specto. """ def __init__(self, specto): self.specto = specto version_file_path = (os.path.join(spectlib.util.get_path(category="doc"), "VERSION")) version_file = open(version_file_path, 'r') version = str(version_file.readline()[:-1]) version_file.close license_file_path = (os.path.join(spectlib.util.get_path(category="doc"), "COPYING")) license_file = open(license_file_path, "r") license = license_file.read() license_file.close() license = str(license) authors_file_path = (os.path.join(spectlib.util.get_path(category="doc"), "AUTHORS")) authors_file = open(authors_file_path, "r") # this is a hack, because gtk.AboutDialog expects a list, not a file authors = authors_file.readlines() authors_file.close() logo = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_about.png")) # gtk.AboutDialog will detect if "translator-credits" is untranslated, # and hide the tab. translator_credits = _("translator-credits") #create tree self.about = gtk.AboutDialog() self.about.set_name("Specto") self.about.set_version(version) self.about.set_copyright("Copyright © Jean-François Fortin Tam & Wout Clymans") #self.wTree.set_comments(comments) self.about.set_license(license) #self.wTree.set_wrap_license(license) gtk.about_dialog_set_url_hook(lambda about, url: self.url_show(url)) self.about.set_website("http://specto.sourceforge.net") self.about.set_website_label(_("Specto's Website")) self.about.set_authors(authors) #self.about.set_documenters(documenters) #self.about.set_artists(artists) self.about.set_translator_credits(translator_credits) self.about.set_logo(logo) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.about.set_icon(icon) self.about.connect("response", lambda d, r: self.close()) self.about.show_all() def url_show(self, url): os.system(spectlib.util.return_webpage(url) + " &") def close(self): self.about.destroy() if __name__ == "__main__": #run the gui app = About() gtk.main() specto-0.3.1/spectlib/export_watch.py0000644000175000017500000002065611225517121016312 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # import_export.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.i18n import _ import os from spectlib.watch import Watch_io try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade import gobject except: pass class Export_watch: """ Class to create the import/export watch dialog. """ def __init__(self, specto, notifier): self.specto = specto self.notifier = notifier #create tree gladefile = os.path.join(self.specto.PATH, "glade/import_export.glade") windowname = "import_export" self.wTree = gtk.glade.XML(gladefile, windowname, \ self.specto.glade_gettext) self.export_watch = self.wTree.get_widget("import_export") self.export_watch.set_title(_("Export watches")) self.wTree.get_widget("button_action").set_label(_("Export watches")) self.model = gtk.ListStore(gobject.TYPE_BOOLEAN, gtk.gdk.Pixbuf, \ gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING) self.new_watch_db = {} #catch some events dic = {"on_button_select_all_clicked": self.select_all, "on_button_deselect_all_clicked": self.deselect_all, "on_button_action_clicked": self.do_action, "on_button_close_clicked": self.delete_event} #attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.export_watch.set_icon(icon) self.treeview = self.wTree.get_widget("treeview") self.treeview.set_model(self.model) self.treeview.set_flags(gtk.TREE_MODEL_ITERS_PERSIST) self.iter = {} ### Checkbox self.renderer = gtk.CellRendererToggle() self.renderer.set_property("activatable", True) self.renderer.connect("toggled", self.check_clicked, self.model) self.columnCheck = gtk.TreeViewColumn(_("Select"), \ self.renderer, active=0) self.treeview.append_column(self.columnCheck) ### Icon self.renderer = gtk.CellRendererPixbuf() self.columnIcon = gtk.TreeViewColumn(_("Type"), \ self.renderer, pixbuf=1) self.treeview.append_column(self.columnIcon) ### Titre self.renderer = gtk.CellRendererText() self.columnTitel = gtk.TreeViewColumn(_("Name"), \ self.renderer, markup=2) self.columnTitel.set_expand(True) self.columnTitel.set_resizable(True) self.treeview.append_column(self.columnTitel) ### ID self.renderer = gtk.CellRendererText() self.column = gtk.TreeViewColumn(_("ID"), self.renderer, markup=3) self.column.set_visible(False) #self.column.set_sort_column_id(3) self.treeview.append_column(self.column) ### type self.renderer = gtk.CellRendererText() self.columnType = gtk.TreeViewColumn(_("TYPE"), \ self.renderer, markup=4) self.columnType.set_visible(False) #self.columnType.set_sort_column_id(4) self.treeview.append_column(self.columnType) for watch in self.specto.watch_db: if watch.deleted == False: self.add_watch_entry(watch.id) def select_all(self, widget): db = self.specto.watch_db for watch in db: if watch.deleted == False: self.model.set_value(self.iter[watch.id], 0, 1) def deselect_all(self, widget): db = self.specto.watch_db for watch in db: if watch.deleted == False: self.model.set_value(self.iter[watch.id], 0, 0) def do_action(self, widget): self.export_watch.hide_all() self.save = Save_dialog(self.specto, None, False, \ self.get_selected_watches()) def delete_event(self, widget, *args): """ Destroy the window. """ self.export_watch.destroy() return True def get_selected_watches(self): selected_watches_db = {} i = 0 watch_db = self.specto.watch_db for watch in watch_db: if watch.deleted == False: if self.model.get_value(self.iter[watch.id], 0) == True: selected_watches_db[i] = watch i += 1 return selected_watches_db def add_watch_entry(self, id): """ Add an entry to the notifier list. """ watch = self.specto.watch_db[id] entry_name = watch.name.replace("&", "&") icon = self.notifier.get_icon(watch.icon, 50, False) self.iter[id] = self.model.insert_before(None, None) self.model.set_value(self.iter[id], 0, 0) self.model.set_value(self.iter[id], 1, icon) self.model.set_value(self.iter[id], 2, entry_name) self.model.set_value(self.iter[id], 3, watch.id) self.model.set_value(self.iter[id], 4, watch.type) def set_new_watch_db(self, watch_db): self.new_watch_db = watch_db def check_clicked(self, object, path, model): """ Call the main function to start/stop the selected watch. """ sel = self.treeview.get_selection() sel.select_path(path) model, iter = self.treeview.get_selection().get_selected() if model.get_value(iter, 0): model.set_value(iter, 0, 0) else: model.set_value(iter, 0, 1) class Save_dialog: """ Class for displaying the save as dialog. """ def __init__(self, specto, _import, action_type, watches_db): self.specto = specto self._export = _import #create tree gladefile = os.path.join(self.specto.PATH, "glade/import_export.glade") windowname = "filechooser" self.wTree = gtk.glade.XML(gladefile, windowname) self.save_dialog = self.wTree.get_widget("filechooser") self.action_type = action_type self.save_dialog.set_action(gtk.FILE_CHOOSER_ACTION_SAVE) self.wTree.get_widget("button_save").set_label("gtk-save") self.watches_db = watches_db dic = {"on_button_cancel_clicked": self.cancel, "on_button_save_clicked": self.save} #attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.save_dialog.set_icon(icon) self.save_dialog.set_filename(os.environ['HOME'] + "/ ") def cancel(self, *args): """ Close the save as dialog. """ self.save_dialog.destroy() def save(self, *args): """ Save the file. """ file_name = self.save_dialog.get_filename() for i in self.watches_db.keys(): values = {} values['name'] = self.watches_db[i].name values['type'] = self.watches_db[i].type values['refresh'] = self.watches_db[i].refresh values.update(self.watches_db[i].get_values()) self.write_options(file_name, values) self.save_dialog.destroy() def write_options(self, file_name, values): """ Write or change the watch options in a configuration file. Values has to be a dictionary with the name from the options and the value. example: { 'name':'value', 'name':'value' } If the name is not found, a new watch will be added, else the excisting watch will be changed. """ watch_io = Watch_io(self.specto, file_name) watch_io.write_watch(values) if __name__ == "__main__": #run the gui app = Export_watch() gtk.main() specto-0.3.1/spectlib/import_watch.py0000644000175000017500000002444311225517121016301 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # import_export.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.i18n import _ import os from spectlib.watch import Watch_io from spectlib.watch import Watch_collection try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade import gobject except: pass class Import_watch: """ Class to create the import/export watch dialog. """ def __init__(self, specto, notifier): self.specto = specto self.notifier = notifier self.open = Open_dialog(self.specto, self, None) def create_import_window(self): #create tree gladefile = os.path.join(self.specto.PATH, "glade/import_export.glade") windowname = "import_export" self.wTree = gtk.glade.XML(gladefile, windowname, self.specto.glade_gettext) self.import_watch = self.wTree.get_widget("import_export") self.import_watch.set_title(_("Import watches")) self.wTree.get_widget("button_action").set_label(_("Import watches")) self.model = gtk.ListStore(gobject.TYPE_BOOLEAN, gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING) self.new_watch_db = {} #catch some events dic = {"on_button_select_all_clicked": self.select_all, "on_button_deselect_all_clicked": self.deselect_all, "on_button_action_clicked": self.import_watches, "on_button_close_clicked": self.delete_event} #attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.import_watch.set_icon(icon) self.treeview = self.wTree.get_widget("treeview") self.treeview.set_model(self.model) self.treeview.set_flags(gtk.TREE_MODEL_ITERS_PERSIST) self.iter = {} ### Checkbox self.renderer = gtk.CellRendererToggle() self.renderer.set_property("activatable", True) self.renderer.connect("toggled", self.check_clicked, self.model) self.columnCheck = gtk.TreeViewColumn(_("Select"), self.renderer, active=0) self.treeview.append_column(self.columnCheck) ### Icon self.renderer = gtk.CellRendererPixbuf() self.columnIcon = gtk.TreeViewColumn(_("Type"), self.renderer, pixbuf=1) self.treeview.append_column(self.columnIcon) ### Titre self.renderer = gtk.CellRendererText() self.columnTitel = gtk.TreeViewColumn(_("Name"), self.renderer, markup=2) self.columnTitel.set_expand(True) self.columnTitel.set_resizable(True) self.treeview.append_column(self.columnTitel) ### ID self.renderer = gtk.CellRendererText() self.column = gtk.TreeViewColumn(_("ID"), self.renderer, markup=3) self.column.set_visible(False) #self.column.set_sort_column_id(3) self.treeview.append_column(self.column) ### type self.renderer = gtk.CellRendererText() self.columnType = gtk.TreeViewColumn(_("TYPE"), self.renderer, markup=4) self.columnType.set_visible(False) #self.columnType.set_sort_column_id(4) self.treeview.append_column(self.columnType) def select_all(self, widget): db = self.new_watch_db for watch in db: if watch.deleted == False: self.model.set_value(self.iter[watch.id], 0, 1) def deselect_all(self, widget): db = self.new_watch_db for watch in db: if watch.deleted == False: self.model.set_value(self.iter[watch.id], 0, 0) def import_watches(self, widget): self.import_watch.hide_all() watches = self.get_selected_watches() all_values = {} for i in watches: values = {} watch = self.new_watch_db[watches[i].id] values.update(self.new_watch_db[watches[i].id].get_values()) values['name'] = watch.name if self.specto.watch_io.is_unique_watch(values['name']): y = 1 while self.specto.watch_io.is_unique_watch(values['name'] + str(y)): y += 1 values['name'] = values['name'] + str(y) values['type'] = watch.type values['refresh'] = watch.refresh values['active'] = True values['last_changed'] = watch.last_changed values['changed'] = False all_values[i] = values _id = self.specto.watch_db.create(all_values) for values in all_values.values(): self.specto.watch_io.write_watch(values) for id in _id: # Create notifier entries self.specto.notifier.add_notifier_entry(id) for id in _id: # Start the new watches self.specto.watch_db[id].start() def delete_event(self, widget, *args): """ Destroy the window. """ self.import_watch.destroy() return True def get_selected_watches(self): selected_watches_db = {} i = 0 watch_db = self.new_watch_db for watch in watch_db: if watch.deleted == False: if self.model.get_value(self.iter[watch.id], 0) == True: selected_watches_db[i] = watch i += 1 return selected_watches_db def add_watch_entry(self, id): """ Add an entry to the notifier list. """ watch = self.new_watch_db[id] entry_name = watch.name.replace("&", "&") icon = self.notifier.get_icon(watch.icon, 50, False) self.iter[id] = self.model.insert_before(None, None) self.model.set_value(self.iter[id], 0, 0) self.model.set_value(self.iter[id], 1, icon)#self.specto.notifier.make_transparent(icon, 50))#does not need transparency here self.model.set_value(self.iter[id], 2, entry_name) self.model.set_value(self.iter[id], 3, watch.id) self.model.set_value(self.iter[id], 4, watch.type) def set_new_watch_db(self, watch_db): self.new_watch_db = watch_db def check_clicked(self, object, path, model): """ Call the main function to start/stop the selected watch. """ sel = self.treeview.get_selection() sel.select_path(path) model, iter = self.treeview.get_selection().get_selected() if model.get_value(iter, 0): model.set_value(iter, 0, 0) else: model.set_value(iter, 0, 1) class Open_dialog: """ Class for displaying the open dialog. """ def __init__(self, specto, _import, watches_db): self.specto = specto self._import = _import # Create the tree gladefile = os.path.join(self.specto.PATH, "glade/import_export.glade") windowname = "filechooser" self.wTree = gtk.glade.XML(gladefile, windowname) self.open_dialog = self.wTree.get_widget("filechooser") dic = {"on_button_cancel_clicked": self.cancel, "on_button_save_clicked": self.open} # Attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.open_dialog.set_icon(icon) self.open_dialog.set_filename(os.environ['HOME'] + "/ ") def cancel(self, *args): """ Close the save as dialog. """ self.open_dialog.destroy() def open(self, *args): """ Save the file. """ self.open_dialog.hide_all() self._import.create_import_window() file_name = self.open_dialog.get_filename() self.read_options(file_name) self._import.import_watch.show() self.open_dialog.destroy() def read_options(self, file_name): watch_io = Watch_io(self.specto, file_name) if watch_io.valid == False: return False values = watch_io.read_all_watches() for i in values: try: int(values[i]['type']) except: pass else: values[i]['open_command'] = "" values[i]['last_changed'] = "" # Import from Specto 0.2 # FIXME: wouldn't this code be more efficient with a case/switch? if values[i]['type'] == "0": values[i]['type'] = "Watch_web_static" elif values[i]['type'] == "1": if values[i]['prot'] == "0": values[i]['type'] = "Watch_mail_pop3" if values[i]['prot'] == "1": values[i]['type'] = "Watch_mail_imap" if values[i]['prot'] == "2": values[i]['type'] = "Watch_mail_gmail" del values[i]['prot'] elif values[i]['type'] == "2": if values[i]['mode'] == "file": values[i]['type'] = "Watch_system_file" else: values[i]['type'] = "Watch_system_folder" del values[i]['mode'] elif values[i]['type'] == "3": values[i]['type'] = "Watch_system_process" elif values[i]['type'] == "4": values[i]['type'] = "Watch_system_port" elif values[i]['type'] == "5": values[i]['type'] = "Watch_web_greader" watch_collection = Watch_collection(self.specto) watch_collection.create(values) self._import.set_new_watch_db(watch_collection) for watch in watch_collection: self._import.add_watch_entry(watch.id) if __name__ == "__main__": # Run the gui app = Import_watch() gtk.main() specto-0.3.1/spectlib/tools/0000755000175000017500000000000011226433142014361 5ustar jeffjeffspecto-0.3.1/spectlib/tools/iniparser.py0000644000175000017500000005474611210244417016745 0ustar jeffjeff# Copyright (c) 2001, 2002, 2003 Python Software Foundation # Copyright (c) 2004 Paramjit Oberoi # All Rights Reserved. See LICENSE-PSF & LICENSE for details. # Copyright (c) 2001, 2002, 2003 Python Software Foundation # Copyright (c) 2004 Paramjit Oberoi # All Rights Reserved. See LICENSE-PSF & LICENSE for details. """Implements basic mechanisms for managing configuration information * A NAMESPACE is a collection of values and other namepsaces * A VALUE is a basic value, like 3.1415, or 'Hello World!' * A NAME identifies a value or namespace within a namespace The namespace class is an abstract class that defines the basic interface implemented by all namespace objects. Two concrete implementations are include: basic_namespace and ini_namespace. Each is described in detail elsewhere. However, here's an example of the capabilities available: Create namespace and populate it: >>> n = basic_namespace() >>> n.playlist.expand_playlist = True >>> n.ui.display_clock = True >>> n.ui.display_qlength = True >>> n.ui.width = 150 Examine data: >>> print n.playlist.expand_playlist True >>> print n['ui']['width'] 150 >>> print n playlist.expand_playlist = True ui.display_clock = True ui.display_qlength = True ui.width = 150 Delete items: >>> del n.playlist >>> print n ui.display_clock = True ui.display_qlength = True ui.width = 150 Convert it to ini format: >>> from cfgparse import iniparser >>> i = iniparser.ini_namespace() >>> i.import_namespace(n) >>> print i [ui] display_clock = True display_qlength = True width = 150 """ # ---- Abstract classes class namespace(object): def __getitem__(self, key): return NotImplementedError(key) def __setitem__(self, key, value): raise NotImplementedError(key, value) def __delitem__(self, key): raise NotImplementedError(key) def __iter__(self): return NotImplementedError() def new_namespace(self, name): raise NotImplementedError(name) def __getattr__(self, name): try: return self.__getitem__(name) except KeyError: return unknown(name, self) def __setattr__(self, name, value): try: object.__getattribute__(self, name) object.__setattr__(self, name, value) return except AttributeError: self.__setitem__(name, value) def __delattr__(self, name): try: object.__getattribute__(self, name) object.__delattr__(self, name) except AttributeError: self.__delitem__(name) def import_namespace(self, ns): for name in ns: value = ns[name] if isinstance(value, namespace): try: myns = self[name] if not isinstance(myns, namespace): raise TypeError('value-namespace conflict') except KeyError: myns = self.new_namespace(name) myns.import_namespace(value) else: self[name] = value class unknown(object): def __init__(self, name, namespace): object.__setattr__(self, 'name', name) object.__setattr__(self, 'namespace', namespace) def __setattr__(self, name, value): obj = self.namespace.new_namespace(self.name) obj[name] = value # ---- Basic implementation of namespace class basic_namespace(namespace): """Represents a collection of named values Values are added using dotted notation: >>> n = basic_namespace() >>> n.x = 7 >>> n.name.first = 'paramjit' >>> n.name.last = 'oberoi' ...and accessed the same way, or with [...]: >>> n.x 7 >>> n.name.first 'paramjit' >>> n.name.last 'oberoi' >>> n['x'] 7 The namespace object is a 'container object'. The default iterator returns the names of values (i.e. keys). >>> l = list(n) >>> l.sort() >>> l ['name', 'x'] Values can be deleted using 'del' and printed using 'print'. >>> n.aaa = 42 >>> del n.x >>> print n aaa = 42 name.first = paramjit name.last = oberoi Nested namepsaces are also namespaces: >>> isinstance(n.name, namespace) True >>> print n.name first = paramjit last = oberoi Finally, values can be read from a file as follows: >>> from StringIO import StringIO >>> sio = StringIO(''' ... # comment ... ui.height = 100 ... ui.width = 150 ... complexity = medium ... have_python ... data.secret.password = goodness=gracious me ... ''') >>> n = basic_namespace() >>> n.readfp(sio) >>> print n complexity = medium data.secret.password = goodness=gracious me have_python ui.height = 100 ui.width = 150 """ # this makes sure that __setattr__ knows this is not a value key _data = None def __init__(self): self._data = {} def __getitem__(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __iter__(self): return iter(self._data) def __str__(self, prefix=''): lines = [] keys = self._data.keys() keys.sort() for name in keys: value = self._data[name] if isinstance(value, namespace): lines.append(value.__str__(prefix='%s%s.' % (prefix, name))) else: if value is None: lines.append('%s%s' % (prefix, name)) else: lines.append('%s%s = %s' % (prefix, name, value)) return '\n'.join(lines) def new_namespace(self, name): obj = basic_namespace() self._data[name] = obj return obj def readfp(self, fp): for line in fp: line = line.strip() if not line: continue if line[0] == '#': continue data = line.split('=', 1) if len(data) == 1: name = line value = None else: name = data[0].strip() value = data[1].strip() name_components = name.split('.') ns = self for n in name_components[:-1]: try: ns = ns[n] if not isinstance(ns, namespace): raise TypeError('value-namespace conflict', n) except KeyError: ns = ns.new_namespace(n) ns[name_components[-1]] = value # Copyright (c) 2001, 2002, 2003 Python Software Foundation # Copyright (c) 2004 Paramjit Oberoi # All Rights Reserved. See LICENSE-PSF & LICENSE for details. """Access and/or modify INI files * Compatiable with confConfigParser * Preserves order of sections & options * Preserves comments/blank lines/etc * More conveninet access to data Example: >>> from StringIO import StringIO >>> sio = StringIO('''# configure foo-application ... [foo] ... bar1 = qualia ... bar2 = 1977 ... [foo-ext] ... special = 1 ... ''') >>> cfg = ini_namespace(sio) >>> print cfg.special 1 >>> print cfg.foo.bar1 qualia >>> cfg.foo.newopt = 'hi!' >>> print cfg # configure foo-application [foo] bar1 = qualia bar2 = 1977 newopt = hi! [foo-ext] special = 1 """ # An iniparser that supports ordered sections/options # Also supports updates, while preserving structure # Backward-compatiable with ConfigParser import re from sets import Set from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError class line_type(object): line = None def __init__(self, line=None): if line is not None: self.line = line.strip('\n') def __str__(self): if self.line is not None: return self.line else: return self.to_string() def __setattr__(self, name, value): if hasattr(self, name): self.__dict__['line'] = None self.__dict__[name] = value def to_string(self): raise Exception('This method must be overridden in derived classes') class section_line(line_type): regex = re.compile(r'^\[' r'(?P[^]]+)' r'\]\s*' r'((?P;|#)(?P.*))?$') def __init__(self, name, comment=None, comment_separator=None, comment_offset=-1, line=None): super(section_line, self).__init__(line) self.name = name self.comment = comment self.comment_separator = comment_separator self.comment_offset = comment_offset def to_string(self): out = '[' + self.name + ']' if self.comment is not None: # try to preserve indentation of comments out = (out+' ').ljust(self.comment_offset) out = out + self.comment_separator + self.comment return out def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('name'), m.group('comment'), m.group('csep'), m.start('csep'), line) parse = classmethod(parse) class option_line(line_type): def __init__(self, name, value, separator='=', comment=None, comment_separator=None, comment_offset=-1, line=None): super(option_line, self).__init__(line) self.name = name self.value = value self.separator = separator self.comment = comment self.comment_separator = comment_separator self.comment_offset = comment_offset def to_string(self): out = '%s %s %s' % (self.name, self.separator, self.value) if self.comment is not None: # try to preserve indentation of comments out = (out+' ').ljust(self.comment_offset) out = out + self.comment_separator + self.comment return out regex = re.compile(r'^(?P[^:=\s[][^:=]*)' r'\s*(?P[:=])\s*' r'(?P.*)$') def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None name = m.group('name').rstrip() value = m.group('value') sep = m.group('sep') # comments are not detected in the regex because # ensuring total compatibility with ConfigParser # requires that: # option = value ;comment // value=='value' # option = value;1 ;comment // value=='value;1 ;comment' # # Doing this in a regex would be complicated. I # think this is a bug. The whole issue of how to # include ';' in the value needs to be addressed. # Also, '#' doesn't mark comments in options... coff = value.find(';') if coff != -1 and value[coff-1].isspace(): comment = value[coff+1:] csep = value[coff] value = value[:coff].rstrip() coff = m.start('value') + coff else: comment = None csep = None coff = -1 return cls(name, value, sep, comment, csep, coff, line) parse = classmethod(parse) class comment_line(line_type): regex = re.compile(r'^(?P[;#]|[rR][eE][mM])' r'(?P.*)$') def __init__(self, comment='', separator='#', line=None): super(comment_line, self).__init__(line) self.comment = comment self.separator = separator def to_string(self): return self.separator + self.comment def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('comment'), m.group('csep'), line) parse = classmethod(parse) class empty_line(line_type): def to_string(self): return '' def parse(cls, line): if line.strip(): return None return cls(line) parse = classmethod(parse) class continuation_line(line_type): regex = re.compile(r'^\s+(?P.*)$') def __init__(self, value, value_offset=8, line=None): super(continuation_line, self).__init__(line) self.value = value self.value_offset = value_offset def to_string(self): return ' '*self.value_offset + self.value def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('value'), m.start('value'), line) parse = classmethod(parse) class line_container(object): def __init__(self, d=None): self.contents = [] if d: if isinstance(d, list): self.extend(d) else: self.add(d) def add(self, x): self.contents.append(x) def extend(self, x): for i in x: self.add(i) def get_name(self): return self.contents[0].name def set_name(self, data): self.contents[0].name = data def get_value(self): if len(self.contents) == 1: return self.contents[0].value else: return '\n'.join([str(x.value) for x in self.contents]) def set_value(self, data): lines = str(data).split('\n') linediff = len(lines) - len(self.contents) if linediff > 0: for _ in range(linediff): self.add(continuation_line('')) elif linediff < 0: self.contents = self.contents[:linediff] for i, v in enumerate(lines): self.contents[i].value = v name = property(get_name, set_name) value = property(get_value, set_value) def __str__(self): s = [str(x) for x in self.contents] return '\n'.join(s) def finditer(self, key): for x in self.contents[::-1]: if hasattr(x, 'name') and x.name==key: yield x def find(self, key): for x in self.finditer(key): return x raise KeyError(key) class section(namespace): _lines = None _options = None _defaults = None _optionxform = None def __init__(self, lineobj, defaults = None, optionxform=None): self._lines = [lineobj] self._defaults = defaults self._optionxform = optionxform self._options = {} def __getitem__(self, key): if key == '__name__': return self._lines[-1].name if self._optionxform: key = self._optionxform(key) try: return self._options[key].value except KeyError: if self._defaults and key in self._defaults._options: return self._defaults._options[key].value else: raise def __setitem__(self, key, value): if self._optionxform: xkey = self._optionxform(key) else: xkey = key if xkey not in self._options: # create a dummy object - value may have multiple lines obj = line_container(option_line(key, '')) self._lines[-1].add(obj) self._options[xkey] = obj # the set_value() function in line_container # automatically handles multi-line values self._options[xkey].value = value def __delitem__(self, key): if self._optionxform: key = self._optionxform(key) for l in self._lines: remaining = [] for o in l.contents: if isinstance(o, line_container): n = o.name if self._optionxform: n = self._optionxform(n) if key != n: remaining.append(o) else: remaining.append(o) l.contents = remaining del self._options[key] def __iter__(self): d = Set() for l in self._lines: for x in l.contents: if isinstance(x, line_container): if self._optionxform: ans = self._optionxform(x.name) else: ans = x.name if ans not in d: yield ans d.add(ans) if self._defaults: for x in self._defaults: if x not in d: yield x d.add(x) def new_namespace(self, name): raise Exception('No sub-sections allowed', name) def make_comment(line): return comment_line(line.rstrip()) class ini_namespace(namespace): _data = None _sections = None _defaults = None _sectionxform = None _optionxform = None _parse_exc = None def __init__(self, fp=None, defaults = None, parse_exc=True, optionxform=str.lower, sectionxform=None): self._data = line_container() self._parse_exc = parse_exc self._optionxform = optionxform self._sectionxform = sectionxform self._sections = {} if defaults is None: defaults = {} self._defaults = section(line_container(), optionxform=optionxform) for name, value in defaults.iteritems(): self._defaults[name] = value if fp is not None: self.readfp(fp) def __getitem__(self, key): if key == DEFAULTSECT: return self._defaults if self._sectionxform: key = self._sectionxform(key) return self._sections[key] def __setitem__(self, key, value): raise Exception('Values must be inside sections', key, value) def __delitem__(self, key): if self._sectionxform: key = self._sectionxform(key) self._data.contents.remove(self._sections[key]._lineobj) del self._sections[key] def __iter__(self): d = Set() for x in self._data.contents: if isinstance(x, line_container): if x.name not in d: yield x.name d.add(x.name) def new_namespace(self, name): if self._data.contents: self._data.add(empty_line()) obj = line_container(section_line(name)) self._data.add(obj) if self._sectionxform: name = self._sectionxform(name) if name in self._sections: ns = self._sections[name] ns._lines.append(obj) else: ns = section(obj, defaults=self._defaults, optionxform=self._optionxform) self._sections[name] = ns return ns def __str__(self): return str(self._data) _line_types = [empty_line, comment_line, section_line, option_line, continuation_line] def _parse(self, line): for linetype in self._line_types: lineobj = linetype.parse(line) if lineobj: return lineobj else: # can't parse line return None def readfp(self, fp): cur_section = None cur_option = None cur_section_name = None cur_option_name = None line = None pending_lines = [] try: fname = fp.name except AttributeError: fname = '' linecount = 0 exc = None for line in fp: lineobj = self._parse(line) linecount += 1 if not cur_section and not isinstance(lineobj, (comment_line, empty_line, section_line)): if self._parse_exc: raise MissingSectionHeaderError(fname, linecount, line) else: lineobj = make_comment(line) if lineobj is None: if self._parse_exc: if exc is None: exc = ParsingError(fname) exc.append(linecount, line) lineobj = make_comment(line) if isinstance(lineobj, continuation_line): if cur_option: cur_option.add(lineobj) else: # illegal continuation line - convert to comment if self._parse_exc: if exc is None: exc = ParsingError(fname) exc.append(linecount, line) lineobj = make_comment(line) else: cur_option = None cur_option_name = None if isinstance(lineobj, option_line): cur_section.extend(pending_lines) pending_lines = [] cur_option = line_container(lineobj) cur_section.add(cur_option) if self._optionxform: cur_option_name = self._optionxform(cur_option.name) else: cur_option_name = cur_option.name if cur_section_name == DEFAULTSECT: optobj = self._defaults else: optobj = self._sections[cur_section_name] optobj._options[cur_option_name] = cur_option if isinstance(lineobj, section_line): self._data.extend(pending_lines) pending_lines = [] cur_section = line_container(lineobj) self._data.add(cur_section) if cur_section.name == DEFAULTSECT: self._defaults._lines.append(cur_section) cur_section_name = DEFAULTSECT else: if self._sectionxform: cur_section_name = self._sectionxform(cur_section.name) else: cur_section_name = cur_section.name if not cur_section_name in self._sections: self._sections[cur_section_name] = \ section(cur_section, defaults=self._defaults, optionxform=self._optionxform) else: self._sections[cur_section_name]._lines. \ append(cur_section) if isinstance(lineobj, (comment_line, empty_line)): pending_lines.append(lineobj) self._data.extend(pending_lines) if line and line[-1] == '\n': self._data.add(empty_line()) if exc: raise exc specto-0.3.1/spectlib/tools/web_proxy.py0000644000175000017500000000306011210223337016744 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # web_proxy.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import urllib2 #to add a timeout to the global process import socket from spectlib.tools.specto_gconf import Specto_gconf proxy_gconf = Specto_gconf("/system/http_proxy") socket.setdefaulttimeout(10)# set globally the timeout to 10 if proxy_gconf.get_entry("use_http_proxy"): http_proxy = "http://%s:%s" % (proxy_gconf.get_entry("host"), \ proxy_gconf.get_entry("port")) proxy_gconf = Specto_gconf("/system/proxy") https_proxy = "https://%s:%s" % (proxy_gconf.get_entry("secure_host"), \ proxy_gconf.get_entry("secure_port")) proxy = {"http": http_proxy, "https": https_proxy} proxy_support = urllib2.ProxyHandler(proxy) opener = urllib2.build_opener(proxy_support) specto-0.3.1/spectlib/tools/networkmanager.py0000644000175000017500000001150411210244417017756 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # networkmanager.py # # Copyright (c) 2006-2007 Christopher Halse Rogers # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import dbus import dbus.glib import urllib2 import gobject import time def get_net_listener(): try: listener = NMListener(dbus.SystemBus()) if not listener.has_networkmanager(): listener = FallbackListener() except dbus.DBusException: listener = FallbackListener() return listener class CallbackRunner(object): def __init__(self): self.callbacks = {} def add_callback(self, callback, *args, **kwargs): self.callbacks[callback] = (args, kwargs) def _run_callbacks(self): # We can't delete items from a dict we're iterating over # so we must make a copy first cb = dict(self.callbacks) for fn, (args, kwargs) in cb.iteritems(): fn(*args, **kwargs) del self.callbacks[fn] class NMListener(CallbackRunner): statusTable = {0: u'Unknown', 1: u'Asleep', 2: u'Connecting', 3: u'Connected', 4: u'Disconnected'} def __init__(self, bus): super(NMListener, self).__init__() self.nm_7 = False nmProxy = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager') try: self.nmIface = dbus.Interface(nmProxy, "org.freedesktop.DBus.Properties") bus.add_signal_receiver(self.on_nm_event, 'StateChanged', 'org.freedesktop.NetworkManager', 'org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager') self.lastStatus = self.nmIface.Get("org.freedesktop.NetworkManager", "State") self.nm_7 = True except: self.nmIface = dbus.Interface(nmProxy, 'org.freedesktop.NetworkManager') self.nmIface.connect_to_signal('DeviceNoLongerActive', self.on_nm_event, 'org.freedesktop.NetworkManager') self.nmIface.connect_to_signal('DeviceNowActive', self.on_nm_event, 'org.freedesktop.NetworkManager') self.lastStatus = self.nmIface.state() def on_nm_event(self, *args, **kwargs): wasConnected = self.connected() if self.nm_7: self.lastStatus = self.nmIface.Get("org.freedesktop.NetworkManager", "State") else: self.lastStatus = self.nmIface.state() if (not wasConnected) and self.connected(): self._run_callbacks() def connected(self): return self.lastStatus == 3 def has_networkmanager(self): ### It seems that the only way of being sure the service exists ### is to actually try to use it! try: if self.nm_7: self.nmIface.Get("org.freedesktop.NetworkManager", "State") else: self.nmIface.state() except dbus.DBusException: return False return True class FallbackListener(CallbackRunner): def __init__(self): self.last_checked = 0 self._lastConnected = self.connected() self._timer_id = gobject.timeout_add(int(10*60*1000), self._callback) def connected(self): if (time.time() - self.last_checked) > 10*60: self.last_checked = time.time() try: # try to see if google can be reached # i.e. connection to internet is up ping = urllib2.urlopen('http://www.google.com') ping.close() self._lastConnected = True except IOError: self._lastConnected = False return self._lastConnected def _callback(self): wasConnected = self._lastConnected self._lastConnected = self.connected() if (not wasConnected) and self._lastConnected: self._run_callbacks() specto-0.3.1/spectlib/tools/specto_gconf.py0000644000175000017500000000672711210223336017413 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # specto_gconf.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import gconf class Specto_gconf: """ Specto gconf class. """ def __init__(self, directory): # Get the GConf object self.client = gconf.client_get_default() self.client.add_dir(directory, gconf.CLIENT_PRELOAD_NONE) self.directory = directory self.org_directory = directory def set_directory(self, dir): if dir != "": #change the dir #check if the dir has to change if self.org_directory + dir != self.directory: self.directory = self.org_directory + dir self.client = gconf.client_get_default() self.client.add_dir(self.directory, gconf.CLIENT_PRELOAD_NONE) else: #change dir to original dir self.directory = self.org_directory self.client = gconf.client_get_default() self.client.add_dir(self.directory, gconf.CLIENT_PRELOAD_NONE) def get_entry(self, key): if "/" in key: dir = "/" + key[:key.index('/')] self.set_directory(dir) key = key[key.index('/')+1:] k = self.directory + "/" + key value = self.client.get(k) if value == None: return None if value.type == gconf.VALUE_STRING: return value.get_string() elif value.type == gconf.VALUE_BOOL: return value.get_bool() elif value.type == gconf.VALUE_INT: return value.get_int() def set_entry(self, key, entry): """ Set the value from a key. """ if "/" in key: dir = "/" + key[:key.index('/')] self.set_directory(dir) key = key[key.index('/')+1:] k = self.directory + "/" + key if type(entry) == type(str()): self.client.set_string(k, entry) elif type(entry) == type(bool()): self.client.set_bool(k, entry) elif type(entry) == type(int()): self.client.set_int(k, entry) elif type(entry) == type(float()): self.client.set_float(k, entry) def unset_entry(self, key): """ Unset (remove) the key. """ if "/" in key: dir = "/" + key[:key.index('/')] self.set_directory(dir) key = key[key.index('/')+1:] k = self.directory + "/" + key self.client.unset(k) def notify_entry(self, key, callback, label): """ Listen for changes in a key. """ if "/" in key: dir = "/" + key[:key.index('/')] self.set_directory(dir) key = key[key.index('/')+1:] k = self.directory + "/" + key self.client.notify_add(k, callback, label) specto-0.3.1/spectlib/tools/__init__.py0000644000175000017500000000000011041474551016464 0ustar jeffjeffspecto-0.3.1/spectlib/tools/keyringmanager.py0000644000175000017500000000456511210244417017746 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # keyringmanager.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import gnomekeyring as gkey class Keyring(object): def __init__(self, name, server, protocol): self._name = name self._server = server self._protocol = protocol self._key = gkey.ITEM_NETWORK_PASSWORD self._keyring = gkey.get_default_keyring_sync() def has_credentials(self): try: if self._key == gkey.ITEM_NETWORK_PASSWORD: attrs = {"server": self._server, "protocol": self._protocol} items = gkey.find_items_sync(gkey.ITEM_NETWORK_PASSWORD, attrs) return len(items) > 0 if self._key == gkey.ITEM_GENERIC_SECRET: attrs = {"name": self._name} items = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, attrs) return len(items) > 0 except gkey.DeniedError: return False def get_credentials(self): attrs = {"server": self._server, "protocol": self._protocol} items = gkey.find_items_sync(gkey.ITEM_NETWORK_PASSWORD, attrs) return (items[0].attributes["user"], items[0].secret) def remove_keyring(self, password): id = password.split(":")[1] gkey.item_delete_sync(self._keyring, int(id)) def set_credentials(self, (user, pw)): attrs = { "user": user, "server": self._server, "protocol": self._protocol, } id = gkey.item_create_sync(gkey.get_default_keyring_sync(),\ gkey.ITEM_NETWORK_PASSWORD, self._name, attrs, pw, True) return id specto-0.3.1/spectlib/balloons.py0000644000175000017500000000775511210244417015420 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # balloons.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import pygtk pygtk.require('2.0') import pynotify import sys import gtk import spectlib.util from time import sleep from spectlib.i18n import _ notifyInitialized = False class NotificationToast: _notifyRealm = 'Specto' _Urgencies = {'low': pynotify.URGENCY_LOW, 'critical': pynotify.URGENCY_CRITICAL, 'normal': pynotify.URGENCY_NORMAL} def __open_watch(self, n, action, id): if self.specto.notifier.open_watch(id): self.specto.notifier.mark_watch_as_read('', id) def __init__(self, specto, notifier): global notifyInitialized self.specto = specto self.notifier = notifier if not notifyInitialized: pynotify.init(self._notifyRealm) notifyInitialized = True # Check the features available from the notification daemon self.capabilities = {'actions': False, 'body': False, 'body-hyperlinks': False, 'body-images': False, 'body-markup': False, 'icon-multi': False, 'icon-static': False, 'sound': False, 'image/svg+xml': False, 'append': False} caps = pynotify.get_server_caps() if caps is None: print "Failed to receive server caps." sys.exit(1) for cap in caps: self.capabilities[cap] = True def show_toast(self, body, icon=None, urgency="low", summary=_notifyRealm, name=None): tray_x = 0 tray_y = 0 if notifyInitialized: sleep(0.5) # FIXME: issue #43, associate the balloon with the notification icon properly. Currently, this is a hack to leave time for the tray icon to appear before getting its coordinates tray_x = self.notifier.tray.get_x() tray_y = self.notifier.tray.get_y() self.toast = pynotify.Notification(summary, body) if name: # If name is not None and exists in specto.watch_db, a button is added to the notification w = self.specto.watch_db.find_watch(name) if w != -1 and self.capabilities["actions"]: # Don't request action buttons if the notification daemon (ex: notify-osd) rejects them self.toast.add_action("clicked", gtk.stock_lookup(gtk.STOCK_JUMP_TO)[1].replace('_', ''), self.__open_watch, w) self.toast.set_urgency(self._Urgencies[urgency]) if icon: #self.toast.set_property('icon-name', icon) # We now use a pixbuf in the line below to allow themable icons self.toast.set_icon_from_pixbuf(icon) if tray_x != 0 and tray_y != 0: # grab the x and y position of the tray icon and make the balloon emerge from it self.toast.set_hint("x", tray_x) self.toast.set_hint("y", tray_y) try: self.toast.show() except: self.specto.logger.log(_("Cannot display notification message. Make sure that libnotify and D-Bus are available on your system."), "error", self.specto) specto-0.3.1/spectlib/gtkconfig.py0000644000175000017500000004011111225517121015542 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # gtkutil.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import gtk import os from spectlib.i18n import _ import spectlib.util class Entry(): def __init__(self, label, text=None): self.table = gtk.Table(rows=1, columns=2, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.entry = gtk.Entry() if text != None: self.entry.set_text(text) self.entry.show() self.table.attach(self.entry, 1, 2, 0, 1) self.table.show() def set_value(self, value): self.entry.set_text(value) def get_value(self): return self.entry.get_text() def get_widget(self): return self.table, self.entry def set_color(self, red, blue, green): self.entry.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.entry.grab_focus() class PasswordEntry(): def __init__(self, label, text=None): self.table = gtk.Table(rows=1, columns=2, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.entry = gtk.Entry() self.entry.set_visibility(False) if text != None: self.entry.set_text(text) self.entry.show() self.table.attach(self.entry, 1, 2, 0, 1) self.table.show() def set_value(self, value): self.entry.set_text(value) def get_value(self): return self.entry.get_text() def get_widget(self): return self.table, self.entry def set_color(self, red, blue, green): self.entry.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.entry.grab_focus() class Spinbutton(): def __init__(self, label, value=1, lower=1, upper=100, \ step_incr=1, page_incr=10, page_size=0): self.table = gtk.Table(rows=1, columns=2, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) adjustment = gtk.Adjustment(value, lower, upper, \ step_incr, page_incr, page_size) self.spinbutton = gtk.SpinButton(adjustment) self.spinbutton.show() self.table.attach(self.spinbutton, 1, 2, 0, 1) self.table.show() def set_value(self, value): self.spinbutton.set_value(value) def get_value(self): return self.spinbutton.get_value() def get_widget(self): return self.table, self.spinbutton def set_color(self, red, blue, green): self.spinbutton.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.spinbutton.grab_focus() class CheckButton(): def __init__(self, label, value=False): self.table = gtk.Table(rows=1, columns=2, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.checkbutton = gtk.CheckButton() self.checkbutton.set_active(value) self.checkbutton.show() self.table.attach(self.checkbutton, 1, 2, 0, 1) self.table.show() def set_value(self, value): self.checkbutton.set_active(value) def get_value(self): return self.checkbutton.get_active() def get_widget(self): return self.table, self.checkbutton def set_color(self, red, blue, green): self.checkbutton.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.checkbutton.grab_focus() class FileChooser(): def __init__(self, label, value=False): self.table = gtk.Table(rows=2, columns=1, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.filechooser = gtk.FileChooserButton(_("Choose a file")) self.filechooser.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) self.filechooser.set_filename(os.environ['HOME']) self.filechooser.show() self.table.attach(self.filechooser, 0, 1, 1, 2) self.table.show() def set_value(self, value): self.filechooser.set_filename(value) def get_value(self): return self.filechooser.get_filename() def get_widget(self): return self.table, self.filechooser def set_color(self, red, blue, green): self.filechooser.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.filechooser.grab_focus() class FolderChooser(): def __init__(self, label, value=False): self.table = gtk.Table(rows=2, columns=1, homogeneous=True) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.dirchooser = gtk.FileChooserButton(_("Choose a directory")) self.dirchooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) self.dirchooser.set_filename(os.environ['HOME']) self.dirchooser.show() self.table.attach(self.dirchooser, 0, 1, 1, 2) self.table.show() def set_value(self, value): self.dirchooser.set_filename(value) def get_value(self): return self.dirchooser.get_filename() def get_widget(self): return self.table, self.dirchooser def set_color(self, red, blue, green): self.dirchooser.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.dirchooser.grab_focus() class Scale(): def __init__(self, label, value=0, lower=0, upper=100, \ step_incr=1.0, page_incr=1.0, page_size=10): self.table = gtk.Table(rows=2, columns=1, homogeneous=False) self.gtkLabel = gtk.Label((label + ":")) self.gtkLabel.set_alignment(xalign=0.0, yalign=0.5) self.gtkLabel.show() self.table.attach(self.gtkLabel, 0, 1, 0, 1) self.value = value self.lower = lower self.upper = upper self.step_incr = step_incr self.page_incr = page_incr self.page_size = page_size _adjustment = gtk.Adjustment(value, lower, upper, \ step_incr, page_incr, page_size) self.scale = gtk.HScale(adjustment=_adjustment) self.scale.set_digits(1) self.scale.set_value_pos(gtk.POS_RIGHT) self.scale.show() self.table.attach(self.scale, 0, 1, 1, 2) self.table.show() def set_value(self, value): _adjustment = gtk.Adjustment(value, self.lower, self.upper, \ self.step_incr, self.page_incr, self.page_size) self.scale.set_adjustment(_adjustment) def get_value(self): return self.scale.get_value() def get_widget(self): return self.table, self.scale def set_color(self, red, blue, green): self.scale.modify_base(gtk.STATE_NORMAL, \ gtk.gdk.Color(red, blue, green)) def grab_focus(self): self.scale.grab_focus() class RemoveDialog(): def __init__(self, title, text): dialog = gtk.Dialog(title, None, gtk.DIALOG_MODAL | \ gtk.DIALOG_NO_SEPARATOR | gtk.DIALOG_DESTROY_WITH_PARENT, None) #HIG tricks dialog.set_has_separator(False) dialog.add_button(gtk.STOCK_REMOVE, 3) dialog.add_button(gtk.STOCK_CANCEL, -1) dialog.label_hbox = gtk.HBox(spacing=6) icon = gtk.Image() icon.set_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) dialog.label_hbox.pack_start(icon, True, True, 6) icon.show() text = text.replace("&", "&") label = gtk.Label(text) label.set_use_markup(True) dialog.label_hbox.pack_start(label, True, True, 6) label.show() dialog.vbox.pack_start(dialog.label_hbox, True, True, 12) dialog.label_hbox.show() icon = gtk.gdk.pixbuf_new_from_file(spectlib.util.get_path() \ + 'icons/specto_window_icon.svg') dialog.set_icon(icon) self.dialog = dialog def show(self): answer = self.dialog.run() if answer == 3: self.dialog.destroy() return True else: self.dialog.destroy() return False class ErrorDialog(): def __init__(self, specto, error_message): self.specto = specto gladefile = os.path.join(self.specto.PATH, "glade/notifier.glade") windowname = "error_dialog" self.wTree = gtk.glade.XML(gladefile, windowname, \ self.specto.glade_gettext) dic = {"on_send_clicked": self.send, "on_ok_clicked": self.delete_event} #attach the events self.wTree.signal_autoconnect(dic) self.error_dialog = self.wTree.get_widget("error_dialog") self.error_dialog.show() icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.error_dialog.set_icon(icon) self.errorwindow = gtk.TextBuffer(None) self.wTree.get_widget("error_message").set_buffer(self.errorwindow) self.errorwindow.set_text(error_message) self.wTree.get_widget("image").set_from_stock(gtk.STOCK_DIALOG_ERROR, \ gtk.ICON_SIZE_DIALOG) self.wTree.get_widget("label4").set_use_markup(True) self.wTree.get_widget("label4").set_label(_("Specto encountered an error\nPlease verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.")) def send(self, *args): url = "http://code.google.com/p/specto/issues/list" os.system(spectlib.util.return_webpage(url) + " &") def delete_event(self, widget, *args): """ Destroy the window. """ self.error_dialog.destroy() return True def create_widget(table, widget_type, value, label, position): i = position watch_options = {} if not widget_type == "scale": gtkLabel = gtk.Label((label + ":")) gtkLabel.set_alignment(xalign=0.0, yalign=0.5) gtkLabel.show() table.attach(gtkLabel, 0, 1, i, i + 1) if widget_type == "entry": entry = gtk.Entry() entry.show() watch_options.update({value: entry}) table.attach(entry, 1, 2, i, i + 1) elif widget_type == "password": entry = gtk.Entry() entry.set_visibility(False) entry.show() watch_options.update({value: entry}) table.attach(entry, 1, 2, i, i + 1) elif widget_type == "scale": scale_table = gtk.Table(rows=2, columns=1, homogeneous=False) adjustment_label = gtk.Label((label + ":")) adjustment_label.set_alignment(xalign=0.0, yalign=0.5) adjustment_label.show() scale_table.attach(adjustment_label, 0, 1, 0, 1) _adjustment = gtk.Adjustment(value=2.0, lower=0, upper=50, \ step_incr=0.1, page_incr=1.0, page_size=10) scale = gtk.HScale(adjustment=_adjustment) scale.set_digits(1) scale.set_value_pos(gtk.POS_RIGHT) scale.show() scale_table.attach(scale, 0, 1, 1, 2) watch_options.update({value: scale}) scale_table.show() table.attach(scale_table, 0, 2, i, i + 1) elif widget_type == "checkbox": checkbox = gtk.CheckButton() checkbox.show() watch_options.update({value: checkbox}) table.attach(checkbox, 1, 2, i, i + 1) elif widget_type == "filechooser": filechooser = gtk.FileChooserButton(_("Choose a file")) filechooser.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) filechooser.show() watch_options.update({value: filechooser}) table.attach(filechooser, 1, 2, i, i + 1) elif widget_type == "dirchooser": dirchooser = gtk.FileChooserButton(_("Choose a directory")) dirchooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) dirchooser.show() watch_options.update({value: dirchooser}) table.attach(dirchooser, 1, 2, i, i + 1) elif widget_type == "calendar": calendar = gtk.Calendar() #calendar.show() watch_options.update({value: calendar}) table.attach(calendar, 1, 2, i, i + 1) elif widget_type == "time": time_table = gtk.Table(rows=1, columns=2, homogeneous=False) minutes_adjustment = gtk.Adjustment(value=1, lower=1, upper=60, \ step_incr=1, page_incr=10, page_size=0) hours_adjustment = gtk.Adjustment(value=1, lower=1, upper=24, \ step_incr=1, page_incr=10, page_size=0) hours = gtk.SpinButton(hours_adjustment) hours.show() minutes = gtk.SpinButton(minutes_adjustment) minutes.show() time_table.attach(hours, 1, 2, 1, 2) time_table.attach(minutes, 2, 3, 1, 2) #time_table.show() watch_options.update({value: (hours, minutes)}) table.attach(time_table, 1, 2, i, i + 1) return watch_options, table def set_widget_value(widget_type, widget, value): if widget_type == "entry" or widget_type == "password": widget.set_text(value) elif widget_type == "scale": _adjustment = gtk.Adjustment(value=value * 100, lower=0, \ upper=50, step_incr=0.1, page_incr=1.0, page_size=10) widget.set_adjustment(_adjustment) elif widget_type == "checkbox": if value == "True" or value == True: widget.set_active(1) else: widget.set_active(0) elif widget_type == "filechooser" or widget_type == "dirchooser": widget.set_filename(value) elif widget_type == "calendar": try: #if value = string value = value.replace("(", "") value = value.replace(")", "") value = value.split(",") except: # value = tuple pass widget.select_month(int(value[1]), int(value[0])) widget.select_day(int(value[2])) elif widget_type == "time": widget[0].set_value(int(value[0])) widget[1].set_value(int(value[1])) def get_widget_value(widget_type, value): result = "" if widget_type == "entry" or widget_type == "password": result = value.values()[0].get_text() elif widget_type == "scale": result = value.values()[0].get_value() elif widget_type == "checkbox": result = value.values()[0].get_active() elif widget_type == "filechooser" or widget_type == "dirchooser": result = value.values()[0].get_filename() elif widget_type == "calendar": result = value.values()[0].get_date() elif widget_type == "time": result = (value.values()[0][0].get_value(), \ value.values()[0][1].get_value()) return result specto-0.3.1/spectlib/logger.py0000644000175000017500000002724111225517121015057 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # logger.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import logging import sys import os import re from datetime import datetime import traceback import shutil try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade except: pass class Log_dialog: """ Class to create the log dialog window. """ def __init__(self, specto, notifier): self.specto = specto self.notifier = notifier #create tree gladefile = os.path.join(self.specto.PATH, "glade/log_dialog.glade") windowname = "log_dialog" self.wTree = gtk.glade.XML(gladefile, windowname, \ self.specto.glade_gettext) dic = {"on_button_help_clicked": self.show_help, "on_button_save_clicked": self.save, "on_button_clear_clicked": self.clear, "on_button_close_clicked": self.delete_event, "on_button_find_clicked": self.find} #attach the events self.wTree.signal_autoconnect(dic) self.log_dialog = self.wTree.get_widget("log_dialog") icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.log_dialog.set_icon(icon) self.wTree.get_widget("combo_level").set_active(0) #read the log file self.read_log() self.logwindow = gtk.TextBuffer(None) self.log_buffer = self.wTree.get_widget("log_field").get_buffer() self.log_buffer.create_tag("ERROR", foreground="#a40000") self.log_buffer.create_tag("INFO", foreground="#4e9a06") self.log_buffer.create_tag("WARNING", foreground="#c4a000") self.log_buffer.create_tag("DEBUG", foreground="#815902") self.log_buffer.create_tag("CRITICAL", foreground="#2e3436") start = self.log_buffer.get_start_iter() end = self.log_buffer.get_end_iter() self.log_buffer.delete(start, end) iter = self.log_buffer.get_iter_at_offset(0) self.log = self.log.split("\n") for line in self.log: if line != "": tag = line.split(" - ")[1].strip() self.log_buffer.insert_with_tags_by_name(iter, \ line + "\n", tag) def save(self, widget): """ Save the text in the logwindow. """ text = self.log_buffer.get_text(self.log_buffer.get_start_iter(), \ self.log_buffer.get_end_iter()) self.save = Save_dialog(self.specto, text) def clear(self, widget): """ Clear the text in the log window and from the log file. """ start = self.log_buffer.get_start_iter() end = self.log_buffer.get_end_iter() self.log_buffer.delete(start, end) f = open(self.file_name, "w") f.write("") f.close() os.chmod(self.file_name, 0600) def find(self, widget): """ Find the lines in the log file that contain the filter word. """ self.read_log() level = self.wTree.get_widget("combo_level").get_active() buffer_log = self.log.split("\n") filtered_log = "" if level == 1: pattern = ("DEBUG") elif level == 2: pattern = ("INFO") elif level == 3: pattern = ("WARNING") elif level == 4: pattern = ("ERROR") elif level == 5: pattern = ("CRITICAL") elif level == -1: pattern = self.wTree.get_widget("combo_level").child.get_text() start = self.log_buffer.get_start_iter() end = self.log_buffer.get_end_iter() self.log_buffer.delete(start, end) iter = self.log_buffer.get_iter_at_offset(0) if level == 0: # Show everything for line in buffer_log: if line: # If the line is not empty tag = line.split(" - ")[1].strip() self.log_buffer.insert_with_tags_by_name(iter, \ line + "\n", tag) else: # Show the filtered log # Do the filtering for i in buffer_log: if re.search(pattern, i, re.IGNORECASE): filtered_log += i + "\n" filtered_log = filtered_log.split("\n") for line in filtered_log: if line: # If the line is not empty tag = line.split(" - ")[1].strip() self.log_buffer.insert_with_tags_by_name(iter, \ line + "\n", tag) def read_log(self): """ Read the log file. """ self.file_name = self.specto.SPECTO_DIR + "/specto.log" if not os.path.exists(self.file_name): f = open(self.file_name, "w") f.close() os.chmod(self.file_name, 0600) log_file = open(self.file_name, "r") self.log = log_file.read().replace("&Separator;", " - ") log_file.close() def show_help(self, widget): """ Show the help webpage. """ self.specto.util.show_webpage(\ "http://code.google.com/p/specto/wiki/Troubleshooting") def delete_event(self, widget, *args): """ Close the window. """ self.log_dialog.destroy() return True class Save_dialog: """ Class for displaying the save as dialog. """ def __init__(self, specto, *args): self.specto = specto #create tree gladefile = os.path.join(self.specto.PATH, "glade/log_dialog.glade") windowname = "file_chooser" self.wTree = gtk.glade.XML(gladefile, windowname) self.save_dialog = self.wTree.get_widget("file_chooser") dic = {"on_button_cancel_clicked": self.cancel, "on_button_save_clicked": self.save} #attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.save_dialog.set_icon(icon) self.save_dialog.set_filename(os.environ['HOME'] + "/ ") self.text = args[0] def cancel(self, *args): """ Close the save as dialog. """ self.save_dialog.destroy() def save(self, *args): """ Save the file. """ file_name = self.save_dialog.get_filename() if not os.path.exists(file_name): f = open(file_name, "w") f.close() os.chmod(file_name, 0600) f = open(file_name, "w") f.write(self.text) f.close() self.save_dialog.destroy() class Logger: """ Class for logging in Specto. """ def __init__(self, specto): self.specto = specto self.file_name = self.specto.SPECTO_DIR + "/specto.log" if not os.path.exists(self.file_name): f = open(self.file_name, "a") f.close() os.chmod(self.file_name, 0600) self.error_file = self.specto.SPECTO_DIR + "/error.log" if not os.path.exists(self.error_file): f = open(self.error_file, "a") f.close() os.chmod(self.error_file, 0600) self.log_rotation() #write to log file #TODO:XXX: Do we need to gettextize it? Maybe just the date. logging.basicConfig(level=logging.INFO, format='%(asctime)s &Separator; %(levelname)s &Separator;' \ + ' %(name)s &Separator; %(message)s', datefmt='%Y-%m-%d %H:%M:%S', filename=self.file_name, filemode='a') #write to console console = logging.StreamHandler() console.setLevel(logging.DEBUG) formatter = logging.Formatter('%(levelname)s - %(name)s - %(message)s') #formatter = logging.Formatter('%(levelname)s - %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) def log(self, message, level, logger): """ Log a message. """ log = logging.getLogger(str(logger)) if self.specto.DEBUG == True: if level == "debug": log.debug(message) elif level == "info": log.info(message) elif level == "warning": log.warn(message) elif level == "error": log.error(message) self.log_error() else: log.critical(message) self.log_error() def read_log(self): """ Read the log file. """ #get the info from the log file log_file = open(self.file_name, "r") self.logfile = log_file.read() self.logfile.replace("&Separator;", " - ") log_file.close() def watch_log(self, watch_name): """ Filter the log for a watch name. """ self.read_log() buffer_log = self.logfile.split("\n") filtered_log = [] for line in buffer_log: if line != "" and line.split("&Separator;")[2].strip() == \ watch_name: info = line.split("&Separator;") filtered_log.append([info[1].strip(), info[0] + " - " \ + info[3] + "\n"]) return filtered_log def remove_watch_log(self, watch_name): """ Remove a watch from the log file. """ self.read_log() buffer_log = self.logfile.split("\n") filtered_log = "" for i in buffer_log: if not re.search(watch_name, i) and i != "": filtered_log += i + "\n" f = open(self.file_name, "w") f.write(filtered_log) f.close() def clear_log(self, *args): """ Clear the log file. """ f = open(self.file_name, "w") f.write("") f.close() os.chmod(self.file_name, 0600) def log_error(self): error_message = "Error on: " + \ datetime.today().strftime("%A %d %b %Y %H:%M") + "\n" et, ev, tb = sys.exc_info() while tb: co = tb.tb_frame.f_code error_message += "Filename: " + str(co.co_filename) + "\n" error_message += "Error Line # : " \ + str(traceback.tb_lineno(tb)) + "\n" tb = tb.tb_next error_message += "Type: " + str(et) + "\n" + "Error: " + \ str(ev) + "\n\n" f = open(self.error_file, "a") f.write(error_message) f.close() def log_rotation(self): if os.path.getsize(self.file_name) > 150000: shutil.move(self.file_name, self.file_name + ".1") f = open(self.file_name, "a") f.close() os.chmod(self.file_name, 0600) if os.path.getsize(self.error_file) > 150000: shutil.move(self.error_file, self.error_file + ".1") f = open(self.error_file, "a") f.close() os.chmod(self.error_file, 0600) specto-0.3.1/spectlib/main.py0000644000175000017500000002464111210244417014524 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # main.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # Definition of the watch_db # watch_db[0] = instance of the first watch global GTK global DEBUG #the DEBUG constant which controls how much info is output import os import sys import gobject import gettext import spectlib.util as util from spectlib.watch import Watch_collection from spectlib.watch import Watch_io from spectlib.console import Console from spectlib.logger import Logger from spectlib.tools.specto_gconf import Specto_gconf from spectlib.i18n import _ from spectlib.tools import networkmanager as conmgr #create a gconf object specto_gconf = Specto_gconf("/apps/specto") if specto_gconf.get_entry("debug_mode")==True: DEBUG = True elif specto_gconf.get_entry("debug_mode")==False: DEBUG = False else: DEBUG = False try: import pygtk pygtk.require("2.0") import gtk import gtk.glade except: print _("no GTK, activating console mode") GTK = False else: GTK = True from spectlib.notifier import Notifier class Specto: """ The main Specto class. """ def __init__(self): self.DEBUG = DEBUG self.util = util self.PATH = self.util.get_path() self.SRC_PATH = self.util.get_path("src") self.SPECTO_DIR = self.util.get_path("specto") self.CACHE_DIR = self.util.get_path("tmp") self.FILE = self.util.get_file() self.glade_gettext = gettext.textdomain("specto") self.logger = Logger(self) self.check_instance() #see if specto is already running self.specto_gconf = specto_gconf self.check_default_settings() self.GTK = GTK self.connection_manager = conmgr.get_net_listener() self.use_keyring = self.specto_gconf.get_entry("use_keyring") #create the watch collection and add the watches self.watch_db = Watch_collection(self) self.watch_io = Watch_io(self, self.FILE) if (sys.argv[1:] and "--console" in sys.argv[1:][0]) or not self.GTK: self.logger.log(_("Console mode enabled."), "debug", "specto") self.GTK = False self.CONSOLE = True try: args = sys.argv[1:][1] except: args = "" self.console = Console(self, args) elif self.GTK: self.GTK = True self.CONSOLE = False self.icon_theme = gtk.icon_theme_get_default() self.notifier = Notifier(self) if self.specto_gconf.get_entry("always_show_icon") == False: self.notifier_hide = False elif self.specto_gconf.get_entry("show_notifier")==True: self.notifier_hide = False self.toggle_notifier() elif self.specto_gconf.get_entry("show_notifier")==False: self.notifier_hide = True else:#just in case the entry was never created in gconf self.notifier_keep_hidden = False else: sys.exit(0) #listen for gconf keys self.specto_gconf.notify_entry("debug_mode", self.key_changed, "debug") values = self.watch_io.read_all_watches(True) try: self.watch_db.create(values) except AttributeError, error_fields: self.logger.log(_("Could not create a watch, because it is corrupt."), \ "critical", "specto") if self.GTK: for watch in self.watch_db: self.notifier.add_notifier_entry(watch.id) self.notifier.refresh_all_watches() gtk.main() else: self.console.start_watches() try: self.go = gobject.MainLoop() self.go.run() except (KeyboardInterrupt, SystemExit): sys.exit(0) def key_changed(self, *args): """ Listen for gconf keys. """ label = args[3] if label == "debug": self.DEBUG = self.specto_gconf.get_entry("debug_mode") def check_default_settings(self): """ This is used to set the default settings properly the first time Specto is run, without using gconf schemas """ #check if the ekiga sounds exists if os.path.exists("/usr/share/sounds/ekiga/voicemail.wav"): changed_sound = "/usr/share/sounds/ekiga/voicemail.wav" else: changed_sound = "" self.default_settings = ( ["always_show_icon", False], #True would be against the HIG! ["debug_mode", False], ["follow_website_redirects", True], ["pop_toast", True], ["show_deactivated_watches", True], ["show_in_windowlist", True], ["show_notifier", True], ["show_toolbar", True], ["sort_function", "name"], ["sort_order", "asc"], ["changed_sound", changed_sound], ["use_changed_sound", False], ["window_notifier_height", 500], ["window_notifier_width", 500], ["use_keyring", True]) for default_setting in self.default_settings: if self.specto_gconf.get_entry(default_setting[0]) == None: self.specto_gconf.set_entry(default_setting[0], \ default_setting[1]) def check_instance(self): """ Check if specto is already running. """ pidfile = self.SPECTO_DIR + "/" + "specto.pid" if not os.path.exists(pidfile): f = open(pidfile, "w") f.close() os.chmod(pidfile, 0600) #see if specto is already running f = open(pidfile, "r") pid = f.readline() f.close() if pid: p = os.system("ps --no-heading --pid " + pid) p_name = os.popen("ps -f --pid " + pid).read() if p == 0 and "specto" in p_name: if DEBUG: self.logger.log(_("Specto is already running!"), "critical", "specto") else: print _("Specto is already running!") sys.exit(0) #write the pid file f = open(pidfile, "w") f.write(str(os.getpid())) f.close() def mark_watch_status(self, status, id): """ get the watch status (checking, changed, idle) """ if self.GTK: self.notifier.mark_watch_status(status, id) elif self.CONSOLE: self.console.mark_watch_status(status, id) def toggle_notifier(self, *args): """ Toggle the state of the notifier, hidden or shown. It will save the size, position, and the last state when you closed Specto. """ #Creating the notifier window, but keeping it hidden if self.notifier.get_state() == True and not self.notifier_hide: self.specto_gconf.set_entry("show_notifier", True) self.notifier.restore_size_and_position() self.notifier.notifier.show() self.notifier_hide = True elif self.notifier.get_state()==True and self.notifier_hide: self.notifier.save_size_and_position() self.specto_gconf.set_entry("show_notifier", False) self.notifier.notifier.hide() self.notifier_hide = False else: self.specto_gconf.set_entry("show_notifier", True) self.notifier.restore_size_and_position() self.notifier.notifier.show() self.notifier_hide = True def quit(self, *args): """ Save the save and position from the notifier and quit Specto. """ if self.notifier.get_state() == True and self.notifier_hide: self.notifier.save_size_and_position() try: gtk.main_quit() except: #create a close dialog self.dialog = gtk.Dialog(_("Cannot quit yet"), None, gtk.DIALOG_NO_SEPARATOR | gtk.DIALOG_DESTROY_WITH_PARENT, None) self.dialog.set_modal(False) # Needed to prevent the notifier UI and refresh process from blocking. Also, do not use dialog.run(), because it automatically sets modal to true. #HIG tricks self.dialog.set_has_separator(False) self.dialog.add_button(_("Murder!"), 3) self.dialog.add_button(gtk.STOCK_CANCEL, -1) self.dialog.label_hbox = gtk.HBox(spacing=6) icon = gtk.Image() icon.set_from_pixbuf(self.icon_theme.\ load_icon("dialog-warning", 64, 0)) self.dialog.label_hbox.pack_start(icon, True, True, 6) icon.show() label = gtk.Label(_('Specto is currently busy and cannot quit yet.\n\nThis may be because it is checking for watch changes.\nHowever, you can try forcing it to quit by clicking the murder button.')) label.set_use_markup(True) self.dialog.label_hbox.pack_start(label, True, True, 6) label.show() self.dialog.vbox.pack_start(self.dialog.label_hbox, True, True, 12) self.dialog.label_hbox.show() icon = gtk.gdk.pixbuf_new_from_file(self.PATH + \ 'icons/specto_window_icon.svg') self.dialog.set_icon(icon) self.dialog.connect("delete_event", self.dialog_response) self.dialog.connect("response", self.dialog_response) self.dialog.show_all() def dialog_response(self, widget, answer): if answer == 3: try:#go figure, it never works! self.notifier.stop_refresh = True sys.exit(0) except: #kill the specto process with killall os.system('killall specto') else: self.dialog.hide() specto-0.3.1/spectlib/edit_watch.py0000644000175000017500000002736711225517121015724 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # add_watch.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os from spectlib.i18n import _ try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade import spectlib.gtkconfig except: pass class Edit_watch: """Class to create the edit watch dialog.""" # Please do not use confusing widget names such as 'lbl' and 'tbl', # use full names like 'label' and 'table'. def __init__(self, specto, notifier, id): self.specto = specto self.notifier = notifier self.watch = self.specto.watch_db[id] # Create the tree gladefile = os.path.join(self.specto.PATH, "glade/edit_watch.glade") windowname = "edit_watch" self.wTree = gtk.glade.XML(gladefile, windowname, self.specto.glade_gettext) # Catch some events dic = {"on_button_cancel_clicked": self.cancel_clicked, "on_button_save_clicked": self.save_clicked, "on_button_remove_clicked": self.remove_clicked, #"on_button_clear_clicked": self.clear_clicked, # clear error_log textfield "on_button_save_as_clicked": self.save_as_clicked, # save error_log text "on_edit_watch_delete_event": self.delete_event, "check_command_toggled": self.command_toggled, "check_open_toggled": self.open_toggled, "on_refresh_unit_changed": self.set_refresh_values} # Attach the events self.wTree.signal_autoconnect(dic) # Set the info from the watch self.edit_watch = self.wTree.get_widget("edit_watch") self.edit_watch.set_title(_("Edit watch: ") + self.watch.name) self.wTree.get_widget("name").set_text(self.watch.name) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.edit_watch.set_icon(icon) self.edit_watch.set_resizable(False) refresh, refresh_unit = self.specto.watch_db.get_interval(self.watch.refresh) self.wTree.get_widget("refresh_unit").set_active(refresh_unit) self.wTree.get_widget("refresh").set_value(refresh) # Create the gui self.watch_options = {} self.create_edit_gui() if not self.specto.DEBUG: self.wTree.get_widget("notebook1").remove_page(2) else: if self.wTree.get_widget("notebook1").get_n_pages() == 3: # Put the logfile in the textview log_text = self.specto.logger.watch_log(self.watch.name) self.log_buffer = self.wTree.get_widget("error_log").get_buffer() self.log_buffer.create_tag("ERROR", foreground="#a40000") self.log_buffer.create_tag("INFO", foreground="#4e9a06") self.log_buffer.create_tag("WARNING", foreground="#c4a000") iter = self.log_buffer.get_iter_at_offset(0) for line in log_text: self.log_buffer.insert_with_tags_by_name(iter, line[1], line[0]) def cancel_clicked(self, widget): """ Destroy the edit watch dialog. """ self.edit_watch.destroy() def set_refresh_values(self, widget): """ Set the max and min values for the refresh unit. """ digits = 0 climb_rate = 1.0 refresh_unit = self.wTree.get_widget("refresh_unit").get_active() if refresh_unit == 0 or refresh_unit == 1: adjustment = gtk.Adjustment(value=1, lower=1, upper=60, step_incr=1, page_incr=10, page_size=0) if refresh_unit == 2: adjustment = gtk.Adjustment(value=1, lower=1, upper=24, step_incr=1, page_incr=10, page_size=0) if refresh_unit == 3: adjustment = gtk.Adjustment(value=1, lower=1, upper=365, step_incr=1, page_incr=30, page_size=0) self.wTree.get_widget("refresh").configure(adjustment, climb_rate, digits) def save_clicked(self, widget): """ Save the new options from the edited watch. """ values = {} #get the standard options from a watch values['name'] = self.wTree.get_widget("name").get_text()#FIXME: cfgparse cannot have single quotes (') it seems. We must watch out for the watch name or arguments not to have them. values['type'] = self.watch.type refresh_value = self.wTree.get_widget("refresh").get_value_as_int() refresh_unit = self.wTree.get_widget("refresh_unit").get_active() values['refresh'] = self.specto.watch_db.set_interval(refresh_value, refresh_unit) values['active'] = self.watch.active values['last_changed'] = self.watch.last_changed if self.wTree.get_widget("check_command").get_active() == True: values['command'] = self.wTree.get_widget("entry_changed_command").get_text() if self.wTree.get_widget("check_open").get_active() == True: values['open_command'] = self.wTree.get_widget("entry_open_command").get_text() else: values['open_command'] = "" gui_values = self.specto.watch_db.plugin_dict[values['type']].get_add_gui_info() window_options = self.watch_options[values['type']] for key in window_options: values[key] = window_options[key].get_value() window_options[key].set_color(0xFFFF, 0xFFFF, 0xFFFF) self.wTree.get_widget("name").modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(0xFFFF, 0xFFFF, 0xFFFF)) try: self.specto.watch_db[self.watch.id].set_values(values, True) except AttributeError, error_fields: fields = str(error_fields).split(",") i = 1 for field in fields: if field == " name": self.wTree.get_widget("name").modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(65535, 0, 0)) self.wTree.get_widget("name").grab_focus() else: field = window_options[field.strip()] if i == 1: field.grab_focus() i = 0 field.set_color(65535, 0, 0) else: if not self.specto.watch_io.is_unique_watch(values['name']): self.specto.watch_io.replace_name(self.watch.name, values['name']) # Change the name in the notifier window self.specto.notifier.change_name(values['name'], self.watch.id) self.specto.watch_db[self.watch.id].set_values(values) self.specto.watch_io.write_watch(values) self.specto.notifier.show_watch_info() self.edit_watch.destroy() if self.watch.active == True: self.specto.watch_db[self.watch.id].restart() def remove_clicked(self, widget): """ Remove the watch. """ dialog = spectlib.gtkconfig.RemoveDialog(_("Remove a watch"), (_('Remove the watch "%s"?\nThis operation cannot be undone.') % self.watch.name)) answer = dialog.show() if answer == True: self.edit_watch.destroy() self.notifier.remove_notifier_entry(self.watch.id) self.specto.watch_db.remove(self.watch.id) #remove the watch self.specto.watch_io.remove_watch(self.watch.name) self.notifier.tray.show_tooltip() def clear_clicked(self, widget): """ Clear the log window. """ self.specto.logger.remove_watch_log(self.watch.name) self.log = self.specto.logger.watch_log(self.watch.name) self.logwindow.set_text(self.log) def save_as_clicked(self, widget): """ Open the Save as dialog window. """ Save_dialog(self, self.log) def delete_event(self, widget, event, data=None): """ Destroy the window. """ self.edit_watch.destroy() return True def create_edit_gui(self): """ Create the gui for the different kinds of watches. """ vbox_options = self.wTree.get_widget("vbox_watch_options") try: self.table.destroy() except: pass watch_type = self.watch.type values = self.specto.watch_db.plugin_dict[watch_type].get_add_gui_info() watch_values = self.watch.get_values() if watch_values['command'] != "": self.wTree.get_widget("entry_changed_command").set_text(watch_values['command']) self.wTree.get_widget("check_command").set_active(True) else: self.wTree.get_widget("entry_changed_command").set_text("") self.wTree.get_widget("check_command").set_active(False) if watch_values['open_command'] != "": self.wTree.get_widget("entry_open_command").set_text(watch_values['open_command']) self.wTree.get_widget("check_open").set_active(True) else: self.wTree.get_widget("entry_open_command").set_text("") self.wTree.get_widget("check_open").set_active(False) # Create the options gui self.table = gtk.Table(rows=len(values), columns=2, homogeneous=False) self.table.set_row_spacings(6) self.table.set_col_spacings(6) self.watch_options[watch_type] = {} i = 0 for value, widget in values: table, _widget = widget.get_widget() widget.set_value(watch_values[value]) self.table.attach(table, 0, 1, i, i + 1) self.watch_options[watch_type].update({value: widget}) i += 1 self.table.show() vbox_options.pack_start(self.table, False, False, 0) def command_toggled(self, widget): sensitive = self.wTree.get_widget("check_command").get_active() self.wTree.get_widget("entry_changed_command").set_sensitive(sensitive) def open_toggled(self, widget): sensitive = self.wTree.get_widget("check_open").get_active() self.wTree.get_widget("entry_open_command").set_sensitive(sensitive) class Save_dialog: """ Class to create the save dialog. """ def __init__(self, specto, *args): """ Display the save as dialog. """ self.specto = specto self.text = args[0] # Create the tree gladefile = os.path.join(self.specto.PATH, "glade/edit_watch.glade") windowname = "file_chooser" self.wTree = gtk.glade.XML(gladefile, windowname) self.save_dialog = self.wTree.get_widget("file_chooser") dic = {"on_button_cancel_clicked": self.cancel, "on_button_save_clicked": self.save} # Attach the events self.wTree.signal_autoconnect(dic) icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.save_dialog.set_icon(icon) self.save_dialog.set_filename(os.environ['HOME'] + "/ ") def cancel(self, *args): """ Destroy the window. """ self.save_dialog.destroy() def save(self, *args): """ Save the file. """ file_name = self.save_dialog.get_filename() f = open(file_name, "w") f.write(self.text) f.close() self.save_dialog.destroy() if __name__ == "__main__": # Run the gui app = Edit_watch() gtk.main() specto-0.3.1/spectlib/i18n.py0000644000175000017500000000530411210244417014352 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # il8n.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import sys import gettext _translation = None MESSAGES_DIR = "%s/share/locale" % sys.prefix def set_language(language=None): global _translation if language is not None: language = [language] try: _translation = gettext.translation('specto', MESSAGES_DIR, language) except IOError: # The selected language was not installed in messages, so fall back to # untranslated English. _translation = gettext.NullTranslations() def get_translation(): return _translation def set_translation(translation): global _translation _translation = translation # Set up the global translation based on environment variables. Mostly used # for command line scripts. if _translation is None: set_language() def _(s): """ Returns the translated version of a singular string. """ if not s: return s return _translation.ugettext(s) def N_(singular, plural, n, var_singular = None, var_plural = None): # FIXME: the code below is UNTESTED, because pygettext hates me """ Calculates plurals and returns the appropriate translation. Also replaces variables such as %s after translating. Example usage: i18n._n("Message from %s", "Messages from %s', len(messages), "Linus", "Linus, Bill, Steve") Or maybe (untested): i18n._n("1 message from %s", len(messages) + " messages from %s', len(messages), "Linus", "Linus, Bill, Steve") """ foo = _translation.ungettext(singular, plural, n) # Get the translation # Now, if the translation has variables to replace, do it. if n == 1 and var_singular is not None: foo = foo % var_singular elif n > 1 and var_plural is not None: foo = foo % var_plural return foo specto-0.3.1/spectlib/plugins/0000755000175000017500000000000011226433142014702 5ustar jeffjeffspecto-0.3.1/spectlib/plugins/watch_vc_bazaar.py0000644000175000017500000001457411217316436020413 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_vc_bazaar.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config import spectlib.gtkconfig from spectlib.i18n import _ import os from bzrlib.missing import find_unmerged from bzrlib.branch import Branch from bzrlib.errors import NotBranchError type = "Watch_vc_bazaar" type_desc = _("Bazaar") icon = 'bazaar' category = _("Version control") def get_add_gui_info(): return [("folder", spectlib.gtkconfig.FolderChooser(_("Folder")))] class Watch_vc_bazaar(Watch): """ Watch class that will check if a bzr folder has been changed. """ def __init__(self, specto, id, values): watch_values = [("folder", spectlib.config.String(True))] self.icon = icon self.standard_open_command = "xdg-open '%s'" % values['folder'] self.type_desc = type_desc #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.use_network = True self.local_branch_ = 0 self.remote_branch_ = 0 self.remote_branch_label = "" self.local_extra = [] self.remote_extra = [] self.cache_file = os.path.join(self.specto.CACHE_DIR, "bazaar" + self.folder.replace("/", "_") + ".cache") def check(self): """ See if a folder's contents were modified or created. """ try: self.read_cache_file() local_branch = Branch.open_containing(self.folder)[0] remote_branch = Branch.open_containing(local_branch.get_parent())[0] if local_branch.get_parent() != None: self.remote_branch_label = local_branch.get_parent().replace("%7E", "~") self.local_extra, self.remote_extra = find_unmerged(local_branch, remote_branch) if len(self.local_extra) != 0: if int(self.local_extra[len(self.local_extra) - 1][0]) > self.local_branch_: self.actually_changed = True self.write_cache_file() if len(self.remote_extra) != 0: if int(self.remote_extra[len(self.remote_extra) - 1][0]) > self.remote_branch_: self.actually_changed = True self.write_cache_file() if not self.local_extra and not self.remote_extra: self.mark_as_read() else: self.set_error(_("No parent branch available, you will not be notified of differences and changes.")) except NotBranchError, e: self.set_error(str(e)) except: self.set_error() Watch.timer_update(self) def get_balloon_text(self): """ create the text for the balloon """ text = "" if len(self.local_extra) != 0: if len(self.local_extra) == 1: text = _("One new local revision has not yet been merged with its parent branch.") else: text = _("%d new local revisions have not yet been merged with its parent branch.") % len(self.local_extra) if len(self.remote_extra) != 0: if len(self.remote_extra) == 1: text = _("One new revision on the remote branch.") else: text = _("%d new revisions on the remote branch.") % len(self.remote_extra) return text def get_extra_information(self): i = 0 text = "" if len(self.remote_extra) != 0: while i < len(self.remote_extra) and i < 4: text += "Rev " + str(self.remote_extra[i][0]) + ": " + str(self.remote_extra[i][1]).split("@")[0] + "\n" if i == 3 and i < len(self.remote_extra) - 1: text += _("and others...") i += 1 if len(self.local_extra) != 0 and text == "": while i < len(self.local_extra) and i < 4: text += "Rev " + str(self.local_extra[i][0]) + ": " + str(self.local_extra[i][1]).split("@")[0] + "\n" if i == 3 and i < len(self.local_extra) - 1: text += _("and others...") i += 1 return text def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: if line.startswith("local_branch:"): self.local_branch_ = int(line.split(":")[1]) if line.startswith("remote_branch:"): self.remote_branch_ = int(line.split(":")[1]) finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: if len(self.local_extra) > 0: f.write("local_branch:" + str(self.local_extra[len(self.local_extra) - 1][0]) + "\n") if len(self.remote_extra) > 0: f.write("remote_branch:" + str(self.remote_extra[len(self.remote_extra) - 1][0]) + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Folder'), self.folder), (_('Main branch'), self.remote_branch_label)] specto-0.3.1/spectlib/plugins/watch_mail_gmail.py0000644000175000017500000003073311217316436020551 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_mail_gmail.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os from urllib2 import URLError import spectlib.tools.web_proxy as web_proxy from spectlib.watch import Watch import spectlib.config import spectlib.gtkconfig from spectlib.i18n import _ import spectlib.util type = "Watch_mail_gmail" type_desc = _("GMail") icon = 'emblem-mail' category = _("Mail") def get_add_gui_info(): return [("username", spectlib.gtkconfig.Entry(_("Username"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password"))), ("label", spectlib.gtkconfig.Entry(_("Label"), "Inbox"))] class Watch_mail_gmail(Watch): """ this watch will check if you have a new mail on your gmail account """ def __init__(self, specto, id, values): watch_values = [("username", spectlib.config.String(True)), ("password", spectlib.config.String(True)), ("label", spectlib.config.String(False))] url = "https://mail.google.com" self.standard_open_command = spectlib.util.return_webpage(url) #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) if self.open_command == self.standard_open_command: #check if google apps url has to be used if "@" in self.username and not "@gmail.com" and not "@googlemail.com" in self.username: url = "http://mail.google.com/a/" + self.username.split("@")[1] # We use mail.google.com instead of gmail.com because of the trademark issue in Germany self.standard_open_command = spectlib.util.return_webpage(url) self.open_command = self.standard_open_command self.use_network = True self.icon = icon self.type_desc = type_desc self.cache_file = os.path.join(self.specto.CACHE_DIR, "gmail" + self.username + ".cache") #watch specific values self.oldMsg = 0 self.newMsg = 0 self.mail_info = Email_collection() self.read_cache_file() def check(self): """ Check for new mails on your gmail account. """ try: if "@" not in self.username: self.username += "@gmail.com" s = GmailAtom(self.username, self.password, self.label) s.refreshInfo() self.oldMsg = s.getUnreadMsgCount() self.newMsg = 0 self.mail_info.clear_old() if self.oldMsg == 0:#no unread messages, we need to clear the watch self.mark_as_read() else: i = 0 while i < self.oldMsg and i < 20: # i < 20 is a hack around the gmail limitation of metadata retrieval (does not affect message count) info = Email(s.getMsgAuthorName(i), s.getMsgTitle(i), s.getMsgSummary(i)) if self.mail_info.add(info): #check if it is a new email or just unread self.actually_changed = True self.newMsg += 1 i += 1 self.mail_info.remove_old() self.write_cache_file() except URLError, e: self.set_error(str(e)) # This '%s' string here has nothing to translate except: self.set_error() Watch.timer_update(self) def get_gui_info(self): return [(_("Name"), self.name), (_("Last changed"), self.last_changed), (_("Username"), self.username), (_("Unread messages"), self.oldMsg)] def get_balloon_text(self): """ create the text for the balloon """ unread_messages = self.mail_info.get_unread_messages() if len(unread_messages) == 1: text = _("New message from %s...\n\n... totalling %d unread mails.") % (unread_messages[0].author, self.oldMsg) else: i = 0 #show max 4 mails author_info = "" while i < len(unread_messages) and i < 4: author_info += unread_messages[i].author + ", " if i == 3 and i < len(unread_messages) - 1: author_info += "and others..." i += 1 author_info = author_info.rstrip(", ") text = _("%d new messages from %s...\n\n... totalling %d unread mails.") % (self.newMsg, author_info, self.oldMsg) return text def get_extra_information(self): i = 0 text = "" while i < len(self.mail_info) and i < 4: name = self.escape(self.mail_info[i].author) subject = self.escape(self.mail_info[i].subject) text += "" + name + ": " + subject + "\n" if i == 3 and i < len(self.mail_info) - 1: text += _("and others...") i += 1 return text def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: info = line.split("&Separator;") email = Email(info[0], info[1], info[2].replace("\n", "")) self.mail_info.add(email) finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for email in self.mail_info: f.write(email.author + "&Separator;" + email.subject + "&Separator;" + email.summary + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) class Email(): def __init__(self, author, subject, summary): self.id = author + subject + summary self.subject = subject self.author = author self.summary = summary self.found = False self.new = False class Email_collection(): def __init__(self): self.email_collection = [] def add(self, email): self.new = True for _email in self.email_collection: if email.id == _email.id: self.new = False _email.found = True if self.new == True: email.found = True email.new = True self.email_collection.append(email) return True else: return False def __getitem__(self, id): return self.email_collection[id] def __len__(self): return len(self.email_collection) def remove_old(self): i = 0 collection_copy = [] for _email in self.email_collection: if _email.found == True: collection_copy.append(_email) i += 1 self.email_collection = collection_copy def clear_old(self): for _email in self.email_collection: _email.found = False _email.new = False def get_unread_messages(self): unread = [] for _email in self.email_collection: if _email.new == True: unread.append(_email) return unread # -*- coding: utf-8 -*- # gmailatom 0.0.1 # # HOW TO USE: # 1) Create an instance of 'GmailAtom' class. The two arguments # its constructor take are the username (including '@gmail.com') # and the password. # 2) To retrieve the account status call 'refreshInfo()'. # 3) To get the unread messages count call 'getUnreadMsgCount()'. # You MUST call 'refreshInfo()' at least one time before using # this method or it will return zero. # 4) To get specific information about an unread email you must # call the corresponding getter method passing to it the number # of the message. The number zero represents the newest one. # You MUST call 'refreshInfo()' at least one time before using any # getter method or they will return an empty string. # The getter methods are: # getMsgTitle(index) # getMsgSummary(index) # getMsgAuthorName(index) # getMsgAuthorEmail(index) # # by Juan Grande # juan.grande@gmail.com from xml.sax.handler import ContentHandler from xml import sax class Mail: # Auxiliar structure title = "" summary = "" author_name = "" author_addr = "" class MailHandler(ContentHandler): """ Sax XML Handler """ # Tags TAG_FEED = "feed" TAG_FULLCOUNT = "fullcount" TAG_ENTRY = "entry" TAG_TITLE = "title" TAG_SUMMARY = "summary" TAG_AUTHOR = "author" TAG_NAME = "name" TAG_EMAIL = "email" # Path the information PATH_FULLCOUNT = [TAG_FEED, TAG_FULLCOUNT] PATH_TITLE = [TAG_FEED, TAG_ENTRY, TAG_TITLE] PATH_SUMMARY = [TAG_FEED, TAG_ENTRY, TAG_SUMMARY] PATH_AUTHOR_NAME = [TAG_FEED, TAG_ENTRY, TAG_AUTHOR, TAG_NAME] PATH_AUTHOR_EMAIL = [TAG_FEED, TAG_ENTRY, TAG_AUTHOR, TAG_EMAIL] def __init__(self): self.startDocument() def startDocument(self): self.entries = list() self.actual = list() self.mail_count = "0" def startElement(self, name, attrs): # update actual path self.actual.append(name) # add a new email to the list if name == "entry": m = Mail() self.entries.append(m) def endElement(self, name): # update actual path self.actual.pop() def characters(self, content): # New messages count if (self.actual == self.PATH_FULLCOUNT): self.mail_count = self.mail_count+content # Message title if (self.actual == self.PATH_TITLE): temp_mail = self.entries.pop() temp_mail.title = temp_mail.title+content self.entries.append(temp_mail) # Message summary if (self.actual == self.PATH_SUMMARY): temp_mail = self.entries.pop() temp_mail.summary = temp_mail.summary+content self.entries.append(temp_mail) # Message author name if (self.actual == self.PATH_AUTHOR_NAME): temp_mail = self.entries.pop() temp_mail.author_name = temp_mail.author_name+content self.entries.append(temp_mail) # Message author email if (self.actual == self.PATH_AUTHOR_EMAIL): temp_mail = self.entries.pop() temp_mail.author_addr = temp_mail.author_addr+content self.entries.append(temp_mail) def getUnreadMsgCount(self): return int(self.mail_count) class GmailAtom: """ The mail class """ realm = "New mail feed" host = "https://mail.google.com" url = host + "/mail/feed/atom" def __init__(self, user, pswd, label): if label: self.url = self.url + "/" + label self.m = MailHandler() # initialize authorization handler auth_handler = web_proxy.urllib2.HTTPBasicAuthHandler() auth_handler.add_password(self.realm, self.host, user, pswd) opener = web_proxy.urllib2.build_opener(auth_handler) web_proxy.urllib2.install_opener(opener) def sendRequest(self): return web_proxy.urllib2.urlopen(self.url) def refreshInfo(self): # get the page and parse it p = sax.parseString(self.sendRequest().read(), self.m) def getUnreadMsgCount(self): return self.m.getUnreadMsgCount() def getMsgTitle(self, index): return self.m.entries[index].title def getMsgSummary(self, index): return self.m.entries[index].summary def getMsgAuthorName(self, index): return self.m.entries[index].author_name def getMsgAuthorEmail(self, index): return self.m.entries[index].author_email specto-0.3.1/spectlib/plugins/watch_system_file.py0000644000175000017500000001333611217316436021001 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_system_file.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config from spectlib.i18n import _ import os type = "Watch_system_file" type_desc = _("File") icon = 'gnome-mime-text' category = _("System") def get_add_gui_info(): return [("file", spectlib.gtkconfig.FileChooser(_("File")))] class Watch_system_file(Watch): """ Watch class that will check if a file has been changed. """ def __init__(self, specto, id, values): watch_values = [("file", spectlib.config.String(True))] self.icon = icon self.open_command = '' self.type_desc = type_desc self.standard_open_command = "xdg-open '%s'" % values['file'] #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.cache_file = os.path.join(self.specto.CACHE_DIR, "file" + self.file.replace("/", "_") + ".cache") self.first_time = False def check(self): """ See if a file was modified or created. """ try: self.info = [] self.file_info = [] self.old_info = "" self.read_cache_file() try: info = tuple(os.stat(self.file)) #mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = info except OSError: self.actually_changed = True self.file_info.append(_("The file was removed")) else: self.old_info = self.old_info.replace("L", "").replace("[", "").replace("]", "").replace("'", "").split(",") i = 0 while i < len(info): self.info.append(str(info[i]).strip()) if not self.first_time: self.old_info[i] = str(self.old_info[i]).strip() i += 1 if self.old_info != self.info and not self.first_time: self.actually_changed = True #if str(self.info[0]) != self.old_info[0].strip(): # self.file_info.append("Inode protection mode changed") #if str(self.info[1]) != self.old_info[1].strip(): # self.file_info.append("Inode number changed") #if str(self.info[2]) != self.old_info[2]: # self.file_info.append("Device inode resides on changed") #if self.info[3] != self.old_info[3]: # self.file_info.append("Number of links to the inode changed") if self.info[4] != self.old_info[4]: self.file_info.append(_("User id of the owner changed")) if self.info[5] != self.old_info[5]: self.file_info.append(_("Group id of the owner changed")) if self.info[6] != self.old_info[6]: self.file_info.append(_("File size changed")) if self.info[7] != self.old_info[7]: self.file_info.append(_("Time of last access changed")) if self.info[8] != self.old_info[8]: self.file_info.append(_("Time of last modification changed")) #if self.info[9] != self.old_info[9]: # self.file_info.append("Metadata changed") self.update_cache_file() self.first_time = False except: self.set_error() Watch.timer_update(self) def update_cache_file(self): """ Write the new values in the cache file. """ try: f = file(self.cache_file, "w") f.write(str(self.info)) except: self.specto.logger.log(_("There was an error writing to the file %s") % self.cache_file, "critical", self.name) finally: f.close() def read_cache_file(self): """ Read the options from the cache file. """ try: if os.path.exists(self.cache_file): f = file(self.cache_file, "r")# Load up the cached version self.old_info = f.readline() f.close() else: self.first_time = True except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) def remove_cache_files(self): os.unlink(self.cache_file) def get_balloon_text(self): """ create the text for the balloon """ text = "" for line in self.file_info: text += line + "\n" return text def get_extra_information(self): text = _("%s has changed:\n") % self.file for line in self.file_info: text += line + "\n" return text def get_gui_info(self): return [ (_('Name'), self.name), (_('Last changed'), self.last_changed), (_('File'), self.file), ] specto-0.3.1/spectlib/plugins/watch_system_port.py0000644000175000017500000000676111210244417021042 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_system_port.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config from spectlib.i18n import _ import os type = "Watch_system_port" type_desc = _("Port") icon = 'network-transmit-receive' category = _("System") def get_add_gui_info(): return [("port", spectlib.gtkconfig.Spinbutton(_("Port"), value=21, upper=65535))] class Watch_system_port(Watch): """ Watch class that will check if a connection was established on a certain port """ def __init__(self, specto, id, values): watch_values = [("port", spectlib.config.Integer(True))] self.icon = icon self.standard_open_command = '' self.type_desc = type_desc self.status = "" #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.running = self.check_port() def check(self): """ See if a socket was opened or closed. """ try: established = self.check_port() if self.running and established == False: self.running = False self.actually_changed = True self.status = _("Closed") elif self.running == False and established == True: self.running = True self.actually_changed = True self.status = _("Open") else: self.actually_changed = False self.status = _("Unknown") except: self.set_error() Watch.timer_update(self) def check_port(self): """ see if there is a connection on the port or not """ conn = False y = os.popen("netstat -nt", "r").read().splitlines() del y[0] del y[0] for k in y: k = k.split(' ') while True: try: k.remove('') except: break try: port = int(k[3][k[3].rfind(':')+1:]) except: port = -1 if port == int(self.port): conn = True if conn: return True else: return False def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Port'), self.port), (_('Status'), self.status)] def get_balloon_text(self): """ create the text for the balloon """ text = "" if self.running == True: text = _("The network socket on port %s was established.") % self.port else: text = _("The network socket on port %s was closed.") % self.port return text specto-0.3.1/spectlib/plugins/watch_web_static.py0000644000175000017500000003375611217316436020612 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_web_static.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.gtkconfig import spectlib.util import spectlib.tools.web_proxy as web_proxy import StringIO import gzip import os import md5 import difflib from httplib import HTTPMessage, BadStatusLine from math import fabs from re import compile #this is the regex compile module to parse some stuff such as tags in feeds from urllib2 import URLError from spectlib.i18n import _ import formatter import htmllib import cStringIO type = "Watch_web_static" type_desc = _("Webpage/feed") icon = 'applications-internet' category = _("Internet") class Watch_web_static(Watch): """ Watch class that will check if http or rss pages are changed. """ type_desc = type_desc url_ = "" info_ = None content_ = None lastModified_ = None digest_ = None refresh_ = None infoB_ = None cached = 0 url2_ = "" def __init__(self, specto, id, values): watch_values = [("uri", spectlib.config.String(True)), ("username", spectlib.config.String(False)), ("password", spectlib.config.String(False)), ("error_margin", spectlib.config.Dec(True)), ("redirect", spectlib.config.Boolean(False))] self.standard_open_command = spectlib.util.return_webpage(values['uri']) Watch.__init__(self, specto, id, values, watch_values) self.cacheSubDir__ = specto.CACHE_DIR self.use_network = True self.filesize_difference = 0.0 self.icon = icon self.open_command = self.open_command.replace("&", "\&") self.url_ = self.uri self.diff = "" def check(self): """ See if a http or rss page changed. """ try: # Create a unique name for each url. if self.uri[:7] != "http://" and self.uri[:8] != "https://" and self.uri[:6] != "ftp://": self.uri = "http://" + self.uri self.url_ = self.uri digest = md5.new(self.url_).digest() cacheFileName = "".join(["%02x" % (ord(c), ) for c in digest]) self.cacheFullPath_ = os.path.join(self.cacheSubDir__, cacheFileName) self.cacheFullPath2_ = os.path.join(self.cacheSubDir__, cacheFileName + "size") if self.username: pwd_mgr = web_proxy.urllib2.HTTPPasswordMgrWithDefaultRealm() pwd_mgr.add_password(None, self.uri, self.username, self.password) auth_hndlr = web_proxy.urllib2.HTTPBasicAuthHandler(pwd_mgr) opener = web_proxy.urllib2.build_opener(auth_hndlr) else: opener = web_proxy.urllib2.build_opener() request = web_proxy.urllib2.Request(self.uri, None, {"Accept-encoding": "gzip"}) cache_res = "" if (self.cached == 1) or (os.path.exists(self.cacheFullPath_)): self.cached = 1 try: f = file(self.cacheFullPath_, "r")# Load up the cached version cache_res = f.read() f.close() except: cache_res = "" try: response = opener.open(request) except (URLError, BadStatusLine), e: self.set_error(str(e)) else: self.info_ = response.info() self.url2_ = response.geturl() self.content_ = self._writeContent(response) self.info_['Url'] = self.uri self.digest_ = md5.new(self.content_).digest() self.digest_ = "".join(["%02x" % (ord(c), ) for c in self.digest_]) self.info_['md5sum'] = self.digest_ # This uncompresses the gzipped contents, if you need to parse the page. This is used to check if it is a feed for example, a few lines later. self.compressedstream = StringIO.StringIO(self.content_) try: self.page_source = gzip.GzipFile(fileobj=self.compressedstream).read() #try uncompressing except: self.page_source = self.content_ #the page was not compressed self.diff = textDiff(cache_res, self.page_source) try: out_file = file(self.cacheFullPath_, "w") out_file.write(str(self.page_source)) out_file.close() except: pass # This will check for the "real" website home URL when the website target is an xml feed. # First, check if the web page is actually a known feed type. # Here we look for three kinds of headers, where * is a wildcard: #RSS 1: #RSS 2: #Atom : if not (compile("").findall(self.page_source)==[]) or not(compile("").findall(self.page_source)==[]) or not (compile("").findall(self.page_source)==[]): #it seems like it is a syndication feed. Let's see if we can extract the home URL from it. self.regexed_contents = compile(".*").findall(self.page_source) # Grabs anything inside and ; .* means "any characters self.rss_links = "" for m in self.regexed_contents: # Iterates through and takes off the tags if self.rss_links == "": m = m.strip("").strip("") self.rss_links = m #change the uri_real attribute if self.open_command == self.standard_open_command: self.standard_open_command = spectlib.util.return_webpage(self.rss_links) self.open_command = self.standard_open_command else: #the file is not a recognized feed. We will not parse it for the tag. pass # Here is stuff for filesize comparison, # just in case there is annoying advertising on the page, # rendering the md5sum a false indicator. self.new_filesize = len(str(self.content_)) # size in bytes?... will be used for the error_margin in case of annoying advertising in the page #if self.specto.DEBUG: "\tPerceived filesize is", self.new_filesize, "bytes ("+str(self.new_filesize/1024)+"KB)" # Useful for adjusting your error_margin if int(self.new_filesize)==4: # FIXME: temporary hack, not sure the etag is ALWAYS 4bytes # 4 bytes means it's actually an etag reply, so there is no change. We don't care about filesize checks then. self.filesize_difference = 0 else: self.old_filesize = self.read_filesize() if self.old_filesize != 0:#if 0, that would mean that read_option could not find the filesize in watches.list # If there is a previous filesize # Calculate the % changed filesize if int(self.old_filesize) != 0: self.filesize_difference = (fabs(int(self.new_filesize) - int(self.old_filesize)) / int(self.old_filesize))*100 self.specto.logger.log(_("Filesize difference: %.2f") % self.filesize_difference, "info", self.name) if self.filesize_difference >= float(self.error_margin) and (self.filesize_difference != 0.0): #and (self.infoB_['md5sum'] == self.info_['md5sum']): self.to_be_stored_filesize = self.new_filesize self.actually_changed = True else: # We don't want to juggle with all the possible filesizes, # We want to stay close to the original, because replacing the filesize each time # If the watch is not changed would create a lot of fluctuations self.to_be_stored_filesize = self.old_filesize self.actually_changed = False else: # If there is no previously stored filesize self.to_be_stored_filesize = self.new_filesize ### NOTE: do not write the redirect url in a config file! self.write_filesize() except: self.set_error() Watch.timer_update(self) def content(self): """Get the content as a single string.""" return self.content_ def info(self): """ Returns an HTTPMessage for manipulating headers. Note that you can use this to read headers but not to add or change headers. Use the 'add_headers()' for adding/changing header values permanently in the cache.""" return self.info_ def write_filesize(self): """ Write the filesize in the watch list. """ try: f = open(self.cacheFullPath2_, "w") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cacheFullPath2_, "critical", self.name) else: f.write(str(self.to_be_stored_filesize)) finally: f.close() def read_filesize(self): if os.path.exists(self.cacheFullPath2_): try: f = open(self.cacheFullPath2_, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cacheFullPath2_, "critical", self.name) else: size = f.read() if size != "": return size.strip() else: return 0 finally: f.close() else: return 0 def remove_cache_files(self): os.unlink(self.cacheFullPath_) os.unlink(self.cacheFullPath2_) def _writeContent(self, response): content = "" content = response.read() return content def get_balloon_text(self): """ create the text for the balloon """ text = _("Difference percentage: %s percent") % (str(self.filesize_difference)[:5]) return text def get_extra_information(self): text = "" if self.diff: self.diff = self.escape(self.diff) outstream = cStringIO.StringIO() p = htmllib.HTMLParser(formatter.AbstractFormatter(formatter.DumbWriter(outstream))) p.feed(self.diff) self.diff = outstream.getvalue() outstream.close() text = self.diff.replace("&", "&") return text def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('URL'), self.url_), (_('Error margin (%)'), str(self.error_margin) + "%")] def get_add_gui_info(): return [("uri", spectlib.gtkconfig.Entry(_("URL"))), ("username", spectlib.gtkconfig.Entry(_("Username"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password"))), ("error_margin", spectlib.gtkconfig.Scale(_("Error margin (%)"), value=2.0, upper=50, step_incr=0.1, page_incr=1.0))] """HTML Diff: http://www.aaronsw.com/2002/diff Rough code, badly documented. Send me comments and patches.""" __author__ = 'Aaron Swartz ' __copyright__ = '(C) 2003 Aaron Swartz. GNU GPL 2.' __version__ = '0.22' import string def isTag(x): return x[0] == "<" and x[-1] == ">" def textDiff(a, b): """Takes in strings a and b and returns a human-readable HTML diff.""" out = [] a, b = html2list(a), html2list(b) s = difflib.SequenceMatcher(None, a, b) for e in s.get_opcodes(): if e[0] == "replace": # @@ need to do something more complicated here # call textDiff but not for html, but for some html... ugh # gonna cop-out for now out.append(''+''.join(a[e[1]:e[2]]) + ''+''.join(b[e[3]:e[4]])+"\n") elif e[0] == "delete": out.append(''+ ''.join(a[e[1]:e[2]]) + "\n") elif e[0] == "insert": out.append(''+''.join(b[e[3]:e[4]]) + "\n") return ''.join(out) def html2list(x, b=1): mode = 'char' cur = '' out = [] for c in x: if mode == 'tag': if c == '>': if b: cur += ']' else: cur += c out.append("") cur = '' mode = 'char' else: cur += c elif mode == 'char': if c == '<': out.append(cur) if b: cur = '[' else: cur = c mode = 'tag' elif c in string.whitespace: out.append(cur+c) cur = '' else: cur += c out.append(cur) return filter(lambda x: x is not '', out) specto-0.3.1/spectlib/plugins/watch_mail_pop3.py0000644000175000017500000002335011217316436020336 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_mail_pop3.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.util import poplib import email import os from socket import error from spectlib.i18n import _ import string type = "Watch_mail_pop3" type_desc = _("POP3") icon = 'emblem-mail' category = _("Mail") def get_add_gui_info(): return [("username", spectlib.gtkconfig.Entry(_("Username"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password"))), ("host", spectlib.gtkconfig.Entry(_("Host"))), ("ssl", spectlib.gtkconfig.CheckButton(_("Use SSL")))] class Watch_mail_pop3(Watch): """ Watch class that will check if you recevied a new mail on your pop3 account. """ def __init__(self, specto, id, values): watch_values = [("username", spectlib.config.String(True)), ("password", spectlib.config.String(True)), ("host", spectlib.config.String(True)), ("ssl", spectlib.config.Boolean(False)), ("port", spectlib.config.Integer(False))] self.standard_open_command = spectlib.util.open_gconf_application("/desktop/gnome/url-handlers/mailto") Watch.__init__(self, specto, id, values, watch_values) self.type_desc = type_desc self.use_network = True self.icon =icon self.cache_file = os.path.join(self.specto.CACHE_DIR, "pop3" + self.host + self.username + ".cache") self.newMsg = 0 self.unreadMsg = 0 self.mail_id = [] self.mail_info = Email_collection() self.read_cache_file() def check(self): """ Check for new mails on your pop3 account. """ try: if self.ssl == True: if self.port != -1: try: s = poplib.POP3_SSL(self.host, self.port) except: self.set_error() Watch.timer_update(self) return "" else: try: s = poplib.POP3_SSL(self.host) except: self.set_error() Watch.timer_update(self) return "" else: if self.port != -1: try: s = poplib.POP3(self.host, self.port) except: self.set_error() Watch.timer_update(self) return "" else: try: s = poplib.POP3(self.host) except: self.set_error() Watch.timer_update(self) return "" except poplib.error_protoerror, e: self.set_error(str(e)) except: self.set_error() else: try: s.user(self.username) s.pass_(self.password) self.unreadMsg = len(s.list()[1]) self.newMsg = 0 self.mail_info.clear_old() if self.unreadMsg > 0: i = 1 while i < self.unreadMsg + 1: str_msg = string.join(s.top(i, 0)[1], "\n") msg = email.message_from_string(str_msg) id = string.split(s.uidl(i))[2] #get unique info mail = Email(id, msg["From"].replace("\n", ""), msg["Subject"].replace("\n", ""), msg["date"]) if self.mail_info.add(mail): #check if it is a new email or just unread self.actually_changed = True self.newMsg += 1 i += 1 self.mail_info.sort() self.mail_info.remove_old() if len(self.mail_info) == 0: self.mark_as_read() self.write_cache_file() s.quit() except poplib.error_proto, e: self.set_error(str(e)) except: self.set_error() self.oldMsg = self.newMsg Watch.timer_update(self) def get_balloon_text(self): """ create the text for the balloon """ unread_messages = self.mail_info.get_unread_messages() if len(unread_messages) == 1: author_info = unread_messages[0].author.split(":")[0] author_info = author_info.replace("<", "(") author_info = author_info.replace(">", ")") text = _("New message from %s...\n\n... totalling %d unread mails.") % (author_info, self.unreadMsg) else: i = 0 #show max 4 mails author_info = "" while i < len(unread_messages) and i < 4: author_info += self.mail_info[i].author + ", " if i == 3 and i < len(unread_messages) - 1: author_info += _("and others...") i += 1 author_info = author_info.rstrip(", ") author_info = author_info.replace("<", "(") author_info = author_info.replace(">", ")") text = _("%d new messages from %s...\n\n... totalling %d unread mails.") % (self.name, self.newMsg, author_info, self.unreadMsg) return text def get_extra_information(self): i = 0 text = "" while i < len(self.mail_info) and i < 4: name = self.escape(self.mail_info[i].author.split("<")[0]) subject = self.escape(self.mail_info[i].subject) text += "" + name + ": " + subject + "\n" if i == 3 and i < len(self.mail_info) - 1: text += _("and others...") i += 1 return text def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Username'), self.username), (_('Unread messages'), self.unreadMsg)] def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: info = line.split("&Separator;") email = Email(info[0], info[1], info[2], info[3].replace("\n", "")) self.mail_info.add(email) finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error writing to the file %s") % self.cache_file, "critical", self.name) else: for email in self.mail_info: f.write(email.id + "&Separator;" + email.author + "&Separator;" + email.subject + "&Separator;" + email.date + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) class Email(): def __init__(self, id, author, subject, date): self.id = id self.subject = subject self.author = author #FIXME: change date to "year month day time" #date = date.split(" ") #month = time.strptime(date[1], "%b") #self.date = date[2] + " " + str(month[1]) + " " + date[0] + " " + date[3] self.date = date self.found = False self.new = False class Email_collection(): def __init__(self): self.email_collection = [] def add(self, email): self.new = True for _email in self.email_collection: if email.id == _email.id: self.new = False _email.found = True if self.new == True: email.found = True email.new = True self.email_collection.append(email) return True else: return False def __getitem__(self, id): return self.email_collection[id] def __len__(self): return len(self.email_collection) def remove_old(self): i = 0 collection_copy = [] for _email in self.email_collection: if _email.found == True: collection_copy.append(_email) i += 1 self.email_collection = collection_copy def clear_old(self): for _email in self.email_collection: _email.found = False _email.new = False def sort(self): self.email_collection.sort(self.sort_function) def sort_function(self, x, y): if x.date > y.date: return 1 elif x.date == y.date: return 0 else: return -1 def get_unread_messages(self): unread = [] for _email in self.email_collection: if _email.new == True: unread.append(_email) return unread specto-0.3.1/spectlib/plugins/watch_system_process.py0000644000175000017500000001236511210244417021531 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_system_process.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config from spectlib.i18n import _ import os import signal type = "Watch_system_process" type_desc = _("Process") icon = 'applications-system' category = _("System") def get_add_gui_info(): return [("process", spectlib.gtkconfig.Entry(_("Process")))] class Watch_system_process(Watch): """ Watch class that will check if a process is running or not. """ def __init__(self, specto, id, values): watch_values = [("process", spectlib.config.String(True))] self.icon = icon self.standard_open_command = values['process'] self.type_desc = type_desc self.status = "" #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.running_initially = self.check_process() def check(self): """ See if a process was started or stopped. """ try: running_now = self.check_process() if self.running_initially and running_now == False: self.running_initially = False self.changed = True self.actually_changed = True self.status = _("Not running") elif self.running_initially == False and running_now == True: self.running_initially = True self.actually_changed = True self.status = _("Running") else: self.actually_changed = False self.status = _("Unknown") except: self.set_error() Watch.timer_update(self) def check_process(self): """ see if the process is running or not """ p = ProcessList() pid = p.named(self.process) if pid: return True else: return False def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Process'), self.process), (_('Status'), self.status)] def get_balloon_text(self): """ create the text for the balloon """ if self.check_process(): text = _("The system process has started.") elif self.check_process()==False:#the process check returned false, which means the process is not running text = _("The system process has stopped.") return text """ Nick Craig-Wood -- http://www.craig-wood.com/nick Manage Processes and a ProcessList under Linux. """ class Process(object): """Represents a process""" def __init__(self, pid): """Make a new Process object""" self.proc = "/proc/%d" % pid pid, command, state, parent_pid = file(os.path.join(self.proc, "stat")).read().strip().split()[:4] command = command[1:-1] self.pid = int(pid) self.command = command self.state = state self.parent_pid = int(parent_pid) self.parent = None self.children = [] def kill(self, sig = signal.SIGTERM): """Kill this process with SIGTERM by default""" os.kill(self.pid, sig) def __repr__(self): return "Process(pid = %r)" % self.pid def getcwd(self): """Read the current directory of this process or None for can't""" try: return os.readlink(os.path.join(self.proc, "cwd")) except OSError: return None class ProcessList(object): """Represents a list of processes""" def __init__(self): """Read /proc and fill up the process lists""" self.by_pid = {} self.by_command = {} for f in os.listdir("/proc"): if f.isdigit(): process = Process(int(f)) self.by_pid[process.pid] = process #print process.command#FIXME ah-ha! there's a bug here, process names are truncated self.by_command.setdefault(process.command, []).append(process) for process in self.by_pid.values(): try: parent = self.by_pid[process.parent_pid] parent.children.append(process) process.parent = parent except KeyError: pass def named(self, name): """Returns a list of processes with the given name""" name = name[:15]#FIXME: this is a hack around the bug found a few lines ago, not a real solution return self.by_command.get(name, []) specto-0.3.1/spectlib/plugins/watch_mail_imap.py0000644000175000017500000002352311217316436020405 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_mail_imap.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.util import imaplib import os from spectlib.i18n import _ type = "Watch_mail_imap" type_desc = _("IMAP") icon = 'emblem-mail' category = _("Mail") def get_add_gui_info(): return [("username", spectlib.gtkconfig.Entry(_("Username"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password"))), ("host", spectlib.gtkconfig.Entry(_("Host"))), ("ssl", spectlib.gtkconfig.CheckButton(_("Use SSL"))), ("folder", spectlib.gtkconfig.Entry(_("Folder (optional)")))] class Watch_mail_imap(Watch): """ Watch class that will check if you recevied a new mail on your pop3 account. """ def __init__(self, specto, id, values): watch_values = [("username", spectlib.config.String(True)), ("password", spectlib.config.String(True)), ("host", spectlib.config.String(True)), ("ssl", spectlib.config.Boolean(False)), ("port", spectlib.config.Integer(False)), ("folder", spectlib.config.String(False))] self.standard_open_command = spectlib.util.open_gconf_application("/desktop/gnome/url-handlers/mailto") Watch.__init__(self, specto, id, values, watch_values) self.type_desc = type_desc self.use_network = True self.icon = icon self.cache_file = os.path.join(self.specto.CACHE_DIR, "imap" + self.host + self.username + ".cache") self.newMsg = 0 self.unreadMsg = 0 self.mail_id = [] self.mail_info = Email_collection() self.read_cache_file() def check(self): """ Check for new mails on your pop3 account. """ try: if self.ssl == True: if self.port != -1: server = imaplib.IMAP4_SSL(self.host, self.port) else: server = imaplib.IMAP4_SSL(self.host) else: if self.port != -1: server = imaplib.IMAP4(self.host, self.port) else: server = imaplib.IMAP4(self.host) server.login(self.username, self.password) except imaplib.IMAP4.error, e: self.set_error(str(e)) except: self.set_error() else: try: if self.folder != "": try: server.select(self.folder, readonly=1) except: self.set_error() else: server.select(readonly=1) (retcode, messages) = server.search(None, '(UNSEEN)') self.mail_info.clear_old() messages = messages[0].split(' ') if messages[0] != "": self.unreadMsg = len(messages) else: self.unreadMsg = 0 self.newMsg = 0 if retcode == 'OK': for message in messages: if message != "": (ret, id) = server.fetch(message, '(BODY[HEADER.FIELDS (MESSAGE-ID)])') if ret == 'OK': (ret, subject) = server.fetch(message, '(BODY[HEADER.FIELDS (SUBJECT)])') (ret, sender) = server.fetch(message, '(BODY[HEADER.FIELDS (FROM)])') if ret == 'OK': id = id[0][1] id = id.replace("\n", "") id = id.replace("\r", "") id = id.lower().replace("message-id: ", "") subject = subject[0][1] subject = subject.replace("\n", "") subject = subject.replace("\r", "") subject = subject.replace("Subject: ", "") sender = sender[0][1] sender = sender.replace("\n", "") sender = sender.replace("\r", "") sender = sender.replace("From: ", "") mail = Email(id, sender, subject) if self.mail_info.add(mail): #check if it is a new email or just unread self.actually_changed = True self.newMsg += 1 self.mail_info.remove_old() self.write_cache_file() if len(self.mail_info) == 0: self.mark_as_read() server.logout() except imaplib.IMAP4.error, e: self.set_error(str(e)) except: self.set_error() Watch.timer_update(self) self.oldMsg = self.newMsg def get_balloon_text(self): """ create the text for the balloon """ unread_messages = self.mail_info.get_unread_messages() if len(unread_messages) == 1: text = _("New message from %s...\n\n... totalling %d unread mails.") % (unread_messages[0].author.split(":")[0], self.unreadMsg) else: i = 0 #show max 4 mails author_info = "" while i < len(unread_messages) and i < 4: author_info += self.mail_info[i].author + ", " if i == 3 and i < len(unread_messages) - 1: author_info += "and others..." i += 1 author_info = author_info.rstrip(", ") author_info = author_info.replace("<", "(") author_info = author_info.replace(">", ")") text = _("%d new messages from %s...\n\n... totalling %d unread mails.") % (self.newMsg, author_info, self.unreadMsg) return text def get_extra_information(self): i = 0 text = "" while i < len(self.mail_info) and i < 4: name = self.escape(self.mail_info[i].author.split("<")[0]) subject = self.escape(self.mail_info[i].subject) text += "" + name + ": " + subject + "\n" if i == 3 and i < len(self.mail_info) - 1: text += _("and others...") i += 1 return text def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Username'), self.username), (_('Unread messages'), self.unreadMsg)] def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: info = line.split("&Separator;") email = Email(info[0], info[1], info[2].replace("\n", "")) self.mail_info.add(email) finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error writing to the file %s") % self.cache_file, "critical", self.name) else: for email in self.mail_info: f.write(email.id + "&Separator;" + email.author + "&Separator;" + email.subject + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) class Email(): def __init__(self, id, author, subject): self.id = id self.subject = subject self.author = author self.found = False self.new = False class Email_collection(): def __init__(self): self.email_collection = [] def add(self, email): self.new = True for _email in self.email_collection: if email.id == _email.id: self.new = False _email.found = True if self.new == True: email.found = True email.new = True self.email_collection.append(email) return True else: return False def __getitem__(self, id): return self.email_collection[id] def __len__(self): return len(self.email_collection) def remove_old(self): i = 0 collection_copy = [] for _email in self.email_collection: if _email.found == True: collection_copy.append(_email) i += 1 self.email_collection = collection_copy def clear_old(self): for _email in self.email_collection: _email.found = False _email.new = False def get_unread_messages(self): unread = [] for _email in self.email_collection: if _email.new == True: unread.append(_email) return unread specto-0.3.1/spectlib/plugins/watch_web_greader.py0000644000175000017500000004254511217316436020730 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_web_greader.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config from spectlib.i18n import _ import spectlib.util import spectlib.tools.web_proxy as web_proxy type = "Watch_web_greader" type_desc = _("Google Reader") icon = 'internet-news-reader' category = _("Internet") def get_add_gui_info(): return [("username", spectlib.gtkconfig.Entry(_("Username"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password")))] class Watch_web_greader(Watch): """ this watch will check if you have new news on your google reader account """ def __init__(self, specto, id, values): watch_values = [("username", spectlib.config.String(True)), ("password", spectlib.config.String(True))] url = "http://www.google.com/reader/" self.standard_open_command = spectlib.util.return_webpage(url) #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.use_network = True self.icon = icon self.type_desc = type_desc self.cache_file = os.path.join(self.specto.CACHE_DIR, "greader" + self.username + ".cache") #watch specific values self.unreadMsg = 0 self.newMsg = 0 self.news_info = Feed_collection() self.or_more = "" self.read_cache_file() def check(self): """ Check for new news on your greader account. """ try: self.newMsg = 0 greader = Greader(self.username, self.password) unread, info_friends, info = greader.refresh() if unread[0] == -1: self.error = True self.specto.logger.log(('%s') % unread[1], "error", self.name) elif unread[0] == 1:#no unread items, we need to clear the watch self.mark_as_read() self.news_info = Feed_collection() else: self.unreadMsg = int(unread[1]) if self.unreadMsg == 1000: self.or_more = _(" or more") self.news_info.clear_old() for feed in info: _feed = Feed(feed, info[feed]) if self.news_info.add(_feed): self.actually_changed = True self.newMsg += 1 self.news_info.remove_old() self.write_cache_file() except: self.set_error() Watch.timer_update(self) def get_gui_info(self): return [(_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Username'), self.username), (_('Unread messages'), str(self.unreadMsg) + self.or_more)] def get_balloon_text(self): """ create the text for the balloon """ unread_messages = self.news_info.get_unread_messages() if len(unread_messages) == 1: text = _("New newsitems in %s...\n\n... totalling %s unread items.") %(unread_messages[0].name, str(self.unreadMsg) + self.or_more) else: i = 0 #show max 4 feeds feed_info = "" while i < len(unread_messages) and i < 4: feed_info += unread_messages[i].name + ", " if i == 3 and i < len(unread_messages) - 1: feed_info += _("and others...") i += 1 feed_info = feed_info.rstrip(", ") text = _("%d new newsitems in %s...\n\n... totalling %s unread items.") %(self.newMsg, feed_info, str(self.unreadMsg) + self.or_more) return text def get_extra_information(self): i = 0 feed_info = "" while i < len(self.news_info) and i < 4: # TODO: do we need to self.escape the name and messages? feed_info += "" + self.news_info[i].name + ": " + str(self.news_info[i].messages) + "\n" if i == 3 and i < len(self.news_info) - 1: feed_info += _("and others...") i += 1 return feed_info def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: info = line.split("&Separator;") feed = Feed(info[0], info[1].replace("\n", "")) self.news_info.add(feed) finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for feed in self.news_info: f.write(feed.name + "&Separator;" + str(feed.messages) + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) class Feed(): def __init__(self, name, messages): self.name = name self.messages = int(messages) self.found = False self.new = False class Feed_collection(): def __init__(self): self.feed_collection = [] def add(self, feed): self.new = True self.changed = False for _feed in self.feed_collection: if feed.name == _feed.name: if feed.messages > _feed.messages: self.new = False self.changed = True _feed.messages = feed.messages _feed.found = True else: _feed.messages = feed.messages self.new = False _feed.found = True if self.new == True: feed.found = True feed.new = True self.feed_collection.append(feed) return True elif self.changed == True: feed.found = True feed.updated = True return True else: return False def __getitem__(self, id): return self.feed_collection[id] def __len__(self): return len(self.feed_collection) def remove_old(self): i = 0 collection_copy = [] for _feed in self.feed_collection: if _feed.found == True: collection_copy.append(_feed) i += 1 self.feed_collection = collection_copy def clear_old(self): for _feed in self.feed_collection: _feed.found = False _feed.new = False _feed.updated = False def get_unread_messages(self): unread = [] for _feed in self.feed_collection: if _feed.new == True or _feed.updated == True: unread.append(_feed) return unread """ grnotify --------- GrNotify is a simple Python written tray application that will allow you to know when there are new items in the Google Reader. GrNotify is written by Kristof Bamps - And maintained by Bram Bonne and Eric Lembregts Dependencies -------------- * Python >= 2.2 * PyXML >= 0.8.3 * PyGTK >= 2.0 """ import urllib import urllib2 import xml.dom.minidom import os.path counter = 1 #boolean to show counter or not numberFeeds = 5 #default maximum number of feeds of which info is shows L = [] #contains feed ids and their number of unread items names = [] #contains names of all feeds feeds = 0 # number of feeds user is subscribed to email = '' passwd = '' cookies = -1 old_unread = -1 unread = 0 def getcookies(): """ Use cookies """ COOKIEFILE = os.path.join(spectlib.util.get_path('tmp'), 'cookies.lwp') # the path and filename to save your cookies in cj = None ClientCookie = None cookielib = None # Let's see if cookielib is available try: import cookielib except ImportError: # If importing cookielib fails # let's try ClientCookie try: import ClientCookie except ImportError: # ClientCookie isn't available either urlopen = web_proxy.urllib2.urlopen Request = web_proxy.urllib2.Request else: # imported ClientCookie urlopen = ClientCookie.urlopen Request = ClientCookie.Request cj = ClientCookie.LWPCookieJar() else: # importing cookielib worked urlopen = web_proxy.urllib2.urlopen Request = web_proxy.urllib2.Request cj = cookielib.LWPCookieJar() # This is a subclass of FileCookieJar # that has useful load and save methods if cj is not None: # we successfully imported # one of the two cookie handling modules # Now we need to get our Cookie Jar # installed in the opener; # for fetching URLs if cookielib is not None: # if we use cookielib # then we get the HTTPCookieProcessor # and install the opener in web_proxy.urllib2 opener = web_proxy.urllib2.build_opener(web_proxy.urllib2.HTTPCookieProcessor(cj)) web_proxy.urllib2.install_opener(opener) else: # if we use ClientCookie # then we get the HTTPCookieProcessor # and install the opener in ClientCookie opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cj)) ClientCookie.install_opener(opener) url = 'https://www.google.com/accounts/ServiceLoginAuth' user_agent = 'Mozilla/4.0(compatible; MSIE 5.5; Windows NT)' login = {'Email': email, 'Passwd': passwd} data = urllib.urlencode(login) theurl = url # an example url that sets a cookie, # try different urls here and see the cookie collection you can make ! txdata = data # if we were making a POST type request, # we could encode a dictionary of values here, # using urllib.urlencode(somedict) txheaders = {'User-agent': 'Mozilla/4.0(compatible; MSIE 5.5; Windows NT)'} # fake a user agent, some websites(like google) don't like automated exploration try: req = Request(theurl, txdata, txheaders) # create a request object handle = urlopen(req) # and open it to return a handle on the url del req except IOError, e: return 2 #we didn't get a connection if cj is None: return 3 #we got a connection, but didn't get any cookies else: cj.save(COOKIEFILE) # save the cookies again return 1, Request, cj #everything went ok def getUnreadItems(Request): """ Get the number of unread items """ global unread, L, feeds LISTFILE = os.path.join(spectlib.util.get_path('tmp'), 'list.xml') url = 'https://www.google.com/reader/api/0/unread-count?all=true' try: req = Request(url) response = web_proxy.urllib2.urlopen(req) del req except IOError, e: return 2 #we didn't get a connection testxml = response.read() del response if '' in testxml: fileHandle = open(LISTFILE, 'w') fileHandle.write(testxml) del testxml fileHandle.close() fileHandle = open(LISTFILE) unread = xml.dom.minidom.parse(fileHandle) fileHandle.close() del fileHandle countlist = unread.getElementsByTagName('number') namelist = unread.getElementsByTagName('string') for count in countlist: if count.attributes["name"].value != 'count': countlist.remove(count) del unread del L[:] found = 0 for i in xrange(0, len(countlist)): if 'state/com.google/reading-list' in namelist[i].firstChild.toxml(): unread = countlist[i].firstChild.toxml() found = 1 else: L.append((countlist[i].firstChild.toxml(), namelist[i].firstChild.toxml())) del countlist[:] del namelist[:] if not found: # If there are no subscribed feeds unread = '-1' L = sorted(L, compare) feeds = len(L) return 1 else: return 0 def updateFeeds(Request): """ Set the names of feeds the user is subscribed to """ global names, feeds LISTFILE = os.path.join(spectlib.util.get_path('tmp'), 'names.xml') url = 'http://www.google.com/reader/api/0/subscription/list' try: req = Request(url) response = web_proxy.urllib2.urlopen(req) del req except IOError, e: return 2 # We didn't get a connection testxml = response.read() #read the opened page del response if '' in testxml: # If we got a XML file fileHandle = open(LISTFILE, 'w') fileHandle.write(testxml) del testxml fileHandle.close fileHandle = open(LISTFILE) document = xml.dom.minidom.parse(fileHandle) fileHandle.close() del fileHandle del names[:] feedlist = document.getElementsByTagName('string') for j in xrange(0, len(feedlist)): if(feedlist[j].attributes["name"].value == 'id' or feedlist[j].attributes["name"].value == 'title'): if('/state/com.google/broadcast' in feedlist[j].firstChild.toxml() or feedlist[j].firstChild.toxml()[0] != 'u'): names.append(feedlist[j].firstChild.toxml()) del document del feedlist[:] def readFeeds(Request): global names LISTFILE = os.path.join(spectlib.util.get_path('tmp'), 'names.xml') if os.path.isfile(LISTFILE): fileHandle = open(LISTFILE) document = xml.dom.minidom.parse(fileHandle) del names[:] feedlist = document.getElementsByTagName('string') for j in xrange(0, len(feedlist)): if(feedlist[j].attributes["name"].value == 'id' or feedlist[j].attributes["name"].value == 'title'): if('/state/com.google/broadcast' in feedlist[j].firstChild.toxml() or feedlist[j].firstChild.toxml()[0] != 'u'): names.append(feedlist[j].firstChild.toxml()) del document del feedlist[:] fileHandle.close() else: updateFeeds(Request) def compare(a, b): """ Compare function to sort the feeds by number of unread items """ return cmp(int(b[0]), int(a[0])) class Greader(): def __init__(self, username, password): global unread, info, extra_info, extra_info_friends, email, passwd global config_changed email = username passwd = password request = "" def refresh(self): cookies = getcookies() if(cookies[0] == 1): request = cookies[1] cj = cookies[2] cookies = getUnreadItems(request) if(cookies == 0): info = -1, _('Wrong username or password') extra_info = '' if(cookies == 2): info = -1, _('Could not establish a connection to server') extra_info = '' if(cookies == 3): info = -1, _('Could not get cookies') extra_info = '' if(cookies != 1): cookies = getcookies() if(unread == '-1'): info = 1, _('You are not subscribed to any feeds') elif(unread == '0'): info = 1, _('No unread items') elif(unread >= '1'): info = 2, unread readFeeds(request) if(len(L) >= numberFeeds): i = numberFeeds else: i = len(L)# - 1 extra_info = {} extra_info_friends = '' for i in xrange(0, i): found = 0 for j in xrange(0, len(names)): if not found: if(str(L[i][1]) == names[j] or '/state/com.google/broadcast-friends' in L[i][1]) and int(L[i][0]) != 0: found = 1 if('/state/com.google/broadcast-friends' in L[i][1]): extra_info_friends += str(L[i][0]) else: extra_info.update({names[j+1]: int(L[i][0])}) del L[:] #set the table back to empty, so same items don't get added time after time try: #remove the cache files os.unlink(os.path.join(spectlib.util.get_path('tmp'), 'names.xml')) os.unlink(os.path.join(spectlib.util.get_path('tmp'), 'cookies.lwp')) os.unlink(os.path.join(spectlib.util.get_path('tmp'), 'list.xml')) except: pass cj.clear_session_cookies() return info, extra_info_friends, extra_info specto-0.3.1/spectlib/plugins/watch_sn_facebook.py0000644000175000017500000003304111217316436020722 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_sn_facebook.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config import spectlib.gtkconfig import spectlib.tools.web_proxy as web_proxy from spectlib.i18n import _ import os import formatter import htmllib import re from cStringIO import StringIO type = "Watch_sn_facebook" type_desc = _("Facebook") icon = 'facebook' category = _("Social networks") def get_add_gui_info(): return [("email", spectlib.gtkconfig.Entry(_("Email"))), ("password", spectlib.gtkconfig.PasswordEntry(_("Password")))] class Watch_sn_facebook(Watch): """ Watch class that will check for changes in a user's Facebook account. """ def __init__(self, specto, id, values): watch_values = [("email", spectlib.config.String(True)), ("password", spectlib.config.String(True))] self.icon = icon self.type_desc = type_desc url = "http://www.facebook.com" self.standard_open_command = spectlib.util.return_webpage(url) #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.cache_file = os.path.join(self.specto.CACHE_DIR, "facebook" + self.email + ".cache") self.previous_messages = [] self.previous_notifications = [] self.previous_requests = [] self.previous_wall = [] self.use_network = True self.read_cache_file() def check(self): """ See if a there are new facebook items. """ try: self.updates = {'message': [], 'notification': [], 'request': [], 'wall': []} #message facebook = Facebook(self.email, self.password) if facebook.connect(): self.messages = facebook.get_messages() for message in self.messages: if message.sender + ": " + message.message not in self.previous_messages: self.updates['message'].append(message.sender + ": " + message.message) self.actually_changed = True self.previous_messages.append(message.sender + ": " + message.message) # Facebook notifications self.notifications = facebook.get_notifications() for notification in self.notifications: if notification.notification not in self.previous_notifications: self.updates['notification'].append(notification.notification) self.actually_changed = True self.previous_notifications.append(notification.notification) # Requests self.requests = facebook.get_requests() for request in self.requests: if request.request not in self.previous_requests: self.updates['request'].append(request.request) self.actually_changed = True self.previous_requests.append(request.request) # Wall posts self.wall = facebook.get_wall() for w in self.wall: if w.poster + ": " + w.post not in self.previous_wall: self.updates['wall'].append(w.poster + ": " + w.post) self.actually_changed = True self.previous_wall.append(w.poster + ": " + w.post) self.write_cache_file() if len(self.messages) == 0 and len(self.notifications) == 0 and len(self.requests) == 0 and len(self.wall) == 0: self.mark_as_read() else: self.set_error((_("Wrong username/password"))) except: self.set_error() Watch.timer_update(self) def get_balloon_text(self): """ create the text for the balloon """ text = _("You received") + " " count = len(self.updates['message']) if count == 1: text += _("a new message") + ", " elif count > 1: text += _("%d new messages") % (count) text += ", " count = len(self.updates['notification']) if count == 1: text += _("a new notification") + ", " elif count > 1: text += _("%d new notifications") % (count) text += ", " count = len(self.updates['request']) if count == 1: text += _("a new request") + ", " elif count > 1: text += _("%d new requests") % (count) text += ", " count = len(self.updates['wall']) if count == 1: text += _("a new wall post") + ", " elif count > 1: text += _("%d new wall posts") % (count) text += ", " return text.rstrip(", ") def get_extra_information(self): i = 0 info = "" for message in self.updates['message']: info += message + "\n" i += 1 for notification in self.updates['notification']: info += notification + "\n" i += 1 for request in self.updates['request']: info += request + "\n" i += 1 for wall in self.updates['wall']: info += wall + "\n" i += 1 return self.escape(info) def read_cache_file(self): if os.path.exists(self.cache_file): try: f = open(self.cache_file, "r") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: for line in f: if line.startswith("message:"): self.previous_messages = line.split("message:")[1].split("&Separator;") elif line.startswith("notification:"): self.previous_notifications = line.split("notification:")[1].split("&Separator;") elif line.startswith("request:"): self.previous_requests = line.split("request:")[1].split("&Separator;") elif line.startswith("wall:"): self.previous_wall = line.split("wall:")[1].split("&Separator;") finally: f.close() def write_cache_file(self): try: f = open(self.cache_file, "w") except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) else: messages_ = "" for message in self.messages: messages_ += message.sender + ": " + message.message + "&Separator;" f.write("message:" + messages_ + "\n") notifications_ = "" for notification in self.notifications: notifications_ += notification.notification + "&Separator;" f.write("notification:" + notifications_ + "\n") requests_ = "" for request in self.requests: requests_ += request.request + "&Separator;" f.write("request:" + requests_ + "\n") wall_ = "" for w in self.wall: wall_ += w.poster + ": " + w.post + "&Separator;" f.write("wall:" + wall_ + "\n") finally: f.close() def remove_cache_files(self): os.unlink(self.cache_file) def get_gui_info(self): return [(_("Name"), self.name), (_("Last changed"), self.last_changed), (_("Email"), self.email)] class Facebook(): def __init__(self, email, password): self.email = email self.password = password def connect(self): opener = web_proxy.urllib2.build_opener(web_proxy.urllib2.HTTPCookieProcessor()) web_proxy.urllib2.install_opener(opener) response = web_proxy.urllib2.urlopen(web_proxy.urllib2.Request("https://login.facebook.com/login.php?m&next=http%3A%2F%2Fm.facebook.com%2Fhome.php", "email=%s&pass=%s&login=Login" % (self.email, self.password))) if "form action=\"https://login.facebook.com/login.php" in response.read(): return False else: return True def get_messages(self): connection = web_proxy.urllib2.urlopen("http://m.facebook.com/inbox/") messages_ = connection.read().split("
") messages = [] title = "" sender = "" unread = False for line in messages_: #search subject title = re.search('(.+)

(.+)(
|,)', line) if sender != None: sender = sender.group(1) else: #multiple receipients sender = re.search('
(.+)(
|,)', line) if sender != None: sender = sender.group(1) if sender != None and title != None: messages.extend([FacebookMessage(sender.strip(), title.strip())]) return messages def get_notifications(self): notifications = [] connection = web_proxy.urllib2.urlopen("http://m.facebook.com/notifications.php") messages = connection.read().split("
") for line in messages: #search notification notification = re.search('
") for line in messages: #search friend requests request = re.search('(.+)
', line) if request != None: outstream = StringIO() p = htmllib.HTMLParser(formatter.AbstractFormatter(formatter.DumbWriter(outstream))) p.feed(request.group(0)) request = re.sub("(\[.\])", " ", outstream.getvalue()) p.close() requests.extend([FacebookRequest(request.replace("\n", "").strip())]) return requests def get_wall(self): walls = [] connection = web_proxy.urllib2.urlopen("http://m.facebook.com/wall.php") messages = connection.read().split("
") for line in messages: #search wall poster poster = re.search('
(.+)
', line) if post != None: outstream = StringIO() p = htmllib.HTMLParser(formatter.AbstractFormatter(formatter.DumbWriter(outstream))) p.feed(post.group(0)) post = re.sub("(\[.+\])", "", outstream.getvalue()).replace("delete", "") outstream.close() if poster != None and post != None: walls.extend([FacebookWall(poster.strip(), post.strip().replace("\n", " "))]) return walls class FacebookMessage(): def __init__(self, sender, message): self.sender = sender self.message = message class FacebookNotification(): def __init__(self, notification): self.notification = notification class FacebookRequest(): def __init__(self, request): self.request = request class FacebookWall(): def __init__(self, poster, post): self.poster = poster self.post = post specto-0.3.1/spectlib/plugins/__init__.py0000644000175000017500000000000011041474551017005 0ustar jeffjeffspecto-0.3.1/spectlib/plugins/watch_system_folder.py0000644000175000017500000002066411217316436021337 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch_system_folder.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.watch import Watch import spectlib.config from spectlib.i18n import _ import os import re from stat import * type = "Watch_system_folder" type_desc = _("Folder") icon = 'folder' category = _("System") def get_add_gui_info(): return [("folder", spectlib.gtkconfig.FolderChooser(_("Folder")))] class Watch_system_folder(Watch): """ Watch class that will check if a folder has been changed. """ def __init__(self, specto, id, values): watch_values = [("folder", spectlib.config.String(True))] self.icon = icon self.standard_open_command = "xdg-open '%s'" % values['folder'] self.type_desc = type_desc #Init the superclass and set some specto values Watch.__init__(self, specto, id, values, watch_values) self.cache_file = os.path.join(self.specto.CACHE_DIR, "folder" + self.folder.replace("/", "_") + ".cache") self.first_time = False self.info = {} self.info['removed'] = [0, ""] self.info['created'] = [0, ""] self.info['modified'] = [0, ""] def check(self): """ See if a folder's contents were modified or created. """ try: self.old_values = self.read_cache_file() mode = os.stat(self.folder)[ST_MODE] self.new_files = [] if S_ISDIR(mode): self.get_dir(self.folder) self.update_cache_file()#write the new values to the cache file self.old_values = self.read_cache_file() #read the new valeus self.get_removed_files() #remove the files that were removed self.update_cache_file()#write the values (with the removed lines) to the cache file else: self.set_error(_('The watch is not set to a folder')) #first time don't mark as changed if self.first_time == True: self.actually_changed = False self.first_time = False except: self.set_error() Watch.timer_update(self) def get_file(self, file_): """ Get the info from a file and compair it with the previous info. """ size = int(os.stat(file_)[6]) #mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = info file_ = file_.replace("?", "\?") \ .replace("(", "\(") \ .replace(")", "\)") \ .replace("^", "\^") \ .replace("[", "\[") \ .replace("]", "\]") \ .replace("$", "\$") \ .replace("+", "\+") \ .replace(".", "\.") #.replace("\", "\\") old_size = re.search('%s:separator:(.+)' % file_, self.old_values) file_ = file_.replace("\?", "?") \ .replace("\(", "(") \ .replace("\)", ")") \ .replace("\^", "^") \ .replace("\[", "[") \ .replace("\]", "]") \ .replace("\$", "$") \ .replace("\+", "+") \ .replace("\.", ".") #.replace("\\", "\") if old_size and str(size): old_size = int(old_size.group(1)) if size != old_size: #replace filesize self.old_values = self.old_values.replace(file_ + ":separator:" + str(old_size), file_ + ":separator:" + str(size)) self.info['modified'][0] += 1 self.info['modified'][1] += file_ + "\n" self.actually_changed = True elif (size or size ==0) and not old_size: #add the file to the list self.old_values += file_ + ":separator:" + str(size) + "\n" self.info['created'][0] += 1 self.info['created'][1] += file_ + "\n" self.actually_changed = True def get_dir(self, dir_): """ Recursively walk a directory. """ for f in os.listdir(dir_): pathname = os.path.join(dir_, f) mode = os.stat(pathname)[ST_MODE] if S_ISDIR(mode): # It's a directory, recurse into it self.get_dir(pathname) elif S_ISREG(mode): # It's a file, get the info self.new_files.append(pathname) self.get_file(pathname) else: # Unknown file type self.specto.logger.log(_("Skipping %s") % pathname, "debug", self.name) def get_removed_files(self): """ Get the removed files. """ old_values_ = self.old_values.split("\n") self.old_values = "" y = 0 for file_ in self.old_files: if file_ not in self.new_files:#see if a old file still exists in the new files list self.info['removed'][0] += 1 self.info['removed'][1] += file_ + "\n" self.actually_changed = True else: self.old_values += old_values_[y] + "\n" y += 1 def get_balloon_text(self): """ create the text for the balloon """ created = self.info['created'][0] removed = self.info['removed'][0] modified = self.info['modified'][0] text = "" if created > 0: if created == 1: text += _("1 new file was created.\n") else: text += str(created) + _(" new files were created.\n") if removed > 0: if removed == 1: text += _("1 file was removed.\n") else: text += str(removed) + _(" files were removed.\n") if modified > 0: if modified == 1: text += _("1 file was modified.\n") else: text += str(modified) + _(" files were modified.\n") return text def get_extra_information(self): created = self.info['created'][0] removed = self.info['removed'][0] modified = self.info['modified'][0] text = "" if created > 0: text += '' + self.escape(self.info['created'][1]) + '' if removed > 0: text += '' + self.escape(self.info['removed'][1]) + '' if modified > 0: text += '' + self.escape(self.info['modified'][1]) + '' return text def update_cache_file(self): """ Write the new values in the cache file. """ try: f = file(self.cache_file, "w") f.write(str(self.old_values)) except: self.specto.logger.log(_("There was an error writing to the file %s") % self.cache_file, "critical", self.name) finally: f.close() def read_cache_file(self): """ Read the options from the cache file. """ try: text = "" if os.path.exists(self.cache_file): f = file(self.cache_file, "r")# Load up the cached version self.old_files = [] for line in f: self.old_files.append(line.split(':separator:')[0]) text += line f.close() else: self.first_time = True return text except: self.specto.logger.log(_("There was an error opening the file %s") % self.cache_file, "critical", self.name) def remove_cache_files(self): os.unlink(self.cache_file) def get_gui_info(self): return [ (_('Name'), self.name), (_('Last changed'), self.last_changed), (_('Folder'), self.folder), ] specto-0.3.1/spectlib/console.py0000644000175000017500000000356311210244417015242 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # notifier.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from spectlib.i18n import _ class Console: def __init__(self, specto, args): self.specto = specto self.only_changed = False if args: if args == "--only-changed": self.only_changed = True def start_watches(self): self.specto.watch_db.restart_all_watches() def mark_watch_status(self, status, id): """ show the right icon for the status from the watch. """ watch = self.specto.watch_db[id] if status == "changed": print watch.name, "-", _("Watch has changed.") print watch.get_extra_information() elif self.only_changed: return elif status == "checking": print watch.name, "-", _("Watch started checking.") elif status == "idle": print watch.name, "-", _("Watch is idle.") elif status == "no-network": print _("No network connection detected") elif status == "error": print watch.name, "-", _("There was an error checking the watch") specto-0.3.1/spectlib/util.py0000644000175000017500000000752511210223170014550 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # util.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os import sys from spectlib.tools.specto_gconf import Specto_gconf def return_webpage(webpage): """ Open the webpage in the default browser. """ specto_gconf = Specto_gconf("/desktop/gnome/url-handlers/http") default_browser = specto_gconf.get_entry("command") return (default_browser % webpage) #return the browser with the page def show_webpage(webpage): os.system(return_webpage(webpage) + " &") def open_gconf_application(key): """ Get the name from gconf and open the application. """ specto_gconf = Specto_gconf(key) application = specto_gconf.get_entry("command") if "mailto" in key: application = application.replace(" %s", "")#this is an ugly hack, because evolution really doesn't want to startup with %s return application def get_path(category=None): """ Return the correct path. """ if not os.path.exists('data') or not os.path.exists('spectlib'): if not category: PATH = "%s/share/specto/" % sys.prefix elif category=="doc": PATH = "%s/share/doc/specto/" % sys.prefix elif category=="src": PATH = os.path.dirname(os.path.abspath(__file__)) else: if not category: PATH =os.path.join(os.getcwd(), "data/") elif category=="doc": PATH = os.path.join(os.getcwd(), "data/doc/") elif category=="src": PATH = os.path.dirname(os.path.abspath(__file__)) if category == "specto": try: PATH = os.path.join(os.environ['XDG_CONFIG_HOME'], "specto") except KeyError: PATH = os.path.join(os.environ['HOME'], ".config", "specto") if not os.path.exists(PATH): os.makedirs(PATH) os.chmod(PATH, 0700) # Meet XDG spec if category == "tmp": try: PATH = os.path.join(os.environ['XDG_CACHE_HOME'], "specto") except KeyError: PATH = os.path.join(os.environ['HOME'], ".cache", "specto") if not os.path.exists(PATH): os.makedirs(PATH) os.chmod(PATH, 0700) # Meet XDG spec return PATH def get_file(): try: file_name = os.path.join(os.environ['XDG_CONFIG_HOME'], "specto", "watches.list") except KeyError: file_name = os.path.join(os.environ['HOME'], ".config", "specto", "watches.list") # Only if file doesn't exist do we need to "open" (create) it. if not os.path.exists(file_name): dirname = os.path.dirname(file_name) if not os.path.exists(dirname): os.makedirs(dirname) os.chmod(dirname, 0700) # Meet XDG spec f = open(file_name, "w") f.close() # As we store passwords make sure only user can read the watch file os.chmod(file_name, 0600) return file_name specto-0.3.1/spectlib/i18n_safedict.py0000644000175000017500000000432211123240767016222 0ustar jeffjeff# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """A `safe' dictionary for string interpolation.""" from types import StringType from UserDict import UserDict COMMASPACE = ', ' class SafeDict(UserDict): """Dictionary which returns a default value for unknown keys. This is used in maketext so that editing templates is a bit more robust. """ def __getitem__(self, key): try: return self.data[key] except KeyError: if isinstance(key, StringType): return '%('+key+')s' else: return '' % `key` def interpolate(self, template): return template % self class MsgSafeDict(SafeDict): def __init__(self, msg, dict=None): self.__msg = msg SafeDict.__init__(self, dict) def __getitem__(self, key): if key.startswith('msg_'): return self.__msg.get(key[4:], 'n/a') elif key.startswith('allmsg_'): missing = [] all = self.__msg.get_all(key[7:], missing) if all is missing: return 'n/a' return COMMASPACE.join(all) else: return SafeDict.__getitem__(self, key) def copy(self): d = self.data.copy() for k in self.__msg.keys(): vals = self.__msg.get_all(k) if len(vals) == 1: d['msg_'+k.lower()] = vals[0] else: d['allmsg_'+k.lower()] = COMMASPACE.join(vals) return d specto-0.3.1/spectlib/watch.py0000644000175000017500000005740611217316436014723 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # watch.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os import sys import time import gobject import thread import gtk from cgi import escape #specto imports import spectlib.config from spectlib.tools.iniparser import ini_namespace from ConfigParser import ConfigParser from spectlib.i18n import _ from datetime import datetime try: from spectlib.tools.keyringmanager import Keyring keyring = True except: keyring = False def gettext_noop(s): return s class Watch: def __init__(self, specto, id, values, watch_values): self.specto = specto watch_values.extend([('name', spectlib.config.String(True)), ('refresh', spectlib.config.Integer(True)), ('type', spectlib.config.String(True)), ('changed', spectlib.config.Boolean(False)), ('command', spectlib.config.String(False)), ('active', spectlib.config.Boolean(False)), ('last_changed', spectlib.config.String(False)), ('open_command', spectlib.config.String(False))]) self.id = id self.use_network = False self.error = False self.actually_changed = False self.timer_id = -1 self.deleted = False self.error_message = "" self.watch_values = watch_values self.set_values(values) self.watch_io = Watch_io(self.specto, self.specto.FILE) global _ def start(self): """ Start the watch. """ try: self.active = True self.watch_io.write_option(self.name, 'active', self.active) self.start_checking() except: self.error = True self.set_error(_("There was an error starting the watch")) def stop(self): """ Stop the watch. """ try: self.active = False self.watch_io.write_option(self.name, 'active', self.active) gobject.source_remove(self.timer_id) except: self.error = True self.set_error(_("There was an error stopping the watch")) def mark_as_read(self): """ mark the watch as read """ try: self.changed = False self.watch_io.write_option(self.name, 'changed', self.changed) if not self.error: self.specto.mark_watch_status("idle", self.id) except: self.set_error(_("There was an error marking the watch as read")) def restart(self): """ restart the watch """ if self.active == True: self.stop() self.start() def start_checking(self): try: if self.use_network: if not self.check_connection(): return self.specto.logger.log(_("Watch started checking."),\ "debug", self.name) self.specto.mark_watch_status("checking", self.id) self.error = False self.actually_changed = False #self.check() #return self.lock = thread.allocate_lock() self.lock.acquire() thread.start_new_thread(self.check, ()) while self.lock.locked(): while gtk.events_pending(): gtk.main_iteration() time.sleep(0.05) except: self.set_error(_("There was an error checking the watch")) def watch_changed(self): try: self.specto.logger.log(_("Watch has changed."), "info", self.name) self.actually_changed = False self.changed = True self.last_changed = datetime.today().strftime("%A %d %b %Y %H:%M") self.watch_io.write_option(self.name, 'changed', self.changed) self.watch_io.write_option(self.name, 'last_changed', \ self.last_changed) self.specto.mark_watch_status("changed", self.id) if self.command != "": #run watch specific "changed" command os.system(self.command + " &") except: self.set_error(_("There was an error marking the watch as changed")) def timer_update(self): """ update the timer """ try: if self.actually_changed == True: self.watch_changed() elif self.error == True: self.specto.mark_watch_status("error", self.id) elif self.active == False: self.stop() else: self.specto.mark_watch_status("idle", self.id) try: self.lock.release() self.timer_id = gobject.timeout_add(self.refresh, self.start_checking) except: self.timer_id = gobject.timeout_add(self.refresh, self.check) except: self.set_error(_("There was an error checking the watch")) def check_connection(self): if not self.specto.connection_manager.connected(): self.specto.logger.log(_("No network connection detected"), "warning", self.name) self.specto.connection_manager.add_callback(self.start_checking) self.specto.mark_watch_status("no-network", self.id) return False else: self.specto.mark_watch_status("idle", self.id) return True def get_values(self): return self.values def set_values(self, values, validate=False): error_fields = "" for key, type in self.watch_values: try: value = values[key] except KeyError: if type.mandatory == False: values[key] = type.getStandardValue() value = values[key] if not validate: setattr(self, key, value) else: error_fields += ", " + key else: value = type.checkRestrictions(values[key]) if value[0] == True: if type.mandatory == True and value[1] == type.getStandardValue(): error_fields += ", " + key else: values[key] = value[1] if not validate: setattr(self, key, value[1]) else: error_fields += ", " + key if values['open_command'] == "": try: self.open_command = self.standard_open_command except: self.open_command = "" if self.last_changed == "" or self.last_changed == _("No changes yet") or self.last_changed == "No changes yet": #otherwise, it will be saved untranslated in the watch list self.last_changed = _("No changes yet") if len(error_fields) != 0: error_fields = error_fields.lstrip(",") raise AttributeError(error_fields) else: if not validate: self.values = values def get_balloon_text(self): return "No message specified yet!" #no need to translate this, if users get to see this, it's no good def get_extra_information(self): """Provide information to be shown in the Extra information tab in the notifier window. Remember to use the escape method to sanitize special characters before adding formatting.""" return _("No extra information available.") def escape(self, text): """Sanitize the input to remove special characters, PyGTK doesn't like them. Use this in the get_extra_information method of watches.""" text = escape(text) # Remove the biggest part using the CGI library's escape function text = str(text).replace('<', "<").replace('>', ">") # Escape the < and > characters return text def remove_cache_files(self): return "" def set_error(self, message=""): self.error = True if message != "": self.error_message = str(message) self.specto.logger.log(('%s') % str(message), "error", self.name) else: self.error_message = _("Unexpected error:") + " " + str(sys.exc_info()[1]) self.specto.logger.log(self.error_message, "error", self.name) class Watch_collection: def __init__(self, specto): self.watch_db = [] self.plugin_menu = {} self.id = 0 self.plugin_dict = {} self.disabl_plugin_dict = {} self.specto = specto self.load_plugins() def load_plugins(self): dir = self.specto.SRC_PATH + "/plugins/" sys.path.append(dir) for f in os.listdir(dir): if f[-3:] == ".py" and f != "__init__.py": if not os.path.exists('data'): dir = "spectlib.plugins." else: dir = "spectlib/plugins/" _file = f[:-3] try: mod = __import__(_file, globals(), locals(), ['']) obj = sys.modules[_file] self.plugin_dict[obj.type] = mod #create the plugin dict for add menu menu1 = obj.category menu2 = [obj.type_desc, obj.icon, obj.type] if not menu1 in self.plugin_menu: self.plugin_menu.update({menu1: []}) self.plugin_menu[menu1].append(menu2) except: self.specto.logger.log(_('There was an error opening the file %s') % _file, "critical", "specto") def create(self, values): """ read the content from the dictionary and create the watch """ _id = [] for i in values: type = values[i]['type'] #get the right object and create the watch object mod = "" try: mod = self.plugin_dict[type] except: self.specto.logger.log(_('Please enable plugin "%s" if you want to use the watch "%s".') % (type, values[i]["name"]), "critical", "specto") if mod: obj = getattr(mod, type) try: watch_ = obj(self.specto, self.id, values[i]) except AttributeError, error_fields: if len(values) > 1: pass else: raise AttributeError(error_fields) else: self.watch_db.append(watch_) _id.append(self.id) self.id += 1 return _id def remove(self, id): """ remove the watch from the collection """ self.watch_db[id].stop() self.watch_db[id].changed = False self.watch_db[id].deleted = True try: self.watch_db[id].remove_cache_files() except: pass self.specto.logger.remove_watch_log(self.watch_db[id].name) def get(self, id): """ get a watch object """ return self.watch_db[id] def mark_all_watches_as_read(self): """ mark all watches as not changed """ for watch in self.watch_db: watch.mark_as_read() def start_all_watches(self): """ start all watches in the collection """ for watch in self.watch_db: watch.start() def stop_all_watches(self): """ stop all watches in the collection """ for watch in self.watch_db: watch.stop() def restart_all_watches(self): """ restart all watches in the collection """ for watch in self.watch_db: if watch.active == True: watch.restart() def length(self): """ return the length from the collection """ return len(self.watch_db) def count_changed_watches(self): """ Count the number of changed watches for the tooltip. """ count_changed = {} for watch in self.watch_db: try: count_changed[watch.type_desc] except KeyError: count_changed[watch.type_desc] = 0 if watch.changed == True: changes = count_changed[watch.type_desc] count_changed[watch.type_desc] = changes + 1 return count_changed def find_watch(self, name): """ Returns the key of a watch or None if it doesn't exists. """ k = -1 for watch in self.watch_db: if watch.name == name: k = watch.id break return k def set_interval(self, refresh, refresh_unit): """ Set the interval between the checks. refresh = number refresh_unit = days, hours, minutes,... in values of 0, 1, 2, 3. """ new_refresh = 0 if refresh_unit == 0: # Seconds new_refresh = refresh * 1000 elif refresh_unit == 1: # Minutes new_refresh = refresh * 60 * 1000 elif refresh_unit == 2: # Hours new_refresh = (refresh * 60) * 60 * 1000 elif refresh_unit == 3: # Days new_refresh = ((refresh * 60) * 60) * 24 *1000 return new_refresh def convert_passwords(self, use_keyring): self.specto.use_keyring = use_keyring for watch in self.watch_db: if 'password' in watch.values: if use_keyring == False: self.specto.watch_io.remove_keyring(watch.name) self.specto.watch_io.write_option(watch.name, 'password', watch.password) def get_interval(self, value): """ Get the interval between 2 checks. """ if ((value / 60) / 60) / 24 / 1000 > 0: refresh_value = ((value / 60) / 60) / 24 / 1000 type = 3 elif (value / 60) / 60 / 1000 > 0: refresh_value = (value / 60) / 60 / 1000 type = 2 elif value / 60 / 1000 > 0: refresh_value = value / 60 / 1000 type = 1 else: refresh_value = value / 1000 type = 0 return refresh_value, type def __getitem__(self, i): return self.watch_db[i] class Watch_io: """ A class for managing watches. """ def __init__(self, specto, file_name): # Read the watch from file using the iniparser module self.specto = specto self.file_name = file_name self.valid = True if not os.path.exists(self.file_name): try: f = open(self.file_name, "w") except: self.valid = False self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") finally: f.close() os.chmod(self.file_name, 0600) # This is important for security purposes, we make the file read-write to the owner only, otherwise everyone can read passwords. try: self.cfg = ini_namespace(file(self.file_name)) except: self.valid = False self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") def read_all_watches(self, startup=False): """ Read the watch options from the config file and return a dictionary containing the info needed to start the watches. """ watch_value_db = {} if startup == False: try: self.cfg = ini_namespace(file(self.file_name)) except: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False names = self.cfg._sections.keys() i = 0 for name_ in names: watch_value_db[i] = self.read_watch(name_, startup) i += 1 return watch_value_db def read_watch(self, name, startup=False): """ Read the watch options from one watch. """ watch_options = {} if startup == False: try: self.cfg = ini_namespace(file(self.file_name)) except: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False name = self.hide_brackets(name) options = self.cfg._sections[name]._options.keys() for option_ in options: if option_ == "password" and not self.check_old_version(self.cfg[name]['type']): #don't use decoding for old watches.list option = self.read_option(name, option_, startup) option = self.decode_password(name, option) else: option = self.read_option(name, option_, startup) watch_options_ = {option_: option} watch_options.update(watch_options_) name = self.show_brackets(name) watch_options.update({'name': name}) return watch_options def read_option(self, name, option, startup=False): """ Read one option from a watch """ if startup == False: try: self.cfg = ini_namespace(file(self.file_name)) except: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False try: return self.cfg[name][option] except: return 0 def write_watch(self, values): """ Write or change the watch options in a configuration file. Values has to be a dictionary with the name from the options and the value. example: { 'name':'value', 'interval':'value' } If the name is not found, a new watch will be added, else the excisting watch will be changed. """ try: cfg = ini_namespace(file(self.file_name)) except: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False if cfg: name = self.hide_brackets(values['name']) if not name in cfg._sections: cfg.new_namespace(name) #add a new watch try: f = open(self.file_name, "w") f.write(str(cfg).strip()) #write the new configuration file except IOError: self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") return False finally: f.close() del values['name'] for option, value in values.iteritems(): self.write_option(name, option, value) def write_option(self, name, option, value): try: cfg = ini_namespace(file(self.file_name)) except: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False if cfg: name = self.hide_brackets(name) if not name in cfg._sections: return 0 else: if option == "password": # and self.check_old_version(self.cfg[name]['type']): #don't use encoding for old watches.list value = self.encode_password(name, value) cfg[name][option] = value try: f = open(self.file_name, "w") f.write(str(cfg).strip()) #write the new configuration file except IOError: self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") return False finally: f.close() def remove_keyring(self, name): try: k = Keyring(name, "Specto " + name, "network") password = self.read_option(name, "password") k.remove_keyring(password) except: pass def remove_watch(self, name): """ Remove a watch from the configuration file. """ self.remove_keyring(name) try: cfgpr = ConfigParser() cfgpr.read(self.file_name) cfgpr.remove_section(self.hide_brackets(name)) f = open(self.file_name, "w") cfgpr.write(open(self.file_name, "w")) except IOError: self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") return False finally: f.close() def is_unique_watch(self, name): """ Returns True if the watch is found in the file. """ try: self.cfg = ini_namespace(file(self.file_name)) if not (self.hide_brackets(name)) in self.cfg._sections: return False else: return True except IOError: self.specto.logger.log(_("There was an error initializing config file %s") % self.file_name, "critical", "specto") return False #this has to be an error def replace_name(self, name, new_name): """ Replace a watch name (rename). """ #read the file try: f = open(self.file_name, "r") text = f.read() except IOError: self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") except: f.close name = self.hide_brackets(name) new_name = self.hide_brackets(new_name) text = text.replace("[" + name + "]", "[" + new_name + "]") if text: #replace and write file try: f = open(self.file_name, "w") f.write(text) except IOError: self.specto.logger.log(_("There was an error writing to the file %s") % self.file_name, "critical", "specto") return False finally: f.close() def hide_brackets(self, name): name = name.replace("[", "&brStart;") name = name.replace("]", "&brEnd;") return name def show_brackets(self, name): name = name.replace("&brStart;", "[") name = name.replace("&brEnd;", "]") return name def encode_password(self, name, password): if self.specto.use_keyring == True and keyring == True: k = Keyring(name, "Specto " + name, "network") id = k.set_credentials((name, password)) password = "keyring:" + str(id) return password def decode_password(self, name, password): if self.specto.use_keyring == True and keyring == True: try: k = Keyring(name, "Specto " + name, "network") password = k.get_credentials()[1] except: password = password return password def check_old_version(self, type): old = True try: int(type) #type is int: old version old = True except ValueError: old = False #type is not int: new version return old specto-0.3.1/spectlib/trayicon.py0000644000175000017500000002055211225517121015426 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # trayicon.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import gtk import os from spectlib.i18n import _ def gettext_noop(s): return s class Tray: """ Display a tray icon in the notification area. """ def __init__(self, specto, notifier): self.specto = specto self.notifier = notifier self.ICON_PATH = os.path.join(self.specto.PATH, "icons/specto_tray_1.svg") self.ICON2_PATH = os.path.join(self.specto.PATH, "icons/specto_tray_2.svg") # Create the tray icon object self.tray = None if not self.tray: self.tray = gtk.StatusIcon() self.tray.set_from_file(self.ICON_PATH) self.tray.connect("activate", self.show_notifier) self.tray.connect("popup-menu", self.show_popup) if self.specto.specto_gconf.get_entry("always_show_icon") == True: self.tray.set_visible(True) else: self.tray.set_visible(False) while gtk.events_pending(): gtk.main_iteration(True) def set_icon_state_excited(self): """ Change the tray icon to "changed". """ if self.specto.specto_gconf.get_entry("always_show_icon") == False: self.tray.set_from_file(self.ICON2_PATH) self.tray.set_visible(True)#we need to show the tray again else: self.tray.set_from_file(self.ICON2_PATH) def set_icon_state_normal(self): """ Change the tray icon to "not changed". If the user requested to always show the tray, it will change its icon but not disappear. Otherwise, it will be removed.""" if self.specto.specto_gconf.get_entry("always_show_icon") == False: self.tray.set_visible(False) else: self.tray.set_from_file(self.ICON_PATH) def show_tooltip(self): """ Create the tooltip message and show the tooltip. """ global _ show_return = False changed_messages = self.specto.watch_db.count_changed_watches() message = "" z = 0 y = 0 for i in changed_messages.values(): if i > 0: y += 1 if show_return == True: message += "\n" message += str(i) + " " + changed_messages.keys()[z] #message += i18n._translation.ungettext(_("watch"), _("watches"), i) #disabled, because it is redundant and not properly translatable show_return = True z += 1 if y > 0: self.set_icon_state_excited() else: message = _("No changed watches.") self.set_icon_state_normal() self.tray.set_tooltip(message) def show_preferences(self, widget): """ Call the main function to show the preferences window. """ self.notifier.show_preferences() def show_help(self, widget): """ Call the main function to show help. """ self.notifier.show_help() def show_about(self, widget): """ Call the main function to show the about window. """ self.notifier.show_about() def refresh(self, widget): self.notifier.refresh_all_watches() def show_notifier(self, widget): """ Call the main function to show the notifier window. """ if self.specto.specto_gconf.get_entry("always_show_icon") == True: self.specto.toggle_notifier() else: self.specto.notifier.notifier.present() def show_popup(self, status_icon, button, activate_time): """ Create the popupmenu """ ## From the PyGTK 2.10 documentation # status_icon : the object which received the signal # button : the button that was pressed, or 0 if the signal is not emitted in response to a button press event # activate_time : the timestamp of the event that triggered the signal emission if self.specto.specto_gconf.get_entry("always_show_icon") == True and self.specto.notifier.get_state() == True: text = _("Hide window") else: text = _("Show window") # Create menu items self.item_show = gtk.MenuItem(text, True) self.item_pref = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) self.item_help = gtk.ImageMenuItem(gtk.STOCK_HELP) self.item_about = gtk.ImageMenuItem(gtk.STOCK_ABOUT) self.item_quit = gtk.ImageMenuItem(gtk.STOCK_QUIT) self.item_clear = gtk.MenuItem(_("Mark as read"), True) self.item_refresh = gtk.ImageMenuItem(_("Refresh All")) image = gtk.image_new_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU) self.item_refresh.set_image(image) image.show() #create submenu for changed watches self.sub_menu = gtk.Menu() self.sub_item_clear = gtk.ImageMenuItem(_("_Mark all read"), True) image = gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) self.sub_item_clear.set_image(image) image.show() self.sub_item_clear.connect('activate', self.specto.notifier.mark_all_as_read) self.sub_menu.append(self.sub_item_clear) self.sub_menu.append(gtk.SeparatorMenuItem()) for watch in self.specto.watch_db: if watch.changed == True: self.sub_item_clear = gtk.ImageMenuItem(watch.name, True) image = gtk.image_new_from_pixbuf(self.notifier.get_icon(watch.icon, 0, False)) self.sub_item_clear.set_image(image) self.sub_item_clear.connect('activate', self.specto.notifier.mark_watch_as_read, watch.id) self.sub_menu.append(self.sub_item_clear) self.sub_menu.show_all() self.item_clear.set_submenu(self.sub_menu) # Connect the events self.item_show.connect('activate', self.show_notifier) self.item_refresh.connect('activate', self.refresh) self.item_pref.connect('activate', self.show_preferences) self.item_help.connect('activate', self.show_help) self.item_about.connect('activate', self.show_about) self.item_quit.connect('activate', self.quit) # Create the menu self.menu = gtk.Menu() # Append menu items to the menu self.menu.append(self.item_show) self.menu.append(gtk.SeparatorMenuItem()) self.menu.append(self.item_refresh) self.menu.append(self.item_clear) self.menu.append(gtk.SeparatorMenuItem()) self.menu.append(self.item_pref) self.menu.append(self.item_help) self.menu.append(self.item_about) self.menu.append(gtk.SeparatorMenuItem()) self.menu.append(self.item_quit) self.menu.show_all() self.menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, self.tray)#the last argument is to tell gtk.status_icon_position_menu where to grab the coordinates to position the popup menu correctly def get_x(self): if self.tray.get_visible()==True: x = self.tray.get_geometry()[1][0] x += int(self.tray.get_size() / 2) #add half the icon's width else: x = 0 #remove half the icon's width #FIXME: I don't know why that one does not work return x def get_y(self): if self.tray.get_visible()==True: y = self.tray.get_geometry()[1][1] y += int(self.tray.get_size() / 2) #add half the icon's height else: y = 0 #remove half the icon's height #FIXME: I don't know why that one does not work return y def destroy(self): self.tray.set_visible(False) def quit(self, widget): """ Call the main function to quit specto. """ self.specto.quit() specto-0.3.1/spectlib/preferences.py0000644000175000017500000001751111225517121016100 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # preferences.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade except: pass class Preferences: """ Display the preferences window. """ def __init__(self, specto, notifier): self.specto = specto self.notifier = notifier gladefile = os.path.join(self.specto.PATH, "glade/preferences.glade") windowname = "preferences" self.wTree = gtk.glade.XML(gladefile, windowname, \ self.specto.glade_gettext) #catch some events dic = {"on_cancel_clicked": self.delete_event, "on_preferences_delete_event": self.delete_event, "on_save_clicked": self.save_clicked, "on_help_clicked": self.help_clicked, "on_chkSoundChanged_toggled": self.chkSoundChanged_toggled, "on_chkSoundProblem_toggled": self.chkSoundProblem_toggled, "on_button_log_clear_clicked": self.specto.logger.clear_log, "on_button_log_open_clicked": self.notifier.show_error_log} #attach the events self.wTree.signal_autoconnect(dic) self.preferences = self.wTree.get_widget("preferences") #set the preferences self.get_preferences() def save_clicked(self, widget): """ Save the preferences. """ self.preferences.hide() self.set_preferences() self.notifier.show_watch_info() def chkSoundChanged_toggled(self, widget): """ Make the filechooser sensitive or insensitive. """ if widget.get_active(): self.wTree.get_widget("soundChanged").set_property('sensitive', 1) else: self.wTree.get_widget("soundChanged").set_property('sensitive', 0) def chkSoundProblem_toggled(self, widget): """ Make the filechooser sensitive or insensitive. """ if widget.get_active(): self.wTree.get_widget("soundProblem").set_property('sensitive', 1) else: self.wTree.get_widget("soundProblem").set_property('sensitive', 0) def set_preferences(self): """ Save the preferences in gconf. """ #save the path for the "changed" sound if self.wTree.get_widget("soundChanged").\ get_property('sensitive') == 1: self.specto.specto_gconf.set_entry("changed_sound", \ self.wTree.get_widget("soundChanged")\ .get_filename()) self.specto.specto_gconf.set_entry("use_changed_sound", True) else: self.specto.specto_gconf.unset_entry("use_changed_sound") #save the path from the problem sound if self.wTree.get_widget("soundProblem").\ get_property('sensitive') == 1: self.specto.specto_gconf.set_entry("problem_sound", \ self.wTree.get_widget("soundProblem").get_filename()) self.specto.specto_gconf.set_entry("use_problem_sound", True) else: self.specto.specto_gconf.unset_entry("use_problem_sound") #see if pop toast has to be saved if self.wTree.get_widget("chk_libnotify").get_active(): self.specto.specto_gconf.set_entry("pop_toast", True) else: self.specto.specto_gconf.set_entry("pop_toast", False) #see if windowlist has to be saved if self.wTree.get_widget("chk_windowlist").get_active(): self.specto.specto_gconf.set_entry("show_in_windowlist", True) self.notifier.notifier.set_skip_taskbar_hint(False) else: self.specto.specto_gconf.set_entry("show_in_windowlist", False) self.notifier.notifier.set_skip_taskbar_hint(True) #see if tray has to be saved if self.wTree.get_widget("chk_tray").get_active(): self.specto.specto_gconf.set_entry("always_show_icon", True) else: self.specto.specto_gconf.set_entry("always_show_icon", False) self.notifier.recreate_tray() #see if debug mode has to be saved if self.wTree.get_widget("chk_debug").get_active(): self.specto.specto_gconf.set_entry("debug_mode", True) self.specto.DEBUG = True else: self.specto.specto_gconf.set_entry("debug_mode", False) self.specto.DEBUG = False #use keyring? if self.wTree.get_widget("chkUseKeyring").get_active(): self.specto.specto_gconf.set_entry("use_keyring", True) self.specto.watch_db.convert_passwords(True) else: self.specto.specto_gconf.set_entry("use_keyring", False) self.specto.watch_db.convert_passwords(False) def get_preferences(self): """ Get the preferences from gconf. """ #check toast if self.specto.specto_gconf.get_entry("pop_toast") == True: self.wTree.get_widget("chk_libnotify").set_active(True) else: self.wTree.get_widget("chk_libnotify").set_active(False) #check windowlist if self.specto.specto_gconf.get_entry("show_in_windowlist") == True: self.wTree.get_widget("chk_windowlist").set_active(True) else: self.wTree.get_widget("chk_windowlist").set_active(False) #check tray if self.specto.specto_gconf.get_entry("always_show_icon") == True: self.wTree.get_widget("chk_tray").set_active(True) else: self.wTree.get_widget("chk_tray").set_active(False) #check "changed" sound if self.specto.specto_gconf.get_entry("use_changed_sound"): self.wTree.get_widget("chkSoundChanged").set_active(True) if self.specto.specto_gconf.get_entry("changed_sound"): self.wTree.get_widget("soundChanged").\ set_filename(self.specto.specto_gconf.\ get_entry("changed_sound")) #check problem sound if self.specto.specto_gconf.get_entry("use_problem_sound"): self.wTree.get_widget("chkSoundProblem").set_active(True) if self.specto.specto_gconf.get_entry("problem_sound"): self.wTree.get_widget("soundProblem").\ set_filename(self.specto.specto_gconf.\ get_entry("problem_sound")) #check debug if self.specto.specto_gconf.get_entry("debug_mode") == True: self.wTree.get_widget("chk_debug").set_active(True) else: self.wTree.get_widget("chk_debug").set_active(False) if self.specto.specto_gconf.get_entry("use_keyring") == True: self.wTree.get_widget("chkUseKeyring").set_active(True) else: self.wTree.get_widget("chkUseKeyring").set_active(False) def help_clicked(self, widget): """ Show the help webpage. """ self.specto.show_help() def delete_event(self, widget, *args): """ Hide the window. """ self.preferences.hide() return True if __name__ == "__main__": #run the gui app = Preferences() gtk.main() specto-0.3.1/spectlib/__init__.py0000644000175000017500000000000011041474551015324 0ustar jeffjeffspecto-0.3.1/spectlib/add_watch.py0000644000175000017500000002161511225517121015515 0ustar jeffjeff# -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # add_watch.py # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade import spectlib.gtkutil except: pass class Add_watch: """Class to create the add watch dialog.""" # Please do not use confusing widget names such as 'lbl' and 'tbl', # Use full names like 'label' and 'table'. def __init__(self, specto, notifier, watch_type): self.specto = specto self.notifier = notifier #create tree gladefile = os.path.join(self.specto.PATH, "glade/add_watch.glade") windowname = "add_watch" self.wTree = gtk.glade.XML(gladefile, windowname, self.specto.glade_gettext) self.watch_type = watch_type #save the option for hiding the table self.option_visible = -1 #catch some events dic = {"on_button_cancel_clicked": self.cancel_clicked, "on_button_add_clicked": self.add_clicked, "on_button_help_clicked": self.help_clicked, "on_add_watch_delete_event": self.delete_event, "check_command_toggled": self.command_toggled, "check_open_toggled": self.open_toggled, "on_refresh_unit_changed": self.set_refresh_values} #attach the events self.wTree.signal_autoconnect(dic) self.add_watch = self.wTree.get_widget("add_watch") icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.add_watch.set_icon(icon) self.add_watch.set_resizable(False) self.name = self.wTree.get_widget("name") self.refresh = self.wTree.get_widget("refresh") self.refresh_unit = self.wTree.get_widget("refresh_unit") #create the gui self.plugins_ = {} self.watch_options = {} self.set_options(watch_type) #set the default values self.refresh_unit.set_active(2) self.refresh.set_value(1.0) self.name.grab_focus() def set_options(self, watch_type): """ Show the table with the right watch options. """ values = self.specto.watch_db.plugin_dict[watch_type].get_add_gui_info() #create the options gui self.table = gtk.Table(rows=len(values), columns=1, homogeneous=False) self.table.set_row_spacings(6) self.table.set_col_spacings(6) self.watch_options[watch_type] = {} i = 0 for value, widget in values: table, _widget = widget.get_widget() self.table.attach(table, 0, 1, i, i + 1) self.watch_options[watch_type].update({value: widget}) i += 1 self.table.show() vbox = self.wTree.get_widget("vbox_watch_options") vbox.pack_start(self.table, False, False, 0) def set_refresh_values(self, widget): """ Set the max and min values for the refresh unit. """ digits = 0 climb_rate = 1.0 refresh_unit = self.refresh_unit.get_active() if refresh_unit == 0 or refresh_unit == 1: adjustment = gtk.Adjustment(value=1, lower=1, upper=60, step_incr=1, page_incr=10, page_size=0) if refresh_unit == 2: adjustment = gtk.Adjustment(value=1, lower=1, upper=24, step_incr=1, page_incr=10, page_size=0) if refresh_unit == 3: adjustment = gtk.Adjustment(value=1, lower=1, upper=365, step_incr=1, page_incr=30, page_size=0) self.refresh.configure(adjustment, climb_rate, digits) def add_clicked(self, widget): """ Add the watch to the watches repository. """ values = {} #get the standard options from a watch values['name'] = self.name.get_text() #check if the watch is unique if self.specto.watch_io.is_unique_watch(values['name']): unique_dialog = Unique_Dialog(self.specto) result = unique_dialog.run() if result ==1: self.name.grab_focus() else: #edit the existing watch self.add_watch.hide_all() name = values['name'] self.notifier.show_edit_watch(-1, name) else: values['refresh'] = self.specto.watch_db.set_interval(self.refresh.get_value_as_int(), self.refresh_unit.get_active()) values['type'] = self.watch_type values['active'] = True values['last_changed'] = "" values['changed'] = False if self.wTree.get_widget("check_command").get_active() == True: values['command'] = self.wTree.get_widget("entry_changed_command").get_text() if self.wTree.get_widget("check_open").get_active() == True: values['open_command'] = self.wTree.get_widget("entry_open_command").get_text() else: values['open_command'] = "" open = True gui_values = self.specto.watch_db.plugin_dict[values['type']].get_add_gui_info() window_options = self.watch_options[values['type']] for key in window_options: values[key] = window_options[key].get_value() window_options[key].set_color(0xFFFF, 0xFFFF, 0xFFFF) self.wTree.get_widget("name").modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(0xFFFF, 0xFFFF, 0xFFFF)) try: id = self.specto.watch_db.create({0: values})[0] #write the options in the configuration file except AttributeError, error_fields: fields = str(error_fields).split(",") i = 1 for field in fields: if field == " name": self.wTree.get_widget("name").modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(65535, 0, 0)) self.wTree.get_widget("name").grab_focus() else: field = window_options[field.strip()] if i == 1: field.grab_focus() i = 0 field.set_color(65535, 0, 0) else: self.add_watch.destroy() if open == True: try: self.specto.watch_db[id].open_command = self.specto.watch_db[id].standard_open_command except: self.specto.watch_db[id].open_command = "" self.specto.watch_io.write_watch(values) self.notifier.add_notifier_entry(id) self.specto.watch_db[id].start() def help_clicked(self, widget): """ Call the show help function. """ self.specto.util.show_webpage("http://code.google.com/p/specto/wiki/AddingWatches") def cancel_clicked(self, widget): """ Destroy the add watch window. """ self.add_watch.destroy() def delete_event(self, widget, event, data=None): """ Destroy the window. """ self.add_watch.destroy() return True def command_toggled(self, widget): sensitive = self.wTree.get_widget("check_command").get_active() self.wTree.get_widget("entry_changed_command").set_sensitive(sensitive) def open_toggled(self, widget): sensitive = self.wTree.get_widget("check_open").get_active() self.wTree.get_widget("entry_open_command").set_sensitive(sensitive) class Unique_Dialog: """ Class to create a message when you add a watch with an existing name. """ def __init__(self, specto): self.specto = specto self.gladefile = os.path.join(self.specto.PATH, "glade/add_watch.glade") self.dialogname = "dialog" def run(self): """ Show the unique dialog. """ self.wTree = gtk.glade.XML(self.gladefile, self.dialogname) self.unique_dialog = self.wTree.get_widget("dialog") icon = gtk.gdk.pixbuf_new_from_file(os.path.join(self.specto.PATH, "icons/specto_window_icon.png")) self.unique_dialog.set_icon(icon) self.unique_dialog.set_resizable(False) self.result = self.unique_dialog.run() self.unique_dialog.destroy() return self.result if __name__ == "__main__": #run the gui app = Add_watch() gtk.main() specto-0.3.1/specto.desktop0000644000175000017500000000027411041474552014314 0ustar jeffjeff[Desktop Entry] Name=Specto Comment=Be notified of everything Comment[fr]=Soyez alerte Categories=GNOME;Utility; Exec=specto Icon=specto StartupNotify=true Terminal=false Type=Application specto-0.3.1/PKG-INFO0000644000175000017500000000052511226433142012513 0ustar jeffjeffMetadata-Version: 1.0 Name: specto Version: 0.3.1 Summary: A desktop application that will watch configurable events (website updates, emails, file and folder changes...) Home-page: http://specto.sourceforge.net Author: Jean-Francois Fortin Tam Author-email: nekohayo at gmail dot com License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN specto-0.3.1/specto0000755000175000017500000000170411210222741012633 0ustar jeffjeff#!/usr/bin/python # -*- coding: UTF8 -*- # Specto , Unobtrusive event notifier # # specto # # See the AUTHORS file for copyright ownership information # 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., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os from spectlib.main import Specto app_name = "specto" app_version = "0.3" specto = Specto() specto-0.3.1/po/0000755000175000017500000000000011226433142012032 5ustar jeffjeffspecto-0.3.1/po/specto.pot0000644000175000017500000005727711162731131014073 0ustar jeffjeff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2009-03-26 12:50+EDT\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" "Generated-By: pygettext.py 1.5\n" #: ../data/glade/add_watch.glade.h:1 ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "" #: ../data/glade/add_watch.glade.h:3 ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" #: ../data/glade/add_watch.glade.h:8 ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "" #: ../data/glade/add_watch.glade.h:9 ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "" #: ../data/glade/add_watch.glade.h:10 ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "" #: ../data/glade/add_watch.glade.h:11 ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" #: ../data/glade/add_watch.glade.h:19 ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "" #: ../data/glade/add_watch.glade.h:20 ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "" #: ../data/glade/edit_watch.glade.h:5 ../spectlib/notifier.py:788 msgid "Error log" msgstr "" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "" #: ../data/glade/notifier.glade.h:10 ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "" #: ../data/glade/notifier.glade.h:20 ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "" #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "" #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "" #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "" #: ../spectlib/console.py:45 ../spectlib/watch.py:140 msgid "Watch has changed." msgstr "" #: ../spectlib/console.py:50 ../spectlib/watch.py:121 msgid "Watch started checking." msgstr "" #: ../spectlib/console.py:52 msgid "Watch is idle." msgstr "" #: ../spectlib/console.py:54 ../spectlib/watch.py:174 msgid "No network connection detected" msgstr "" #: ../spectlib/console.py:56 ../spectlib/watch.py:136 ../spectlib/watch.py:170 msgid "There was an error checking the watch" msgstr "" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "" #: ../spectlib/edit_watch.py:186 ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "" #: ../spectlib/edit_watch.py:187 ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" #: ../spectlib/export_watch.py:57 ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "" #: ../spectlib/export_watch.py:86 ../spectlib/import_watch.py:87 msgid "Select" msgstr "" #: ../spectlib/export_watch.py:92 ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "" #: ../spectlib/export_watch.py:98 ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "" #: ../spectlib/export_watch.py:106 ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "" #: ../spectlib/export_watch.py:113 ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "" #: ../spectlib/gtkconfig.py:171 ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "" #: ../spectlib/gtkconfig.py:204 ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" #: ../spectlib/import_watch.py:60 ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "" #: ../spectlib/main.py:130 msgid "Could not create a watch, because it is corrupt." msgstr "" #: ../spectlib/main.py:204 ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "" #: ../spectlib/main.py:258 msgid "Murder!" msgstr "" #: ../spectlib/main.py:269 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "" #: ../spectlib/notifier.py:185 ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "" #: ../spectlib/notifier.py:218 ../spectlib/notifier.py:347 msgid "The network connection seems to be down, networked watches will not check until then." msgstr "" #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "" #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "" #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "" #: ../spectlib/notifier.py:245 msgid "%s has changed" msgstr "" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "" #: ../spectlib/notifier.py:392 ../spectlib/watch.py:230 msgid "No extra information available." msgstr "" #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "" #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "" #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "" #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "" #: ../spectlib/notifier.py:693 msgid "Active" msgstr "" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 ../spectlib/watch.py:241 #: ../spectlib/watch.py:250 msgid "Unexpected error:" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 ../spectlib/watch.py:288 msgid "There was an error opening the file %s" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:43 msgid "Folder (optional)" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 ../spectlib/watch.py:447 #: ../spectlib/watch.py:541 ../spectlib/watch.py:569 ../spectlib/watch.py:593 #: ../spectlib/watch.py:619 ../spectlib/watch.py:633 msgid "There was an error writing to the file %s" msgstr "" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "" #: ../spectlib/plugins/watch_system_file.py:157 msgid "" "%s has changed:\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "" "1 new file was created.\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:167 msgid "" " new files were created.\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "" "1 file was removed.\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:172 msgid "" " files were removed.\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "" "1 file was modified.\n" msgstr "" #: ../spectlib/plugins/watch_system_folder.py:177 msgid "" " files were modified.\n" msgstr "" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The network socket on port %s was established." msgstr "" #: ../spectlib/plugins/watch_system_port.py:116 msgid "The network socket on port %s was closed." msgstr "" #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "" #: ../spectlib/plugins/watch_system_process.py:98 msgid "The system process has started." msgstr "" #: ../spectlib/plugins/watch_system_process.py:100 msgid "The system process has stopped." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "" #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "" #: ../spectlib/watch.py:88 msgid "There was an error starting the watch" msgstr "" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "" #: ../spectlib/watch.py:108 msgid "There was an error marking the watch as read" msgstr "" #: ../spectlib/watch.py:151 msgid "There was an error marking the watch as changed" msgstr "" #: ../spectlib/watch.py:216 ../spectlib/watch.py:217 msgid "No changes yet" msgstr "" #: ../spectlib/watch.py:301 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "" #: ../spectlib/watch.py:455 ../spectlib/watch.py:468 ../spectlib/watch.py:488 #: ../spectlib/watch.py:514 ../spectlib/watch.py:530 ../spectlib/watch.py:554 #: ../spectlib/watch.py:609 msgid "There was an error initializing config file %s" msgstr "" specto-0.3.1/po/es/0000755000175000017500000000000011226433142012441 5ustar jeffjeffspecto-0.3.1/po/es/specto.mo0000644000175000017500000004250611162732010014275 0ustar jeffjefft   6PGYHGBW&g $&C SaB M T`%q-  eRbx 0*( :!Gi~2   -<"Nqz     DD:P2 B NF\&&)<.~k  )0?GOj q + _ ".>Fary~U). N n    !&!%!."/G",w"+"&"%"%#)C#m#!#######8#'$/$L$U$e$}$$$ $$ $$%%%%#&z(&$& && &&&&'' !'.' 4'B' U'c' s'''' G)h)#))G))P*S`***'*+$+A+P+k++++$,,,),-*-9--N .Z.a.t.?.5.. / //s1/////0 06#03Z0000'01%1;D111110111 2242(G2p2y22222222 2!23-32353:333;3(5 >5H5N5]5 p5|55K5N5 &6G6%V6|6O6677B*7&m777 717;7D8`88 88 99 979@9 W9 b9o9 999:99^ : j:v:::::::::Z:.U;2;&;&;&<,<)L<2v<'<<,=@=9>8:>6s>+>*>+?.-?#\?,????? ??S?N@#W@{@@"@@@@ A#A@AQA%$B!JB(lB(B!BB1jCCCCCCCCD!D3D8DIDaDqD DDD :5HVc0RK `)$&CpF>{=oiP-LSaG6;s @NqMYgf[,|/dh+W4l]_!b'y8U139Om#QE2 xw%D"ujeB?tZ.kr*Jv^(n} ~A\zTI7X< files were modified. files were removed. new files were created. or more%d new local revisions have not yet been merged with its parent branch.%d new messages%d new messages from %s... ... totalling %d unread mails.%d new newsitems in %s... ... totalling %s unread items.%d new notifications%d new requests%d new revisions on the remote branch.%d new wall posts%s encountered a problem%s has changed1 file was modified. 1 file was removed. 1 new file was created. %s has changed: Specto is currently busy and cannot quit yet. This may be because it is checking for watch changes. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayGeneral settingsRun a custom command:SecuritySoundsSpecto encountered an error Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.Watch optionsRemove the watch "%s"? This operation cannot be undone.ActiveAdd a WatchAdvanced optionsAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBazaarBy ActiveBy NameBy Watch TypeCannot display notification message. Make sure that libnotify and D-Bus are available on your system.Cannot quit yetChoose an other nameChoose a directoryChoose a fileClosedConsole mode enabled.Could not create a watch, because it is corrupt.Could not establish a connection to serverCould not get cookiesDebug informationDeselect allDifference percentage: %s percentDisplay _All WatchesDisplay _ToolbarDisplay the notification window in the window listEditEdit existing watchEdit watch: EmailEnable debug mode and loggingErrorError logError margin (%)Export watchesExtra informationExtra information could not be setFacebookFileFile size changedFilesize difference: %.2fFilter:FolderGMailGeneralGeneral optionsGoogle ReaderGroup id of the owner changedHide windowHostIDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.Import watchesInternetIt is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account.Last changedLogsMailMain branchMark as readMurder!NameName:New message from %s... ... totalling %d unread mails.New newsitems in %s... ... totalling %s unread items.No changed watches.No changes yetNo extra information available.No network connection detectedNo parent branch available, you will not be notified of differences and changes.No unread itemsNot runningNotificationsOne new local revision has not yet been merged with its parent branch.One new revision on the remote branch.OpenPOP3PasswordPlay this sound when a problem occurs:Play this sound when a watch has changed:Please enable plugin "%s" if you want to use the watch "%s".Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.PortPreferencesProcessRefreshRefresh AllRefresh Interval:RemoveRemove a watchRunningSave AsSeconds Minutes Hours DaysSelectSelect a FileSelect allShow notifications when a watch has changedShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSocial networksSortingSpecto is already running!Specto's WebsiteStatusStopSystemTYPEThe file was removedThe network connection seems to be down, networked watches will not check until then.The network socket on port %s was closed.The network socket on port %s was established.The system process has started.The system process has stopped.The watch "%s" has a problem.The watch "%s" has changed.The watch "%s" is checking.The watch is not set to a folderThe watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.There was an error checking the watchThere was an error initializing config file %sThere was an error marking the watch as changedThere was an error marking the watch as readThere was an error marking the watch statusThere was an error opening the file %sThere was an error starting the watchThere was an error stopping the watchThere was an error writing to the file %sTime of last access changedTime of last modification changedTip of the Day:TypeURLUnexpected error:UnknownUnread messagesUse GNOME keyring to store passwords in encrypted formatUse SSLUser id of the owner changedUsernameVersion controlVisit the issue trackerWatch $WATCH_NAMEWatch has changed.Watch is idle.Watch openedWatch started checking.Webpage/feedWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.When this watch has changedWhen you open this watchWrong username or passwordWrong username/passwordYou are not subscribed to any feedsYou can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.You may need to check the error log.You received_Edit_Error Log_Export Watches_File_Help_Import Watches_Mark all read_Refresh All_Viewa new messagea new notificationa new requesta new wall postand others...no GTK, activating console modetranslator-creditsProject-Id-Version: Specto 0.3 POT-Creation-Date: 2009-03-20 10:42+EDT PO-Revision-Date: 2009-03-20 15:53-0300 Last-Translator: Emilio López Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.4 X-Poedit-Language: Spanish X-Poedit-Country: Bolivia X-Poedit-Country: Argentina archivos han sido modificados. archivos han sido eliminados. nuevos archivos han sido creados. o más%d nuevas revisiones locales aún no han sido unidas con su rama padre.%d nuevos mensajes%d nuevos mensajes de %s... ... totalizando %d emails no leídos.%s nuevas noticias en %s... ... totalizando %s elementos no leídos.%d nuevas notificaciones%d nuevos pedidos%d nuevas revisiones en la rama remota.%d nuevas entradas públicas%s ha encontrado un problema%s ha cambiado1 archivo fue modificado. 1 archivo ha sido eliminado. 1 nuevo archivo fue creado. %s ha cambiado: Specto actualmente esta ocupado y no puede salir todavía. Puede ser que este revisando actualizaciones en los Observadores. Sin embargo, puede tratar de forzarlo a salir usando el botón AsesinarRegistros e Informe de FallosVisualizaciónPreferencias generalesEjecutar un comando personalizado:SeguridadSonidosSpecto ha encontrado un error Por favor verifique si este error ya se encuentra en nuestro rastreador de problemas, y si no es así, ingréselo para que podamos repararlo.Opciones del observador¿Eliminar el observador "%s"? Esta operación no puede deshacerse.ActivoAgregar ObservadorOpciones avanzadasTodo Informe de Fallos Información Advertencias Error CríticoMostrar siempre el icono en el área de notificaciónBazaarPor ActivoPor NombrePor tipo de ObservadorNo se puede mostrar un mensaje de notificación. Asegúrese que libnotify y D-Bus estén disponibles en su sistema.Todavía no se puede salirElige otro nombreSeleccione un directorioSeleccione un archivoCerradoModo consola habilitado.No se pudo crear un observador, porque está corrupto.No se pudo establecer una conexión con el servidorNo se pudo obtener las cookiesInformación de depuraciónDeseleccionar todosPorcentaje de diferencia: %s por cientoMostrar _Todos los ObservadoresMostrar _Barra de HerramientasMostrar la ventana de notificación en la lista de ventanasEditarEditar un observador existenteEditar Observador:EmailActivar el modo de Informe de Fallos y RegistrosErrorRegistro de erroresMargen de Error (%)Exportar ObservadoresInformación extraNo se pudo guardar la información extraFacebookArchivoTamaño de archivo cambióDiferencia de tamaño: %.2fFiltro:CarpetaGMailGeneralPreferencias generalesGoogle ReaderCambió el id de grupo del dueñoOcultar ventanaHostIDIMAPSi se activa, recibirá mas información cuando ejecute Specto desde una terminal, y se adjuntara más información en los Registros del Programa.Importar ObservadoresInternetSe recomienda encarecidamente utilizar encriptación con contraseña del anillo de contraseñas. Si deshabilita esta opción, sus contraseñas se guardarán en texto plano, sin encriptar en su lista de observadores, y podrían ser leídos por cualquiera que obtenga acceso a su cuenta de usuario del sistema.Última modificaciónRegistrosEmailRama principalMarcar como leído¡Asesinar!NombreNombre:Nuevo mensaje de %s... ... totalizando %d emails no leídos.Nueva noticia en %s... ... totalizando %s elementos no leídos.No hay observadores con cambios.No hay cambiosNo hay información extra disponible.No se detecto conexión de redNo hay una rama padre disponible, no será notificado de diferencias y cambios.Sin elementos no leídosNo se está ejecutandoNotificacionesUna nueva revisión local aún no ha sido unida con su rama padre.Una nueva revisión en la rama remota.AbiertoPOP3ContraseñaReproducir este sonido cuando un problema ocurra:Reproducir este sonido cuando un observador halla cambiado:Por favor habilite el plugin "%s" si quiere usar el observador "%s".Por favor elije un intervalo de refresco razonable para salvar ancho de banda y prevenir ser bloqueado de los proveedores de contenido.PuertoPreferenciasProcesoActualizarActualizar TodosIntervalo de Refresco:EliminarEliminar un observadorEjecutandoGuardar ComoSegundos Minutos Horas DíasSeleccionarSeleccione un ArchivoSeleccionar todosMostrar notificaciones cuando un observador halla cambiadoMostrar ventanaUn solo clic en un Observador existente muestra la información, doble clic abre el contenido.Saltando %sRedes socialesOrdenar¡Specto ya esta ejecutándose!Sitio web de SpectoEstadoDetenerSistemaTYPEEl archivo ha sido eliminadoLa conexión parece caída, los observadores por red no se actualizarán hasta resolverlo.La conexión de red del puerto %s fue cerrada.La conexión de red del puerto %s fue establecida.El proceso del sistema se ha iniciado.El proceso del sistema se ha detenido.El observador: "%s" tiene un problema.El observador "%s" ha cambiado.El observador "%s" está siendo revisado.El observador no se ha configurado a un directorioEl nombre del Observador ya esta en uso¡El nombre del observador especificado ya existe! ¿Quiere modificar el Observador existente, o realmente quiere crear uno nuevo? Si quieres crear uno nuevo, necesita elegir un nuevo nombre.Ha ocurrido un error revisando el observadorHa habido un error inicializando el archivo de configuración %sHa habido un error marcando el observador como modificadoHa ocurrido un error al marcar el observador como leídoHa ocurrido un error marcando el estado del observadorHa ocurrido un error abriendo el archivo %sHa habido un error iniciando el observadorHa habido un error deteniendo el observadorHa ocurrido un error escribiendo al archivo %sCambió la fecha del último accesoCambió la fecha de la última modificaciónConsejo del Día:TipoURLError inesperado:DesconocidoMensajes no leídosUsar el anillo de llaves de GNOME para almacenar contraseñas en formato encriptadoUsar SSLCambió el id de usuario del dueñoUsuarioControl de versionesVisitar el rastreador de problemasObservar $WATCH_NAMEEl observador ha cambiado.El observador está inactivo.Observador abiertoObservador comienza actualización.Página web/feedLos observadores de sitios web pueden usar un margen de error que permiten fijar un porcentaje mínimo de diferencia. Esto te permite adaptarte a los sitios que cambian constantemente o tienen mucha publicidad.Cuando este observador halla cambiadoCuando usted abre este observadorNombre de usuario/contraseña incorrectoNombre de usuario/contraseña incorrectoNo está subscrito a ningún feedPuedes agregar todo tipo de contenido web como observadores. Specto manipula automáticamente: Paginas estáticas, RSS o Atom Feeds, etc.Tal vez necesites revisar el registro de errores.Usted recibió_Editar_Registro de Errores_Exportar Observadores_Archivo_Ayuda_Importar Observadores_Marcar todos como leídos_Actualizar Todos_Verun mensaje nuevouna nueva notificaciónun pedido nuevouna nueva entrada públicay otros...sin GTK, activando modo consolaEmilio López Nicolas Espina Tacchetti Mario César Señoranis Ayala specto-0.3.1/po/es/specto.po0000644000175000017500000007700111162732002014277 0ustar jeffjeff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Specto 0.3\n" "POT-Creation-Date: 2009-03-20 10:42+EDT\n" "PO-Revision-Date: 2009-03-20 15:53-0300\n" "Last-Translator: Emilio López \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.4\n" "X-Poedit-Language: Spanish\n" "X-Poedit-Country: Bolivia\n" "X-Poedit-Country: Argentina\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "Ejecutar un comando personalizado:" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "Agregar Observador" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "Opciones avanzadas" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Elige \n" "otro nombre" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Editar un observador\n" "existente" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "Preferencias generales" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "Nombre:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "Intervalo de Refresco:" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Segundos\n" "Minutos\n" "Horas\n" "Días" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "El nombre del Observador ya esta en uso" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "¡El nombre del observador especificado ya existe! ¿Quiere modificar el Observador existente, o realmente quiere crear uno nuevo?\n" "\n" "Si quieres crear uno nuevo, necesita elegir un nuevo nombre." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "Cuando este observador halla cambiado" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "Cuando usted abre este observador" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "Preferencias generales" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "Opciones del observador" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:788 msgid "Error log" msgstr "Registro de errores" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "Observar $WATCH_NAME" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Deseleccionar todos" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Seleccionar todos" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Todo\n" "Informe de Fallos\n" "Información\n" "Advertencias\n" "Error\n" "Crítico" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtro:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Registros" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Guardar Como" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Por Activo" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Por Nombre" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Por tipo de Observador" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Información de depuración" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "Mostrar _Todos los Observadores" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "Mostrar _Barra de Herramientas" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "Error" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "Información extra" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "General" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "Marcar como leído" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "Notificaciones" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "Ordenar" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "Visitar el rastreador de problemas" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "_Editar" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "_Registro de Errores" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "_Exportar Observadores" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "_Archivo" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "_Ayuda" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "_Importar Observadores" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "_Marcar todos como leídos" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "_Actualizar Todos" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "_Ver" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Registros e Informe de Fallos" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Visualización" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "Seguridad" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "Sonidos" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "Mostrar siempre el icono en el área de notificación" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "Mostrar la ventana de notificación en la lista de ventanas" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "Activar el modo de Informe de Fallos y Registros" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Si se activa, recibirá mas información cuando ejecute Specto desde una terminal, y se adjuntara más información en los Registros del Programa." #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "Se recomienda encarecidamente utilizar encriptación con contraseña del anillo de contraseñas. Si deshabilita esta opción, sus contraseñas se guardarán en texto plano, sin encriptar en su lista de observadores, y podrían ser leídos por cualquiera que obtenga acceso a su cuenta de usuario del sistema." #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "Reproducir este sonido cuando un problema ocurra:" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "Reproducir este sonido cuando un observador halla cambiado:" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Preferencias" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Seleccione un Archivo" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "Mostrar notificaciones cuando un observador halla cambiado" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "Usar el anillo de llaves de GNOME para almacenar contraseñas en formato encriptado" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "" "Emilio López \n" "Nicolas Espina Tacchetti \n" "Mario César Señoranis Ayala " #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Sitio web de Specto" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "No se puede mostrar un mensaje de notificación. Asegúrese que libnotify y D-Bus estén disponibles en su sistema." #: ../spectlib/console.py:45 #: ../spectlib/watch.py:145 msgid "Watch has changed." msgstr "El observador ha cambiado." #: ../spectlib/console.py:50 #: ../spectlib/watch.py:124 msgid "Watch started checking." msgstr "Observador comienza actualización." #: ../spectlib/console.py:52 msgid "Watch is idle." msgstr "El observador está inactivo." #: ../spectlib/console.py:54 #: ../spectlib/watch.py:181 msgid "No network connection detected" msgstr "No se detecto conexión de red" #: ../spectlib/console.py:56 #: ../spectlib/watch.py:140 #: ../spectlib/watch.py:177 msgid "There was an error checking the watch" msgstr "Ha ocurrido un error revisando el observador" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "Editar Observador:" #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "Eliminar un observador" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "¿Eliminar el observador \"%s\"?\n" "Esta operación no puede deshacerse." #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "Exportar Observadores" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 msgid "Select" msgstr "Seleccionar" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "Tipo" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "Nombre" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "TYPE" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "Seleccione un archivo" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "Seleccione un directorio" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" "Specto ha encontrado un error\n" "Por favor verifique si este error ya se encuentra en nuestro rastreador de problemas, y si no es así, ingréselo para que podamos repararlo." #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "Importar Observadores" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "sin GTK, activando modo consola" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "Modo consola habilitado." #: ../spectlib/main.py:130 msgid "Could not create a watch, because it is corrupt." msgstr "No se pudo crear un observador, porque está corrupto." #: ../spectlib/main.py:204 #: ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "¡Specto ya esta ejecutándose!" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "Todavía no se puede salir" #: ../spectlib/main.py:258 msgid "Murder!" msgstr "¡Asesinar!" #: ../spectlib/main.py:269 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto actualmente esta ocupado y no puede salir todavía.\n" "\n" "Puede ser que este revisando actualizaciones en los Observadores.\n" "Sin embargo, puede tratar de forzarlo a salir usando el botón Asesinar" #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "Detener" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "Actualizar Todos" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "El observador \"%s\" está siendo revisado." #: ../spectlib/notifier.py:218 #: ../spectlib/notifier.py:347 msgid "The network connection seems to be down, networked watches will not check until then." msgstr "La conexión parece caída, los observadores por red no se actualizarán hasta resolverlo." #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "El observador: \"%s\" tiene un problema." #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "%s ha encontrado un problema" #: ../spectlib/notifier.py:226 msgid "You may need to check the error log." msgstr "Tal vez necesites revisar el registro de errores." #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "El observador \"%s\" ha cambiado." #: ../spectlib/notifier.py:245 msgid "%s has changed" msgstr "%s ha cambiado" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "Ha ocurrido un error marcando el estado del observador" #: ../spectlib/notifier.py:392 #: ../spectlib/watch.py:237 msgid "No extra information available." msgstr "No hay información extra disponible." #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "No se pudo guardar la información extra" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "Observador abierto" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "Actualizar" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "Editar" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "Eliminar" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Puedes agregar todo tipo de contenido web como observadores. Specto manipula automáticamente: Paginas estáticas, RSS o Atom Feeds, etc." #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Los observadores de sitios web pueden usar un margen de error que permiten fijar un porcentaje mínimo de diferencia. Esto te permite adaptarte a los sitios que cambian constantemente o tienen mucha publicidad." #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Un solo clic en un Observador existente muestra la información, doble clic abre el contenido." #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Por favor elije un intervalo de refresco razonable para salvar ancho de banda y prevenir ser bloqueado de los proveedores de contenido." #: ../spectlib/notifier.py:693 msgid "Active" msgstr "Activo" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "Consejo del Día:" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "GMail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "Email" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "Usuario" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "Contraseña" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_imap.py:141 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 msgid "Unexpected error:" msgstr "Error inesperado:" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "Última modificación" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "Mensajes no leídos" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "Nuevo mensaje de %s...\n" "\n" "... totalizando %d emails no leídos." #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "%d nuevos mensajes de %s...\n" "\n" "... totalizando %d emails no leídos." #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "y otros..." #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:276 msgid "There was an error opening the file %s" msgstr "Ha ocurrido un error abriendo el archivo %s" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "Host" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "Usar SSL" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:435 #: ../spectlib/watch.py:529 #: ../spectlib/watch.py:557 #: ../spectlib/watch.py:581 #: ../spectlib/watch.py:607 #: ../spectlib/watch.py:621 msgid "There was an error writing to the file %s" msgstr "Ha ocurrido un error escribiendo al archivo %s" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "Redes sociales" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Email" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "Nombre de usuario/contraseña incorrecto" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "Usted recibió" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "un mensaje nuevo" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d nuevos mensajes" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "una nueva notificación" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "%d nuevas notificaciones" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "un pedido nuevo" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "%d nuevos pedidos" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "una nueva entrada pública" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "%d nuevas entradas públicas" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "Archivo" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "Sistema" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "El archivo ha sido eliminado" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "Cambió el id de usuario del dueño" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "Cambió el id de grupo del dueño" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "Tamaño de archivo cambió" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "Cambió la fecha del último acceso" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "Cambió la fecha de la última modificación" #: ../spectlib/plugins/watch_system_file.py:157 msgid "%s has changed:\n" msgstr "%s ha cambiado:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "Carpeta" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "El observador no se ha configurado a un directorio" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "Saltando %s" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "1 new file was created.\n" msgstr "1 nuevo archivo fue creado.\n" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr " nuevos archivos han sido creados.\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "1 archivo ha sido eliminado.\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr " archivos han sido eliminados.\n" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "1 file was modified.\n" msgstr "1 archivo fue modificado.\n" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr " archivos han sido modificados.\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "Puerto" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "Cerrado" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "Abierto" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "Desconocido" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "Estado" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The network socket on port %s was established." msgstr "La conexión de red del puerto %s fue establecida." #: ../spectlib/plugins/watch_system_port.py:116 msgid "The network socket on port %s was closed." msgstr "La conexión de red del puerto %s fue cerrada." #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "Proceso" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "No se está ejecutando" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "Ejecutando" #: ../spectlib/plugins/watch_system_process.py:98 msgid "The system process has started." msgstr "El proceso del sistema se ha iniciado." #: ../spectlib/plugins/watch_system_process.py:100 msgid "The system process has stopped." msgstr "El proceso del sistema se ha detenido." #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "Bazaar" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "Control de versiones" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "No hay una rama padre disponible, no será notificado de diferencias y cambios." #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "Una nueva revisión local aún no ha sido unida con su rama padre." #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "%d nuevas revisiones locales aún no han sido unidas con su rama padre." #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "Una nueva revisión en la rama remota." #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "%d nuevas revisiones en la rama remota." #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "Rama principal" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google Reader" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "Internet" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr " o más" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "Nueva noticia en %s...\n" "\n" "... totalizando %s elementos no leídos." #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "%s nuevas noticias en %s...\n" "\n" "... totalizando %s elementos no leídos." #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "Nombre de usuario/contraseña incorrecto" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "No se pudo establecer una conexión con el servidor" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "No se pudo obtener las cookies" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "No está subscrito a ningún feed" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "Sin elementos no leídos" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "Página web/feed" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "Diferencia de tamaño: %.2f" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "Porcentaje de diferencia: %s por ciento" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "Margen de Error (%)" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "No hay observadores con cambios." #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "Ocultar ventana" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "Mostrar ventana" #: ../spectlib/watch.py:87 msgid "There was an error starting the watch" msgstr "Ha habido un error iniciando el observador" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "Ha habido un error deteniendo el observador" #: ../spectlib/watch.py:110 msgid "There was an error marking the watch as read" msgstr "Ha ocurrido un error al marcar el observador como leído" #: ../spectlib/watch.py:157 msgid "There was an error marking the watch as changed" msgstr "Ha habido un error marcando el observador como modificado" #: ../spectlib/watch.py:223 #: ../spectlib/watch.py:224 msgid "No changes yet" msgstr "No hay cambios" #: ../spectlib/watch.py:289 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "Por favor habilite el plugin \"%s\" si quiere usar el observador \"%s\"." #: ../spectlib/watch.py:443 #: ../spectlib/watch.py:456 #: ../spectlib/watch.py:476 #: ../spectlib/watch.py:502 #: ../spectlib/watch.py:518 #: ../spectlib/watch.py:542 #: ../spectlib/watch.py:597 msgid "There was an error initializing config file %s" msgstr "Ha habido un error inicializando el archivo de configuración %s" #~ msgid "Duration (in seconds):" #~ msgstr "Duración (en segundos)" #~ msgid "" #~ "\n" #~ "Specto console version\n" #~ "\n" #~ "Use \"specto --console --only-changed\" to show only watch changes " #~ "notifications.\n" #~ "\n" #~ msgstr "" #~ "\n" #~ "Versión de consola de Specto\n" #~ "Use \"specto --console --only-changed\" para mostrar solo notificaciones " #~ "de cambios en observadores.\n" #~ "\n" #~ msgid "" #~ "%s has received %d new newsitems in %s...\n" #~ "\n" #~ "... totalling %s unread items." #~ msgstr "" #~ "%s has recibido %d nuevas noticias de %s...\n" #~ "\n" #~ "... totalizando %s elementos no leídos." specto-0.3.1/po/es/specto.po.semiold0000644000175000017500000007705111140440051015733 0ustar jeffjeffmsgid "" msgstr "" "Project-Id-Version: Specto\n" "POT-Creation-Date: 2009-01-29 18:49+ARST\n" "PO-Revision-Date: 2009-01-29 18:47-0500\n" "Last-Translator: Jean-François Fortin Tam\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Spanish\n" "X-Poedit-Country: Bolivia\n" "X-Poedit-Country: Argentina\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "Ejecutar un comando personalizado:" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "Agregar Observador" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "Opciones avanzadas" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Elige \n" "otro nombre" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Editar un observador\n" "existente" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 #, fuzzy msgid "General options" msgstr "Preferencias generales" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "Nombre:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "Intervalo de Refresco:" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Segundos\n" "Minutos\n" "Horas\n" "Días" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "El nombre del Observador ya esta en uso" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "¡El nombre del observador especificado ya existe! ¿Quiere modificar el Observador existente, o realmente quiere crear uno nuevo?\n" "\n" "Si quieres crear uno nuevo, necesita elegir un nuevo nombre." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "Cuando este observador halla cambiado" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "Cuando usted abre este observador" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "Preferencias generales" #: ../data/glade/edit_watch.glade.h:3 #, fuzzy msgid "Watch options" msgstr "Nombre del Observador" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:789 #, fuzzy msgid "Error log" msgstr "Registro de _Errores" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "Observar $WATCH_NAME" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Deseleccionar todos" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Seleccionar todos" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Todo\n" "Informe de Fallos\n" "Información\n" "Advertencias\n" "Error\n" "Crítico" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtro:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Registros" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Guardar Como" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Por Activo" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Por Nombre" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Por tipo de Observador" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Información de depuración" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "Mostrar _Todos los Observadores" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "Mostrar _Barra de Herramientas" #: ../data/glade/notifier.glade.h:7 #, fuzzy msgid "Error" msgstr "Registro de _Errores" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "Información extra" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "General" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:493 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "Marcar como leído" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "Notificaciones" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "Ordenar" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "Visitar el rastreador de problemas" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "_Editar" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "_Registro de Errores" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "_Exportar Observadores" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "_Archivo" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "_Ayuda" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "_Importar Observadores" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "_Marcar todos como leídos" #: ../data/glade/notifier.glade.h:21 #, fuzzy msgid "_Refresh All" msgstr "_Limpiar Todos" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "_Ver" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Registros e Informe de Fallos" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Visualización" #: ../data/glade/preferences.glade.h:3 #, fuzzy msgid "Security" msgstr "Puerto:" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "Sonidos" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "Mostrar siempre el icono en el área de notificación" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "Mostrar la ventana de notificación en la lista de ventanas" #: ../data/glade/preferences.glade.h:7 msgid "Duration (in seconds):" msgstr "Duración (en segundos)" #: ../data/glade/preferences.glade.h:8 msgid "Enable debug mode and logging" msgstr "Activar el modo de Informe de Fallos y Registros" #: ../data/glade/preferences.glade.h:9 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Si se activa, recibirá mas información cuando ejecute Specto desde una terminal, y se adjuntara más información en los Registros del Programa." #: ../data/glade/preferences.glade.h:10 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "Se recomienda encarecidamente utilizar encriptación con contraseña del anillo de contraseñas. Si deshabilita esta opción, sus contraseñas se guardarán en texto plano, sin encriptar en su lista de observadores, y podrían ser leídos por cualquiera que obtenga acceso a su cuenta de usuario del sistema." #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a problem occurs:" msgstr "Reproducir este sonido cuando un problema ocurra:" #: ../data/glade/preferences.glade.h:12 msgid "Play this sound when a watch has changed:" msgstr "Reproducir este sonido cuando un observador halla cambiado:" #: ../data/glade/preferences.glade.h:13 msgid "Preferences" msgstr "Preferencias" #: ../data/glade/preferences.glade.h:14 msgid "Select a File" msgstr "Seleccione un Archivo" #: ../data/glade/preferences.glade.h:15 msgid "Show notifications when a watch has changed" msgstr "Mostrar notificaciones cuando un observador halla cambiado" #: ../data/glade/preferences.glade.h:16 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "Usar el anillo de llaves de GNOME para almacenar contraseñas en formato encriptado" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "" "Emilio López \n" "Nicolas Espina Tacchetti \n" "Mario César Señoranis Ayala " #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Sitio web de Specto" #: ../spectlib/balloons.py:84 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "No se puede mostrar un mensaje de notificación. Asegúrese que libnotify y D-Bus estén disponibles en su sistema." #: ../spectlib/console.py:37 msgid "" "\n" "Specto console version\n" "\n" "Use \"specto --console --only-changed\" to show only watch changes notifications.\n" "\n" msgstr "" "\n" "Versión de consola de Specto\n" "Use \"specto --console --only-changed\" para mostrar solo notificaciones de cambios en observadores.\n" "\n" #: ../spectlib/console.py:48 #: ../spectlib/watch.py:145 #, fuzzy msgid "Watch has changed." msgstr "El observador: \"%s\" tiene un error" #: ../spectlib/console.py:53 #: ../spectlib/watch.py:124 msgid "Watch started checking." msgstr "Observador comienza actualización." #: ../spectlib/console.py:55 #, fuzzy msgid "Watch is idle." msgstr "Observador : \"%s\" editado." #: ../spectlib/console.py:57 #: ../spectlib/watch.py:181 msgid "No network connection detected" msgstr "No se detecto conexión de red" #: ../spectlib/console.py:59 #: ../spectlib/watch.py:140 #: ../spectlib/watch.py:177 msgid "There was an error checking the watch" msgstr "Ha ocurrido un error revisando el observador" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "Editar Observador:" #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:593 msgid "Remove a watch" msgstr "Eliminar un observador" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:594 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "¿Eliminar el observador \"%s\"?\n" "Esta operación no puede deshacerse." #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "Exportar Observadores" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 #, fuzzy msgid "Select" msgstr "Seleccionar todos" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:701 msgid "Type" msgstr "Tipo" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:710 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "Nombre" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:719 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:726 msgid "TYPE" msgstr "TYPE" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 #, fuzzy msgid "Choose a file" msgstr "Seleccione un archivo o directorio:" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 #, fuzzy msgid "Choose a directory" msgstr "Seleccione un archivo o directorio:" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" "Specto ha encontrado un error\n" "Por favor verifique si este error ya se encuentra en nuestro rastreador de problemas, y si no es así, ingréselo para que podamos repararlo." #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "Importar Observadores" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "sin GTK, activando modo consola" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "Modo consola habilitado." #: ../spectlib/main.py:128 msgid "Could not create a watch, because it is corrupt." msgstr "No se pudo crear un observador, porque está corrupto." #: ../spectlib/main.py:202 msgid "Specto is already running!" msgstr "¡Specto ya esta ejecutándose!" #: ../spectlib/main.py:249 msgid "Cannot quit yet" msgstr "Todavía no se puede salir" #: ../spectlib/main.py:255 msgid "Murder!" msgstr "¡Asesinar!" #: ../spectlib/main.py:266 #, fuzzy msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto actualmente esta ocupado y no puede salir todavía.\n" "\n" "Puede ser que este revisando actualizaciones en los Observadores.\n" "Sin embargo, puede tratar de forzarlo a salir usando el botón ¡Asesinar!" #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "Detener" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 #, fuzzy msgid "Refresh All" msgstr "Intervalo de Refresco" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "El observador \"%s\" está siendo revisado." #: ../spectlib/notifier.py:219 #: ../spectlib/notifier.py:348 #, fuzzy msgid "The network connection seems to be down, networked watches will not check until then." msgstr "La conexión parece caída, los observadores no se actualizaran hasta resolverlo." #: ../spectlib/notifier.py:224 #, fuzzy msgid "The watch \"%s\" has a problem." msgstr "El observador: \"%s\" tiene un error" #: ../spectlib/notifier.py:227 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "El observador, %s, tiene un problema. Tal vez necesites revisar el registro de errores." #: ../spectlib/notifier.py:233 #, fuzzy msgid "The watch \"%s\" has changed." msgstr "observador \"%s\" comenzando" #: ../spectlib/notifier.py:263 msgid "There was an error marking the watch status" msgstr "Ha ocurrido un error marcando el estado del observador" #: ../spectlib/notifier.py:393 #: ../spectlib/watch.py:237 msgid "No extra information available." msgstr "No hay información extra disponible." #: ../spectlib/notifier.py:401 msgid "Extra information could not be set" msgstr "No se pudo guardar la información extra" #: ../spectlib/notifier.py:428 #, fuzzy msgid "Watch opened" msgstr "observador \"%s\" abierto" #: ../spectlib/notifier.py:484 msgid "Refresh" msgstr "Actualizar" #: ../spectlib/notifier.py:505 #, fuzzy msgid "Edit" msgstr "_Editar" #: ../spectlib/notifier.py:512 msgid "Remove" msgstr "Eliminar" #: ../spectlib/notifier.py:545 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Puedes agregar todo tipo de contenido web como observadores. Specto manipula automáticamente: Paginas estáticas, RSS o Atom Feeds, etc." #: ../spectlib/notifier.py:546 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Los observadores de sitios web pueden usar un margen de error que permiten fijar un porcentaje mínimo de diferencia. Esto te permite adaptarte a los sitios que cambian constantemente o tienen mucha publicidad." #: ../spectlib/notifier.py:547 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Un solo clic en un Observador existente muestra la información, doble clic abre el contenido." #: ../spectlib/notifier.py:548 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Por favor elije un intervalo de refresco razonable para salvar ancho de banda y prevenir ser bloqueado de los proveedores de contenido." #: ../spectlib/notifier.py:694 msgid "Active" msgstr "Activo" #: ../spectlib/notifier.py:743 msgid "Tip of the Day:" msgstr "Consejo del Día:" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "GMail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "Email" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 #, fuzzy msgid "Username" msgstr "Nombre de Usuario" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 #, fuzzy msgid "Password" msgstr "Contraseña" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_imap.py:141 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 msgid "Unexpected error:" msgstr "Error inesperado:" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "Última modificación" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "Mensajes no leídos" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "%s has received a new message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "%s ha recibido un mensaje de %s...\n" "\n" "... totalizando %d emails no leídos." #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%s has received %d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "%s ha recibido %d nuevos mensajes de %s...\n" "\n" "... totalizando %d emails no leídos." #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "y otros..." #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:276 msgid "There was an error opening the file %s" msgstr "Ha ocurrido un error abriendo el archivo %s" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 #, fuzzy msgid "Host" msgstr "Host" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 #, fuzzy msgid "Use SSL" msgstr "Usar SSL" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:435 #: ../spectlib/watch.py:529 #: ../spectlib/watch.py:557 #: ../spectlib/watch.py:581 #: ../spectlib/watch.py:607 #: ../spectlib/watch.py:621 msgid "There was an error writing to the file %s" msgstr "Ha ocurrido un error escribiendo al archivo %s" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "Redes sociales" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Email" #: ../spectlib/plugins/watch_sn_facebook.py:118 #, fuzzy msgid "Wrong username/password" msgstr "El observador: \"%s\" tiene el error nombre de usuario/contraseña incorrecto" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "Usted recibió" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "un mensaje nuevo" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d nuevos mensajes" #: ../spectlib/plugins/watch_sn_facebook.py:137 #, fuzzy msgid "a new notification" msgstr "Notificaciones" #: ../spectlib/plugins/watch_sn_facebook.py:139 #, fuzzy msgid "%d new notifications" msgstr "Notificaciones" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "un pedido nuevo" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "%d nuevos pedidos" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "una nueva entrada pública" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "%d nuevas entradas públicas" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "Archivo" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "Sistema" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "El archivo ha sido eliminado" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "Cambió el id de usuario del dueño" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "Cambió el id de grupo del dueño" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "Tamaño de archivo cambió" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "Cambió la fecha del último acceso" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "Cambió la fecha de la última modificación" #: ../spectlib/plugins/watch_system_file.py:150 #: ../spectlib/plugins/watch_system_file.py:157 #: ../spectlib/plugins/watch_system_folder.py:162 msgid "%s has changed:\n" msgstr "%s ha cambiado:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "Carpeta" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "El observador no se ha configurado a un directorio" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "Saltando %s" #: ../spectlib/plugins/watch_system_folder.py:165 #, fuzzy msgid "1 new file was created.\n" msgstr "actualización: %s fue creada" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr " nuevos archivos han sido creados.\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "1 archivo ha sido eliminado.\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr " archivos han sido eliminados.\n" #: ../spectlib/plugins/watch_system_folder.py:175 #, fuzzy msgid "1 file was modified.\n" msgstr "actualización: %s fue modificado" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr " archivos han sido modificados.\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 #, fuzzy msgid "Port" msgstr "Puerto" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "Cerrado" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "Abierto" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "Desconocido" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "Estado" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The connection, %s, was established." msgstr "La conexión, %s, fue establecida." #: ../spectlib/plugins/watch_system_port.py:116 msgid "The connection, %s, was closed." msgstr "La conexión, %s, fue cerrada." #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 #, fuzzy msgid "Process" msgstr "Proceso" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "No se está ejecutando" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "Ejecutando" #: ../spectlib/plugins/watch_system_process.py:98 #, fuzzy msgid "The system process, %s, has started." msgstr "El proceso, %s, fue iniciado." #: ../spectlib/plugins/watch_system_process.py:100 #, fuzzy msgid "The system process, %s, has stopped." msgstr "El proceso, %s, fue detenido." #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "Bazaar" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "Control de versiones" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "No hay una rama padre disponible, no será notificado de diferencias y cambios." #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision on %s has not yet been merged with its parent branch." msgstr "Una nueva revisión local en %saún no ha sido unida con su rama padre." #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions on %s have not yet been merged with its parent branch." msgstr "%d nuevas revisiones locales en %saún no han sido unidas con su rama padre." #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch for %s." msgstr "Una nueva revisión en la rama remota para %s." #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch for %s." msgstr "%d nuevas revisiones en la rama remota para %s." #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "Rama principal" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google Reader" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "Internet" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr " o más" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "%s has a new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "%s tiene una nueva noticia en %s...\n" "\n" "... totalizando %s elementos no leídos." #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%s has received %d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "%s has recibido %d nuevas noticias de %s...\n" "\n" "... totalizando %s elementos no leídos." #: ../spectlib/plugins/watch_web_greader.py:481 #, fuzzy msgid "Wrong username or password" msgstr "El observador: \"%s\" tiene el error nombre de usuario/contraseña incorrecto" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "No se pudo establecer una conexión con el servidor" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "No se pudo obtener las cookies" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "No está subscrito a ningún feed" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "Sin elementos no leídos" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "Página web/feed" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "Diferencia de tamaño: %.2f" #: ../spectlib/plugins/watch_web_static.py:264 #, fuzzy msgid "" "The website, %s, has changed.\n" "Difference percentage: %s percent" msgstr "El sitio Web, %s, fue actualizado." #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 #, fuzzy msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 #, fuzzy msgid "Error margin (%)" msgstr "Margen de Error (%)" #: ../spectlib/trayicon.py:98 #, fuzzy msgid "No changed watches." msgstr "No hay observadores actualizados." #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "Ocultar ventana" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "Mostrar ventana" #: ../spectlib/watch.py:87 msgid "There was an error starting the watch" msgstr "Ha habido un error iniciando el observador" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "Ha habido un error deteniendo el observador" #: ../spectlib/watch.py:110 msgid "There was an error marking the watch as read" msgstr "Ha ocurrido un error al marcar el observador como leído" #: ../spectlib/watch.py:157 msgid "There was an error marking the watch as changed" msgstr "Ha habido un error marcando el observador como modificado" #: ../spectlib/watch.py:223 #: ../spectlib/watch.py:224 #, fuzzy msgid "No changes yet" msgstr "No hay actualizaciones" #: ../spectlib/watch.py:289 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "Por favor habilite el plugin \"%s\" si quiere usar el observador \"%s\"." specto-0.3.1/po/de/0000755000175000017500000000000011226433142012422 5ustar jeffjeffspecto-0.3.1/po/de/specto.mo0000644000175000017500000003114311172636564014273 0ustar jeffjeffd 89Pf #@Og wB %-'U \f n| * ! 3!@bw2  +"=`ew      ? O [ins&|)<~      +) U_a $)>\x %./,+3&_%%)!:JOSem8}  ,9'B#Zz~  '-3C R_ es % $ DOc ~! - < \ n !{ ]  !!92!.l!!! !!!! "" /";"-U""""""#5# J#U#l##(#####-#'$-$M$k$r$y$ $$ $+$$$%%{%%%%%%%%%!% &#&&"J&m& &&&&&3&<&Q*'|'( (( (-(@( Y(c(y((( ( ((>()x%))) )))))** *"$*$G*!l*'**(+>+4+1,,-^, ,#,#,",&-/?-o---- --I- .,. A.N.`..(. ..#/"/#//0:00 0011"1)1D1`1t1}11 1!11ysPXDC:x= 'Ik#6bQ%,fp"` q_7Z{(WvGz-U eM~Oua 5iVTo\]N3jd20K/R?>w}l^SH; .mn+1)t 4<9EYrF[!|&ch8ALJ*@gB$ files were modified. files were removed. new files were created. or more%d new messages%d new notifications%s encountered a problem1 file was modified. 1 file was removed. 1 new file was created. %s has changed: Debugging and LoggingDisplayGeneral settingsSecuritySoundsWatch optionsRemove the watch "%s"? This operation cannot be undone.ActiveAdd a WatchAdvanced optionsAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBazaarBy ActiveBy NameBy Watch TypeCannot quit yetChoose an other nameChoose a directoryChoose a fileClosedConsole mode enabled.Could not establish a connection to serverCould not get cookiesDebug informationDeselect allDifference percentage: %s percentDisplay _All WatchesDisplay _ToolbarDisplay the notification window in the window listEditEdit existing watchEdit watch: EmailEnable debug mode and loggingErrorError margin (%)Export watchesExtra informationExtra information could not be setFileFile size changedFilesize difference: %.2fFilter:FolderFolder (optional)GeneralGeneral optionsGoogle ReaderGroup id of the owner changedHide windowHostIDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.Import watchesInternetLast changedLogsMailMark as readNameName:No changed watches.No changes yetNo extra information available.No network connection detectedNo unread itemsNot runningNotificationsOpenPOP3PasswordPlay this sound when a problem occurs:Play this sound when a watch has changed:Please enable plugin "%s" if you want to use the watch "%s".Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.PortPreferencesProcessRefreshRefresh AllRefresh Interval:RemoveRemove a watchRunningSave AsSeconds Minutes Hours DaysSelectSelect a FileSelect allShow notifications when a watch has changedShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSocial networksSortingSpecto is already running!Specto's WebsiteStatusStopSystemTYPEThe file was removedThe watch "%s" has a problem.The watch "%s" has changed.The watch "%s" is checking.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.There was an error checking the watchThere was an error initializing config file %sThere was an error marking the watch as changedThere was an error marking the watch as readThere was an error marking the watch statusThere was an error opening the file %sThere was an error starting the watchThere was an error stopping the watchThere was an error writing to the file %sTime of last access changedTime of last modification changedTip of the Day:TypeURLUnexpected error:UnknownUnread messagesUse GNOME keyring to store passwords in encrypted formatUse SSLUser id of the owner changedUsernameVersion controlWatch has changed.Watch openedWatch started checking.Webpage/feedWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.When this watch has changedWhen you open this watchWrong username or passwordWrong username/passwordYou are not subscribed to any feedsYou can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.You received_Edit_Error Log_Export Watches_File_Help_Import Watches_Mark all read_Refresh All_Viewa new messagea new notificationand others...no GTK, activating console modetranslator-creditsProject-Id-Version: Specto POT-Creation-Date: 2009-03-26 12:50+EDT PO-Revision-Date: 2009-04-19 17:04+0100 Last-Translator: Martin Lettner Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: German Dateien wurden geändert. Dateien wurden entfernt. neue Dateien wurden erstellt. oder mehr%d neue Nachrichten%d neue Benachrichtigungen%s hat einen Fehler festgestellt1 Datei wurde verändert. 1 Datei wurde entfernt. 1 neue Datei wurde erstellt. %s hat geändert: Fehlerbehebung und BerichtAnzeigeAllgemeine EinstellungenSicherheitSoundBeobachtungs-EinstellungenBeobachtung "%s" entfernen? Dieser Vorgang kann nicht rückgängig gemacht werden.AktivBeobachtung hinzufügenErweiterte EinstellungenAlle Fehlerbehebung Informationen Warnung Fehler KritischSymbol immer im Benachrichtigungsfeld anzeigenBazaarNach AktivitätNach NameNach BeobachtungstypKann noch nicht beendet werdenEinen anderen Namen wählenOrdner auswählenDatei auswählenGeschlossenKonsolen-Modus aktiviert.Konnte keine Verbindung zum Server herstellenKonnte Cookies nicht empfangenDebug-InformationNichts auswählenDifferenz-Anteil: %s Prozent_Alle Beobachtungen anzeigenAnzeigesymbolleisteBenachrichtigungsfenster in der Fensterliste anzeigenBearbeitenBeobachtung bearbeitenBeobachtung bearbeiten:EmailFehlerbehebung und Protokoll einschaltenFehlerFehlertoleranz (%)Beobachtungen exportierenZusatzinformationZusatzinformation konnte nicht gesetzt werdenDateiDateigröße hat sich geändertDateigrößen-Differenz: %.2fFilterOrdnerOrdner (optional)AllgemeinAllgemeine EinstellungenGoogle ReaderGruppen-ID des Besitzers hat sich geändertFenster versteckenHostIDIMAPWenn aktiv werden mehr informationen im Terminalmodus ausgegeben und mehr informationen werden in die Berichte aufgenommen.Beobachtungen importierenInternetZuletzt geändertBerichteMailAls gelesen markierenNameName:Keine veränderten Beobachtungen.Bisher keine VeränderungenKeine Zusatzinformation verfügbar.Keine Netzwerk-Verbindung gefundenKeine ungelesenen ObjekteAngehaltenBenachrichtigungenOffenPOP3PasswortDiesen Klang wiedergeben wenn ein Problem auftritt:Diesen Klang wiedergeben wenn sich eine Beobachtung ändert:Bitte aktivieren Sie Plugin "%s", wenn Sie die Beobachtung "%s" verwenden wollen.Bitte wählen Sie ein vernünftiges Aktualisierungsintervall um Bandbreite zu sparen und damit Webseitenbetreiber Sie nicht blockieren.PortEinstellungenProzessAktualisierenAlle aktualisierenÜberprüfungsintervall:EntfernenBeobachtung entfernenLäuftSpeichern unterSekunden Minuten Stunden TageauswählenDatei wählenAlle auswählenBenachrichtigungen anzeigen wenn sich eine Beobachtung ändertFenster zeigenKlicken sie einfach auf eine existierende Beobachtung um Informationen anzuzeigen, und doppelt um den Inhalt zu öffnen.Überspringe %sSoziale NetzwerkeSortierenSpecto läuft bereits!Specto WebseiteStatusStoppenSystemTYPDie Datei wurde entferntBeobachtung "%s" hat einen Fehler.Beobachtung "%s" hat sich geändert.Die Beobachtung "%s" überprüft.Beobachtungsname wird bereits verwendetDer eingegebene Beobachtungsname existiert bereits! Soll die vorhandene Beobachtung geändert oder eine neue angelegt werden? Wenn eine neue Beobachtung erstellt werden soll muss eine anderer Name eingegeben werden.Fehler beim Überprüfen der BeobachtungFehler während der Initialisierung der Konfigurationsdatei %sFehler beim Markieren der Beobachtung als verändertFehler beim Markieren der Beobachtung als gelesenFehler beim Markieren des Beobachtungs-StatusFehler beim Öffnen der Datei %sFehler beim Starten der BeobachtungFehler beim Stoppen der BeobachtungFehler beim Schreiben der Datei %sLetzte Zugriffszeit hat sich geändertZeit der letzten Bearbeitung hat sich geändertTipp des Tages:TypURLUnerwarteter Fehler:UnbekanntUngelesene NachrichtenGNOME-Schlüsselbund verwenden um Passwörter verschlüsselt zu speichernSSL benutzenBenutzer-ID des Besitzers hat sich geändertBenutzernameVersionskontrolleBeobachtung hat sich geändert.Beobachtung geöffnetBeobachtung hat Überprüfung gestartet.Webseite/FeedBei Webseiten können sie eine Fehlertoleranz auswählen, die die minimale Änderung in Prozent angibt. Dies ermöglicht es z.B. Seiten mit viel Werbung die sich ständig ändert zu überwachen.Wenn sich diese Beobachtung ändertWenn Sie diese Beobachtung öffnenFalscher Benutzername oder PasswortFalscher Benutzername/PasswortSie haben keine Feeds abonniertSie können alle Arten von Webseiten als Beobachtung hinzufügen. Statische Seiten, RSS oder Atom Feeds, etc. Specto wird sie automatisch untersuchen.Sie haben empfangen_Bearbeiten_FehlerberichtBeobachtungen E_xportieren_Datei_HilfeBeobachtungen _importierenAlle als gelesen _markierenAlle _aktualisieren_Ansichteine neue Nachrichteine neue Benachrichtigungund andere...kein GTK, aktiviere KonsolenmodusThomas McColgan Sebastian Fischer Martin Lettner specto-0.3.1/po/de/specto.po0000644000175000017500000010605011172636564014276 0ustar jeffjeffmsgid "" msgstr "" "Project-Id-Version: Specto\n" "POT-Creation-Date: 2009-03-26 12:50+EDT\n" "PO-Revision-Date: 2009-04-19 17:04+0100\n" "Last-Translator: Martin Lettner \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 #, fuzzy msgid "Run a custom command:" msgstr "Ein spezielles Kommando ausführen:" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "Beobachtung hinzufügen" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "Erweiterte Einstellungen" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Einen anderen\n" "Namen wählen" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Beobachtung\n" "bearbeiten" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "Allgemeine Einstellungen" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "Name:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "Überprüfungsintervall:" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Sekunden\n" "Minuten\n" "Stunden\n" "Tage" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "Beobachtungsname wird bereits verwendet" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Der eingegebene Beobachtungsname existiert bereits! Soll die vorhandene Beobachtung geändert oder eine neue angelegt werden?\n" "\n" "Wenn eine neue Beobachtung erstellt werden soll muss eine anderer Name eingegeben werden." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "Wenn sich diese Beobachtung ändert" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "Wenn Sie diese Beobachtung öffnen" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "Allgemeine Einstellungen" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "Beobachtungs-Einstellungen" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:788 #, fuzzy msgid "Error log" msgstr "Fehlerbericht" #: ../data/glade/edit_watch.glade.h:13 #, fuzzy msgid "Watch $WATCH_NAME" msgstr "Beobachtung $WATCH_NAME" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Nichts auswählen" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Alle auswählen" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Alle\n" "Fehlerbehebung\n" "Informationen\n" "Warnung\n" "Fehler\n" "Kritisch" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filter" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Berichte" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Speichern unter" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Nach Aktivität" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Nach Name" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Nach Beobachtungstyp" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Debug-Information" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "_Alle Beobachtungen anzeigen" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "Anzeigesymbolleiste" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "Fehler" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "Zusatzinformation" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "Allgemein" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "Als gelesen markieren" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "Benachrichtigungen" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "Sortieren" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "_Bearbeiten" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "_Fehlerbericht" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "Beobachtungen E_xportieren" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "_Datei" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "_Hilfe" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "Beobachtungen _importieren" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "Alle als gelesen _markieren" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "Alle _aktualisieren" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "_Ansicht" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Fehlerbehebung und Bericht" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Anzeige" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "Sicherheit" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "Sound" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "Symbol immer im Benachrichtigungsfeld anzeigen" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "Benachrichtigungsfenster in der Fensterliste anzeigen" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "Fehlerbehebung und Protokoll einschalten" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Wenn aktiv werden mehr informationen im Terminalmodus ausgegeben und mehr informationen werden in die Berichte aufgenommen." #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "" #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "Diesen Klang wiedergeben wenn ein Problem auftritt:" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "Diesen Klang wiedergeben wenn sich eine Beobachtung ändert:" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Einstellungen" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Datei wählen" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "Benachrichtigungen anzeigen wenn sich eine Beobachtung ändert" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "GNOME-Schlüsselbund verwenden um Passwörter verschlüsselt zu speichern" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "" "Thomas McColgan \n" "Sebastian Fischer \n" "Martin Lettner " #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Specto Webseite" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "" #: ../spectlib/console.py:45 #: ../spectlib/watch.py:140 msgid "Watch has changed." msgstr "Beobachtung hat sich geändert." #: ../spectlib/console.py:50 #: ../spectlib/watch.py:121 msgid "Watch started checking." msgstr "Beobachtung hat Überprüfung gestartet." #: ../spectlib/console.py:52 #, fuzzy msgid "Watch is idle." msgstr "Beobachtung ist untätig." #: ../spectlib/console.py:54 #: ../spectlib/watch.py:174 msgid "No network connection detected" msgstr "Keine Netzwerk-Verbindung gefunden" #: ../spectlib/console.py:56 #: ../spectlib/watch.py:136 #: ../spectlib/watch.py:170 msgid "There was an error checking the watch" msgstr "Fehler beim Überprüfen der Beobachtung" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "Beobachtung bearbeiten:" #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "Beobachtung entfernen" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "Beobachtung \"%s\" entfernen?\n" "Dieser Vorgang kann nicht rückgängig gemacht werden." #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "Beobachtungen exportieren" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 msgid "Select" msgstr "auswählen" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "Typ" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "Name" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "TYP" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "Datei auswählen" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "Ordner auswählen" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "Beobachtungen importieren" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "kein GTK, aktiviere Konsolenmodus" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "Konsolen-Modus aktiviert." #: ../spectlib/main.py:130 #, fuzzy msgid "Could not create a watch, because it is corrupt." msgstr "Konnte keine Beobachtung erstellen, sie scheint kaputt." #: ../spectlib/main.py:204 #: ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "Specto läuft bereits!" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "Kann noch nicht beendet werden" #: ../spectlib/main.py:258 #, fuzzy msgid "Murder!" msgstr "Ermorden!" #: ../spectlib/main.py:269 #, fuzzy msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto ist im Moment beschäftigt und kann nicht geschlossen werden.\n" "\n" "Dies kann daran liegen dass einige Objekte gerade überprüft werden.\n" "Allerdings kann versucht werden Specto mit der Mörder-Schaltfläche zu killen." #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "Stoppen" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "Alle aktualisieren" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "Die Beobachtung \"%s\" überprüft." #: ../spectlib/notifier.py:218 #: ../spectlib/notifier.py:347 #, fuzzy msgid "The network connection seems to be down, networked watches will not check until then." msgstr "Es scheint keine Netzwerk-Verbindung vorhanden zu sein, Netzwerk-Beobachtungen werden momentan nicht ausgeführt." #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "Beobachtung \"%s\" hat einen Fehler." #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "%s hat einen Fehler festgestellt" #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "Beobachtung \"%s\" hat sich geändert." #: ../spectlib/notifier.py:245 #, fuzzy msgid "%s has changed" msgstr "Zuletzt geändert" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "Fehler beim Markieren des Beobachtungs-Status" #: ../spectlib/notifier.py:392 #: ../spectlib/watch.py:230 msgid "No extra information available." msgstr "Keine Zusatzinformation verfügbar." #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "Zusatzinformation konnte nicht gesetzt werden" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "Beobachtung geöffnet" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "Aktualisieren" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "Bearbeiten" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "Entfernen" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Sie können alle Arten von Webseiten als Beobachtung hinzufügen. Statische Seiten, RSS oder Atom Feeds, etc. Specto wird sie automatisch untersuchen." #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Bei Webseiten können sie eine Fehlertoleranz auswählen, die die minimale Änderung in Prozent angibt. Dies ermöglicht es z.B. Seiten mit viel Werbung die sich ständig ändert zu überwachen." #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Klicken sie einfach auf eine existierende Beobachtung um Informationen anzuzeigen, und doppelt um den Inhalt zu öffnen." #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Bitte wählen Sie ein vernünftiges Aktualisierungsintervall um Bandbreite zu sparen und damit Webseitenbetreiber Sie nicht blockieren." #: ../spectlib/notifier.py:693 msgid "Active" msgstr "Aktiv" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "Tipp des Tages:" #: ../spectlib/plugins/watch_mail_gmail.py:34 #, fuzzy msgid "GMail" msgstr "Gmail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "Mail" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "Benutzername" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "Passwort" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 #: ../spectlib/watch.py:241 #: ../spectlib/watch.py:250 msgid "Unexpected error:" msgstr "Unerwarteter Fehler:" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "Zuletzt geändert" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "Ungelesene Nachrichten" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "und andere..." #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:288 msgid "There was an error opening the file %s" msgstr "Fehler beim Öffnen der Datei %s" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "Host" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "SSL benutzen" #: ../spectlib/plugins/watch_mail_imap.py:43 msgid "Folder (optional)" msgstr "Ordner (optional)" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:447 #: ../spectlib/watch.py:541 #: ../spectlib/watch.py:569 #: ../spectlib/watch.py:593 #: ../spectlib/watch.py:619 #: ../spectlib/watch.py:633 msgid "There was an error writing to the file %s" msgstr "Fehler beim Schreiben der Datei %s" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 #, fuzzy msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "Soziale Netzwerke" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Email" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "Falscher Benutzername/Passwort" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "Sie haben empfangen" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "eine neue Nachricht" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d neue Nachrichten" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "eine neue Benachrichtigung" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "%d neue Benachrichtigungen" #: ../spectlib/plugins/watch_sn_facebook.py:144 #, fuzzy msgid "a new request" msgstr "eine neue Anfrage" #: ../spectlib/plugins/watch_sn_facebook.py:146 #, fuzzy msgid "%d new requests" msgstr "%d neue Anfragen" #: ../spectlib/plugins/watch_sn_facebook.py:151 #, fuzzy msgid "a new wall post" msgstr "eine neue Pinnwand-Nachricht" #: ../spectlib/plugins/watch_sn_facebook.py:153 #, fuzzy msgid "%d new wall posts" msgstr "%d neue neue Pinnwand-Nachrichten" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "Datei" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "System" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "Die Datei wurde entfernt" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "Benutzer-ID des Besitzers hat sich geändert" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "Gruppen-ID des Besitzers hat sich geändert" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "Dateigröße hat sich geändert" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "Letzte Zugriffszeit hat sich geändert" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "Zeit der letzten Bearbeitung hat sich geändert" #: ../spectlib/plugins/watch_system_file.py:157 msgid "%s has changed:\n" msgstr "%s hat geändert:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "Ordner" #: ../spectlib/plugins/watch_system_folder.py:78 #, fuzzy msgid "The watch is not set to a folder" msgstr "Die Beobachtung ist für keinen Ordner festgelegt" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "Überspringe %s" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "1 new file was created.\n" msgstr "1 neue Datei wurde erstellt.\n" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr " neue Dateien wurden erstellt.\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "1 Datei wurde entfernt.\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr " Dateien wurden entfernt.\n" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "1 file was modified.\n" msgstr "1 Datei wurde verändert.\n" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr " Dateien wurden geändert.\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "Port" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "Geschlossen" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "Offen" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "Unbekannt" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "Status" #: ../spectlib/plugins/watch_system_port.py:114 #, fuzzy msgid "The network socket on port %s was established." msgstr "Die Verbindung %s wurde hergestellt." #: ../spectlib/plugins/watch_system_port.py:116 #, fuzzy msgid "The network socket on port %s was closed." msgstr "Die Verbindung %s wurde geschlossen." #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "Prozess" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "Angehalten" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "Läuft" #: ../spectlib/plugins/watch_system_process.py:98 #, fuzzy msgid "The system process has started." msgstr "Der System-Prozess %s wurde gestoppt." #: ../spectlib/plugins/watch_system_process.py:100 #, fuzzy msgid "The system process has stopped." msgstr "System-Prozess %s wurde gestoppt." #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "Bazaar" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "Versionskontrolle" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:172 #, fuzzy msgid "Main branch" msgstr "Haupt-Zweig" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google Reader" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "Internet" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr " oder mehr" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "Falscher Benutzername oder Passwort" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "Konnte keine Verbindung zum Server herstellen" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "Konnte Cookies nicht empfangen" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "Sie haben keine Feeds abonniert" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "Keine ungelesenen Objekte" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "Webseite/Feed" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "Dateigrößen-Differenz: %.2f" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "Differenz-Anteil: %s Prozent" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "Fehlertoleranz (%)" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "Keine veränderten Beobachtungen." #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "Fenster verstecken" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "Fenster zeigen" #: ../spectlib/watch.py:88 msgid "There was an error starting the watch" msgstr "Fehler beim Starten der Beobachtung" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "Fehler beim Stoppen der Beobachtung" #: ../spectlib/watch.py:108 msgid "There was an error marking the watch as read" msgstr "Fehler beim Markieren der Beobachtung als gelesen" #: ../spectlib/watch.py:151 msgid "There was an error marking the watch as changed" msgstr "Fehler beim Markieren der Beobachtung als verändert" #: ../spectlib/watch.py:216 #: ../spectlib/watch.py:217 msgid "No changes yet" msgstr "Bisher keine Veränderungen" #: ../spectlib/watch.py:301 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "Bitte aktivieren Sie Plugin \"%s\", wenn Sie die Beobachtung \"%s\" verwenden wollen." #: ../spectlib/watch.py:455 #: ../spectlib/watch.py:468 #: ../spectlib/watch.py:488 #: ../spectlib/watch.py:514 #: ../spectlib/watch.py:530 #: ../spectlib/watch.py:554 #: ../spectlib/watch.py:609 msgid "There was an error initializing config file %s" msgstr "Fehler während der Initialisierung der Konfigurationsdatei %s" #~ msgid "Duration (in seconds):" #~ msgstr "Dauer (in Sekunden):" #~ msgid "" #~ "The watch, %s, has a problem. You may need to check the error log." #~ msgstr "" #~ "Die Beobachtung %s hat einen Fehler erzeugt. Im Fehlerbericht " #~ "stehen eventuell Details." #~ msgid "" #~ "The website, %s, has changed.\n" #~ "Difference percentage: %s percent" #~ msgstr "" #~ "Die Webseite %s hat sich geändert.\n" #~ "Differenz: %s Prozent" #~ msgid "Watch Type:" #~ msgstr "Beobachtungstyp:" #, fuzzy #~ msgid "" #~ "Website\n" #~ "Email\n" #~ "Files or folders\n" #~ "Process\n" #~ "Port" #~ msgstr "" #~ "Webseite\n" #~ "Email\n" #~ "Dateien/Ordner" #~ msgid "Watch Settings" #~ msgstr "Beobachtungseinstellungen" #~ msgid "A problem occured" #~ msgstr "Ein Problem ist aufgetreten" #~ msgid "A watch is updated" #~ msgstr "Eine Beobachtung wird aktualisiert!" #~ msgid "Pop toasts from the tray icon when a watch is updated" #~ msgstr "" #~ "Popup vom Spectosymbol wenn ein Objekt unter Beobachtung geändert wurde" #~ msgid "" #~ "While in debug mode, Specto will provide more information in order to " #~ "help you diagnose problems. Logging will save all this information to a " #~ "log file. You can use this to help developers improve Specto." #~ msgstr "" #~ "Im Fehlerbehebungsmodus wird Specto mehr Informationen anzeigen um bei " #~ "der Fehlerbehebung zu helfen. Die Fehlerberichterstattung wird all diese " #~ "Informationen in einem Bericht speichern. Dieser kann dann genutzt werden " #~ "um Specto zu verbessern." #~ msgid "file" #~ msgstr "Datei" #~ msgid "folder" #~ msgstr "Ordner" #~ msgid "Protocol:" #~ msgstr "Protokol:" #~ msgid "User:" #~ msgstr "Benutzer:" #~ msgid "File/folder:" #~ msgstr "Datei/Ordner:" #~ msgid "removed logs from watch: \"%s\"" #~ msgstr "Logs von Beobachtung entfernt: : \"%s\"" #~ msgid "Pop3" #~ msgstr "Pop3" #~ msgid "Imap" #~ msgstr "Imap" #~ msgid "watch \"%s\" stopped" #~ msgstr "Beobachtung \"%s\" gestoppt" #~ msgid "notifier: reappear" #~ msgstr "Benachrichtiger: anzeigen" #~ msgid "notifier: hide" #~ msgstr "Benachrichtiger: verstecken" #~ msgid "preferences: create" #~ msgstr "Einstellungen: erstellen" #~ msgid "preferences: reappear" #~ msgstr "Einstellungen: anzeigen" #~ msgid "error log: create" #~ msgstr "Fehlerlog: erstellen" #~ msgid "error log: already visible" #~ msgstr "Fehlerlog: bereits sichtbar" #~ msgid "error log: recreate" #~ msgstr "Fehlerbericht: wiederherstellen" #~ msgid "add watch: create" #~ msgstr "Beobachtung hinzufügen: erstellen" #~ msgid "add watch: already visible" #~ msgstr "Beobachtung hinzufügen: bereits sichtbar" #~ msgid "add watch: recreate" #~ msgstr "Beobachtung hinzufügen: wiederherstellen" #~ msgid "edit watch: create" #~ msgstr "Beobachtung hinzufügen: erstellen" #~ msgid "edit watch: already visible" #~ msgstr "Beobachtung hinzufügen: bereits sichtbar" #~ msgid "edit watch: recreate" #~ msgstr "Beobachtung hinzufügen: wiederherstellen" #~ msgid "gmail (%s unread)" #~ msgstr "gmail (%s ungelesen)" #~ msgid "notifier: size set" #~ msgstr "Benachrichtiger: Größe eingestellt" #~ msgid "notifier: size not set" #~ msgstr "Benachrichtiger: Größe nicht eingestellt" #~ msgid "notifier: position set" #~ msgstr "Benachrichtiger: Position eingestellt" #~ msgid "notifier: position not set" #~ msgstr "Benachrichtiger: Position nicht eingestellt" #~ msgid "Name:" #~ msgstr "Name:" #~ msgid "Last Updated:" #~ msgstr "Letztes Update:" #~ msgid "Location:" #~ msgstr "Ort:" #~ msgid "Error Margin:" #~ msgstr "Fehlertoleranz:" #~ msgid "Host:" #~ msgstr "Host:" #~ msgid "Username:" #~ msgstr "Benutzername:" #~ msgid "File/folder:" #~ msgstr "Datei/Ordner:" #~ msgid "Preferences saved." #~ msgstr "Einstellungen gespeichert." #~ msgid "Updated watches:\n" #~ msgstr "Aktualisierte Beobachtungen:\n" #~ msgid "website" #~ msgstr "Webseite" #~ msgid "websites" #~ msgstr "Webseiten" #~ msgid "mail account" #~ msgstr "Mail-Account" #~ msgid "mail accounts" #~ msgstr "Mail-Accounts" #~ msgid "file/folder" #~ msgstr "Datei/Ordner" #~ msgid "files/folders" #~ msgstr "Dateien/Ordner" #~ msgid "Watch \"%s\" updated!" #~ msgstr "Beobachtung \"%s\" aktualisiert!" #~ msgid "Your email account, %s, has %d new mail." #~ msgstr "Ihr Email-Account, %s, hat %d neue Mails." #~ msgid "" #~ "Your email account, %s, has %d new unread mails, totalling %" #~ "s" #~ msgstr "" #~ "Ihr Email-Account %s hat %d neue ungelesene Mails, " #~ "insgesamt %s." #~ msgid "Your email account, %s, has new mail." #~ msgstr "Ihr Email-Account %s hat neue Mail." #~ msgid "The file/folder, %s, has been updated." #~ msgstr "Die Datei/Der Ordner , %s, wurde aktualisiert." #~ msgid "Not implemented yet" #~ msgstr "Noch nicht implementiert" #~ msgid "Unknown File Watch" #~ msgstr "Unbekannte Dateibeobachtung" #~ msgid "Updating watch: \"%s\"" #~ msgstr "Aktualisiere Beobachtung: \"%s\"" #~ msgid "update: %s removed" #~ msgstr "Update: %s entfernt" #~ msgid "Unknown Mail Watch" #~ msgstr "Unbekannte Mailbeobachtung" #~ msgid "Watch: \"%s\" has error: %s" #~ msgstr "Beobachtung: \"%s\" hat einen Fehler: %s" #~ msgid "Mailbox does not exist" #~ msgstr "Mailbox existiert nicht" #~ msgid "Watch: \"%s\" has error: " #~ msgstr "Beobachtung: \"%s\" hat einen Fehler:" #, fuzzy #~ msgid "Unknown Process Watch" #~ msgstr "Unbekannte Dateibeobachtung" #~ msgid "Watch: \"%s\" has error: empty url" #~ msgstr "Beobachtung: \"%s\" hat einen Fehler: leere URL" specto-0.3.1/po/zh_CN/0000755000175000017500000000000011226433142013033 5ustar jeffjeffspecto-0.3.1/po/zh_CN/specto.mo0000644000175000017500000003367111172643155014706 0ustar jeffjeff H9Ngv B %-E s} e  2@G0]* !%26in  "'AIPbhp  GV_ Ubg l xD P?  &)<~[   /7?Z a o+z _ &ARY^ejU)..Nn  %./',W+&%%)# M !i       8 !!,!5!E!W!j! y!! !!!!!#"z7" "" """""" ## #,#?#_#mr#$$%%G/%w%%%%%%&&& &&&' $'2''A'($( 7(%D(j(( ((V())/)B)U)\)3u))) ) ))*!*$5*Z*a*x**** * * ****++ /+<+C+X+^+e+y++ +++{+ 2, ?,I,- --7- >-H-X-h- o-@y-- ---K.d. w.....$.!.3.Q/h/ o/|// //// / //// 0$0 40NA0000000000H0&>1&e111#112$2!C2e2!'3*I3*t3'3-3!3!4!94![4}444444 4425 35=5 X5 b5o55555 5555606yI6 6 666 6 77$787 I7T7d7$w77$59[.%<W"]UM0Syo|DAB(u1lH4^K+> Z*`j2{X_hgR  e:Ndw86abE,TpvJcn&'V}~\F#3x;tQ= rm k !O-f@qYI/)C?G7zsiLP files were modified. files were removed. new files were created. %d new messages%d new messages from %s... ... totalling %d unread mails.%d new notifications%s encountered a problem%s has changed1 file was modified. 1 file was removed. 1 new file was created. %s has changed: Specto is currently busy and cannot quit yet. This may be because it is checking for watch changes. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayGeneral settingsRun a custom command:SecuritySoundsSpecto encountered an error Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.Watch optionsRemove the watch "%s"? This operation cannot be undone.ActiveAdd a WatchAdvanced optionsAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot display notification message. Make sure that libnotify and D-Bus are available on your system.Cannot quit yetChoose an other nameChoose a directoryChoose a fileClosedConsole mode enabled.Could not create a watch, because it is corrupt.Could not establish a connection to serverCould not get cookiesDebug informationDeselect allDifference percentage: %s percentDisplay _All WatchesDisplay _ToolbarDisplay the notification window in the window listEditEdit existing watchEdit watch: EmailEnable debug mode and loggingErrorError logExport watchesExtra informationExtra information could not be setFacebookFileFile size changedFilesize difference: %.2fFilter:FolderFolder (optional)GMailGeneralGeneral optionsGoogle ReaderGroup id of the owner changedHide windowIDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.Import watchesInternetIt is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account.Last changedLogsMailMain branchMark as readMurder!NameName:New message from %s... ... totalling %d unread mails.No changed watches.No changes yetNo extra information available.No network connection detectedNo parent branch available, you will not be notified of differences and changes.No unread itemsNot runningNotificationsOpenPOP3PasswordPlay this sound when a problem occurs:Play this sound when a watch has changed:Please enable plugin "%s" if you want to use the watch "%s".Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.PortPreferencesProcessRefreshRefresh AllRefresh Interval:RemoveRemove a watchRunningSave AsSeconds Minutes Hours DaysSelectSelect a FileSelect allShow notifications when a watch has changedShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!Specto's WebsiteStatusStopSystemTYPEThe file was removedThe network connection seems to be down, networked watches will not check until then.The network socket on port %s was closed.The network socket on port %s was established.The system process has started.The system process has stopped.The watch "%s" has a problem.The watch "%s" has changed.The watch "%s" is checking.The watch is not set to a folderThe watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.There was an error checking the watchThere was an error initializing config file %sThere was an error marking the watch as changedThere was an error marking the watch as readThere was an error marking the watch statusThere was an error opening the file %sThere was an error starting the watchThere was an error stopping the watchThere was an error writing to the file %sTime of last access changedTime of last modification changedTip of the Day:TypeURLUnexpected error:UnknownUnread messagesUse GNOME keyring to store passwords in encrypted formatUse SSLUser id of the owner changedUsernameVersion controlWatch $WATCH_NAMEWatch has changed.Watch is idle.Watch openedWatch started checking.Webpage/feedWhen this watch has changedWhen you open this watchWrong username or passwordWrong username/passwordYou are not subscribed to any feedsYou can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.You received_Edit_Error Log_Export Watches_File_Help_Import Watches_Mark all read_Refresh All_Viewa new messagea new notificationno GTK, activating console modetranslator-creditsProject-Id-Version: specto-0.2.2 POT-Creation-Date: 2009-03-26 12:50+EDT PO-Revision-Date: 2009-04-19 11:42-0500 Last-Translator: Jean-François Fortin Tam Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Chinese X-Poedit-Country: CHINA X-Poedit-SourceCharset: utf-8 X-Poedit-Basepath: ./ 文件被修改。 文件被移除。 创建了新文件。 %d 个新信息来自%s的%d 个新信息 ... 总计 %d 未读邮件。%d个新的提醒%s遇到了一个问题%s已经改变一个文件被移除。 一个文件被移除。 一个新文件被创建。 %s已经改变: Specto 正忙并且尚不能退出 这可能是因为正在检查更新. 但是您仍可以通过点击强制退出按钮强制退出。Debugging 和 日志显示基本设置运行自定义命令:安全:声音Specto 遇到了一个错误 Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.监视名称移除这个监视"%s"? 这个操作无法被撤销。启用添加一个监视高级选项All Debug Info Warning Error Critical一直显示在提示区按 活动状态按 名称按 监视类型不能够显示提示信息。请确认您的系统中libnotify和D-Bus是可用的。尚不能退出选择 另一个名称选择一个目录选择一个文件关闭终端模式已启用。无法创建一个监视,它可能已经损坏。无法与服务器建立连接无法获取cookieDebug信息删除全部差异比例:%s%显示所有的监视(_A)显示工具栏(_T)在窗口列表中显示提醒窗口编辑编辑存在的 监视编辑监视:Email启用 debug 模式和日志错误错误日志导出监视额外信息无法设置额外信息Facebook文件文件大小改变文件大小差别:%.2f过滤器:目录文件夹(可选的)Gmail常规基本设置Google阅读器所有者的组ID改变隐藏窗口IDIMAP如果激活此模式,你将会在运行specto的终端中得到更多信息, 并且更多信息将会记录到日志中。导入监视互联网强烈的推荐您使用密钥环。如果您取消此选项,您的密码将会被保存在未经加密的监视列表文本文件中,并且可能会被任何能够访问你的系统的人员获取。最近的变化日志:邮件主分支标记为已读强制退出!名称名称:来自%s的新信息... ... 总计 %d未读邮件没有更新的监视。尚无更新没有可用的额外信息。未检测到网络连接没有可用的父分支,您将不会接收到不同和改变的通知。没有未读条目未运行提醒打开POP3密码当问发生问题时播放声音:当监视更新时播放声音:请启用“%s”插件以使用监视“%s”。请设置一个合理的刷新间隔以节省带宽并防止被服务商封禁。端口偏好设置进程刷新刷新全部刷新间隔:移除移除一个监视运行中保存为秒 分 小时 天选择选择一个文件选择全部显示提醒当一个监视更新时显示窗口单机存在的监视以显示相关信息,双击将会打开详细内容。跳过%s排序Specto已经在运行Specto的网站状态停止系统类型文件已被移除网络连接似乎是断开的,监视在连接之前将不会更新。%s端口上的网络连接被关闭。%s端口上的网络连接被打开。系统进程已启动。系统进程已停止。监视“%s”存在一个错误。监视“%s”已经改变。监视“%s”正在检查。监视未被设置到一个文件夹这个监视名称已经存在了您选择的这个监视名称已经存在了! 您是希望修改现有的监视, 还是创建一个新的监视? 如果你希望创建一个新的监视, 你需要选择一个不同的名称.当检查监视是发生了错误初始化配置文件时发生了错误。将监视标为已改变时发生了错误将监视标为已读时发生了错误标记监视状态时发生了一个错误。打开文件%s时发生了错误 开始监视时发生了错误。停止监视时发生了错误。写入文件%s时发生了错误 最后一次访问时间改变最后一次修改时间改变每日提示:类型URL意外错误:未知的未读的消息使用GNOME密钥环以加密的格式保存密码使用SSL所有者的用户ID改变用户名版本控制监视$WATCH_NAME监视已改变监视空闲。监视已打开监视开始检查。网页/源当监视刷新时当打开监视时错误的用户名或密码错误的用户名或密码您没有订阅任何源你可以添加各种网站作为监视对象。包括静态页面,RSS或ATOM源等。Specto将会自动处理他们。您接收到编辑(_E)错误日志(_E)导出监视(_E)文件(_F)帮助(_H)导入监视(_I)标记为已读(_M)刷新所有(_A)视图(_V)一个新信息一个新的提醒不使用GTK,在终端模式活动Alex Yang specto-0.3.1/po/zh_CN/specto.po0000644000175000017500000010142111172643155014676 0ustar jeffjeffmsgid "" msgstr "" "Project-Id-Version: specto-0.2.2\n" "POT-Creation-Date: 2009-03-26 12:50+EDT\n" "PO-Revision-Date: 2009-04-19 11:42-0500\n" "Last-Translator: Jean-François Fortin Tam\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-Basepath: ./\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "运行自定义命令:" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "添加一个监视" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "高级选项" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "选择 \n" "另一个名称" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "编辑存在的\n" "监视" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "基本设置" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "名称:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "刷新间隔:" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "秒\n" "分\n" "小时\n" "天" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "这个监视名称已经存在了" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "您选择的这个监视名称已经存在了! 您是希望修改现有的监视, 还是创建一个新的监视?\n" "\n" "如果你希望创建一个新的监视, 你需要选择一个不同的名称." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "当监视刷新时" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "当打开监视时" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "基本设置" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "监视名称" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:788 msgid "Error log" msgstr "错误日志" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "监视$WATCH_NAME" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "删除全部" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "选择全部" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "过滤器:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "日志:" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "保存为" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "按 活动状态" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "按 名称" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "按 监视类型" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Debug信息" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "显示所有的监视(_A)" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "显示工具栏(_T)" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "错误" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "额外信息" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "常规" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "标记为已读" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "提醒" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "排序" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "编辑(_E)" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "错误日志(_E)" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "导出监视(_E)" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "文件(_F)" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "帮助(_H)" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "导入监视(_I)" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "标记为已读(_M)" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "刷新所有(_A)" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "视图(_V)" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Debugging 和 日志" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "显示" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "安全:" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "声音" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "一直显示在提示区" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "在窗口列表中显示提醒窗口" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "启用 debug 模式和日志" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "如果激活此模式,你将会在运行specto的终端中得到更多信息, 并且更多信息将会记录到日志中。" #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "强烈的推荐您使用密钥环。如果您取消此选项,您的密码将会被保存在未经加密的监视列表文本文件中,并且可能会被任何能够访问你的系统的人员获取。" #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "当问发生问题时播放声音:" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "当监视更新时播放声音:" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "偏好设置" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "选择一个文件" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "显示提醒当一个监视更新时" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "使用GNOME密钥环以加密的格式保存密码" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "Alex Yang " #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Specto的网站" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "不能够显示提示信息。请确认您的系统中libnotify和D-Bus是可用的。" #: ../spectlib/console.py:45 #: ../spectlib/watch.py:140 msgid "Watch has changed." msgstr "监视已改变" #: ../spectlib/console.py:50 #: ../spectlib/watch.py:121 msgid "Watch started checking." msgstr "监视开始检查。" #: ../spectlib/console.py:52 msgid "Watch is idle." msgstr "监视空闲。" #: ../spectlib/console.py:54 #: ../spectlib/watch.py:174 msgid "No network connection detected" msgstr "未检测到网络连接" #: ../spectlib/console.py:56 #: ../spectlib/watch.py:136 #: ../spectlib/watch.py:170 msgid "There was an error checking the watch" msgstr "当检查监视是发生了错误" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "编辑监视:" #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "移除一个监视" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "移除这个监视\"%s\"?\n" "这个操作无法被撤销。" #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "导出监视" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 msgid "Select" msgstr "选择" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "类型" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "名称" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "类型" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "选择一个文件" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "选择一个目录" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" "Specto 遇到了一个错误\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "导入监视" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "不使用GTK,在终端模式活动" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "终端模式已启用。" #: ../spectlib/main.py:130 msgid "Could not create a watch, because it is corrupt." msgstr "无法创建一个监视,它可能已经损坏。" #: ../spectlib/main.py:204 #: ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "Specto已经在运行" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "尚不能退出" #: ../spectlib/main.py:258 msgid "Murder!" msgstr "强制退出!" #: ../spectlib/main.py:269 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto 正忙并且尚不能退出\n" "\n" "这可能是因为正在检查更新.\n" "但是您仍可以通过点击强制退出按钮强制退出。" #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "停止" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "刷新全部" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "监视“%s”正在检查。" #: ../spectlib/notifier.py:218 #: ../spectlib/notifier.py:347 msgid "The network connection seems to be down, networked watches will not check until then." msgstr "网络连接似乎是断开的,监视在连接之前将不会更新。" #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "监视“%s”存在一个错误。" #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "%s遇到了一个问题" #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "监视“%s”已经改变。" #: ../spectlib/notifier.py:245 msgid "%s has changed" msgstr "%s已经改变" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "标记监视状态时发生了一个错误。" #: ../spectlib/notifier.py:392 #: ../spectlib/watch.py:230 msgid "No extra information available." msgstr "没有可用的额外信息。" #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "无法设置额外信息" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "监视已打开" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "刷新" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "编辑" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "移除" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "你可以添加各种网站作为监视对象。包括静态页面,RSS或ATOM源等。Specto将会自动处理他们。" #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "" #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "单机存在的监视以显示相关信息,双击将会打开详细内容。" #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "请设置一个合理的刷新间隔以节省带宽并防止被服务商封禁。" #: ../spectlib/notifier.py:693 msgid "Active" msgstr "启用" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "每日提示:" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "Gmail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "邮件" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "用户名" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "密码" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 #: ../spectlib/watch.py:241 #: ../spectlib/watch.py:250 msgid "Unexpected error:" msgstr "意外错误:" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "最近的变化" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "未读的消息" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "来自%s的新信息...\n" "\n" "... 总计 %d未读邮件" #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "来自%s的%d 个新信息\n" "\n" "... 总计 %d 未读邮件。" #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "" #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:288 msgid "There was an error opening the file %s" msgstr "打开文件%s时发生了错误 " #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "使用SSL" #: ../spectlib/plugins/watch_mail_imap.py:43 msgid "Folder (optional)" msgstr "文件夹(可选的)" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:447 #: ../spectlib/watch.py:541 #: ../spectlib/watch.py:569 #: ../spectlib/watch.py:593 #: ../spectlib/watch.py:619 #: ../spectlib/watch.py:633 msgid "There was an error writing to the file %s" msgstr "写入文件%s时发生了错误 " #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Email" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "错误的用户名或密码" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "您接收到" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "一个新信息" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d 个新信息" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "一个新的提醒" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "%d个新的提醒" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "文件" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "系统" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "文件已被移除" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "所有者的用户ID改变" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "所有者的组ID改变" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "文件大小改变" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "最后一次访问时间改变" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "最后一次修改时间改变" #: ../spectlib/plugins/watch_system_file.py:157 msgid "%s has changed:\n" msgstr "%s已经改变:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "目录" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "监视未被设置到一个文件夹" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "跳过%s" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "1 new file was created.\n" msgstr "一个新文件被创建。\n" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr "创建了新文件。\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "一个文件被移除。\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr "文件被移除。\n" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "1 file was modified.\n" msgstr "一个文件被移除。\n" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr "文件被修改。\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "端口" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "关闭" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "打开" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "未知的" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "状态" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The network socket on port %s was established." msgstr "%s端口上的网络连接被打开。" #: ../spectlib/plugins/watch_system_port.py:116 msgid "The network socket on port %s was closed." msgstr "%s端口上的网络连接被关闭。" #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "进程" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "未运行" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "运行中" #: ../spectlib/plugins/watch_system_process.py:98 msgid "The system process has started." msgstr "系统进程已启动。" #: ../spectlib/plugins/watch_system_process.py:100 msgid "The system process has stopped." msgstr "系统进程已停止。" #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "版本控制" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "没有可用的父分支,您将不会接收到不同和改变的通知。" #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "" #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "主分支" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google阅读器" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "互联网" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr "" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "错误的用户名或密码" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "无法与服务器建立连接" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "无法获取cookie" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "您没有订阅任何源" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "没有未读条目" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "网页/源" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "文件大小差别:%.2f" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "差异比例:%s%" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "没有更新的监视。" #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "隐藏窗口" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "显示窗口" #: ../spectlib/watch.py:88 msgid "There was an error starting the watch" msgstr "开始监视时发生了错误。" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "停止监视时发生了错误。" #: ../spectlib/watch.py:108 msgid "There was an error marking the watch as read" msgstr "将监视标为已读时发生了错误" #: ../spectlib/watch.py:151 msgid "There was an error marking the watch as changed" msgstr "将监视标为已改变时发生了错误" #: ../spectlib/watch.py:216 #: ../spectlib/watch.py:217 msgid "No changes yet" msgstr "尚无更新" #: ../spectlib/watch.py:301 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "请启用“%s”插件以使用监视“%s”。" #: ../spectlib/watch.py:455 #: ../spectlib/watch.py:468 #: ../spectlib/watch.py:488 #: ../spectlib/watch.py:514 #: ../spectlib/watch.py:530 #: ../spectlib/watch.py:554 #: ../spectlib/watch.py:609 msgid "There was an error initializing config file %s" msgstr "初始化配置文件时发生了错误。" #~ msgid "Watch Type:" #~ msgstr "监视类型:" #~ msgid "" #~ "Website\n" #~ "Email\n" #~ "Files or folders\n" #~ "Process\n" #~ "Port" #~ msgstr "" #~ "站点\n" #~ "电子邮件\n" #~ "文件或文件夹\n" #~ "进程\n" #~ "端口" #~ msgid "Watch Settings" #~ msgstr "监视设置" #~ msgid "File/folder:" #~ msgstr "文件/文件夹:" #~ msgid "Last Updated:" #~ msgstr "最后更新:" #~ msgid "Location:" #~ msgstr "位置:" #~ msgid "Name:" #~ msgstr "名称:" #~ msgid "Process:" #~ msgstr "进程:" #~ msgid "Username:" #~ msgstr "用户名:" #~ msgid "label" #~ msgstr "标签" #~ msgid "A problem occured" #~ msgstr "发生了一个问题" #~ msgid "A watch is updated" #~ msgstr "更新了一个监视" #~ msgid "Duration (in seconds):" #~ msgstr "持续时间(秒)" #~ msgid "Pop toasts from the tray icon when a watch is updated" #~ msgstr "当有监视更新时从托盘图标中弹出气泡" #~ msgid "" #~ "While in debug mode, Specto will provide more information in order to " #~ "help you diagnose problems. Logging will save all this information to a " #~ "log file. You can use this to help developers improve Specto." #~ msgstr "" #~ "在debug模式下,Specto将会提供更多信息以帮助您诊断可能存在的问题。日志系统" #~ "将会将所有的这些信息存贮到日志文件中。您可以使用它帮助开发者改进 Specto。" #~ msgid "file" #~ msgstr "文件" #~ msgid "folder" #~ msgstr "目录" #~ msgid "User:" #~ msgstr "用户名:" #~ msgid "File/folder:" #~ msgstr "文件/目录:" #~ msgid "removed logs from watch: \"%s\"" #~ msgstr "删除“%s”监视的日志" #~ msgid "Pop3" #~ msgstr "Pop3" #~ msgid "Imap" #~ msgstr "IMAP" #~ msgid "watch \"%s\" stopped" #~ msgstr "监视“%s”已经停止" #~ msgid "gmail (%s unread)" #~ msgstr "Gmail (%s 未读)" #~ msgid "notifier: size set" #~ msgstr "提醒:尺寸已设置" #~ msgid "notifier: size not set" #~ msgstr "提醒:尺寸尚未设置" #~ msgid "notifier: position set" #~ msgstr "提醒:位置已设置" #~ msgid "notifier: position not set" #~ msgstr "ntifer:位置尚未设置" #~ msgid "Preferences saved." #~ msgstr "偏好设置已保存。" #~ msgid "Updated watches:\n" #~ msgstr "有更新的监视:\n" #~ msgid "website" #~ msgstr "网站" #~ msgid "websites" #~ msgstr "多个网站" #~ msgid "mail account" #~ msgstr "邮件帐号" #~ msgid "mail accounts" #~ msgstr "多个邮件帐号" #~ msgid "file/folder" #~ msgstr "文件/文件夹" #~ msgid "files/folders" #~ msgstr "多个文件/文件夹" #~ msgid "process" #~ msgstr "进程" #~ msgid "processes" #~ msgstr "多个进程" #~ msgid "port" #~ msgstr "端口" #~ msgid "ports" #~ msgstr "多个端口" #~ msgid "" #~ "The watch, %s, has a problem. You may need to check the error log." #~ msgstr "监视“%s”存在问题。您可以检查错误日志。" #~ msgid "Watch \"%s\" is already marked as updated in the notifier" #~ msgstr "监视“%s”已经在提示中标记为已更新" #~ msgid "Watch \"%s\" updated!" #~ msgstr "监视“%s” 更新!" #~ msgid "The website, %s, has been updated." #~ msgstr "网站%s已经更新。" #~ msgid "Your email account, %s, has %d new mail." #~ msgstr "您的Email帐号%s%d 封新邮件。" #~ msgid "" #~ "Your email account, %s, has %d new unread mails, totalling %" #~ "s" #~ msgstr "您的Email帐号%s%d 封未读,总计 %s" #~ msgid "Your email account, %s, has new mail." #~ msgstr "您的Email帐号%s有新邮件。" #~ msgid "The file/folder, %s, has been updated." #~ msgstr "文件/文件夹%s已更新。" #~ msgid "Unknown File Watch" #~ msgstr "未知的文件监视" #~ msgid "Updating watch: \"%s\"" #~ msgstr "正在更新监视“%s”" #~ msgid "update: %s removed" #~ msgstr "更新:%s被移除" #~ msgid "Unknown Mail Watch" #~ msgstr "未知的邮件监视" #~ msgid "Watch: \"%s\" has error: %s" #~ msgstr "监视“%s”存在一个错误 :%s" #~ msgid "Mailbox does not exist" #~ msgstr "邮箱不存在" #~ msgid "Watch: \"%s\" has error: " #~ msgstr "监视“%s”存在一个错误" #~ msgid "Unknown Process Watch" #~ msgstr "未知的进程监视" #~ msgid "Watch: \"%s\" has error: empty url" #~ msgstr "监视“%s”存在一个错误:空的URL" specto-0.3.1/po/cs/0000755000175000017500000000000011226433142012437 5ustar jeffjeffspecto-0.3.1/po/cs/specto.mo0000644000175000017500000003325411041474550014303 0ustar jeffjeff\ ()(< Tav    %-@ nx  &2&Yp     ( <J O~Y5 %8 AK]e   _ 4&9+`-L$$, QrI>)/8 >7H  .0+_Dz6K, ;F LWgms);O T `nu   4GLRf| &9AiJ  "!! !"-"B"U"s"" "" """"" #,#5#9I#,## ####$ +$(8$a$$.$$ $ %( %I%Z%x%%%% %% % %%%%b&g&~&*&&&&*&$&'6' O'\'a'h']'P(U( [(f({( (( (( ( ( (q(b)s)|))")#)-)` *k**'**_+*,;,D,H,M,`,s,,, , ,,G, ;-\-x--#-%-'-2.HE.1../0II1g1>1:2J2S2e2}2 22 2$22#2$3@3#_3!33 3333 4!444P4)l44!444#5!*5L5Q5W5m555)5+556 $6E6`6y6 6 6][ e4NpVs=@P-UY#Lg~u ZdnIr^B&5jSo m$E\7;fHwt)a3F?_xv'OK}(9%>cX6bzT: {2k.RW /h*qi,CA`yQDG J"<l+08!|M1Specto is currently busy and cannot quit yet. This may be because it is checking for watch updates. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayError Margin:File/folder:General settingsHost:Last Updated:Location:Name:Port:Process:SoundsUsername:Watch nameA problem occuredA watch is updatedActiveAdd a WatchAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot quit yetChoose an other nameChoose a file or folderDeselect allDifference percentage:%s (Watch: "%s")Display _All WatchesDisplay _ToolbarDisplay the notification window in the window listDuration (in seconds):Edit existing watchEdit watch: Enable debug mode and loggingError LogError Margin (%):Export watchesFileFile/folder:Filter:FolderGmailHide windowHost:IDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.ImapImport watchesLogsMailbox does not existMurder!NameName:No network connection detectedNo updated watches.No updates yet.Not implemented yetNotificationsPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop toasts from the tray icon when a watch is updatedPop3Port:PreferencesPreferences saved.Process:Protocol:Refresh Interval:Save AsSeconds Minutes Hours DaysSelect a FileSelect allShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!TYPEThe connection, %s, was closed.The connection, %s, was established.The file/folder, %s, has been updated.The network connection seems to be down, watches will not update until then.The process, %s, has started.The process, %s, has stopped.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.The watch, %s, has a problem. You may need to check the error log.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchUpdated watches: Updating watch: "%s"Use SSL:User:Username:Watch "%s" is already marked as updated in the notifierWatch "%s" updated!Watch : "%s" edited.Watch SettingsWatch Type:Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite Email Files or folders Process PortWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail._Clear All_Edit_Error Log_Export Watches_File_Help_Import Watches_Viewadd watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefile/folderfiles/foldersfoldergmail (%s unread)mail accountmail accountsno GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setportportspreferences: createpreferences: reappearprocessprocessesremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedwebsitewebsitesProject-Id-Version: Specto POT-Creation-Date: Tue May 29 18:06:54 2007 PO-Revision-Date: 2007-07-12 00:52-0500 Last-Translator: Jeff Fortin Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.4 X-Poedit-Language: Czech X-Poedit-Country: CZECH REPUBLIC Specto je momentálně zaneprázdněno a nemůže ještě skončit. To může být způsobeno tím, že kontroluje zda nedošlo k aktualizaci sledovaných objektů. Nicméně můžete zkusit přinutit jej skončit klepnutím na tlačítko zabít.Ladění a zaznamenáváníZobrazeníTolerovaná míra změny:Soubor/adresář:Obecné volbyPočítač:Poslední aktualizace:Umístění:Jméno:Port:Proces:ZvukyUživatelské jméno:Jméno sledováníDošlo k problémuSledovaný objekt je aktualizovánAktivníPřidat sledováníVšechny Ladící Informační Varování Chyby KritickéVždy zobrazovat ikonu v oznamovací oblastiPodle aktivityPodle jménaPodle typu sledováníNelze ještě skončitZvolte jiné jménoZvolte soubor či adresářNevybrat nicProcento rozdílu:%s (Sledování: "%s")Zobrazit _všechna sledováníZobrazit _lištu nástrojůZobrazovat upozorňovací okno v seznamu oken.Doba trvání (v sekundách):Upravit existující sledováníUpravit sledování: Zapnout ladící mód a zaznamenáváníChybový záznamTolerovaná míra změny (%):Exportovat sledováníSouborSoubor/adresář:Filtr:AdresářGmailSkrýt oknoPočítač:IDIMAPJe-li aktivováno, obdržíte více informací při spuštění Specto z terminálu a více informací bude vypsáno do záznamů.ImapImportovat sledováníZáznamySchránka elektronické pošty neexistuje.Zabít!JménoJméno:Detekováno žádné síťové připojeníŽádná aktualizovaná sledování.Zatím žádné aktualizace.Zatím neimplementovánoUpozorněníPOP3Heslo:Prosím nastavte rozumný obnovovací interval pro šetření šířkou pásma a zabránění vašeho zablokování poskytovateli obsahu.Upozornit vyskakovací bublinou z oznamovací oblasti, je-li sledovaný objekt aktualizován.Pop3Port:PředvolbyPředvolby uloženy.Proces:Protokol:Obnovovací interval:Uložit jakoSekund Minut Hodin DníZvolte souborVybrat všeZobrazit oknoKlepněte na existující sledovaný objekt pro zobrazení informací a poklepejte na něj pro otevření obsahu.Přeskočení %sŘazeníSpecto již běží!TYPSpojení %s bylo uzavřeno.Spojení %s bylo navázáno.Soubor/adresář %s byl aktualizován.Síťové připojení se zdá být přerušeno, sledování nebudou po tuto dobu aktualizována.Proces %s byl spuštěn.Proces %s se zastavil.Jméno sledování je již používánoJméno sledování, které jste specifikovali již existuje! Chtěli jste modifikovat toto existující sledování, nebo jste skutečně chtěli vytvořit nové? Pokud chcete vytvořit nové, musíte zvolit jiné jméno.U sledování %s došlo k problému. Možná potřebujete zkontrolovat chybový záznam.Webstránka %s byla aktualizována.Tip dne:TypURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchAktualizovaná sledování: Aktualizace sledování: "%s"Použít SSL:Uživatel:Uživatelské jméno:Sledování "%s" je již označeno jako aktualizované v upozorňovačiSledování "%s" aktualizováno!Sledování: "%s" upraveno.Nastavení sledováníTyp sledování:U sledování: "%s" došlo k chyběU sledování: "%s" došlo k chybě: U sledování: "%s" došlo k chybě: %sU sledování: "%s" došlo k chybě: prázdné urlU sledování: "%s" došlo k chybě: špatné uživatelské jméno/hesloWebstránka E-mail Soubor či složka Proces PortSledování webových stránek mohou používat tolerovanou míru změny, která vám umožňuje nastavit minimální procento rozdílu. To vám umožňuje přizpůsobení webstránkám, které se konstantně mění či mají mnoho reklamy.Je-li v ladícím módu, Specto bude poskytovat více informací za účelem pomoci vám diagnostikovat potíže. Zaznamenávání uloží všechny tyto informace do souboru se záznamem. Můžete to použít pro pomoc vývojářům zlepšit Specto.Jako sledované objekty můžete přidat všechny druhy webstránek - statické stránky, RSS či Atom kanály atd., Specto je bude automaticky zpracovávat.Váš účet elektronické pošty %s%d nových zpráv.Váš účet elektronické pošty %s%d nových nepřečtených zpráv (celkově %s).Váš účet elektronické pošty %s má novou zprávu._Vyčistit vše_Upravit_Chybový záznam_Exportovat sledování_Soubor_Nápověda_Importovat sledování_Zobrazitpřidat sledování: již viditelnépřidat sledování: vytvořitpřidat sledování: znovuvytvořitupravit sledování: již viditelnéupravit sledování: vytvořitupravit sledování: znovuvytvořitchybový záznam: již viditelnéchybový záznam: vytvořitchybový záznam: znovuvytvořitsouborsoubor/složkasoubory/složkyadresářgmail (%s nepřečtených)účet elektronické poštyúčty elektronické poštyžádné GTK, aktivace konzolového móduupozorňovač: skrýtupozorňovač: pozice nenastavenaupozorňovač: pozice nastavenaupozorňovač: reappearupozorňovač: velikost nenastavenaupozorňovač: velikost nastavenaportportypředvolby: vytvořitpředvolby: znovuobjevitprocesprocesyodstraněny záznamy ze sledování: "%s"Oldřich Šmehlík aktualizace: %s odstraněnaktualizace: %s byl vytvořenaktualizace: %s byl modifikovánsledování "%s" otevřenosledování "%s" začalosledování "%s" skončilowebstránkawebstránkyspecto-0.3.1/po/cs/specto.po0000644000175000017500000005117511041474550014310 0ustar jeffjeff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR ORGANIZATION # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Specto\n" "POT-Creation-Date: Tue May 29 18:06:54 2007\n" "PO-Revision-Date: 2007-07-12 00:52-0500\n" "Last-Translator: Jeff Fortin \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.4\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "Obecné volby" #: ../data/glade/add_watch.glade.h:2 msgid "Watch name" msgstr "Jméno sledování" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "Přidat sledování" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Zvolte \n" "jiné jméno" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Upravit existující\n" "sledování" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 msgid "Name:" msgstr "Jméno:" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "Obnovovací interval:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Sekund\n" "Minut\n" "Hodin\n" "Dní" #: ../data/glade/add_watch.glade.h:14 msgid "The watch name is already in use" msgstr "Jméno sledování je již používáno" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Jméno sledování, které jste specifikovali již existuje! Chtěli jste modifikovat toto existující sledování, nebo jste skutečně chtěli vytvořit nové?\n" "\n" "Pokud chcete vytvořit nové, musíte zvolit jiné jméno." #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "Typ sledování:" #: ../data/glade/add_watch.glade.h:19 msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" "Webstránka\n" "E-mail\n" "Soubor či složka\n" "Proces\n" "Port" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "Chybový záznam" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Uložit jako" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "Nastavení sledování" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Nevybrat nic" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Vybrat vše" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Všechny\n" "Ladící\n" "Informační\n" "Varování\n" "Chyby\n" "Kritické" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtr:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Záznamy" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Podle aktivity" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Podle jména" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Podle typu sledování" #: ../data/glade/notifier.glade.h:4 msgid "Display _All Watches" msgstr "Zobrazit _všechna sledování" #: ../data/glade/notifier.glade.h:5 msgid "Display _Toolbar" msgstr "Zobrazit _lištu nástrojů" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "Upozornění" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "Řazení" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "_Vyčistit vše" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "_Upravit" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "_Chybový záznam" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "_Exportovat sledování" #: ../data/glade/notifier.glade.h:12 msgid "_File" msgstr "_Soubor" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "_Nápověda" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "_Importovat sledování" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "_Zobrazit" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Ladění a zaznamenávání" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Zobrazení" #: ../data/glade/preferences.glade.h:3 msgid "Sounds" msgstr "Zvuky" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "Došlo k problému" #: ../data/glade/preferences.glade.h:5 msgid "A watch is updated" msgstr "Sledovaný objekt je aktualizován" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "Vždy zobrazovat ikonu v oznamovací oblasti" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "Zobrazovat upozorňovací okno v seznamu oken." #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "Doba trvání (v sekundách):" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "Zapnout ladící mód a zaznamenávání" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Je-li aktivováno, obdržíte více informací při spuštění Specto z terminálu a více informací bude vypsáno do záznamů." #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "Upozornit vyskakovací bublinou z oznamovací oblasti, je-li sledovaný objekt aktualizován." #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Předvolby" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Zvolte soubor" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "Je-li v ladícím módu, Specto bude poskytovat více informací za účelem pomoci vám diagnostikovat potíže. Zaznamenávání uloží všechny tyto informace do souboru se záznamem. Můžete to použít pro pomoc vývojářům zlepšit Specto." #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "Oldřich Šmehlík " #: ../spectlib/add_watch.py:165 msgid "file" msgstr "soubor" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "adresář" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "URL:" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Tolerovaná míra změny (%):" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protokol:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "Gmail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Uživatel:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Heslo:" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Počítač:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 msgid "Use SSL:" msgstr "Použít SSL:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "Soubor/adresář:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "Soubor" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Adresář" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Zvolte soubor či adresář" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "Proces:" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 msgid "Port:" msgstr "Port:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "Upravit sledování: " #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "Sledování: \"%s\" upraveno." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "odstraněny záznamy ze sledování: \"%s\"" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Uživatelské jméno:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "Pop3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "Imap" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 msgid "Import watches" msgstr "Importovat sledování" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 msgid "Export watches" msgstr "Exportovat sledování" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Aktivní" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Typ" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "Jméno" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "ID" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TYP" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "žádné GTK, aktivace konzolového módu" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "Specto již běží!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Zatím žádné aktualizace." #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "sledování \"%s\" začalo" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "sledování \"%s\" skončilo" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "upozorňovač: reappear" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "upozorňovač: skrýt" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "předvolby: vytvořit" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "předvolby: znovuobjevit" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "chybový záznam: vytvořit" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "chybový záznam: již viditelné" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "chybový záznam: znovuvytvořit" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "přidat sledování: vytvořit" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "přidat sledování: již viditelné" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "přidat sledování: znovuvytvořit" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "upravit sledování: vytvořit" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "upravit sledování: již viditelné" #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "upravit sledování: znovuvytvořit" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "Nelze ještě skončit" #: ../spectlib/main.py:582 msgid "Murder!" msgstr "Zabít!" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto je momentálně zaneprázdněno a nemůže ještě skončit.\n" "\n" "To může být způsobeno tím, že kontroluje zda nedošlo k aktualizaci sledovaných objektů.\n" "Nicméně můžete zkusit přinutit jej skončit klepnutím na tlačítko zabít." #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "Síťové připojení se zdá být přerušeno, sledování nebudou po tuto dobu aktualizována." #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s nepřečtených)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "sledování \"%s\" otevřeno" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Jako sledované objekty můžete přidat všechny druhy webstránek - statické stránky, RSS či Atom kanály atd., Specto je bude automaticky zpracovávat." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Sledování webových stránek mohou používat tolerovanou míru změny, která vám umožňuje nastavit minimální procento rozdílu. To vám umožňuje přizpůsobení webstránkám, které se konstantně mění či mají mnoho reklamy." #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Klepněte na existující sledovaný objekt pro zobrazení informací a poklepejte na něj pro otevření obsahu." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Prosím nastavte rozumný obnovovací interval pro šetření šířkou pásma a zabránění vašeho zablokování poskytovateli obsahu." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "upozorňovač: velikost nastavena" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "upozorňovač: velikost nenastavena" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "upozorňovač: pozice nastavena" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "upozorňovač: pozice nenastavena" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Tip dne:" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Jméno:" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Poslední aktualizace:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Umístění:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Tolerovaná míra změny:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Počítač:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Uživatelské jméno:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "Soubor/adresář:" #: ../spectlib/notifier.py:852 msgid "Process:" msgstr "Proces:" #: ../spectlib/notifier.py:897 msgid "Port:" msgstr "Port:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Předvolby uloženy." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Žádná aktualizovaná sledování." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Aktualizovaná sledování:\n" #: ../spectlib/trayicon.py:79 msgid "website" msgstr "webstránka" #: ../spectlib/trayicon.py:79 msgid "websites" msgstr "webstránky" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "účet elektronické pošty" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "účty elektronické pošty" #: ../spectlib/trayicon.py:93 msgid "file/folder" msgstr "soubor/složka" #: ../spectlib/trayicon.py:93 msgid "files/folders" msgstr "soubory/složky" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "proces" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "procesy" #: ../spectlib/trayicon.py:108 msgid "port" msgstr "port" #: ../spectlib/trayicon.py:108 msgid "ports" msgstr "porty" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Skrýt okno" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Zobrazit okno" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "U sledování %s došlo k problému. Možná potřebujete zkontrolovat chybový záznam." #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "Sledování \"%s\" je již označeno jako aktualizované v upozorňovači" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "Sledování \"%s\" aktualizováno!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "Webstránka %s byla aktualizována." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "" "Váš účet elektronické pošty\n" "%s\n" "má %d nových zpráv." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "" "Váš účet elektronické pošty\n" "%s\n" "má %d nových nepřečtených zpráv\n" "(celkově %s)." #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "" "Váš účet elektronické pošty\n" "%s má novou zprávu." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "Soubor/adresář %s byl aktualizován." #: ../spectlib/watch.py:125 msgid "The process, %s, has stopped." msgstr "Proces %s se zastavil." #: ../spectlib/watch.py:127 msgid "The process, %s, has started." msgstr "Proces %s byl spuštěn." #: ../spectlib/watch.py:132 msgid "The connection, %s, was closed." msgstr "Spojení %s bylo uzavřeno." #: ../spectlib/watch.py:134 msgid "The connection, %s, was established." msgstr "Spojení %s bylo navázáno." #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Zatím neimplementováno" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Unknown File Watch" #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "Aktualizace sledování: \"%s\"" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "U sledování: \"%s\" došlo k chybě" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "aktualizace: %s byl modifikován" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "aktualizace: %s byl vytvořen" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "Přeskočení %s" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "aktualizace: %s odstraněn" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Unknown Mail Watch" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "Detekováno žádné síťové připojení" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "U sledování: \"%s\" došlo k chybě: špatné uživatelské jméno/heslo" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "U sledování: \"%s\" došlo k chybě: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "Schránka elektronické pošty neexistuje." #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "U sledování: \"%s\" došlo k chybě: " #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 msgid "Unknown Process Watch" msgstr "Unknown Process Watch" #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "U sledování: \"%s\" došlo k chybě: prázdné url" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Procento rozdílu:%s (Sledování: \"%s\")" specto-0.3.1/po/ro/0000755000175000017500000000000011226433142012452 5ustar jeffjeffspecto-0.3.1/po/ro/specto.mo0000644000175000017500000001543311041474551014316 0ustar jeffjeffZ  "3:&R y    * / ~9   _ F R m -r )        1 7 A U j   .  z 69 Kp ,  *FYn5H_r!4G\t  .=Vjrz   n(/E)I$s "#  %9 Tu!&;7*<&#? ^% "">FL!f"!1F^w C>0.P#?H-&41! A<3BNZM ')F D /,O(Q;=LR"U$@7JW2+SGIX5%6VT:E8*9K YError Margin:File/folder:Host:Last Updated:Location:Name:Username:ActiveChoose a file or folderDifference percentage:%s (Watch: "%s")Edit watch: Error Margin (%):FileFile/folder:FolderGmailHide windowHost:IDIMAPImapMailbox does not existNameNo updated watches.No updates yet.Not implemented yetPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop3Preferences saved.Protocol:Show windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSpecto is already running!TYPEThe file/folder, %s, has been updated.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUpdated watches: Updating watch: "%s"User:Username:Watch "%s" updated!Watch : "%s" edited.Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail.add watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefoldergmail (%s unread)no GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setpreferences: createpreferences: reappearremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedProject-Id-Version: specto POT-Creation-Date: PO-Revision-Date: 2007-05-29 18:27-0500 Last-Translator: Jeff Fortin Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Romanian Marja de Eroare:Fișier/dosar:Host:Ultima schimbare:Locație:Nume:Nume de Utilizator:ActivAlegeți un fișier sau dosarProcentaj de diferență:%s (Urmăreala: "%s")Editează o urmăreală:Marja de eroare (%)FișierFișier/dosar:DosarGmailAscunde jeamulHost:IDIMAPImapCutia de poștă nu existăNumeNici o noutate.Nici un update.Ne-implementatPOP3Parola:Vă rog să setați o intervală de refresh resonabila, ca să salvăm bandwidth si ca să nu fiim blocați de la content.Pop3Preferințe salvate.Protocol:Arată jeamulClicați odată pe o urmăreală pentru a verifica informația, sau de doua ori pentru a deschide conținutul.Sar %sSpecto e deja lansat!TIPFișierul/Dosar %s a fost updatat.Website-ul %s a fost updatat.Tipul zileiTipURL:Urmăreală de fișier necunoscut.Urmăreală de poștă necunoscutăNoutăți: Updatez Urmăreala: "%s"Utilizator:Nume de utilizator:Urmăreala "%s" updatată!Urmăreala "%s" a fost editată.Urmăreala "%s" are o eroareUrmăreala: "%s" are o eroare: Urmăreala: "%s" are o eroare: %sUrmăreala: "%s" are o eroare: url golUrmăreala: "%s" are o eroare: utilizator/parola incorectăUrmăreli de website pot avea marje de eroare care vă lasă să setați un procentaj de diferența minimă. Asta vă lasă să adaptați la website-uri care se schimb constant, sau care au multe reclame.Puteți adauga multe feluri de website-uri ca urmăreli. Pagini statici, șiruri RSS sau Atom, etc., vor fi manajate de Specto automat.Contul %s are %d mesaje noi.Contul %s are %d mesaje noi, cu un total de %sAveți mesaje noi pe contul %s.adaugă o urmăreală: visibil dejaadaugă o urmăreală: creazăadaugă o urmăreală: recreazăeditează o urmăreală: deja visibileditează o urmăreală: creazăeditează o urmăreală: recreazărecord de eroare: deja visibilrecord de eroare: creazărecord de eroare: recreazăfișierdosargmail (%s necitit)fără GTK, activez in mod consolnotificator: ascundenotificator: posiția nu e setatănotificator: posiție setatnotificator: redeschidenotificator: mărime nu e setatănotificator: mărime setatpreferințe: creazăpreferințe: redeschiderecordurile "%s" șterseAdrian Petrescuupdate: %s ștersupdate: %s a fost creatUrmăreala %s a fost modificatăurmăreala "%s" deschisăUrmăreala "%s" pornitUrmăreala "%s" oprităspecto-0.3.1/po/ro/specto.po0000644000175000017500000004402311041474551014316 0ustar jeffjeffmsgid "" msgstr "" "Project-Id-Version: specto\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2007-05-29 18:27-0500\n" "Last-Translator: Jeff Fortin \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Romanian\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "" #: ../data/glade/add_watch.glade.h:2 #, fuzzy msgid "Watch name" msgstr "Nume:" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" #: ../data/glade/add_watch.glade.h:6 #, fuzzy msgid "" "Edit existing\n" "watch" msgstr "Editează o urmăreală:" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 #, fuzzy msgid "Name:" msgstr "Nume" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" #: ../data/glade/add_watch.glade.h:14 #, fuzzy msgid "The watch name is already in use" msgstr "editează o urmăreală: deja visibil" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "" #: ../data/glade/add_watch.glade.h:19 msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" #: ../data/glade/log_dialog.glade.h:7 #, fuzzy msgid "Filter:" msgstr "Fișier" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "" #: ../data/glade/notifier.glade.h:1 #, fuzzy msgid "By Active" msgstr "Activ" #: ../data/glade/notifier.glade.h:2 #, fuzzy msgid "By Name" msgstr "Nume" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "" #: ../data/glade/notifier.glade.h:4 msgid "Display _All Watches" msgstr "" #: ../data/glade/notifier.glade.h:5 msgid "Display _Toolbar" msgstr "" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "" #: ../data/glade/notifier.glade.h:12 #, fuzzy msgid "_File" msgstr "Fișier" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "" #: ../data/glade/preferences.glade.h:2 #, fuzzy msgid "Display" msgstr "Nume:" #: ../data/glade/preferences.glade.h:3 #, fuzzy msgid "Sounds" msgstr "Host:" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "" #: ../data/glade/preferences.glade.h:5 #, fuzzy msgid "A watch is updated" msgstr "Urmăreala \"%s\" updatată!" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "" #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "" #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "" #: ../data/glade/preferences.glade.h:12 #, fuzzy msgid "Preferences" msgstr "Preferințe salvate." #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "" #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "Adrian Petrescu" #: ../spectlib/add_watch.py:165 msgid "file" msgstr "fișier" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "dosar" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "URL:" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Marja de eroare (%)" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protocol:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "Gmail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Utilizator:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Parola:" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Host:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 #, fuzzy msgid "Use SSL:" msgstr "Utilizator:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "Fișier/dosar:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "Fișier" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Dosar" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Alegeți un fișier sau dosar" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 #, fuzzy msgid "Port:" msgstr "Host:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "Editează o urmăreală:" #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "Urmăreala \"%s\" a fost editată." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "recordurile \"%s\" șterse" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Nume de utilizator:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "Pop3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "Imap" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 #, fuzzy msgid "Import watches" msgstr "Noutăți:\n" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 #, fuzzy msgid "Export watches" msgstr "Noutăți:\n" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Activ" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Tip" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "Nume" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "ID" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TIP" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "fără GTK, activez in mod consol" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "Specto e deja lansat!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Nici un update." #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "Urmăreala \"%s\" pornit" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "Urmăreala \"%s\" oprită" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "notificator: redeschide" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "notificator: ascunde" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "preferințe: crează" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "preferințe: redeschide" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "record de eroare: crează" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "record de eroare: deja visibil" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "record de eroare: recrează" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "adaugă o urmăreală: crează" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "adaugă o urmăreală: visibil deja" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "adaugă o urmăreală: recrează" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "editează o urmăreală: crează" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "editează o urmăreală: deja visibil" #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "editează o urmăreală: recrează" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "" #: ../spectlib/main.py:582 msgid "Murder!" msgstr "" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "" #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s necitit)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "urmăreala \"%s\" deschisă" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Puteți adauga multe feluri de website-uri ca urmăreli. Pagini statici, șiruri RSS sau Atom, etc., vor fi manajate de Specto automat." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Urmăreli de website pot avea marje de eroare care vă lasă să setați un procentaj de diferența minimă. Asta vă lasă să adaptați la website-uri care se schimb constant, sau care au multe reclame." #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Clicați odată pe o urmăreală pentru a verifica informația, sau de doua ori pentru a deschide conținutul." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Vă rog să setați o intervală de refresh resonabila, ca să salvăm bandwidth si ca să nu fiim blocați de la content." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "notificator: mărime setat" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "notificator: mărime nu e setată" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "notificator: posiție setat" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "notificator: posiția nu e setată" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Tipul zilei" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Nume:" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Ultima schimbare:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Locație:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Marja de Eroare:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Host:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Nume de Utilizator:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "Fișier/dosar:" #: ../spectlib/notifier.py:852 #, fuzzy msgid "Process:" msgstr "Host:" #: ../spectlib/notifier.py:897 #, fuzzy msgid "Port:" msgstr "Host:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Preferințe salvate." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Nici o noutate." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Noutăți:\n" #: ../spectlib/trayicon.py:79 #, fuzzy msgid "website" msgstr " website" #: ../spectlib/trayicon.py:79 #, fuzzy msgid "websites" msgstr " website-uri" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "" #: ../spectlib/trayicon.py:93 #, fuzzy msgid "file/folder" msgstr " Fișier/Dosare:" #: ../spectlib/trayicon.py:93 #, fuzzy msgid "files/folders" msgstr " Fișiere/Dosare:" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "" #: ../spectlib/trayicon.py:108 msgid "port" msgstr "" #: ../spectlib/trayicon.py:108 msgid "ports" msgstr "" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Ascunde jeamul" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Arată jeamul" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "" #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "Urmăreala \"%s\" updatată!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "Website-ul %s a fost updatat." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "Contul %s are %d mesaje noi." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "Contul %s are %d mesaje noi, cu un total de %s" #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "Aveți mesaje noi pe contul %s." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "Fișierul/Dosar %s a fost updatat." #: ../spectlib/watch.py:125 #, fuzzy msgid "The process, %s, has stopped." msgstr "Website-ul %s a fost updatat." #: ../spectlib/watch.py:127 #, fuzzy msgid "The process, %s, has started." msgstr "Website-ul %s a fost updatat." #: ../spectlib/watch.py:132 #, fuzzy msgid "The connection, %s, was closed." msgstr "Website-ul %s a fost updatat." #: ../spectlib/watch.py:134 #, fuzzy msgid "The connection, %s, was established." msgstr "Website-ul %s a fost updatat." #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Ne-implementat" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Urmăreală de fișier necunoscut." #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "Updatez Urmăreala: \"%s\"" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "Urmăreala \"%s\" are o eroare" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "Urmăreala %s a fost modificată" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "update: %s a fost creat" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "Sar %s" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "update: %s șters" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Urmăreală de poștă necunoscută" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "Urmăreala: \"%s\" are o eroare: utilizator/parola incorectă" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "Urmăreala: \"%s\" are o eroare: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "Cutia de poștă nu există" #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "Urmăreala: \"%s\" are o eroare: " #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 #, fuzzy msgid "Unknown Process Watch" msgstr "Urmăreală de fișier necunoscut." #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "Urmăreala: \"%s\" are o eroare: url gol" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Procentaj de diferență:%s (Urmăreala: \"%s\")" specto-0.3.1/po/fr/0000755000175000017500000000000011226433142012441 5ustar jeffjeffspecto-0.3.1/po/fr/specto.mo0000644000175000017500000004302611217316436014306 0ustar jeffjefft   6PGYHGBW&g $&C SaB M T`%q-  eRbx 0*( :!Gi~2   -<"Nqz  "'*/   DDLPD T `Fn&&)<@~}   );BQYa|  + _ 4@PXsU) .1 `     !8!%".*"/Y","+"&"% #%/#)U##!#######8$9$A$^$g$w$$$$ $$ $$%%%%#&z:& && &&&&&& '' !'/' B'P' `'n'''((&(")[+))W)X)M*h*0*&** *++":+]+s+R,p,,.,, ,,-J-.#.:.-L.8z.....z.d/z/////=/60 R0s00000A0@1 I1j11/111112.2E2N2V2u22222 22 2*23+313439333O3O5b5k5t55 555R5U6X6j6+|6#6\6)7>7 P7V^7/777 7+7.*8AY8859 :9 H9 R9^9o999 999 99::":]:r: :;;(;>;V;\;e;n;s;e;.;-#<"Q<%t<1<!<4<+#="O=r=/T>O>B>:?ER?9?,?*??*@%j@-@@@@@@@QA WA cA AAAAA)AB*1B\B|B!GCiC C C5CDD DDDDDDEE .E9ELEfE$|E E,E:E :5IWd0SL a)$&CqF>|=pjQ-MTbG6;t @OrNZhg\,}/ei+X4m^`!Hc'z8V139Pn#RE2 yx%D"vkfB?u[.ls*Kw_(o~ A]{UJ7Y< files were modified. files were removed. new files were created. or more%d new local revisions have not yet been merged with its parent branch.%d new messages%d new messages from %s... ... totalling %d unread mails.%d new newsitems in %s... ... totalling %s unread items.%d new notifications%d new requests%d new revisions on the remote branch.%d new wall posts%s encountered a problem%s has changed1 file was modified. 1 file was removed. 1 new file was created. %s has changed: Specto is currently busy and cannot quit yet. This may be because it is checking for watch changes. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayGeneral settingsRun a custom command:SecuritySoundsSpecto encountered an error Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.Watch optionsRemove the watch "%s"? This operation cannot be undone.ActiveAdd a WatchAdvanced optionsAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBazaarBy ActiveBy NameBy Watch TypeCannot display notification message. Make sure that libnotify and D-Bus are available on your system.Cannot quit yetChoose an other nameChoose a directoryChoose a fileClosedConsole mode enabled.Could not create a watch, because it is corrupt.Could not establish a connection to serverCould not get cookiesDebug informationDeselect allDifference percentage: %s percentDisplay _All WatchesDisplay _ToolbarDisplay the notification window in the window listEditEdit existing watchEdit watch: EmailEnable debug mode and loggingErrorError logError margin (%)Export watchesExtra informationExtra information could not be setFacebookFileFile size changedFilesize difference: %.2fFilter:FolderFolder (optional)GMailGeneralGeneral optionsGoogle ReaderGroup id of the owner changedHide windowHostIDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.Import watchesInternetIt is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account.Last changedLogsMailMain branchMark as readMurder!NameName:New message from %s... ... totalling %d unread mails.New newsitems in %s... ... totalling %s unread items.No changed watches.No changes yetNo extra information available.No network connection detectedNo parent branch available, you will not be notified of differences and changes.No unread itemsNot runningNotificationsOne new local revision has not yet been merged with its parent branch.One new revision on the remote branch.OpenPOP3PasswordPlay this sound when a problem occurs:Play this sound when a watch has changed:Please enable plugin "%s" if you want to use the watch "%s".Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.PortPreferencesProcessRefreshRefresh AllRefresh Interval:RemoveRemove a watchRunningSave AsSeconds Minutes Hours DaysSelectSelect a FileSelect allShow notifications when a watch has changedShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSocial networksSortingSpecto is already running!Specto's WebsiteStatusStopSystemTYPEThe file was removedThe network connection seems to be down, networked watches will not check until then.The network socket on port %s was closed.The network socket on port %s was established.The system process has started.The system process has stopped.The watch "%s" has a problem.The watch "%s" has changed.The watch "%s" is checking.The watch is not set to a folderThe watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.There was an error checking the watchThere was an error initializing config file %sThere was an error marking the watch as changedThere was an error marking the watch as readThere was an error marking the watch statusThere was an error opening the file %sThere was an error starting the watchThere was an error stopping the watchThere was an error writing to the file %sTime of last access changedTime of last modification changedTip of the Day:TypeURLUnexpected error:UnknownUnread messagesUse GNOME keyring to store passwords in encrypted formatUse SSLUser id of the owner changedUsernameVersion controlVisit the issue trackerWatch $WATCH_NAMEWatch has changed.Watch is idle.Watch openedWatch started checking.Webpage/feedWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.When this watch has changedWhen you open this watchWrong username or passwordWrong username/passwordYou are not subscribed to any feedsYou can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.You received_Edit_Error Log_Export Watches_File_Help_Import Watches_Mark all read_Refresh All_Viewa new messagea new notificationa new requesta new wall postand others...no GTK, activating console modetranslator-creditsProject-Id-Version: Specto POT-Creation-Date: 2009-03-26 12:50+EDT PO-Revision-Date: 2009-06-14 11:32-0500 Last-Translator: Jean-François Fortin Tam Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: French fichiers ont été modifiés. fichiers ont été enlevés. nouveaux fichiers ont été créés. ou plus%d nouvelles révisions locales n'ont pas encore été fusionnées dans la branche parente.%d nouveaux messages%d nouveaux messages de %s... ... pour un total de %d courriels non lus.%d nouvelles brèves dans %s... ... pour un total de %s brèves non lues.%d nouvelles notifications%d nouvelles requêtes%d nouvelles révisions sur la branche distante.%d nouveaux commentaires sur votre mur%s a rencontré un problème%s a changé1 fichier a été modifié. 1 fichier a été enlevé. 1 nouveau fichier a été créé. %s a changé: Specto est actuellement occupé et ne peut pas quitter. Cela peut être parce que des observateurs sont en cours de mise à jour. Si vous insistez, il est cependant possible de faire un arrêt d'urgence.Débuggage et journauxAffichageParamètres générauxExécuter une commande personnalisée :SécuritéSonsSpecto a rencontré une erreur Veuillez vérifier si ce bug a été répertorié dans notre gestionnaire de bugs, et sinon, rédiger un rapport de bug pour que nous puissions le solutionner.Options de l'observateurEnlever l'observateur "%s"? Cette opération est irréversible.ActifAjouter un observateurOptions avancéesTout Debug Info Avertissement Erreur CritiqueToujours afficher l'icône dans la zone de notificationsBazaarActif / inactifPar nomPar type d'observateurImpossible d'afficher le message de notification. Assurez-vous que libnotify et D-Bus sont disponibles sur votre système.Impossible de quitterChoisissez  un autre nomChoisissez un dossierChoisissez un fichierFerméMode console activé.Specto n'a pas pu créer un observateur, car il est corrompu.La connexion vers le serveur n'a pas pu être établieImpossible d'obtenir les cookiesInformation de débuggageDéselectionner toutPourcentage de différence : %sAfficher _tous les observateursAfficher la barre d'_outilsAfficher la fenêtre de notifications dans la liste des fenêtresÉditionModifier un observateur existantModifier l'observateur : CourrielActiver les journaux d'erreurs et le mode debugErreurJournal d'erreursMarge d'erreur (%)Exporter des observateursInfo additionnelleL'info additionnelle n'a pas pu être publiéeFacebookFichierLa taille du fichier a changéDifférence de taille : %.2fFiltre :DossierDossier (facultatif)GMailGénéralParamètres générauxGoogle ReaderLe ID du groupe du propriétaire a changéCacher la fenêtreHôteIDIMAPSi activé, vous recevrez plus d'information lorsque vous exécutez Specto à partir d'un terminal, et plus d'informations seront enregistrées dans les journaux.Importer des observateursInternetIl est fortement recommandé d'utiliser le chiffrement des mots de passe par trousseau de clés. Si vous désactivez cette option, vos mots de passe seront enregistrés en clair, sans chiffrement dans votre liste d'observateurs, et pourraient être lus par n'importe qui ayant accès à votre compte d'usager sur cet ordinateur.Dernier changementJournauxCourrierBranche principaleMarquer comme luAssassiner !NomNom :Nouveau message de %s... ... pour un total de %d courriels non lus.Nouvelles brèves dans %s... ... pour un total de %s brèves non lues.Rien à signaler.Rien à signaler.Pas d'information additionnelle disponible.Pas de connexion réseau détectéeAucune branche parente disponible, vous ne serez pas averti des changements et différences.Aucuns items non lusPas en exécutionNotificationsUne nouvelle révision locale n'a pas encore été fusionnée dans la branche parente.Une nouvelle révision sur la branche distante.OuvertPOP3Mot de passeJouer ce son lorsqu'un problème survient :Jouer ce son lorsqu'un observateur a changé :Veuillez activer le plugin "%s" pour utiliser l'observateur "%s".Choisissez un délai de rafraîchissement raisonnable afin de conserver de la bande passante et éviter d'être bloqué par les distributeurs de contenu.PortPréférencesProcessusRafraîchirTout rafraîchirIntervalle de mise à jour :EnleverEnlever un observateurEn exécutionEnregistrer sousSecondes Minutes Heures JoursSélectionnerSélectionnez un fichierTout sélectionnerAfficher les notifications lorsqu'un observateur a changéAfficher la fenêtreFaites un simple-clic sur un observateur pour afficher des informations ou double-cliquez dessus pour accéder au contenu associé.Sauter %sRéseaux sociauxTriSpecto est déjà en cours d'exécution!Site Internet de SpectoÉtatArrêterSystèmeTYPELe fichier a été enlevéLa connexion réseau semble indisponible. Les observateurs la nécessitant ne seront pas mis à jour.La connexion sur le port %s s'est interrompue.La connexion sur le port %s a été établie.Le processus système a démarré.Le processus système s'est arrêté.L'observateur « %s » a rencontré un problème.L'observateur « %s » a changé.L'observateur « %s » a commencé sa mise à jour.L'observateur ne pointe pas vers un dossierCe nom d'observateur existe déjàLe nom que vous avez spécifié existe déjà ! Désiriez-vous modifier l'observateur déjà existant, ou vouliez-vous vraiment en créer un nouveau? Si vous voulez en créer un nouveau, vous devez choisir un nom différent.Erreur lors de la mise à jour de l'observateurUne erreur est survenue en tentant d'initialiser le fichier de configuration %sUne erreur est survenue en signalant l'observateur comme "changé"Une erreur est survenue en marquant l'observateur comme luUne erreur est survenue lors du changement de statut de l'observateurUne erreur est survenue en tentant d'ouvrir le fichier %sErreur en tentant de démarrer l'observateurErreur en tentant d'arrêter l'observateurUne erreur est survenue en tentant d'écrire dans le fichier %sLe moment de dernier accès a changéLe moment de dernière modification a changéAstuce du jour :TypeURLErreur inattendue :InconnuMessages non lusUtiliser le trousseau de GNOME pour garder les mots de passe sous forme chiffréeActiver SSLLe ID du propriétaire a changéUtilisateurGestion de versionsAller au gestionnaire de bugsObservateur $NOML'observateur a changé.L'observateur a terminé sa mise à jour.Ouverture de l'observateurL'observateur a commencé sa mise à jour.Page web ou flux de syndicationLes observateurs de sites web peuvent utiliser une marge d'erreur en pourcentage. Ceci vous permet d'adapter Specto aux sites Internet qui changent constamment ou qui contiennent beaucoup de publicité.Lorsque cet observateur a changéLorsque j'ouvre cet observateurMauvais utilisateur/mot de passeMauvais utilisateur/mot de passeVous n'êtes pas inscrit à aucun flux de syndicationVous pouvez ajouter toutes sortes d'observateurs. Pages statiques, fils de syndication RSS ou Atom, Specto les prendra en charge automatiquement.Vous avez reçu_Édition_Journal d'erreurs_Exporter les observateurs_Fichier_Aide_Importer les observateursTout _marquer comme luTout _rafraîchir_Affichageun nouveau messageune nouvelle notificationune nouvelle requêteun nouveau commentaire sur votre muret autres...GTK indisponible, activation du mode consoleJean-Francois Fortin Tam specto-0.3.1/po/fr/specto.po0000644000175000017500000007570511217316436014322 0ustar jeffjeffmsgid "" msgstr "" "Project-Id-Version: Specto\n" "POT-Creation-Date: 2009-03-26 12:50+EDT\n" "PO-Revision-Date: 2009-06-14 11:32-0500\n" "Last-Translator: Jean-François Fortin Tam\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "Exécuter une commande personnalisée :" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "Ajouter un observateur" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "Options avancées" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Choisissez \n" "un autre nom" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Modifier un observateur\n" "existant" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "Paramètres généraux" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "Nom :" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "Intervalle de mise à jour :" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Secondes\n" "Minutes\n" "Heures\n" "Jours" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "Ce nom d'observateur existe déjà" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Le nom que vous avez spécifié existe déjà ! Désiriez-vous modifier l'observateur déjà existant, ou vouliez-vous vraiment en créer un nouveau?\n" "\n" "Si vous voulez en créer un nouveau, vous devez choisir un nom différent." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "Lorsque cet observateur a changé" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "Lorsque j'ouvre cet observateur" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "Paramètres généraux" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "Options de l'observateur" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:788 msgid "Error log" msgstr "Journal d'erreurs" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "Observateur $NOM" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Déselectionner tout" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Tout sélectionner" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Tout\n" "Debug\n" "Info\n" "Avertissement\n" "Erreur\n" "Critique" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtre :" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Journaux" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Enregistrer sous" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Actif / inactif" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Par nom" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Par type d'observateur" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Information de débuggage" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "Afficher _tous les observateurs" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "Afficher la barre d'_outils" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "Erreur" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "Info additionnelle" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "Général" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "Marquer comme lu" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "Notifications" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "Tri" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "Aller au gestionnaire de bugs" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "_Édition" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "_Journal d'erreurs" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "_Exporter les observateurs" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "_Fichier" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "_Aide" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "_Importer les observateurs" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "Tout _marquer comme lu" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "Tout _rafraîchir" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "_Affichage" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Débuggage et journaux" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Affichage" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "Sécurité" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "Sons" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "Toujours afficher l'icône dans la zone de notifications" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "Afficher la fenêtre de notifications dans la liste des fenêtres" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "Activer les journaux d'erreurs et le mode debug" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Si activé, vous recevrez plus d'information lorsque vous exécutez Specto à partir d'un terminal, et plus d'informations seront enregistrées dans les journaux." #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "Il est fortement recommandé d'utiliser le chiffrement des mots de passe par trousseau de clés. Si vous désactivez cette option, vos mots de passe seront enregistrés en clair, sans chiffrement dans votre liste d'observateurs, et pourraient être lus par n'importe qui ayant accès à votre compte d'usager sur cet ordinateur." #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "Jouer ce son lorsqu'un problème survient :" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "Jouer ce son lorsqu'un observateur a changé :" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Préférences" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Sélectionnez un fichier" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "Afficher les notifications lorsqu'un observateur a changé" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "Utiliser le trousseau de GNOME pour garder les mots de passe sous forme chiffrée" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "Jean-Francois Fortin Tam " #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Site Internet de Specto" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "Impossible d'afficher le message de notification. Assurez-vous que libnotify et D-Bus sont disponibles sur votre système." #: ../spectlib/console.py:45 #: ../spectlib/watch.py:140 msgid "Watch has changed." msgstr "L'observateur a changé." #: ../spectlib/console.py:50 #: ../spectlib/watch.py:121 msgid "Watch started checking." msgstr "L'observateur a commencé sa mise à jour." #: ../spectlib/console.py:52 msgid "Watch is idle." msgstr "L'observateur a terminé sa mise à jour." #: ../spectlib/console.py:54 #: ../spectlib/watch.py:174 msgid "No network connection detected" msgstr "Pas de connexion réseau détectée" #: ../spectlib/console.py:56 #: ../spectlib/watch.py:136 #: ../spectlib/watch.py:170 msgid "There was an error checking the watch" msgstr "Erreur lors de la mise à jour de l'observateur" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "Modifier l'observateur : " #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "Enlever un observateur" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "Enlever l'observateur \"%s\"?\n" "Cette opération est irréversible." #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "Exporter des observateurs" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 msgid "Select" msgstr "Sélectionner" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "Type" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "Nom" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "TYPE" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "Choisissez un fichier" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "Choisissez un dossier" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" "Specto a rencontré une erreur\n" "Veuillez vérifier si ce bug a été répertorié dans notre gestionnaire de bugs, et sinon, rédiger un rapport de bug pour que nous puissions le solutionner." #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "Importer des observateurs" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "GTK indisponible, activation du mode console" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "Mode console activé." #: ../spectlib/main.py:130 msgid "Could not create a watch, because it is corrupt." msgstr "Specto n'a pas pu créer un observateur, car il est corrompu." #: ../spectlib/main.py:204 #: ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "Specto est déjà en cours d'exécution!" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "Impossible de quitter" #: ../spectlib/main.py:258 msgid "Murder!" msgstr "Assassiner !" #: ../spectlib/main.py:269 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto est actuellement occupé et ne peut pas quitter.\n" "\n" "Cela peut être parce que des observateurs sont en cours de mise à jour.\n" "Si vous insistez, il est cependant possible de faire un arrêt d'urgence." #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "Arrêter" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "Tout rafraîchir" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "L'observateur « %s » a commencé sa mise à jour." #: ../spectlib/notifier.py:218 #: ../spectlib/notifier.py:347 msgid "The network connection seems to be down, networked watches will not check until then." msgstr "La connexion réseau semble indisponible. Les observateurs la nécessitant ne seront pas mis à jour." #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "L'observateur « %s » a rencontré un problème." #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "%s a rencontré un problème" #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "L'observateur « %s » a changé." #: ../spectlib/notifier.py:245 msgid "%s has changed" msgstr "%s a changé" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "Une erreur est survenue lors du changement de statut de l'observateur" #: ../spectlib/notifier.py:392 #: ../spectlib/watch.py:230 msgid "No extra information available." msgstr "Pas d'information additionnelle disponible." #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "L'info additionnelle n'a pas pu être publiée" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "Ouverture de l'observateur" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "Rafraîchir" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "Édition" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "Enlever" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Vous pouvez ajouter toutes sortes d'observateurs. Pages statiques, fils de syndication RSS ou Atom, Specto les prendra en charge automatiquement." #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Les observateurs de sites web peuvent utiliser une marge d'erreur en pourcentage. Ceci vous permet d'adapter Specto aux sites Internet qui changent constamment ou qui contiennent beaucoup de publicité." #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Faites un simple-clic sur un observateur pour afficher des informations ou double-cliquez dessus pour accéder au contenu associé." #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Choisissez un délai de rafraîchissement raisonnable afin de conserver de la bande passante et éviter d'être bloqué par les distributeurs de contenu." #: ../spectlib/notifier.py:693 msgid "Active" msgstr "Actif" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "Astuce du jour :" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "GMail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "Courrier" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "Utilisateur" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "Mot de passe" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 #: ../spectlib/watch.py:241 #: ../spectlib/watch.py:250 msgid "Unexpected error:" msgstr "Erreur inattendue :" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "Dernier changement" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "Messages non lus" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "Nouveau message de %s...\n" "\n" "... pour un total de %d courriels non lus." #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "%d nouveaux messages de %s...\n" "\n" "... pour un total de %d courriels non lus." #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "et autres..." #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:288 msgid "There was an error opening the file %s" msgstr "Une erreur est survenue en tentant d'ouvrir le fichier %s" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "Hôte" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "Activer SSL" #: ../spectlib/plugins/watch_mail_imap.py:43 msgid "Folder (optional)" msgstr "Dossier (facultatif)" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:447 #: ../spectlib/watch.py:541 #: ../spectlib/watch.py:569 #: ../spectlib/watch.py:593 #: ../spectlib/watch.py:619 #: ../spectlib/watch.py:633 msgid "There was an error writing to the file %s" msgstr "Une erreur est survenue en tentant d'écrire dans le fichier %s" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "Réseaux sociaux" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Courriel" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "Mauvais utilisateur/mot de passe" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "Vous avez reçu" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "un nouveau message" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d nouveaux messages" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "une nouvelle notification" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "%d nouvelles notifications" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "une nouvelle requête" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "%d nouvelles requêtes" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "un nouveau commentaire sur votre mur" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "%d nouveaux commentaires sur votre mur" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "Fichier" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "Système" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "Le fichier a été enlevé" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "Le ID du propriétaire a changé" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "Le ID du groupe du propriétaire a changé" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "La taille du fichier a changé" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "Le moment de dernier accès a changé" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "Le moment de dernière modification a changé" #: ../spectlib/plugins/watch_system_file.py:157 msgid "%s has changed:\n" msgstr "%s a changé:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "Dossier" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "L'observateur ne pointe pas vers un dossier" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "Sauter %s" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "1 new file was created.\n" msgstr "1 nouveau fichier a été créé.\n" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr " nouveaux fichiers ont été créés.\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "1 fichier a été enlevé.\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr " fichiers ont été enlevés.\n" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "1 file was modified.\n" msgstr "1 fichier a été modifié.\n" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr " fichiers ont été modifiés.\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "Port" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "Fermé" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "Ouvert" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "Inconnu" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "État" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The network socket on port %s was established." msgstr "La connexion sur le port %s a été établie." #: ../spectlib/plugins/watch_system_port.py:116 msgid "The network socket on port %s was closed." msgstr "La connexion sur le port %s s'est interrompue." #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "Processus" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "Pas en exécution" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "En exécution" #: ../spectlib/plugins/watch_system_process.py:98 msgid "The system process has started." msgstr "Le processus système a démarré." #: ../spectlib/plugins/watch_system_process.py:100 msgid "The system process has stopped." msgstr "Le processus système s'est arrêté." #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "Bazaar" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "Gestion de versions" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "Aucune branche parente disponible, vous ne serez pas averti des changements et différences." #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "Une nouvelle révision locale n'a pas encore été fusionnée dans la branche parente." #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "%d nouvelles révisions locales n'ont pas encore été fusionnées dans la branche parente." #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "Une nouvelle révision sur la branche distante." #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "%d nouvelles révisions sur la branche distante." #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "Branche principale" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google Reader" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "Internet" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr " ou plus" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "Nouvelles brèves dans %s...\n" "\n" "... pour un total de %s brèves non lues." #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "%d nouvelles brèves dans %s...\n" "\n" "... pour un total de %s brèves non lues." #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "Mauvais utilisateur/mot de passe" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "La connexion vers le serveur n'a pas pu être établie" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "Impossible d'obtenir les cookies" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "Vous n'êtes pas inscrit à aucun flux de syndication" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "Aucuns items non lus" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "Page web ou flux de syndication" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "Différence de taille : %.2f" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "Pourcentage de différence : %s" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "Marge d'erreur (%)" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "Rien à signaler." #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "Cacher la fenêtre" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "Afficher la fenêtre" #: ../spectlib/watch.py:88 msgid "There was an error starting the watch" msgstr "Erreur en tentant de démarrer l'observateur" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "Erreur en tentant d'arrêter l'observateur" #: ../spectlib/watch.py:108 msgid "There was an error marking the watch as read" msgstr "Une erreur est survenue en marquant l'observateur comme lu" #: ../spectlib/watch.py:151 msgid "There was an error marking the watch as changed" msgstr "Une erreur est survenue en signalant l'observateur comme \"changé\"" #: ../spectlib/watch.py:216 #: ../spectlib/watch.py:217 msgid "No changes yet" msgstr "Rien à signaler." #: ../spectlib/watch.py:301 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "Veuillez activer le plugin \"%s\" pour utiliser l'observateur \"%s\"." #: ../spectlib/watch.py:455 #: ../spectlib/watch.py:468 #: ../spectlib/watch.py:488 #: ../spectlib/watch.py:514 #: ../spectlib/watch.py:530 #: ../spectlib/watch.py:554 #: ../spectlib/watch.py:609 msgid "There was an error initializing config file %s" msgstr "Une erreur est survenue en tentant d'initialiser le fichier de configuration %s" specto-0.3.1/po/sv/0000755000175000017500000000000011226433142012462 5ustar jeffjeffspecto-0.3.1/po/sv/specto.mo0000644000175000017500000003222011041474551014317 0ustar jeffjeff\ ()(< Tav    %-@ nx  &2&Yp     ( <J O~Y5 %8 AK]e   _ 4&9+`-L$$, QrI>)/8 >7H  .0+_Dz6K, ;F LWgms);O T `nu   4GLRf| &9AJ !!!!" !"/" I" W" d"q" """"""") #%5# [# g#r#####(#$$+)$U$o$$($$$$$ $%%%%)%0%3%8%%%%%%& &(&:&X&r& && &&E8'~''''' '' '' ( ( (t-(( (((#(%(')OE)")#)))R*&+ .+;+?+D+X+o+++ + ++A+&,D,_,x,#,!,#,*,B-0_--i./?0?T0)0 0 0000011"1B1 ^1 11111122 2,212 K2 W2 d22$222#2383=3D3Z3u3 }3%3(333 4&4B4^4 z4 4][ e4NpVs=@P-UY#Lg~u ZdnIr^B&5jSo m$E\7;fHwt)a3F?_xv'OK}(9%>cX6bzT: {2k.RW /h*qi,CA`yQDG J"<l+08!|M1Specto is currently busy and cannot quit yet. This may be because it is checking for watch updates. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayError Margin:File/folder:General settingsHost:Last Updated:Location:Name:Port:Process:SoundsUsername:Watch nameA problem occuredA watch is updatedActiveAdd a WatchAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot quit yetChoose an other nameChoose a file or folderDeselect allDifference percentage:%s (Watch: "%s")Display _All WatchesDisplay _ToolbarDisplay the notification window in the window listDuration (in seconds):Edit existing watchEdit watch: Enable debug mode and loggingError LogError Margin (%):Export watchesFileFile/folder:Filter:FolderGmailHide windowHost:IDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.ImapImport watchesLogsMailbox does not existMurder!NameName:No network connection detectedNo updated watches.No updates yet.Not implemented yetNotificationsPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop toasts from the tray icon when a watch is updatedPop3Port:PreferencesPreferences saved.Process:Protocol:Refresh Interval:Save AsSeconds Minutes Hours DaysSelect a FileSelect allShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!TYPEThe connection, %s, was closed.The connection, %s, was established.The file/folder, %s, has been updated.The network connection seems to be down, watches will not update until then.The process, %s, has started.The process, %s, has stopped.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.The watch, %s, has a problem. You may need to check the error log.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchUpdated watches: Updating watch: "%s"Use SSL:User:Username:Watch "%s" is already marked as updated in the notifierWatch "%s" updated!Watch : "%s" edited.Watch SettingsWatch Type:Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite Email Files or folders Process PortWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail._Clear All_Edit_Error Log_Export Watches_File_Help_Import Watches_Viewadd watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefile/folderfiles/foldersfoldergmail (%s unread)mail accountmail accountsno GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setportportspreferences: createpreferences: reappearprocessprocessesremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedwebsitewebsitesProject-Id-Version: specto Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: Thu May 10 15:33:12 2007 PO-Revision-Date: 2007-05-29 18:17-0500 Last-Translator: Jeff Fortin Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rosetta-Export-Date: 2007-05-29 19:38:10+0000 Specto är för närvarande upptagen och kan inte avslutas än. Det här kan bero på att den kontrollerar bevakningar. Dock kan du prova att tvinga igenom en avslutning genom att klicka på mordknappen.Felsökning och loggningVisningFelmarginal:Fil/mapp:Allmänna inställningarVärd:Senast uppdaterad:Plats:Namn:Port:Process:LjudAnvändarnamn:BevakningsnamnEtt problem inträffadeEn bevakning är uppdateradAktivLägg till en bevakningAlla Felsökning Info Varning Fel KritiskVisa alltid ikonen i notifieringsytanEfter aktivEfter namnEfter bevakningstypKan inte avsluta änVälj ett annat namnVälj en fil eller mappAvmarkera alltSkillnad i procent: %s (Bevakning: "%s")Visa _alla bevakningarVisa _verktygsradVisa notifieringsfönstret i fönsterlistanVaraktighet (i sekunder):Redigera befintlig bevakningRedigera bevakning: Aktivera felsökningsläget och loggningFelloggFelmarginal (%):Exportera bevakningarFilFil/mapp:Filter:MappGmailDölj fönsterVärd:IdIMAPOm aktiverat, kommer du att ta emot mer information när Specto kör från en terminal, och mer information kommer att skrivas till loggarna.ImapImportera bevakningarLoggarPostlådan finns inteMörda!NamnNamn:Ingen nätverksanslutning har upptäcktsInga uppdaterade bevakningar.Inga uppdateringar ännu.Ännu inte implementeradNotifieringarPOP3Lösenord:Ställ in ett rimligt uppdateringsintervall för att spara bandbredd och förhindra dig från att bli blockerad från innehållsleverantörer.Visa meddelanden från aktivitetsfältet när en bevakning uppdaterasPop3Port:InställningarInställningarna sparades.Process:Protokoll:Uppdateringsintervall:Spara somSekunder Minuter Timmar DygnVälj en filMarkera alltVisa fönsterEnkelklicka på befintlig bevakning för att visa information, och dubbelklicka på den för att öppna innehållet.Hoppar över %sSorteringSpecto kör redan!TYPAnslutningen, %s, stängdes.Anslutningen, %s, etablerades.Filen/mappen %s har uppdaterats.Nätverksanslutningen verkar vara nere, bevakningar kommer inte att uppdateras.Processen, %s, har startat.Processen, %s, har stoppats.Bevakningsnamnet används redanBevakningsnamnet du angav finns redan! Menade du att ändra den befintliga bevakningen eller ville du skapa en ny? Om du vill skapa en ny bevakning behöver du välja ett annat namn.Bevakningen, %s, har ett problem. Du kanske behöver kontrollera felloggen.Webbplatsen %s har uppdaterats.Dagens tips:Typurl:Okänd filbevakningOkänd e-postbevakningOkänd processbevakningUppdaterade bevakningar: Uppdaterar bevakning: "%s"Använd SSL:Användare:Användarnamn:Bevakningen "%s" är redan markerad som uppdaterad i notifierarenBevakning av "%s" uppdaterad!Bevakning: "%s" redigerad.BevakningsinställningarBevakningstyp:Bevakning: "%s" innehåller ett felBevakning: "%s" innehåller fel: Bevakning: "%s" innehåller fel: %sBevakning: "%s" innehåller fel: blank urlBevakning: "%s" innehåller fel: felaktigt användarnamn/lösenordWebbplats E-post Filer eller mappar Process PortBevakningar av webbplatser kan använda en felmarginal som låter dig ställa in en minimum procentandel som får skilja sig. Detta låter dig att anpassa webbplatser som ändras ofta eller innehåller mycket reklam.När Specto kör i felsökningsläge kommer mer information att tillhandahållas för att hjälpa dig att felsöka problem. Loggning kommer att spara all denna information till en loggfil. Du kan använda den här funktionen för att hjälpa utvecklarna att förbättra Specto.Du kan lägga till alla typer av webbplatser för bevakning. Statiska sidor, RSS- eller Atom-kanaler etc. Specto kommer automatiskt att hantera dem.Ditt e-postkonto %s har %d nytt e-postmeddelande.Ditt e-postkonto %s har %d nya e-postmeddelanden.Ditt e-postkonto %s har ny e-post._Töm alltR_edigeraFel_logg_Exportera bevakningar_Arkiv_Hjälp_Importera bevakningar_Visalägg till bevakning: redan synliglägg till bevakning: skapalägg till bevakning: återskaparedigera bevakning: redan synligredigera bevakning: skaparedigera bevakning: återskapafellogg: redan synligfellogg: skapafellogg: återskapafilfil/mappfiler/mapparmappgmail (%s olästa)e-postkontoe-postkontoninget GTK, aktiverar konsollägenotifierare: döljnotifierare: position inte inställdnotifierare: position inställdnotifierare: visas igennotifierare: storlek inte inställdnotifierare: storlek inställdportportarinställningar: skapainställningar: visas igenprocessprocessertog bort loggar från bevakning: "%s"Daniel Nylander Umutuppdatering: %s togs bortuppdatering: %s skapadesuppdatering: %s har ändratsbevakning av "%s" öppnadesbevakning av "%s" startadesbevakning av "%s" stoppadeswebbplatswebbplatserspecto-0.3.1/po/sv/specto.po0000644000175000017500000005025711041474551014334 0ustar jeffjeff# Swedish translation for specto # Copyright (c) 2006 Free Software Foundation, Inc. # This file is distributed under the same license as the specto package. # Daniel Nylander , 2006. # msgid "" msgstr "" "Project-Id-Version: specto\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: Thu May 10 15:33:12 2007\n" "PO-Revision-Date: 2007-05-29 18:17-0500\n" "Last-Translator: Jeff Fortin \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Rosetta-Export-Date: 2007-05-29 19:38:10+0000\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "Allmänna inställningar" #: ../data/glade/add_watch.glade.h:2 msgid "Watch name" msgstr "Bevakningsnamn" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "Lägg till en bevakning" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Välj ett\n" "annat namn" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Redigera befintlig\n" "bevakning" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 msgid "Name:" msgstr "Namn:" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "Uppdateringsintervall:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Sekunder\n" "Minuter\n" "Timmar\n" "Dygn" #: ../data/glade/add_watch.glade.h:14 msgid "The watch name is already in use" msgstr "Bevakningsnamnet används redan" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Bevakningsnamnet du angav finns redan! Menade du att ändra den befintliga bevakningen eller ville du skapa en ny?\n" "\n" "Om du vill skapa en ny bevakning behöver du välja ett annat namn." #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "Bevakningstyp:" #: ../data/glade/add_watch.glade.h:19 msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" "Webbplats\n" "E-post\n" "Filer eller mappar\n" "Process\n" "Port" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "Fellogg" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Spara som" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "Bevakningsinställningar" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Avmarkera allt" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Markera allt" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Alla\n" "Felsökning\n" "Info\n" "Varning\n" "Fel\n" "Kritisk" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filter:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Loggar" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Efter aktiv" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Efter namn" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Efter bevakningstyp" #: ../data/glade/notifier.glade.h:4 msgid "Display _All Watches" msgstr "Visa _alla bevakningar" #: ../data/glade/notifier.glade.h:5 msgid "Display _Toolbar" msgstr "Visa _verktygsrad" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "Notifieringar" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "Sortering" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "_Töm allt" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "R_edigera" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "Fel_logg" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "_Exportera bevakningar" #: ../data/glade/notifier.glade.h:12 msgid "_File" msgstr "_Arkiv" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "_Hjälp" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "_Importera bevakningar" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "_Visa" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Felsökning och loggning" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Visning" #: ../data/glade/preferences.glade.h:3 msgid "Sounds" msgstr "Ljud" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "Ett problem inträffade" #: ../data/glade/preferences.glade.h:5 msgid "A watch is updated" msgstr "En bevakning är uppdaterad" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "Visa alltid ikonen i notifieringsytan" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "Visa notifieringsfönstret i fönsterlistan" #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "Varaktighet (i sekunder):" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "Aktivera felsökningsläget och loggning" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Om aktiverat, kommer du att ta emot mer information när Specto kör från en terminal, och mer information kommer att skrivas till loggarna." #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "Visa meddelanden från aktivitetsfältet när en bevakning uppdateras" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Inställningar" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Välj en fil" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "När Specto kör i felsökningsläge kommer mer information att tillhandahållas för att hjälpa dig att felsöka problem. Loggning kommer att spara all denna information till en loggfil. Du kan använda den här funktionen för att hjälpa utvecklarna att förbättra Specto." #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "" "Daniel Nylander \n" "Umut" #: ../spectlib/add_watch.py:165 msgid "file" msgstr "fil" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "mapp" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "url:" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Felmarginal (%):" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protokoll:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "Gmail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Användare:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Lösenord:" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Värd:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 msgid "Use SSL:" msgstr "Använd SSL:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "Fil/mapp:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "Fil" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Mapp" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Välj en fil eller mapp" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "Process:" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 msgid "Port:" msgstr "Port:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "Redigera bevakning: " #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "Bevakning: \"%s\" redigerad." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "tog bort loggar från bevakning: \"%s\"" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Användarnamn:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "Pop3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "Imap" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 msgid "Import watches" msgstr "Importera bevakningar" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 msgid "Export watches" msgstr "Exportera bevakningar" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Aktiv" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Typ" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "Namn" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "Id" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TYP" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "inget GTK, aktiverar konsolläge" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "Specto kör redan!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Inga uppdateringar ännu." #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "bevakning av \"%s\" startades" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "bevakning av \"%s\" stoppades" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "notifierare: visas igen" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "notifierare: dölj" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "inställningar: skapa" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "inställningar: visas igen" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "fellogg: skapa" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "fellogg: redan synlig" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "fellogg: återskapa" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "lägg till bevakning: skapa" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "lägg till bevakning: redan synlig" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "lägg till bevakning: återskapa" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "redigera bevakning: skapa" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "redigera bevakning: redan synlig" #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "redigera bevakning: återskapa" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "Kan inte avsluta än" #: ../spectlib/main.py:582 msgid "Murder!" msgstr "Mörda!" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto är för närvarande upptagen och kan inte avslutas än.\n" "\n" "Det här kan bero på att den kontrollerar bevakningar.\n" "Dock kan du prova att tvinga igenom en avslutning genom att klicka på mordknappen." #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "Nätverksanslutningen verkar vara nere, bevakningar kommer inte att uppdateras." #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s olästa)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "bevakning av \"%s\" öppnades" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Du kan lägga till alla typer av webbplatser för bevakning. Statiska sidor, RSS- eller Atom-kanaler etc. Specto kommer automatiskt att hantera dem." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Bevakningar av webbplatser kan använda en felmarginal som låter dig ställa in en minimum procentandel som får skilja sig. Detta låter dig att anpassa webbplatser som ändras ofta eller innehåller mycket reklam." #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Enkelklicka på befintlig bevakning för att visa information, och dubbelklicka på den för att öppna innehållet." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Ställ in ett rimligt uppdateringsintervall för att spara bandbredd och förhindra dig från att bli blockerad från innehållsleverantörer." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "notifierare: storlek inställd" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "notifierare: storlek inte inställd" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "notifierare: position inställd" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "notifierare: position inte inställd" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Dagens tips:" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Namn:" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Senast uppdaterad:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Plats:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Felmarginal:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Värd:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Användarnamn:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "Fil/mapp:" #: ../spectlib/notifier.py:852 msgid "Process:" msgstr "Process:" #: ../spectlib/notifier.py:897 msgid "Port:" msgstr "Port:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Inställningarna sparades." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Inga uppdaterade bevakningar." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Uppdaterade bevakningar:\n" #: ../spectlib/trayicon.py:79 msgid "website" msgstr "webbplats" #: ../spectlib/trayicon.py:79 msgid "websites" msgstr "webbplatser" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "e-postkonto" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "e-postkonton" #: ../spectlib/trayicon.py:93 msgid "file/folder" msgstr "fil/mapp" #: ../spectlib/trayicon.py:93 msgid "files/folders" msgstr "filer/mappar" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "process" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "processer" #: ../spectlib/trayicon.py:108 msgid "port" msgstr "port" #: ../spectlib/trayicon.py:108 msgid "ports" msgstr "portar" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Dölj fönster" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Visa fönster" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "Bevakningen, %s, har ett problem. Du kanske behöver kontrollera felloggen." #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "Bevakningen \"%s\" är redan markerad som uppdaterad i notifieraren" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "Bevakning av \"%s\" uppdaterad!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "Webbplatsen %s har uppdaterats." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "Ditt e-postkonto %s har %d nytt e-postmeddelande." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "Ditt e-postkonto %s har %d nya e-postmeddelanden." #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "Ditt e-postkonto %s har ny e-post." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "Filen/mappen %s har uppdaterats." #: ../spectlib/watch.py:125 msgid "The process, %s, has stopped." msgstr "Processen, %s, har stoppats." #: ../spectlib/watch.py:127 msgid "The process, %s, has started." msgstr "Processen, %s, har startat." #: ../spectlib/watch.py:132 msgid "The connection, %s, was closed." msgstr "Anslutningen, %s, stängdes." #: ../spectlib/watch.py:134 msgid "The connection, %s, was established." msgstr "Anslutningen, %s, etablerades." #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Ännu inte implementerad" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Okänd filbevakning" #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "Uppdaterar bevakning: \"%s\"" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "Bevakning: \"%s\" innehåller ett fel" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "uppdatering: %s har ändrats" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "uppdatering: %s skapades" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "Hoppar över %s" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "uppdatering: %s togs bort" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Okänd e-postbevakning" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "Ingen nätverksanslutning har upptäckts" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "Bevakning: \"%s\" innehåller fel: felaktigt användarnamn/lösenord" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "Bevakning: \"%s\" innehåller fel: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "Postlådan finns inte" #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "Bevakning: \"%s\" innehåller fel: " #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 msgid "Unknown Process Watch" msgstr "Okänd processbevakning" #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "Bevakning: \"%s\" innehåller fel: blank url" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Skillnad i procent: %s (Bevakning: \"%s\")" specto-0.3.1/po/ru/0000755000175000017500000000000011226433142012460 5ustar jeffjeffspecto-0.3.1/po/ru/specto.mo0000644000175000017500000005266211165202436014327 0ustar jeffjefft   6PGYHGBW&g $&C SaB M T`%q-  eRbx 0*( :!Gi~2   -<"Nqz  "'*/   DDLPD T `Fn&&)<@~}   );BQYa|  + _ 4@PXsU) .1 `     !8!%".*"/Y","+"&"% #%/#)U##!#######8$9$A$^$g$w$$$$ $$ $$%%%%#&z:& && &&&&&& '' !'/' B'P' `'n''R'((&)1D)v)) *s)*~*$+A+>`+,+-+/+"*, M,+n,,^,5.N.*l.J../"/.70df00%0/1k01W1112"#2F2!2%3-3M3 g37t3h3R4-h4)4$4:4- 57N5M55>5'$6L6LR6 6661617aH777*707 8&8+58a8g8#x8 8.888889/9:):%; ; ;;,<2<D<K<pS<t<59="o=G=)=>4>>>>D? ?? ?\?^O@@0A)B2BEBTBeB&}BB#BBB+C,C;CUCmkCCCDDEE4EDEWE`EoEtEE3%F3YF8F>FAG/GG1wGHG;GV.HLIhIn;JlJ\KEtKJKNLATLCL@LM.M5M$9M^M-sMyMN-8NfNNN N*N,O#|=pjQ-MTbG6;t @OrNZhg\,}/ei+X4m^`!Hc'z8V139Pn#RE2 yx%D"vkfB?u[.ls*Kw_(o~ A]{UJ7Y< files were modified. files were removed. new files were created. or more%d new local revisions have not yet been merged with its parent branch.%d new messages%d new messages from %s... ... totalling %d unread mails.%d new newsitems in %s... ... totalling %s unread items.%d new notifications%d new requests%d new revisions on the remote branch.%d new wall posts%s encountered a problem%s has changed1 file was modified. 1 file was removed. 1 new file was created. %s has changed: Specto is currently busy and cannot quit yet. This may be because it is checking for watch changes. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayGeneral settingsRun a custom command:SecuritySoundsSpecto encountered an error Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it.Watch optionsRemove the watch "%s"? This operation cannot be undone.ActiveAdd a WatchAdvanced optionsAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBazaarBy ActiveBy NameBy Watch TypeCannot display notification message. Make sure that libnotify and D-Bus are available on your system.Cannot quit yetChoose an other nameChoose a directoryChoose a fileClosedConsole mode enabled.Could not create a watch, because it is corrupt.Could not establish a connection to serverCould not get cookiesDebug informationDeselect allDifference percentage: %s percentDisplay _All WatchesDisplay _ToolbarDisplay the notification window in the window listEditEdit existing watchEdit watch: EmailEnable debug mode and loggingErrorError logError margin (%)Export watchesExtra informationExtra information could not be setFacebookFileFile size changedFilesize difference: %.2fFilter:FolderFolder (optional)GMailGeneralGeneral optionsGoogle ReaderGroup id of the owner changedHide windowHostIDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.Import watchesInternetIt is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account.Last changedLogsMailMain branchMark as readMurder!NameName:New message from %s... ... totalling %d unread mails.New newsitems in %s... ... totalling %s unread items.No changed watches.No changes yetNo extra information available.No network connection detectedNo parent branch available, you will not be notified of differences and changes.No unread itemsNot runningNotificationsOne new local revision has not yet been merged with its parent branch.One new revision on the remote branch.OpenPOP3PasswordPlay this sound when a problem occurs:Play this sound when a watch has changed:Please enable plugin "%s" if you want to use the watch "%s".Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.PortPreferencesProcessRefreshRefresh AllRefresh Interval:RemoveRemove a watchRunningSave AsSeconds Minutes Hours DaysSelectSelect a FileSelect allShow notifications when a watch has changedShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSocial networksSortingSpecto is already running!Specto's WebsiteStatusStopSystemTYPEThe file was removedThe network connection seems to be down, networked watches will not check until then.The network socket on port %s was closed.The network socket on port %s was established.The system process has started.The system process has stopped.The watch "%s" has a problem.The watch "%s" has changed.The watch "%s" is checking.The watch is not set to a folderThe watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.There was an error checking the watchThere was an error initializing config file %sThere was an error marking the watch as changedThere was an error marking the watch as readThere was an error marking the watch statusThere was an error opening the file %sThere was an error starting the watchThere was an error stopping the watchThere was an error writing to the file %sTime of last access changedTime of last modification changedTip of the Day:TypeURLUnexpected error:UnknownUnread messagesUse GNOME keyring to store passwords in encrypted formatUse SSLUser id of the owner changedUsernameVersion controlVisit the issue trackerWatch $WATCH_NAMEWatch has changed.Watch is idle.Watch openedWatch started checking.Webpage/feedWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.When this watch has changedWhen you open this watchWrong username or passwordWrong username/passwordYou are not subscribed to any feedsYou can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.You received_Edit_Error Log_Export Watches_File_Help_Import Watches_Mark all read_Refresh All_Viewa new messagea new notificationa new requesta new wall postand others...no GTK, activating console modetranslator-creditsProject-Id-Version: specto POT-Creation-Date: 2009-03-26 12:50+EDT PO-Revision-Date: 2009-04-02 14:34-0500 Last-Translator: Jean-François Fortin Tam Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.5 X-Generator: KBabel 1.11.4 файлов было изменено. файлов было удалено. новых файлов было создано. или более%d новых локальных ревизий не были слиты со своей родительской веткой.%d новых сообщений%d новых сообщений от %s... ... всего %d непрочитанных писем.%s имеется новости в %s... ... всего %s непрочитанных новостей.%d новых уведомлений%d новых запросов%d новых ревизий в удаленной ветке.%d новых записей на Стене%s столкнулся с проблемойДополнительные параметры1 файл был изменен. 1 файл был удален. 1 новый файл был создан. %s изменился: В данный момент Specto занят и пока не может выйти. Возможно это связано с тем, что он проверяет изменения наблюдений. Тем не менее, Вы можете принудительно выйти, нажав кнопку Убийство.Отладка и журналированиеОтображениеОсновные установкиВыполнить пользовательскую команду:БезопасностьЗвукиSpecto столкнулся с ошибкой Пожалуйста проверьте, указана ли данная ошибка в нашем issue tracker, и если нет, то пошлите отчет об ошибке, чтобы мы могли исправить ее.Настройки наблюденияУдалить наблюдение "%s"? Это необратимая операция.АктивноДобавить НаблюдениеДополнительные параметрыВсе Отладка Информация Предупреждение Ошибка КритическаяВсегда показывать иконку в области уведомленияBazaarПо АктивномуПо ИмениПо Типу НаблюденияНевозможно вывести уведомление. Убедитесь, что libnotify и D-Bus установлены в Вашей системе.Пока не могу выйтиВыберите другое имяВыберите каталогВыберите файлЗакрытАктивирован консольный режим.Невозможно создать наблюдение потому, что оно испорчено.Невозможно установить соединение с серверомНевозможно получить cookiesОтладочная информацияОтменить выбор всехПроцентная разница: %s процентовПоказать _Все НаблюденияПоказать _Панель инструментовПоказывать окно уведомления в списке оконИзменитьИзменить существующее наблюдениеИзменить наблюдение: EmailРазрешить режим отладки и журналированияОшибкаЖурнал ошибокПредел ошибки (%)Экспортировать наблюденияДополнительная информацияДополнительная информация не может быть установленаFacebookФайлРазмер файла изменилсяРазница в размере файла:%.2fФильтр:КаталогКаталог (необязательно)GMailОсновныеОсновные настройкиGoogle ReaderGroup id владельца изменилсяСкрыть окноУзелIDIMAPАктивировав, Вы будете получать больше информации при запуске Specto из терминала и больше информации будет печататься в журнал.Импортировать наблюденияИнтернетРекомендуется использовать шифрование паролей. Если Вы отключите эту опцию, пароли будут сохранены в виде обычного текста в списке Наблюдений, и могут быть прочитаны имеющими доступ к Вашей учетной записи.Последние измененияЗаписиПочтаОсновная веткаОтметить как прочтенноеУбийство!ИмяИмя:Новое сообщение от %s... ... всего %d непрочитанных писем.Пояились новости %s... ... всего %s непрочитанных новостей.Нет изменившихся наблюдений.Пока без измененийДополнительная информация недоступна.Нет соединения с сетьюРодительская ветвь недоступна, Вы не будете уведомлены о различиях и изменениях.Нет непрочитанных элементовНе запущенУведомленияОдна новая локальная ревизия пока ещё не была слита cо своей родительской веткой.Одна новая ревизия в удаленной ветке.ОткрытPOP3ПарольПроигрывать этот звук при возникновении проблемы:Проигрывать этот звук когда наблюдение изменилось:Пожалуйста включите плагин "%s" если хотите использовать наблюдение "%s".Чтобы сохранить пропускную способность канала и не быть блокированным на сайтах, пожалуйста, указывайте приемлемый интервал проверки.ПортПараметрыПроцессОбновитьОбновить ВсеИнтервал обновления:УдалитьУдалить наблюдениеЗапущенСохранить какСекунд Минут Часов ДнейВыбратьВыберите файлВыбрать всеПоказывать уведомления при изменении состояния наблюденияПоказать окноДля получения информации щелкните один раз на существующем наблюдении, щелкните дважды, чтобы открыть его содержимое.Пропускаю %sСоциальные сетиСортировкаSpecto уже запущен!Сайт SpectoСостояниеСтопСистемаTYPEФайл был удаленПохоже сетевое соединение отсутствует, проверка сетевых наблюдений недоступна.Сокет на порте %s, был закрыт.Сокет на порте %s, был открыт.Системный процесс был запущен.Системный процесс был остановлен.С наблюдением "%s" возникли проблемы.Наблюдение "%s" изменилось.Наблюдение "%s" проверяется.За каталогом не установлено наблюдениеИмя наблюдения уже используетсяУказанное для наблюдения имя уже существует! Вы действительно хотите его изменить или Вы действительно хотите создать новое? Если Вы хотите создать новое наблюдение, укажите другое имя.При проверке наблюдения произошла ошибкаПроизошла ошибка при инициализации файла конфигурации %sПри пометке наблюдения, как изменившегося, произошла ошибкаПри пометке наблюдения, как прочитанного, произошла ошибкаВозникла ошибка при отметке состояния наблюденияПроизошла ошибка при открытии файла %sПри запуске наблюдения произошла ошибкаПри остановке наблюдения произошла ошибкаПроизошла ошибка при записи файла %sВремя последнего доступа изменилосьВремя последней правки изменилось Совет дня:ТипURLНеожиданная ошибка:НеизвестноНепрочитанные сообщенияИспользовать брелок GNOME для хранения паролей в зашифрованном видеИспользовать SSLUser id владельца изменилсяИмя пользователяКонтроль версийПосетите issue trackerНаблюдение $WATCH_NAMEНаблюдение изменилось.Наблюдение простаивает.Наблюдение открытоНаблюдение начало проверку.Веб-страница/лентаНаблюдения за веб-сайтами могут использовать предел ошибки, позволяющий задать процент минимальных отличий. Это дает возможность подстраиваться к веб-сайтам, которые постоянно изменяются или имеют большое количество рекламы.Когда это наблюдение изменилосьКогда Вы открыли это наблюдениеНеверное имя пользователя или парольНеверное имя пользователя/парольВы не подписаны ни на одну лентуВы можете добавлять все возможные веб-сайты в качестве наблюдений. Статические страницы, ленты RSS и Atom, и т.д. Specto автоматически возьмет их под контроль.Вы получили_Правка_Журнал ошибок_Экспортировать Наблюдения_Файл_Помощь_Импортировать Наблюдения_Отметить все как прочтенные_Обновить Все_Видновое сообщениеновое уведомлениеновый запросНовая запись на Стенеи другие...GTK не найден, активирую консольный режимSergey Kuzmin (kdk_mail@mail.ru)specto-0.3.1/po/ru/specto.po0000644000175000017500000010573511165202436014332 0ustar jeffjeff# translation of specto.po to Russian # Copyright (C) 2009 ORGANIZATION # # Sergey Kuzmin , 2009. msgid "" msgstr "" "Project-Id-Version: specto\n" "POT-Creation-Date: 2009-03-26 12:50+EDT\n" "PO-Revision-Date: 2009-04-02 14:34-0500\n" "Last-Translator: Jean-François Fortin Tam\n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.5\n" "X-Generator: KBabel 1.11.4\n" #: ../data/glade/add_watch.glade.h:1 #: ../data/glade/edit_watch.glade.h:2 msgid "Run a custom command:" msgstr "Выполнить пользовательскую команду:" #: ../data/glade/add_watch.glade.h:2 msgid "Add a Watch" msgstr "Добавить Наблюдение" #: ../data/glade/add_watch.glade.h:3 #: ../data/glade/edit_watch.glade.h:4 msgid "Advanced options" msgstr "Дополнительные параметры" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Выберите \n" "другое имя" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Изменить существующее\n" "наблюдение" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:6 msgid "General options" msgstr "Основные настройки" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:7 msgid "Name:" msgstr "Имя:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:8 msgid "Refresh Interval:" msgstr "Интервал обновления:" #: ../data/glade/add_watch.glade.h:11 #: ../data/glade/edit_watch.glade.h:9 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Секунд\n" "Минут\n" "Часов\n" "Дней" #: ../data/glade/add_watch.glade.h:15 msgid "The watch name is already in use" msgstr "Имя наблюдения уже используется" #: ../data/glade/add_watch.glade.h:16 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Указанное для наблюдения имя уже существует! Вы действительно хотите его изменить или Вы действительно хотите создать новое?\n" "\n" "Если Вы хотите создать новое наблюдение, укажите другое имя." #: ../data/glade/add_watch.glade.h:19 #: ../data/glade/edit_watch.glade.h:14 msgid "When this watch has changed" msgstr "Когда это наблюдение изменилось" #: ../data/glade/add_watch.glade.h:20 #: ../data/glade/edit_watch.glade.h:15 msgid "When you open this watch" msgstr "Когда Вы открыли это наблюдение" #: ../data/glade/edit_watch.glade.h:1 msgid "General settings" msgstr "Основные установки" #: ../data/glade/edit_watch.glade.h:3 msgid "Watch options" msgstr "Настройки наблюдения" #: ../data/glade/edit_watch.glade.h:5 #: ../spectlib/notifier.py:788 msgid "Error log" msgstr "Журнал ошибок" #: ../data/glade/edit_watch.glade.h:13 msgid "Watch $WATCH_NAME" msgstr "Наблюдение $WATCH_NAME" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Отменить выбор всех" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Выбрать все" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Все\n" "Отладка\n" "Информация\n" "Предупреждение\n" "Ошибка\n" "Критическая" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Фильтр:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Записи" #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Сохранить как" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "По Активному" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "По Имени" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "По Типу Наблюдения" #: ../data/glade/notifier.glade.h:4 msgid "Debug information" msgstr "Отладочная информация" #: ../data/glade/notifier.glade.h:5 msgid "Display _All Watches" msgstr "Показать _Все Наблюдения" #: ../data/glade/notifier.glade.h:6 msgid "Display _Toolbar" msgstr "Показать _Панель инструментов" #: ../data/glade/notifier.glade.h:7 msgid "Error" msgstr "Ошибка" #: ../data/glade/notifier.glade.h:8 msgid "Extra information" msgstr "Дополнительная информация" #: ../data/glade/notifier.glade.h:9 msgid "General" msgstr "Основные" #: ../data/glade/notifier.glade.h:10 #: ../spectlib/notifier.py:492 #: ../spectlib/trayicon.py:144 msgid "Mark as read" msgstr "Отметить как прочтенное" #: ../data/glade/notifier.glade.h:11 msgid "Notifications" msgstr "Уведомления" #: ../data/glade/notifier.glade.h:12 msgid "Sorting" msgstr "Сортировка" #: ../data/glade/notifier.glade.h:13 msgid "Visit the issue tracker" msgstr "Посетите issue tracker" #: ../data/glade/notifier.glade.h:14 msgid "_Edit" msgstr "_Правка" #: ../data/glade/notifier.glade.h:15 msgid "_Error Log" msgstr "_Журнал ошибок" #: ../data/glade/notifier.glade.h:16 msgid "_Export Watches" msgstr "_Экспортировать Наблюдения" #: ../data/glade/notifier.glade.h:17 msgid "_File" msgstr "_Файл" #: ../data/glade/notifier.glade.h:18 msgid "_Help" msgstr "_Помощь" #: ../data/glade/notifier.glade.h:19 msgid "_Import Watches" msgstr "_Импортировать Наблюдения" #: ../data/glade/notifier.glade.h:20 #: ../spectlib/trayicon.py:153 msgid "_Mark all read" msgstr "_Отметить все как прочтенные" #: ../data/glade/notifier.glade.h:21 msgid "_Refresh All" msgstr "_Обновить Все" #: ../data/glade/notifier.glade.h:22 msgid "_View" msgstr "_Вид" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Отладка и журналирование" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Отображение" #: ../data/glade/preferences.glade.h:3 msgid "Security" msgstr "Безопасность" #: ../data/glade/preferences.glade.h:4 msgid "Sounds" msgstr "Звуки" #: ../data/glade/preferences.glade.h:5 msgid "Always show the icon in the notification area" msgstr "Всегда показывать иконку в области уведомления" #: ../data/glade/preferences.glade.h:6 msgid "Display the notification window in the window list" msgstr "Показывать окно уведомления в списке окон" #: ../data/glade/preferences.glade.h:7 msgid "Enable debug mode and logging" msgstr "Разрешить режим отладки и журналирования" #: ../data/glade/preferences.glade.h:8 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Активировав, Вы будете получать больше информации при запуске Specto из терминала и больше информации будет печататься в журнал." #: ../data/glade/preferences.glade.h:9 msgid "It is strongly recommended to use keyring password encryption. If you disable this option, your passwords will be saved in plain text, unencrypted in your watch list, and could be read by anyone gaining access to your system user account." msgstr "Рекомендуется использовать шифрование паролей. Если Вы отключите эту опцию, пароли будут сохранены в виде обычного текста в списке Наблюдений, и могут быть прочитаны имеющими доступ к Вашей учетной записи." #: ../data/glade/preferences.glade.h:10 msgid "Play this sound when a problem occurs:" msgstr "Проигрывать этот звук при возникновении проблемы:" #: ../data/glade/preferences.glade.h:11 msgid "Play this sound when a watch has changed:" msgstr "Проигрывать этот звук когда наблюдение изменилось:" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Параметры" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Выберите файл" #: ../data/glade/preferences.glade.h:14 msgid "Show notifications when a watch has changed" msgstr "Показывать уведомления при изменении состояния наблюдения" #: ../data/glade/preferences.glade.h:15 msgid "Use GNOME keyring to store passwords in encrypted format" msgstr "Использовать брелок GNOME для хранения паролей в зашифрованном виде" #: ../spectlib/about.py:66 msgid "translator-credits" msgstr "Sergey Kuzmin (kdk_mail@mail.ru)" #: ../spectlib/about.py:79 msgid "Specto's Website" msgstr "Сайт Specto" #: ../spectlib/balloons.py:99 msgid "Cannot display notification message. Make sure that libnotify and D-Bus are available on your system." msgstr "Невозможно вывести уведомление. Убедитесь, что libnotify и D-Bus установлены в Вашей системе." #: ../spectlib/console.py:45 #: ../spectlib/watch.py:140 msgid "Watch has changed." msgstr "Наблюдение изменилось." #: ../spectlib/console.py:50 #: ../spectlib/watch.py:121 msgid "Watch started checking." msgstr "Наблюдение начало проверку." #: ../spectlib/console.py:52 msgid "Watch is idle." msgstr "Наблюдение простаивает." #: ../spectlib/console.py:54 #: ../spectlib/watch.py:174 msgid "No network connection detected" msgstr "Нет соединения с сетью" #: ../spectlib/console.py:56 #: ../spectlib/watch.py:136 #: ../spectlib/watch.py:170 msgid "There was an error checking the watch" msgstr "При проверке наблюдения произошла ошибка" #: ../spectlib/edit_watch.py:73 msgid "Edit watch: " msgstr "Изменить наблюдение: " #: ../spectlib/edit_watch.py:186 #: ../spectlib/notifier.py:592 msgid "Remove a watch" msgstr "Удалить наблюдение" #: ../spectlib/edit_watch.py:187 #: ../spectlib/notifier.py:593 msgid "" "Remove the watch \"%s\"?\n" "This operation cannot be undone." msgstr "" "Удалить наблюдение \"%s\"?\n" "Это необратимая операция." #: ../spectlib/export_watch.py:57 #: ../spectlib/export_watch.py:58 msgid "Export watches" msgstr "Экспортировать наблюдения" #: ../spectlib/export_watch.py:86 #: ../spectlib/import_watch.py:87 msgid "Select" msgstr "Выбрать" #: ../spectlib/export_watch.py:92 #: ../spectlib/import_watch.py:92 #: ../spectlib/notifier.py:700 msgid "Type" msgstr "Тип" #: ../spectlib/export_watch.py:98 #: ../spectlib/import_watch.py:97 #: ../spectlib/notifier.py:709 #: ../spectlib/plugins/watch_mail_gmail.py:107 #: ../spectlib/plugins/watch_mail_imap.py:180 #: ../spectlib/plugins/watch_mail_pop3.py:164 #: ../spectlib/plugins/watch_sn_facebook.py:236 #: ../spectlib/plugins/watch_system_file.py:165 #: ../spectlib/plugins/watch_system_folder.py:234 #: ../spectlib/plugins/watch_system_port.py:105 #: ../spectlib/plugins/watch_system_process.py:90 #: ../spectlib/plugins/watch_vc_bazaar.py:169 #: ../spectlib/plugins/watch_web_greader.py:102 #: ../spectlib/plugins/watch_web_static.py:280 msgid "Name" msgstr "Имя" #: ../spectlib/export_watch.py:106 #: ../spectlib/import_watch.py:104 #: ../spectlib/notifier.py:718 msgid "ID" msgstr "ID" #: ../spectlib/export_watch.py:113 #: ../spectlib/import_watch.py:111 #: ../spectlib/notifier.py:725 msgid "TYPE" msgstr "TYPE" #: ../spectlib/gtkconfig.py:171 #: ../spectlib/gtkconfig.py:402 msgid "Choose a file" msgstr "Выберите файл" #: ../spectlib/gtkconfig.py:204 #: ../spectlib/gtkconfig.py:408 msgid "Choose a directory" msgstr "Выберите каталог" #: ../spectlib/gtkconfig.py:344 msgid "" "Specto encountered an error\n" "Please verify if this bug has been entered in our issue tracker, and if not, file a bug report so we can fix it." msgstr "" "Specto столкнулся с ошибкой\n" "Пожалуйста проверьте, указана ли данная ошибка в нашем issue tracker, и если нет, то пошлите отчет об ошибке, чтобы мы могли исправить ее." #: ../spectlib/import_watch.py:60 #: ../spectlib/import_watch.py:61 msgid "Import watches" msgstr "Импортировать наблюдения" #: ../spectlib/main.py:60 msgid "no GTK, activating console mode" msgstr "GTK не найден, активирую консольный режим" #: ../spectlib/main.py:96 msgid "Console mode enabled." msgstr "Активирован консольный режим." #: ../spectlib/main.py:130 msgid "Could not create a watch, because it is corrupt." msgstr "Невозможно создать наблюдение потому, что оно испорчено." #: ../spectlib/main.py:204 #: ../spectlib/main.py:206 msgid "Specto is already running!" msgstr "Specto уже запущен!" #: ../spectlib/main.py:252 msgid "Cannot quit yet" msgstr "Пока не могу выйти" #: ../spectlib/main.py:258 msgid "Murder!" msgstr "Убийство!" #: ../spectlib/main.py:269 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch changes.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "В данный момент Specto занят и пока не может выйти.\n" "\n" "Возможно это связано с тем, что он проверяет изменения наблюдений.\n" "Тем не менее, Вы можете принудительно выйти, нажав кнопку Убийство." #: ../spectlib/notifier.py:164 msgid "Stop" msgstr "Стоп" #: ../spectlib/notifier.py:185 #: ../spectlib/trayicon.py:145 msgid "Refresh All" msgstr "Обновить Все" #: ../spectlib/notifier.py:203 msgid "The watch \"%s\" is checking." msgstr "Наблюдение \"%s\" проверяется." #: ../spectlib/notifier.py:218 #: ../spectlib/notifier.py:347 msgid "The network connection seems to be down, networked watches will not check until then." msgstr "Похоже сетевое соединение отсутствует, проверка сетевых наблюдений недоступна." #: ../spectlib/notifier.py:223 msgid "The watch \"%s\" has a problem." msgstr "С наблюдением \"%s\" возникли проблемы." #: ../spectlib/notifier.py:226 msgid "%s encountered a problem" msgstr "%s столкнулся с проблемой" #: ../spectlib/notifier.py:232 msgid "The watch \"%s\" has changed." msgstr "Наблюдение \"%s\" изменилось." #: ../spectlib/notifier.py:245 msgid "%s has changed" msgstr "Дополнительные параметры" #: ../spectlib/notifier.py:262 msgid "There was an error marking the watch status" msgstr "Возникла ошибка при отметке состояния наблюдения" #: ../spectlib/notifier.py:392 #: ../spectlib/watch.py:230 msgid "No extra information available." msgstr "Дополнительная информация недоступна." #: ../spectlib/notifier.py:400 msgid "Extra information could not be set" msgstr "Дополнительная информация не может быть установлена" #: ../spectlib/notifier.py:427 msgid "Watch opened" msgstr "Наблюдение открыто" #: ../spectlib/notifier.py:483 msgid "Refresh" msgstr "Обновить" #: ../spectlib/notifier.py:504 msgid "Edit" msgstr "Изменить" #: ../spectlib/notifier.py:511 msgid "Remove" msgstr "Удалить" #: ../spectlib/notifier.py:544 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Вы можете добавлять все возможные веб-сайты в качестве наблюдений. Статические страницы, ленты RSS и Atom, и т.д. Specto автоматически возьмет их под контроль." #: ../spectlib/notifier.py:545 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Наблюдения за веб-сайтами могут использовать предел ошибки, позволяющий задать процент минимальных отличий. Это дает возможность подстраиваться к веб-сайтам, которые постоянно изменяются или имеют большое количество рекламы." #: ../spectlib/notifier.py:546 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Для получения информации щелкните один раз на существующем наблюдении, щелкните дважды, чтобы открыть его содержимое." #: ../spectlib/notifier.py:547 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Чтобы сохранить пропускную способность канала и не быть блокированным на сайтах, пожалуйста, указывайте приемлемый интервал проверки." #: ../spectlib/notifier.py:693 msgid "Active" msgstr "Активно" #: ../spectlib/notifier.py:742 msgid "Tip of the Day:" msgstr "Совет дня:" #: ../spectlib/plugins/watch_mail_gmail.py:34 msgid "GMail" msgstr "GMail" #: ../spectlib/plugins/watch_mail_gmail.py:36 #: ../spectlib/plugins/watch_mail_imap.py:35 #: ../spectlib/plugins/watch_mail_pop3.py:38 msgid "Mail" msgstr "Почта" #: ../spectlib/plugins/watch_mail_gmail.py:40 #: ../spectlib/plugins/watch_mail_gmail.py:109 #: ../spectlib/plugins/watch_mail_imap.py:39 #: ../spectlib/plugins/watch_mail_imap.py:182 #: ../spectlib/plugins/watch_mail_pop3.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:166 #: ../spectlib/plugins/watch_web_greader.py:35 #: ../spectlib/plugins/watch_web_greader.py:104 msgid "Username" msgstr "Имя пользователя" #: ../spectlib/plugins/watch_mail_gmail.py:41 #: ../spectlib/plugins/watch_mail_imap.py:40 #: ../spectlib/plugins/watch_mail_pop3.py:43 #: ../spectlib/plugins/watch_sn_facebook.py:45 #: ../spectlib/plugins/watch_web_greader.py:36 msgid "Password" msgstr "Пароль" #: ../spectlib/plugins/watch_mail_gmail.py:103 #: ../spectlib/plugins/watch_mail_pop3.py:95 #: ../spectlib/plugins/watch_mail_pop3.py:126 #: ../spectlib/plugins/watch_sn_facebook.py:121 #: ../spectlib/plugins/watch_system_file.py:118 #: ../spectlib/plugins/watch_system_folder.py:86 #: ../spectlib/plugins/watch_system_port.py:75 #: ../spectlib/plugins/watch_system_process.py:77 #: ../spectlib/plugins/watch_vc_bazaar.py:101 #: ../spectlib/plugins/watch_web_greader.py:98 #: ../spectlib/plugins/watch_web_static.py:192 #: ../spectlib/watch.py:241 #: ../spectlib/watch.py:250 msgid "Unexpected error:" msgstr "Неожиданная ошибка:" #: ../spectlib/plugins/watch_mail_gmail.py:108 #: ../spectlib/plugins/watch_mail_imap.py:181 #: ../spectlib/plugins/watch_mail_pop3.py:165 #: ../spectlib/plugins/watch_sn_facebook.py:237 #: ../spectlib/plugins/watch_system_file.py:166 #: ../spectlib/plugins/watch_system_folder.py:235 #: ../spectlib/plugins/watch_system_port.py:106 #: ../spectlib/plugins/watch_system_process.py:91 #: ../spectlib/plugins/watch_vc_bazaar.py:170 #: ../spectlib/plugins/watch_web_greader.py:103 #: ../spectlib/plugins/watch_web_static.py:281 msgid "Last changed" msgstr "Последние изменения" #: ../spectlib/plugins/watch_mail_gmail.py:110 #: ../spectlib/plugins/watch_mail_imap.py:183 #: ../spectlib/plugins/watch_mail_pop3.py:167 #: ../spectlib/plugins/watch_web_greader.py:105 msgid "Unread messages" msgstr "Непрочитанные сообщения" #: ../spectlib/plugins/watch_mail_gmail.py:116 #: ../spectlib/plugins/watch_mail_imap.py:150 #: ../spectlib/plugins/watch_mail_pop3.py:135 msgid "" "New message from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "Новое сообщение от %s...\n" "\n" "... всего %d непрочитанных писем." #: ../spectlib/plugins/watch_mail_gmail.py:126 #: ../spectlib/plugins/watch_mail_imap.py:162 #: ../spectlib/plugins/watch_mail_pop3.py:147 msgid "" "%d new messages from %s...\n" "\n" "... totalling %d unread mails." msgstr "" "%d новых сообщений от %s...\n" "\n" "... всего %d непрочитанных писем." #: ../spectlib/plugins/watch_mail_gmail.py:135 #: ../spectlib/plugins/watch_mail_imap.py:174 #: ../spectlib/plugins/watch_mail_pop3.py:142 #: ../spectlib/plugins/watch_mail_pop3.py:159 #: ../spectlib/plugins/watch_vc_bazaar.py:127 #: ../spectlib/plugins/watch_vc_bazaar.py:133 #: ../spectlib/plugins/watch_web_greader.py:118 #: ../spectlib/plugins/watch_web_greader.py:130 msgid "and others..." msgstr "и другие..." #: ../spectlib/plugins/watch_mail_gmail.py:144 #: ../spectlib/plugins/watch_mail_gmail.py:157 #: ../spectlib/plugins/watch_mail_imap.py:190 #: ../spectlib/plugins/watch_mail_pop3.py:174 #: ../spectlib/plugins/watch_sn_facebook.py:190 #: ../spectlib/plugins/watch_sn_facebook.py:208 #: ../spectlib/plugins/watch_system_file.py:143 #: ../spectlib/plugins/watch_system_folder.py:227 #: ../spectlib/plugins/watch_vc_bazaar.py:142 #: ../spectlib/plugins/watch_vc_bazaar.py:156 #: ../spectlib/plugins/watch_web_greader.py:139 #: ../spectlib/plugins/watch_web_greader.py:153 #: ../spectlib/plugins/watch_web_static.py:214 #: ../spectlib/plugins/watch_web_static.py:226 #: ../spectlib/watch.py:288 msgid "There was an error opening the file %s" msgstr "Произошла ошибка при открытии файла %s" #: ../spectlib/plugins/watch_mail_imap.py:33 msgid "IMAP" msgstr "IMAP" #: ../spectlib/plugins/watch_mail_imap.py:41 #: ../spectlib/plugins/watch_mail_pop3.py:44 msgid "Host" msgstr "Узел" #: ../spectlib/plugins/watch_mail_imap.py:42 #: ../spectlib/plugins/watch_mail_pop3.py:45 msgid "Use SSL" msgstr "Использовать SSL" #: ../spectlib/plugins/watch_mail_imap.py:43 msgid "Folder (optional)" msgstr "Каталог (необязательно)" #: ../spectlib/plugins/watch_mail_imap.py:203 #: ../spectlib/plugins/watch_mail_pop3.py:187 #: ../spectlib/plugins/watch_system_file.py:128 #: ../spectlib/plugins/watch_system_folder.py:207 #: ../spectlib/watch.py:447 #: ../spectlib/watch.py:541 #: ../spectlib/watch.py:569 #: ../spectlib/watch.py:593 #: ../spectlib/watch.py:619 #: ../spectlib/watch.py:633 msgid "There was an error writing to the file %s" msgstr "Произошла ошибка при записи файла %s" #: ../spectlib/plugins/watch_mail_pop3.py:36 msgid "POP3" msgstr "POP3" #: ../spectlib/plugins/watch_sn_facebook.py:38 msgid "Facebook" msgstr "Facebook" #: ../spectlib/plugins/watch_sn_facebook.py:40 msgid "Social networks" msgstr "Социальные сети" #: ../spectlib/plugins/watch_sn_facebook.py:44 #: ../spectlib/plugins/watch_sn_facebook.py:238 msgid "Email" msgstr "Email" #: ../spectlib/plugins/watch_sn_facebook.py:118 msgid "Wrong username/password" msgstr "Неверное имя пользователя/пароль" #: ../spectlib/plugins/watch_sn_facebook.py:127 msgid "You received" msgstr "Вы получили" #: ../spectlib/plugins/watch_sn_facebook.py:130 msgid "a new message" msgstr "новое сообщение" #: ../spectlib/plugins/watch_sn_facebook.py:132 msgid "%d new messages" msgstr "%d новых сообщений" #: ../spectlib/plugins/watch_sn_facebook.py:137 msgid "a new notification" msgstr "новое уведомление" #: ../spectlib/plugins/watch_sn_facebook.py:139 msgid "%d new notifications" msgstr "%d новых уведомлений" #: ../spectlib/plugins/watch_sn_facebook.py:144 msgid "a new request" msgstr "новый запрос" #: ../spectlib/plugins/watch_sn_facebook.py:146 msgid "%d new requests" msgstr "%d новых запросов" #: ../spectlib/plugins/watch_sn_facebook.py:151 msgid "a new wall post" msgstr "Новая запись на Стене" #: ../spectlib/plugins/watch_sn_facebook.py:153 msgid "%d new wall posts" msgstr "%d новых записей на Стене" #: ../spectlib/plugins/watch_system_file.py:31 #: ../spectlib/plugins/watch_system_file.py:37 #: ../spectlib/plugins/watch_system_file.py:167 msgid "File" msgstr "Файл" #: ../spectlib/plugins/watch_system_file.py:33 #: ../spectlib/plugins/watch_system_folder.py:35 #: ../spectlib/plugins/watch_system_port.py:33 #: ../spectlib/plugins/watch_system_process.py:33 msgid "System" msgstr "Система" #: ../spectlib/plugins/watch_system_file.py:70 msgid "The file was removed" msgstr "Файл был удален" #: ../spectlib/plugins/watch_system_file.py:97 msgid "User id of the owner changed" msgstr "User id владельца изменился" #: ../spectlib/plugins/watch_system_file.py:100 msgid "Group id of the owner changed" msgstr "Group id владельца изменился" #: ../spectlib/plugins/watch_system_file.py:103 msgid "File size changed" msgstr "Размер файла изменился" #: ../spectlib/plugins/watch_system_file.py:106 msgid "Time of last access changed" msgstr "Время последнего доступа изменилось" #: ../spectlib/plugins/watch_system_file.py:109 msgid "Time of last modification changed" msgstr "Время последней правки изменилось " #: ../spectlib/plugins/watch_system_file.py:157 msgid "%s has changed:\n" msgstr "%s изменился:\n" #: ../spectlib/plugins/watch_system_folder.py:33 #: ../spectlib/plugins/watch_system_folder.py:39 #: ../spectlib/plugins/watch_system_folder.py:236 #: ../spectlib/plugins/watch_vc_bazaar.py:42 #: ../spectlib/plugins/watch_vc_bazaar.py:171 msgid "Folder" msgstr "Каталог" #: ../spectlib/plugins/watch_system_folder.py:78 msgid "The watch is not set to a folder" msgstr "За каталогом не установлено наблюдение" #: ../spectlib/plugins/watch_system_folder.py:141 msgid "Skipping %s" msgstr "Пропускаю %s" #: ../spectlib/plugins/watch_system_folder.py:165 msgid "1 new file was created.\n" msgstr "1 новый файл был создан.\n" #: ../spectlib/plugins/watch_system_folder.py:167 msgid " new files were created.\n" msgstr "новых файлов было создано.\n" #: ../spectlib/plugins/watch_system_folder.py:170 msgid "1 file was removed.\n" msgstr "1 файл был удален.\n" #: ../spectlib/plugins/watch_system_folder.py:172 msgid " files were removed.\n" msgstr "файлов было удалено.\n" #: ../spectlib/plugins/watch_system_folder.py:175 msgid "1 file was modified.\n" msgstr "1 файл был изменен.\n" #: ../spectlib/plugins/watch_system_folder.py:177 msgid " files were modified.\n" msgstr "файлов было изменено.\n" #: ../spectlib/plugins/watch_system_port.py:31 #: ../spectlib/plugins/watch_system_port.py:37 #: ../spectlib/plugins/watch_system_port.py:107 msgid "Port" msgstr "Порт" #: ../spectlib/plugins/watch_system_port.py:65 msgid "Closed" msgstr "Закрыт" #: ../spectlib/plugins/watch_system_port.py:69 msgid "Open" msgstr "Открыт" #: ../spectlib/plugins/watch_system_port.py:72 #: ../spectlib/plugins/watch_system_process.py:74 msgid "Unknown" msgstr "Неизвестно" #: ../spectlib/plugins/watch_system_port.py:108 #: ../spectlib/plugins/watch_system_process.py:93 msgid "Status" msgstr "Состояние" #: ../spectlib/plugins/watch_system_port.py:114 msgid "The network socket on port %s was established." msgstr "Сокет на порте %s, был открыт." #: ../spectlib/plugins/watch_system_port.py:116 msgid "The network socket on port %s was closed." msgstr "Сокет на порте %s, был закрыт." #: ../spectlib/plugins/watch_system_process.py:31 #: ../spectlib/plugins/watch_system_process.py:37 #: ../spectlib/plugins/watch_system_process.py:92 msgid "Process" msgstr "Процесс" #: ../spectlib/plugins/watch_system_process.py:67 msgid "Not running" msgstr "Не запущен" #: ../spectlib/plugins/watch_system_process.py:71 msgid "Running" msgstr "Запущен" #: ../spectlib/plugins/watch_system_process.py:98 msgid "The system process has started." msgstr "Системный процесс был запущен." #: ../spectlib/plugins/watch_system_process.py:100 msgid "The system process has stopped." msgstr "Системный процесс был остановлен." #: ../spectlib/plugins/watch_vc_bazaar.py:36 msgid "Bazaar" msgstr "Bazaar" #: ../spectlib/plugins/watch_vc_bazaar.py:38 msgid "Version control" msgstr "Контроль версий" #: ../spectlib/plugins/watch_vc_bazaar.py:94 msgid "No parent branch available, you will not be notified of differences and changes." msgstr "Родительская ветвь недоступна, Вы не будете уведомлены о различиях и изменениях." #: ../spectlib/plugins/watch_vc_bazaar.py:110 msgid "One new local revision has not yet been merged with its parent branch." msgstr "Одна новая локальная ревизия пока ещё не была слита cо своей родительской веткой." #: ../spectlib/plugins/watch_vc_bazaar.py:112 msgid "%d new local revisions have not yet been merged with its parent branch." msgstr "%d новых локальных ревизий не были слиты со своей родительской веткой." #: ../spectlib/plugins/watch_vc_bazaar.py:115 msgid "One new revision on the remote branch." msgstr "Одна новая ревизия в удаленной ветке." #: ../spectlib/plugins/watch_vc_bazaar.py:117 msgid "%d new revisions on the remote branch." msgstr "%d новых ревизий в удаленной ветке." #: ../spectlib/plugins/watch_vc_bazaar.py:172 msgid "Main branch" msgstr "Основная ветка" #: ../spectlib/plugins/watch_web_greader.py:29 msgid "Google Reader" msgstr "Google Reader" #: ../spectlib/plugins/watch_web_greader.py:31 #: ../spectlib/plugins/watch_web_static.py:49 msgid "Internet" msgstr "Интернет" #: ../spectlib/plugins/watch_web_greader.py:83 msgid " or more" msgstr "или более" #: ../spectlib/plugins/watch_web_greader.py:111 msgid "" "New newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "Пояились новости %s...\n" "\n" "... всего %s непрочитанных новостей." #: ../spectlib/plugins/watch_web_greader.py:121 msgid "" "%d new newsitems in %s...\n" "\n" "... totalling %s unread items." msgstr "" "%s имеется новости в %s...\n" "\n" "... всего %s непрочитанных новостей." #: ../spectlib/plugins/watch_web_greader.py:481 msgid "Wrong username or password" msgstr "Неверное имя пользователя или пароль" #: ../spectlib/plugins/watch_web_greader.py:484 msgid "Could not establish a connection to server" msgstr "Невозможно установить соединение с сервером" #: ../spectlib/plugins/watch_web_greader.py:487 msgid "Could not get cookies" msgstr "Невозможно получить cookies" #: ../spectlib/plugins/watch_web_greader.py:493 msgid "You are not subscribed to any feeds" msgstr "Вы не подписаны ни на одну ленту" #: ../spectlib/plugins/watch_web_greader.py:495 msgid "No unread items" msgstr "Нет непрочитанных элементов" #: ../spectlib/plugins/watch_web_static.py:47 msgid "Webpage/feed" msgstr "Веб-страница/лента" #: ../spectlib/plugins/watch_web_static.py:175 msgid "Filesize difference: %.2f" msgstr "Разница в размере файла:%.2f" #: ../spectlib/plugins/watch_web_static.py:264 msgid "Difference percentage: %s percent" msgstr "Процентная разница: %s процентов" #: ../spectlib/plugins/watch_web_static.py:282 #: ../spectlib/plugins/watch_web_static.py:287 msgid "URL" msgstr "URL" #: ../spectlib/plugins/watch_web_static.py:283 #: ../spectlib/plugins/watch_web_static.py:288 msgid "Error margin (%)" msgstr "Предел ошибки (%)" #: ../spectlib/trayicon.py:98 msgid "No changed watches." msgstr "Нет изменившихся наблюдений." #: ../spectlib/trayicon.py:134 msgid "Hide window" msgstr "Скрыть окно" #: ../spectlib/trayicon.py:136 msgid "Show window" msgstr "Показать окно" #: ../spectlib/watch.py:88 msgid "There was an error starting the watch" msgstr "При запуске наблюдения произошла ошибка" #: ../spectlib/watch.py:98 msgid "There was an error stopping the watch" msgstr "При остановке наблюдения произошла ошибка" #: ../spectlib/watch.py:108 msgid "There was an error marking the watch as read" msgstr "При пометке наблюдения, как прочитанного, произошла ошибка" #: ../spectlib/watch.py:151 msgid "There was an error marking the watch as changed" msgstr "При пометке наблюдения, как изменившегося, произошла ошибка" #: ../spectlib/watch.py:216 #: ../spectlib/watch.py:217 msgid "No changes yet" msgstr "Пока без изменений" #: ../spectlib/watch.py:301 msgid "Please enable plugin \"%s\" if you want to use the watch \"%s\"." msgstr "Пожалуйста включите плагин \"%s\" если хотите использовать наблюдение \"%s\"." #: ../spectlib/watch.py:455 #: ../spectlib/watch.py:468 #: ../spectlib/watch.py:488 #: ../spectlib/watch.py:514 #: ../spectlib/watch.py:530 #: ../spectlib/watch.py:554 #: ../spectlib/watch.py:609 msgid "There was an error initializing config file %s" msgstr "Произошла ошибка при инициализации файла конфигурации %s" specto-0.3.1/po/it/0000755000175000017500000000000011226433142012446 5ustar jeffjeffspecto-0.3.1/po/it/specto.mo0000644000175000017500000003324311041474550014310 0ustar jeffjeff\ ()(< Tav    %-@ nx  &2&Yp     ( <J O~Y5 %8 AK]e   _ 4&9+`-L$$, QrI>)/8 >7H  .0+_Dz6K, ;F LWgms);O T `nu   4GLRf| &9AtJ !!!!! "!">" P" ]"k" |"""""""#4#/N#~######$0$!G$!i$3$$!$$,%<%O%f%z%%%%%%%%%y%?&D&X&a& &&&$&&&& '' ')'^'(( (*( >( H(T( q(|((((i(2) ;)G)_))d),)/)l)$X*$}*+**h+*+',@,E,J, j,#,,#,,, ,C -N-k---*-+-..5A.Iw.-../06F1_}1+1 2 2"232H2N2U2 j2#v222#223!63X3s33 3 333 3 303#4%:4!`44&4"444455"57+5c55!5%!6G6_6x666][ e4NpVs=@P-UY#Lg~u ZdnIr^B&5jSo m$E\7;fHwt)a3F?_xv'OK}(9%>cX6bzT: {2k.RW /h*qi,CA`yQDG J"<l+08!|M1Specto is currently busy and cannot quit yet. This may be because it is checking for watch updates. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayError Margin:File/folder:General settingsHost:Last Updated:Location:Name:Port:Process:SoundsUsername:Watch nameA problem occuredA watch is updatedActiveAdd a WatchAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot quit yetChoose an other nameChoose a file or folderDeselect allDifference percentage:%s (Watch: "%s")Display _All WatchesDisplay _ToolbarDisplay the notification window in the window listDuration (in seconds):Edit existing watchEdit watch: Enable debug mode and loggingError LogError Margin (%):Export watchesFileFile/folder:Filter:FolderGmailHide windowHost:IDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.ImapImport watchesLogsMailbox does not existMurder!NameName:No network connection detectedNo updated watches.No updates yet.Not implemented yetNotificationsPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop toasts from the tray icon when a watch is updatedPop3Port:PreferencesPreferences saved.Process:Protocol:Refresh Interval:Save AsSeconds Minutes Hours DaysSelect a FileSelect allShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!TYPEThe connection, %s, was closed.The connection, %s, was established.The file/folder, %s, has been updated.The network connection seems to be down, watches will not update until then.The process, %s, has started.The process, %s, has stopped.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.The watch, %s, has a problem. You may need to check the error log.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchUpdated watches: Updating watch: "%s"Use SSL:User:Username:Watch "%s" is already marked as updated in the notifierWatch "%s" updated!Watch : "%s" edited.Watch SettingsWatch Type:Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite Email Files or folders Process PortWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail._Clear All_Edit_Error Log_Export Watches_File_Help_Import Watches_Viewadd watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefile/folderfiles/foldersfoldergmail (%s unread)mail accountmail accountsno GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setportportspreferences: createpreferences: reappearprocessprocessesremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedwebsitewebsitesProject-Id-Version: 0.1 POT-Creation-Date: Tue Mar 13 23:10:56 2007 PO-Revision-Date: 2007-06-20 20:52-0500 Last-Translator: Jean-François Fortin Tam Language-Team: Italian Translation Team MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: pygettext.py 1.4 X-Rosetta-Export-Date: 2007-05-10 19:48:10+0000 Specto è occupato e non può ancora uscire. Porebbe essere perché sta controllando l'aggiornamento di un osservatore. Tuttavia puoi provare a forzare l'uscita cliccando sul tasto dell'assassinio.Debug e giornaleVisualizzazioneMargine di errore:File/cartella:Impostazioni generaliHost:Ultimo aggiornamento:Posizione:Nome:Porta:Processo:SuoniNome utente:Nome dell'osservatoreSi è verificato un problemaUn osservatore è stato aggiornatoAttivoAggiungi un osservatoreTutti Debug Informazioni Avvertimento Errore CriticoVisualizza sempre l'icona nell'area di notificaPer stato di attivitàPer nomePer tipo di osservatoreNon si può ancora uscireScegli un altro nomeScegli un file o una cartellaDeseleziona tuttoPercentuale di differenza: %s (Osservatore "%s")Visualizza _tutti gli osservatoriVisualizza _barra degli strumentiMostra la finestra di notifica nella lista finestreDurata (in secondi):Modifica un osservatore esistenteModifica un osservatore:Abilita la modalità di debug ed il giornaleGiornale di erroreMargine di errore (%):Esporta osservatoriFileFile/cartella:Filtro:CartellaGmailNascondi finestraHost:IDIMAPSe attivato, avviando Specto dal terminale si riceveranno più informazioni e nel giornale saranno scritte più messaggi.ImapImporta osservatoriGiornaliLa casella di posta non esisteAssassinio!NomeNome:Nessuna connessione di rete rilevataNessun osservatore aggiornato.Ancora nessun aggiornamento.Non ancora implementatoNotifichePOP3Password:Seleziona un intervallo di aggiornamento ragionevole per risparmiare la banda e per evitare di essere bloccato dai fornitori di contenuti.Visualizza il fumetto a partire dall'icona sul pannello quando un osservatore viene aggiornatoPop3Porta:PreferenzePreferenze salvate.Processo:Protocollo:Intervallo di aggiornamento:Salva comeSecondi Minuti Ore GiorniSeleziona un fileSeleziona tuttoMostra finestraClicca su un osservatore esistente per visualizzarne le informazioni, e fai doppio click per modificarlo.Salto %sOrdinamentoSpecto è già avviato!TIPOLa connessione %s è stata chiusa.La connessione %s è stata stabilita.Il file/cartella %s è stato aggiornato.La connessione di rete sembra non disponibile, gli osservatori non verranno aggiornati finchè rimarrà taleIl processo %s si è avviato.Il processo %s si è fermato.Il nome dell'osservatore è già utilizzatoIl nome dell'osservatore specificato esite già! Si intende modificare l'osservatore esistente, o si intende crearne uno nuovo? Se si intende crearne uno nuovo, si deve scegliere un nome diverso.L'osservatore %s ha un problema. Potrebbe essere necessario controllare il giornale degli errori.Il sito web %s è stato aggiornato.Suggerimento del giorno:TipoURL:Osservatore di file sconosciutoOsservatore di posta sconosciutoOsservatore di processo sconosciutoOsservatori aggiornati: Aggiornamento dell'osservatore "%s"Usa SSL:Utente:Nome utente:L'osservatore "%s" è già marcato come aggiornato nel notificatoreOsservatore "%s" aggiornato!Osservatore "%s" modificato.Impostazioni dell'osservatoreTipo di osservatore:L'osservatore "%s" ha incontrato un erroreL'osservatore "%s" ha incontrato un errore:L'osservatore "%s" ha incontrato un errore: %sL'osservatore "%s" ha un incontrato errore: url vuotaL'osservatore "%s" ha incontrato un errore: nome utente o password erratiSito web Email File o cartelle Processo PortaGli osservatori di siti web possono utilizzare un margine di errore il che consente di impostare una percentuale minima di differenza. Ció permette di adattarsi a siti web che cambiano in continuazione o che hanno molta pubblicitàIn modalità debug, Specto fornirà più informazioni per aiutare a diagnosticare i problemi. Il giornale mantiene queste informazione in un file. Questo file può essere utilizzato per aiutare gli sviluppatori a migliorare Specto.Puoi aggiungere tutti i tipi di siti web come osservatori. Pagine statiche, feed RSS o Atom, ecc. Specto li gestirà automaticamente.L'account email %s ha %s nuovi messaggi.L'account email %s ha %d nuovi messaggi non letti, per un totatle di %s messaggi.L'account email %s ha nuovi messaggi._Pulisci tutti_Modifica_Giornale errori_Esporta osservatori_File_Aiuto_Importa osservatori_Visualizzaaggiungi osservatore: già visibileaggiungi osservatore: creatoaggiungi osservatore: ricreatomodifica osservatore: già visibilemodifica osservatore: creatomodifica osservatore: ricreatogiornale di errore: già visibilegiornale di errore: creatogiornale di errore: ricreatofilefile/cartellafile/cartellecartellagmail (%s non letti)account emailaccount emailGTK non disponibile, attivo la modalità consolenotificatore: nascostonotificatore: posizione non impostatanotificatore: posizione impostatanotificatore: riapparsonotificatore: dimensione non impostatanotificatore: dimensione impostataportaportepreferenze: createpreferenze: riapparseprocessoprocessiinformazioni dell'osservatore "%s" rimosse dal giornaleGiulio Lotti Vincenzo Consales Alessandro Falappa aggiornamento: %s rimossoaggiornamento: %s è stato creatoaggiornamento: %s è stato modificatoosservatore "%s" apertoosservatore "%s" partitoosservatore "%s" fermatosito websiti webspecto-0.3.1/po/it/specto.po0000644000175000017500000005115611041474551014317 0ustar jeffjeff# Something funny here. # Copyright (C) KIDDO INTERNATIONAL DRUGS DEALER. # Giulio Iotti , 2006 # msgid "" msgstr "" "Project-Id-Version: 0.1\n" "POT-Creation-Date: Tue Mar 13 23:10:56 2007\n" "PO-Revision-Date: 2007-06-20 20:52-0500\n" "Last-Translator: Jean-François Fortin Tam\n" "Language-Team: Italian Translation Team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: pygettext.py 1.4\n" "X-Rosetta-Export-Date: 2007-05-10 19:48:10+0000\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "Impostazioni generali" #: ../data/glade/add_watch.glade.h:2 msgid "Watch name" msgstr "Nome dell'osservatore" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "Aggiungi un osservatore" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Scegli \n" "un altro nome" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Modifica un osservatore\n" "esistente" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 msgid "Name:" msgstr "Nome:" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "Intervallo di aggiornamento:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Secondi\n" "Minuti\n" "Ore\n" "Giorni" #: ../data/glade/add_watch.glade.h:14 msgid "The watch name is already in use" msgstr "Il nome dell'osservatore è già utilizzato" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Il nome dell'osservatore specificato esite già! Si intende modificare l'osservatore esistente, o si intende crearne uno nuovo?\n" "\n" "Se si intende crearne uno nuovo, si deve scegliere un nome diverso." #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "Tipo di osservatore:" #: ../data/glade/add_watch.glade.h:19 msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" "Sito web\n" "Email\n" "File o cartelle\n" "Processo\n" "Porta" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "Giornale di errore" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Salva come" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "Impostazioni dell'osservatore" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Deseleziona tutto" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Seleziona tutto" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Tutti\n" "Debug\n" "Informazioni\n" "Avvertimento\n" "Errore\n" "Critico" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtro:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Giornali" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Per stato di attività" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Per nome" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Per tipo di osservatore" #: ../data/glade/notifier.glade.h:4 msgid "Display _All Watches" msgstr "Visualizza _tutti gli osservatori" #: ../data/glade/notifier.glade.h:5 msgid "Display _Toolbar" msgstr "Visualizza _barra degli strumenti" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "Notifiche" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "Ordinamento" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "_Pulisci tutti" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "_Modifica" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "_Giornale errori" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "_Esporta osservatori" #: ../data/glade/notifier.glade.h:12 msgid "_File" msgstr "_File" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "_Aiuto" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "_Importa osservatori" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "_Visualizza" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Debug e giornale" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Visualizzazione" #: ../data/glade/preferences.glade.h:3 msgid "Sounds" msgstr "Suoni" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "Si è verificato un problema" #: ../data/glade/preferences.glade.h:5 msgid "A watch is updated" msgstr "Un osservatore è stato aggiornato" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "Visualizza sempre l'icona nell'area di notifica" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "Mostra la finestra di notifica nella lista finestre" #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "Durata (in secondi):" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "Abilita la modalità di debug ed il giornale" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Se attivato, avviando Specto dal terminale si riceveranno più informazioni e nel giornale saranno scritte più messaggi." #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "Visualizza il fumetto a partire dall'icona sul pannello quando un osservatore viene aggiornato" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Preferenze" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Seleziona un file" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "In modalità debug, Specto fornirà più informazioni per aiutare a diagnosticare i problemi. Il giornale mantiene queste informazione in un file. Questo file può essere utilizzato per aiutare gli sviluppatori a migliorare Specto." #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "" "Giulio Lotti \n" "Vincenzo Consales \n" "Alessandro Falappa " #: ../spectlib/add_watch.py:165 msgid "file" msgstr "file" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "cartella" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "URL:" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Margine di errore (%):" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protocollo:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "Gmail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Utente:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Password:" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Host:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 msgid "Use SSL:" msgstr "Usa SSL:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "File/cartella:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "File" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Cartella" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Scegli un file o una cartella" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "Processo:" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 msgid "Port:" msgstr "Porta:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "Modifica un osservatore:" #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "Osservatore \"%s\" modificato." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "informazioni dell'osservatore \"%s\" rimosse dal giornale" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Nome utente:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "Pop3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "Imap" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 msgid "Import watches" msgstr "Importa osservatori" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 msgid "Export watches" msgstr "Esporta osservatori" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Attivo" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Tipo" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "Nome" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "ID" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TIPO" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "GTK non disponibile, attivo la modalità console" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "Specto è già avviato!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Ancora nessun aggiornamento." #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "osservatore \"%s\" partito" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "osservatore \"%s\" fermato" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "notificatore: riapparso" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "notificatore: nascosto" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "preferenze: create" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "preferenze: riapparse" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "giornale di errore: creato" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "giornale di errore: già visibile" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "giornale di errore: ricreato" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "aggiungi osservatore: creato" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "aggiungi osservatore: già visibile" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "aggiungi osservatore: ricreato" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "modifica osservatore: creato" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "modifica osservatore: già visibile" #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "modifica osservatore: ricreato" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "Non si può ancora uscire" #: ../spectlib/main.py:582 msgid "Murder!" msgstr "Assassinio!" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto è occupato e non può ancora uscire.\n" "\n" "Porebbe essere perché sta controllando l'aggiornamento di un osservatore.\n" "Tuttavia puoi provare a forzare l'uscita cliccando sul tasto dell'assassinio." #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "La connessione di rete sembra non disponibile, gli osservatori non verranno aggiornati finchè rimarrà tale" #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s non letti)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "osservatore \"%s\" aperto" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Puoi aggiungere tutti i tipi di siti web come osservatori. Pagine statiche, feed RSS o Atom, ecc. Specto li gestirà automaticamente." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Gli osservatori di siti web possono utilizzare un margine di errore il che consente di impostare una percentuale minima di differenza. Ció permette di adattarsi a siti web che cambiano in continuazione o che hanno molta pubblicità" #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Clicca su un osservatore esistente per visualizzarne le informazioni, e fai doppio click per modificarlo." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Seleziona un intervallo di aggiornamento ragionevole per risparmiare la banda e per evitare di essere bloccato dai fornitori di contenuti." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "notificatore: dimensione impostata" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "notificatore: dimensione non impostata" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "notificatore: posizione impostata" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "notificatore: posizione non impostata" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Suggerimento del giorno:" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Nome:" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Ultimo aggiornamento:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Posizione:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Margine di errore:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Host:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Nome utente:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "File/cartella:" #: ../spectlib/notifier.py:852 msgid "Process:" msgstr "Processo:" #: ../spectlib/notifier.py:897 msgid "Port:" msgstr "Porta:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Preferenze salvate." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Nessun osservatore aggiornato." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Osservatori aggiornati:\n" #: ../spectlib/trayicon.py:79 msgid "website" msgstr "sito web" #: ../spectlib/trayicon.py:79 msgid "websites" msgstr "siti web" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "account email" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "account email" #: ../spectlib/trayicon.py:93 msgid "file/folder" msgstr "file/cartella" #: ../spectlib/trayicon.py:93 msgid "files/folders" msgstr "file/cartelle" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "processo" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "processi" #: ../spectlib/trayicon.py:108 msgid "port" msgstr "porta" #: ../spectlib/trayicon.py:108 msgid "ports" msgstr "porte" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Nascondi finestra" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Mostra finestra" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "L'osservatore %s ha un problema. Potrebbe essere necessario controllare il giornale degli errori." #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "L'osservatore \"%s\" è già marcato come aggiornato nel notificatore" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "Osservatore \"%s\" aggiornato!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "Il sito web %s è stato aggiornato." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "L'account email %s ha %s nuovi messaggi." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "L'account email %s ha %d nuovi messaggi non letti, per un totatle di %s messaggi." #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "L'account email %s ha nuovi messaggi." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "Il file/cartella %s è stato aggiornato." #: ../spectlib/watch.py:125 msgid "The process, %s, has stopped." msgstr "Il processo %s si è fermato." #: ../spectlib/watch.py:127 msgid "The process, %s, has started." msgstr "Il processo %s si è avviato." #: ../spectlib/watch.py:132 msgid "The connection, %s, was closed." msgstr "La connessione %s è stata chiusa." #: ../spectlib/watch.py:134 msgid "The connection, %s, was established." msgstr "La connessione %s è stata stabilita." #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Non ancora implementato" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Osservatore di file sconosciuto" #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "Aggiornamento dell'osservatore \"%s\"" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "L'osservatore \"%s\" ha incontrato un errore" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "aggiornamento: %s è stato modificato" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "aggiornamento: %s è stato creato" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "Salto %s" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "aggiornamento: %s rimosso" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Osservatore di posta sconosciuto" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "Nessuna connessione di rete rilevata" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "L'osservatore \"%s\" ha incontrato un errore: nome utente o password errati" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "L'osservatore \"%s\" ha incontrato un errore: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "La casella di posta non esiste" #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "L'osservatore \"%s\" ha incontrato un errore:" #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 msgid "Unknown Process Watch" msgstr "Osservatore di processo sconosciuto" #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "L'osservatore \"%s\" ha un incontrato errore: url vuota" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Percentuale di differenza: %s (Osservatore \"%s\")" specto-0.3.1/po/generate_template.py0000755000175000017500000000254611131421455016102 0ustar jeffjeff#!/usr/bin/env python #this script is for translators. #It is used to regenerate the translations template file (po/specto.pot) #when strings in specto have changed. print "Specto's custom string extractor script\n" import os import glob from string import replace paths = ["../spectlib", "../spectlib/tools", "../spectlib/plugins", "../data/glade"] extensions = [".py", ".h"] arguments = "" #this is to extract the strings from the glade files #before passing them to pygettext #intltool-extract --type=gettext/glade pywine.glade print "Parsing glade files..." for x in glob.glob("../data/glade/*.glade"): glade_file_to_parse = "intltool-extract --type=gettext/glade " + x os.system(glade_file_to_parse) print "\tDone.\n" #use pygettext to transform strings in the .glade.h files #and strings in .py files into a specto.pot template file for path in paths: for extension in extensions: foo = path + "/*" + extension for x in glob.glob(foo): arguments += x arguments += " " # Here is a hack to prevent indexing that file: arguments = replace(arguments, " ../spectlib/i18n.py", "") print "Will analyze these files:\n\n", arguments command = "pygettext --keyword=N_ --output=specto.pot " + arguments os.system(command) print "\n\nSTRINGS EXTRACTED. They have been saved" \ " as the template file 'specto.pot'" specto-0.3.1/po/tarball_rosetta.sh0000755000175000017500000000047611041474551015566 0ustar jeffjeff#!/bin/bash echo "WARNING. This script is only for creating a Rosetta-compliant upload tarball. It assumes that you properly generated the specto.pot template beforehand with generate_template.py" mkdir po for i in * do cp $i/specto.po po/$i.po done cp specto.pot po/specto.pot tar -cvf rosetta_po.tar.gz po rm -R po specto-0.3.1/po/pt_BR/0000755000175000017500000000000011226433142013040 5ustar jeffjeffspecto-0.3.1/po/pt_BR/specto.mo0000644000175000017500000003306011041474551014700 0ustar jeffjeff\ ()(< Tav    %-@ nx  &2&Yp     ( <J O~Y5 %8 AK]e   _ 4&9+`-L$$, QrI>)/8 >7H  .0+_Dz6K, ;F LWgms);O T `nu   4GLRf| &9AJ &! !!"+"I"\"z" " "" """"#.#6#$N#0s## ##*#$$;$/S$$$4$$ %%%#8%\%n%%%%%%% % %%%%z&& && &&&&&''9'U'd'i'p'G'E(J( Q(_( u( (( (((( (e)h) {)#))#)()+)g)*$*"*(*+N+1+ ,*,/,"4, W,#x,,, , ,,?,:-V-q---- -'-A'.;i../0A/1Wq171 222)2@2I2P2g2"o222 223!3A3Z3u3 }333333'34$4>4^4"|44444 44 5'5,:5g55 555566][ e4NpVs=@P-UY#Lg~u ZdnIr^B&5jSo m$E\7;fHwt)a3F?_xv'OK}(9%>cX6bzT: {2k.RW /h*qi,CA`yQDG J"<l+08!|M1Specto is currently busy and cannot quit yet. This may be because it is checking for watch updates. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayError Margin:File/folder:General settingsHost:Last Updated:Location:Name:Port:Process:SoundsUsername:Watch nameA problem occuredA watch is updatedActiveAdd a WatchAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot quit yetChoose an other nameChoose a file or folderDeselect allDifference percentage:%s (Watch: "%s")Display _All WatchesDisplay _ToolbarDisplay the notification window in the window listDuration (in seconds):Edit existing watchEdit watch: Enable debug mode and loggingError LogError Margin (%):Export watchesFileFile/folder:Filter:FolderGmailHide windowHost:IDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.ImapImport watchesLogsMailbox does not existMurder!NameName:No network connection detectedNo updated watches.No updates yet.Not implemented yetNotificationsPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop toasts from the tray icon when a watch is updatedPop3Port:PreferencesPreferences saved.Process:Protocol:Refresh Interval:Save AsSeconds Minutes Hours DaysSelect a FileSelect allShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!TYPEThe connection, %s, was closed.The connection, %s, was established.The file/folder, %s, has been updated.The network connection seems to be down, watches will not update until then.The process, %s, has started.The process, %s, has stopped.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.The watch, %s, has a problem. You may need to check the error log.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchUpdated watches: Updating watch: "%s"Use SSL:User:Username:Watch "%s" is already marked as updated in the notifierWatch "%s" updated!Watch : "%s" edited.Watch SettingsWatch Type:Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite Email Files or folders Process PortWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail._Clear All_Edit_Error Log_Export Watches_File_Help_Import Watches_Viewadd watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefile/folderfiles/foldersfoldergmail (%s unread)mail accountmail accountsno GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setportportspreferences: createpreferences: reappearprocessprocessesremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedwebsitewebsitesProject-Id-Version: specto Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: Tue May 29 18:06:54 2007 PO-Revision-Date: 2007-07-03 23:52-0500 Last-Translator: Jeff Fortin Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rosetta-Export-Date: 2007-06-21 18:38:08+0000 O Specto está ocupado e ainda não pode ser finalizado. Isto ocorre devido a verificação de atualizações para os Observadores. Entretanto, você pode forçar a terminar o programa, apertando o botão Finalizar.Executando Debugg e registrandoExibirMargem de erro:Arquivo/pasta:Configurações GeraisComputador:Última Atualização:Localização:Nome:Porta:Processo:SonsNome de Usuário:Nome do ObservadorOcorreu um problemaUm Observador está atualizadoAtivadoAdicionar um ObservadorTodos Debub Info Aviso Erro CríticoSempre exibir o ícone na área de notificaçãoPor Observador AtivoPelo NomePor Tipo de ObservadorO programa ainda não pode ser finalizado Escolher an outro nomeSelecione um arquivo ou pastaRemover Seleção totalPorcentagem de Diferença:%s (Observador: "%s")Exibir_Todos os ObservadoresExibir_Barra de FerramentasExibir a janela de notificação na lista de janelasDuração(em segundos):Editar existente observadorEditar Observador:Habilitar modo de debugg e registroRegistro de ErrosMargem de Erro (%):Exportar ObservadoresArquivoArquivo/pasta:Filtro:PastaGmailFechar JanelaComputador:IDIMAPSe ativado, você irá receber mais informações em uma janela de terminal do Specto e também serão armazenadas de forma adicional nos registros.ImapImportar ObservadoresRegistrosCaixa de correio não existeFinalizado!NomeNome:Conexão de rede não detectadaNenhum Observador atualizado.Não existem atualizações disponiveisAinda não foi implementadoNotificaçõesPOP3Senha:Favor ajustar um intervalo de atualização razoável a fim de economizar banda e preveni-lo de ser bloqueado pelos provedores de conteúdo.Um ícone na bandeja irá avisá-lo quando um Observador for atualizadoPop3Porta:PreferênciasPreferências Salvas.Processo:Protocolo:Intervalo de Atualização:Salvar comoSegundos Minutos Horas DiasSelecionar um ArquivoSelecionar tudoExibir janelaClique uma vez em um observador para mostrar sua informação e duas vezes para exibir seu conteúdo.Desconsiderando %sClassificarO Specto já está sendo executado!TIPOA conexão, %s, foi fechada.A conexão, %s, foi estabelecida.O arquivo/pasta, %s, foi atualizado.A conexão de rede parece estar desativada. Os Observadores não serão atualizados até nova conexão.O processo, %s, foi iniciado.O processo, %s, foi parado.O nome do do observador já está em usoO nome do Observador especificado já existe! Você quer modificar o existente ou criar um novo? Se quiser criar um novo, especifique um nome diferente.O Observador, %s, tem um problema. Favor verificar o Registro de Erros.A página de internet, %s, foi atualizada.Dica do Dia:TipoURL:Observador de Arquivo DesconhecidoObservador de email desconhecidoObservador de Processo DesconhecidoObservadores Atualizados: Atualizando Observador: "%s"Usar SSL:Usuário:Nome de Usuário:O Observador "%s" está indicado como atualizado no notificadorObservador "%s" Atualizado!Observador : "%s" editado.Configurações do ObservadorTipo de Observador:Observador: "%s" tem um erroObservador: "%s" tem um erro:Observador: "%s" tem um erro: %sObservador: "%s" tem um erro: url vaziaO Observador: "%s" tem um erro: Nome de Usuário/Senha incorretosPágina da Internet Email Arquivos ou pastas Processo PortaOs observadores de Páginas da Internet podem usar uma margem de erro que lhe permite ajustar uma porcentagem mínima de variação. Isto lhe possibilita se adaptar a páginas que variam constantemente ou possuem muita propaganda.Enquanto no modo debug, o Specto irá fornecer mais informações a fim de auxilia-lo na soluções de problemas. O registro irá armazenar toda esta informação em um arquivo de registro. Você pode utiliza-la para ajudar os desenvolvedores a melhorar o Specto. Você pode adicionar todos os tipos de páginas de Internet como Observador. Páginas estáticas, RSS ou Atom. O Specto irá observa-las automaticamente.Sua conta de email, %s, tem %d nova(s) mensagem(s).Sua conta de email, %s, tem %d novas mensagens não lidas, totalizando %sSua conta de email, %s, tem nova(s) mensagem(s)._Limpar tudo_Editar_Registro de Erros_Exportar Observadores_Arquivo_Ajuda_Importar Observadores_Exibiradicionar Observador: já visíveladicionar Observador: criaradicionar Observador: recriarEditar Observador: já visível Editar Observador: criarEditar Observador: recriarRegistro de erros: Já visívelRegistro de erros: criarRegistro de Erros: recriararquivoArquivo/pastaArquivos/pastaspastagmail (%s não lidos)Conta de emailContas de emailGTK desabilitado, ativando modo consoleNotificador:ocultarNotificador: Posição não ajustadaNotificador: Posição ajustadaNotificador:mostrar novamenteNotificador: Tamanho não ajustadoNotificador: Tamanho Ajustadoportaportaspreferencias: criarpreferências: mostrar novamenteprocessoprocessosRegistros removidos do Observador: "%s"Charles Gratarolli Atualização: %s removidaAtualização: %s foi criadaAtualização: %s foi modificadaObservador "%s" abertoObservador "%s" iniciadoObservador "%s" paradoPágina de InternetPáginas de Internetspecto-0.3.1/po/pt_BR/specto.po0000644000175000017500000005113011041474551014701 0ustar jeffjeff# Brazilian Portuguese translation for specto # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the specto package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: specto\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: Tue May 29 18:06:54 2007\n" "PO-Revision-Date: 2007-07-03 23:52-0500\n" "Last-Translator: Jeff Fortin \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Rosetta-Export-Date: 2007-06-21 18:38:08+0000\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "Configurações Gerais" #: ../data/glade/add_watch.glade.h:2 msgid "Watch name" msgstr "Nome do Observador" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "Adicionar um Observador" #: ../data/glade/add_watch.glade.h:4 msgid "" "Choose \n" "an other name" msgstr "" "Escolher \n" "an outro nome" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Editar existente\n" "observador" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 msgid "Name:" msgstr "Nome:" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "Intervalo de Atualização:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Segundos\n" "Minutos\n" "Horas\n" "Dias" #: ../data/glade/add_watch.glade.h:14 msgid "The watch name is already in use" msgstr "O nome do do observador já está em uso" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "O nome do Observador especificado já existe! Você quer modificar o existente ou criar um novo?\n" "\n" "Se quiser criar um novo, especifique um nome diferente." #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "Tipo de Observador:" #: ../data/glade/add_watch.glade.h:19 msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" "Página da Internet\n" "Email\n" "Arquivos ou pastas\n" "Processo\n" "Porta" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "Registro de Erros" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Salvar como" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "Configurações do Observador" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Remover Seleção total" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Selecionar tudo" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Todos\n" "Debub\n" "Info\n" "Aviso\n" "Erro\n" "Crítico" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Filtro:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Registros" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Por Observador Ativo" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Pelo Nome" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "Por Tipo de Observador" #: ../data/glade/notifier.glade.h:4 msgid "Display _All Watches" msgstr "Exibir_Todos os Observadores" #: ../data/glade/notifier.glade.h:5 msgid "Display _Toolbar" msgstr "Exibir_Barra de Ferramentas" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "Notificações" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "Classificar" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "_Limpar tudo" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "_Editar" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "_Registro de Erros" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "_Exportar Observadores" #: ../data/glade/notifier.glade.h:12 msgid "_File" msgstr "_Arquivo" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "_Ajuda" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "_Importar Observadores" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "_Exibir" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Executando Debugg e registrando" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Exibir" #: ../data/glade/preferences.glade.h:3 msgid "Sounds" msgstr "Sons" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "Ocorreu um problema" #: ../data/glade/preferences.glade.h:5 msgid "A watch is updated" msgstr "Um Observador está atualizado" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "Sempre exibir o ícone na área de notificação" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "Exibir a janela de notificação na lista de janelas" #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "Duração(em segundos):" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "Habilitar modo de debugg e registro" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Se ativado, você irá receber mais informações em uma janela de terminal do Specto e também serão armazenadas de forma adicional nos registros." #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "Um ícone na bandeja irá avisá-lo quando um Observador for atualizado" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Preferências" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Selecionar um Arquivo" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "Enquanto no modo debug, o Specto irá fornecer mais informações a fim de auxilia-lo na soluções de problemas. O registro irá armazenar toda esta informação em um arquivo de registro. Você pode utiliza-la para ajudar os desenvolvedores a melhorar o Specto. " #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "Charles Gratarolli " #: ../spectlib/add_watch.py:165 msgid "file" msgstr "arquivo" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "pasta" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "URL:" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Margem de Erro (%):" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protocolo:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "Gmail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Usuário:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Senha:" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Computador:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 msgid "Use SSL:" msgstr "Usar SSL:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "Arquivo/pasta:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "Arquivo" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Pasta" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Selecione um arquivo ou pasta" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "Processo:" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 msgid "Port:" msgstr "Porta:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "Editar Observador:" #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "Observador : \"%s\" editado." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "Registros removidos do Observador: \"%s\"" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Nome de Usuário:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "Pop3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "Imap" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 msgid "Import watches" msgstr "Importar Observadores" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 msgid "Export watches" msgstr "Exportar Observadores" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Ativado" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Tipo" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "Nome" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "ID" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TIPO" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "GTK desabilitado, ativando modo console" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "O Specto já está sendo executado!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Não existem atualizações disponiveis" #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "Observador \"%s\" iniciado" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "Observador \"%s\" parado" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "Notificador:mostrar novamente" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "Notificador:ocultar" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "preferencias: criar" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "preferências: mostrar novamente" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "Registro de erros: criar" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "Registro de erros: Já visível" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "Registro de Erros: recriar" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "adicionar Observador: criar" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "adicionar Observador: já visível" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "adicionar Observador: recriar" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "Editar Observador: criar" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "Editar Observador: já visível " #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "Editar Observador: recriar" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "O programa ainda não pode ser finalizado " #: ../spectlib/main.py:582 msgid "Murder!" msgstr "Finalizado!" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "O Specto está ocupado e ainda não pode ser finalizado.\n" "\n" "Isto ocorre devido a verificação de atualizações para os Observadores.\n" "Entretanto, você pode forçar a terminar o programa, apertando o botão Finalizar." #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "A conexão de rede parece estar desativada. Os Observadores não serão atualizados até nova conexão." #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s não lidos)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "Observador \"%s\" aberto" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Você pode adicionar todos os tipos de páginas de Internet como Observador. Páginas estáticas, RSS ou Atom. O Specto irá observa-las automaticamente." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Os observadores de Páginas da Internet podem usar uma margem de erro que lhe permite ajustar uma porcentagem mínima de variação. Isto lhe possibilita se adaptar a páginas que variam constantemente ou possuem muita propaganda." #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Clique uma vez em um observador para mostrar sua informação e duas vezes para exibir seu conteúdo." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Favor ajustar um intervalo de atualização razoável a fim de economizar banda e preveni-lo de ser bloqueado pelos provedores de conteúdo." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "Notificador: Tamanho Ajustado" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "Notificador: Tamanho não ajustado" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "Notificador: Posição ajustada" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "Notificador: Posição não ajustada" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Dica do Dia:" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Nome:" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Última Atualização:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Localização:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Margem de erro:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Computador:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Nome de Usuário:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "Arquivo/pasta:" #: ../spectlib/notifier.py:852 msgid "Process:" msgstr "Processo:" #: ../spectlib/notifier.py:897 msgid "Port:" msgstr "Porta:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Preferências Salvas." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Nenhum Observador atualizado." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Observadores Atualizados:\n" #: ../spectlib/trayicon.py:79 msgid "website" msgstr "Página de Internet" #: ../spectlib/trayicon.py:79 msgid "websites" msgstr "Páginas de Internet" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "Conta de email" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "Contas de email" #: ../spectlib/trayicon.py:93 msgid "file/folder" msgstr "Arquivo/pasta" #: ../spectlib/trayicon.py:93 msgid "files/folders" msgstr "Arquivos/pastas" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "processo" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "processos" #: ../spectlib/trayicon.py:108 msgid "port" msgstr "porta" #: ../spectlib/trayicon.py:108 msgid "ports" msgstr "portas" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Fechar Janela" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Exibir janela" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "O Observador, %s, tem um problema. Favor verificar o Registro de Erros." #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "O Observador \"%s\" está indicado como atualizado no notificador" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "Observador \"%s\" Atualizado!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "A página de internet, %s, foi atualizada." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "Sua conta de email, %s, tem %d nova(s) mensagem(s)." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "Sua conta de email, %s, tem %d novas mensagens não lidas, totalizando %s" #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "Sua conta de email, %s, tem nova(s) mensagem(s)." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "O arquivo/pasta, %s, foi atualizado." #: ../spectlib/watch.py:125 msgid "The process, %s, has stopped." msgstr "O processo, %s, foi parado." #: ../spectlib/watch.py:127 msgid "The process, %s, has started." msgstr "O processo, %s, foi iniciado." #: ../spectlib/watch.py:132 msgid "The connection, %s, was closed." msgstr "A conexão, %s, foi fechada." #: ../spectlib/watch.py:134 msgid "The connection, %s, was established." msgstr "A conexão, %s, foi estabelecida." #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Ainda não foi implementado" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Observador de Arquivo Desconhecido" #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "Atualizando Observador: \"%s\"" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "Observador: \"%s\" tem um erro" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "Atualização: %s foi modificada" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "Atualização: %s foi criada" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "Desconsiderando %s" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "Atualização: %s removida" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Observador de email desconhecido" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "Conexão de rede não detectada" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "O Observador: \"%s\" tem um erro: Nome de Usuário/Senha incorretos" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "Observador: \"%s\" tem um erro: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "Caixa de correio não existe" #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "Observador: \"%s\" tem um erro:" #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 msgid "Unknown Process Watch" msgstr "Observador de Processo Desconhecido" #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "Observador: \"%s\" tem um erro: url vazia" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Porcentagem de Diferença:%s (Observador: \"%s\")" specto-0.3.1/po/tr/0000755000175000017500000000000011226433142012457 5ustar jeffjeffspecto-0.3.1/po/tr/specto.mo0000644000175000017500000003023011041474551014313 0ustar jeffjeff|       ' 4AQbt %-    0 H&U2|  !0 5BJQ Wcilq (05;Zn~  ~5.di o{    _ [go&+ I)CSX]p 7%: IUn .zu6K',s 0K]q v   ,?Vi} *=PXa%%:I a my , *D o     !/(!X!g!!2!!!!""""$"*":"K"S"X""" ##+#4#:#">#a### ####Dc$$$ $$$ $$ %!%9%J%Y%pk% % %%& &"6&Y&x&YG'"''' ''(#(@([( x( ((3((( ))/)N)f)')A))*+BV,T,3,"-1-O-b-!}---"--.0. 6.D.X."^. ../.../"/@/_/|/// /+//00'090O0g0 0 0=ON<3}cYyEim"[L;*M( #b2FJ\&kH RCPuU w$x+1/@?`W8.dgo{)ZtS s47:D>j_QBl6| n]^!IGT5a9rA-f,KheVp~%q'X0v zSpecto is currently busy and cannot quit yet. This may be because it is checking for watch updates. However, you can try forcing it to quit by clicking the murder button.Debugging and LoggingDisplayError Margin:File/folder:General settingsHost:Last Updated:Location:Name:Port:Process:Username:Watch nameA problem occuredA watch is updatedActiveAdd a WatchAll Debug Info Warning Error CriticalAlways show the icon in the notification areaBy ActiveBy NameBy Watch TypeCannot quit yetChoose a file or folderDeselect allDifference percentage:%s (Watch: "%s")Display the notification window in the window listDuration (in seconds):Edit existing watchEdit watch: Enable debug mode and loggingError LogError Margin (%):Export watchesFileFile/folder:Filter:FolderGmailHide windowHost:IDIMAPIf activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs.ImapImport watchesLogsMailbox does not existMurder!NameName:No network connection detectedNo updated watches.No updates yet.Not implemented yetNotificationsPOP3Password:Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers.Pop toasts from the tray icon when a watch is updatedPop3Port:PreferencesPreferences saved.Process:Protocol:Refresh Interval:Save AsSeconds Minutes Hours DaysSelect a FileSelect allShow windowSingle-click an existing watch to display information, and double-click it to open the content.Skipping %sSortingSpecto is already running!TYPEThe connection, %s, was closed.The connection, %s, was established.The watch name is already in useThe watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one? If you want to create a new one, you need to choose a different name.The watch, %s, has a problem. You may need to check the error log.The website, %s, has been updated.Tip of the Day:TypeURL:Unknown File WatchUnknown Mail WatchUnknown Process WatchUpdated watches: Updating watch: "%s"Use SSL:User:Username:Watch "%s" is already marked as updated in the notifierWatch "%s" updated!Watch : "%s" edited.Watch SettingsWatch Type:Watch: "%s" has an errorWatch: "%s" has error: Watch: "%s" has error: %sWatch: "%s" has error: empty urlWatch: "%s" has error: wrong username/passwordWebsite watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising.While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto.You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them.Your email account, %s, has %d new mail.Your email account, %s, has %d new unread mails, totalling %sYour email account, %s, has new mail._Clear Alladd watch: already visibleadd watch: createadd watch: recreateedit watch: already visibleedit watch: createedit watch: recreateerror log: already visibleerror log: createerror log: recreatefilefile/folderfiles/foldersfoldergmail (%s unread)mail accountmail accountsno GTK, activating console modenotifier: hidenotifier: position not setnotifier: position setnotifier: reappearnotifier: size not setnotifier: size setpreferences: createpreferences: reappearprocessprocessesremoved logs from watch: "%s"translator-creditsupdate: %s removedupdate: %s was createdupdate: %s was modifiedwatch "%s" openedwatch "%s" startedwatch "%s" stoppedwebsitewebsitesProject-Id-Version: specto Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: Tue Mar 13 23:10:56 2007 PO-Revision-Date: 2007-05-29 18:28-0500 Last-Translator: Jeff Fortin Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rosetta-Export-Date: 2007-05-10 19:48:11+0000 Specto şu anda meşgul ve henüz sonlandırılamaz. Bunun nedeni izleme güncellemelerini kontrol etmekte olması olabilir. Yine de "Cinayet!" düğmesine basarak programı sonlanmaya zorlayabilirsiniz.Hata ayıklama ve günlüklemeGörüntüHata Payı:Dosya/klasör:Genel ayarlarMakine:Son Güncelleme:Yer:Ad::Bağlantı noktası:İşlem:Kullanıcı Adı:İzleme adıBir sorun ortaya çıktıBir izleme güncellendiEtkinİzleme EkleTüm Hata Ayıklama Bilgi Uyarı Hata KritikBildirim alanında her zaman ikonu gösterFaaliyet Durumuna GöreAda Göreİzleme Türüne GöreHenüz çıkmak mümkün değilBir dosya ya da dizin seçinizTümününün seçimini kaldırFark yüzdesi:s% (İzleme: "%s")Bildirim penceresini pencere listesinde gösterSüre (saniye)Varolan izlemeyi düzenleİzleme Düzenle Hata ayıklama ve günlükleme modunu etkinleştirHata GünlüğüHata Payı (%):İzlemeleri Dışa AktarDosyaDosya/Klasör:Fİltre:DizinGMailPencereyi gizleBilgisayar Adı:No (ID)IMAPEtkinleştirildiğinde, Specto'yu terminalden çalıştırırken daha fazla bilgi alacaksınız, ve günlüklere daha fazla bilgi yazılacak.IMAPİzlemeleri İçe AktarGünlüklerBöyle bir posta kutusu yokCinayet!İsimAd:Ağ bağlantısı tesbit edilemediGüncellenmiş bir izleme yok.Henüz güncelleme yok.Henüz kullanımda değilBildirimlerPOP3Parola :Lütfen bant genişliğinden tasarruf etmek ve içerik sağlayıcılar tarafından engellenmeyi önlemek için makul bir tazeleme aralığı seçiniz.Bir izleme güncellendiğinde bildirim alaını ikonundan uyarı verPOP3Bağlantı Noktası:TercihlerTercihler kaydedildi.İşlem:Protokol:Tazeleme aralığı:Farklı İsimle KaydetSaniye Dakika Saat GünBir Dosya SeçinTümünü SeçPencereyi gösterVarolan bir izlemeye tek tıklayarak bilgi görüntüleyebilir, ve çift tıklayarak içeriğini açabilirsiniz.%s atlanıyorSıralamaSpecto zaten çalışmakta!TÜR%s bağlantısı kapandı%s bağlantısı sağlandıİzleme adı zaten kullanımdaBelirttiğiniz izleme adı zaten kullanımda! Varolan izlemeyi düzenlemek mi, yoksa yeni bir izleme yaratmak mı istiyorsunuz? Eğer yeni bir izleme yaratmak istiyorsanız, farklı bir isim seçmelisiniz.%s izlemesinde bir sorun var. Daha fazla bilgi için hata günlüğüne bakınız.%s web sitesi güncellendi.Günün Püf Noktası:TürAdres (URL):Bilinmeyen Dosya İzlemesiBilinmeyen Posta İzlemesiBilinmeyen İşlem İzlemesiGüncellenmiş izlemeler: "%s" izlemesi güncelleniyorSSL Kullan:Kullanıcı:Kulanıcı Adı:"%s" izlemesi zaten güncellenmiş olarak işaretli"%s" izlemesi güncellendi!"%s" izlemesi düzenlendi.İzleme Ayarlarıİzleme Türü:"%s" izlemesinde bir hata var"%s" izlemesinde hata: "%s" izlemesinde hata: %s"%s" izlemesinde hata: boş adres (URL)"%s" izlemesinde bir hata var: yanlış kullanıcı adı / şifreWeb sitesi izlemelerinde asgari bir fark yüzdesi belirtmenize imkan sağlayan bir "hata payı" kullanabilirsiniz. Bu, sürekli değişen veya fazlaca reklam içeren web sitelerine uyumluluğu sağlayabilir.Hata ayıklama modunda, Specto sorunları çözmenize yardımcı olmak için daha fazla bilgi temin edecektir. Günlükleme tüm bu bilgiyi bir günlük dosyasına yazacaktır. Bunu programcıların Specto'yu geliştirmesine yardım etmek için kullanabilirsiniz.Her tür web sitesini izleme olarak ekleyebilirsiniz. Statik sayfalar, RSS ve Atom kaynakları, vs. Specto bunları otomatik olarak tanıyacaktır.%s adlı posta hesabınızda %d adet yeni posta var.%s adlı posta hesabınızda %d okunmamış, ve toplamda %s posta var.%s adlı posta hesabınızda yeni posta var._Tümünü Silizleme ekle: zaten görünürizleme ekle: yaratizleme ekle: yeniden yaratizleme düzenle: zaten görünürizleme düzenle: yaratizleme düzenle: yeniden yarathata günlüğü: zaten görünürhata günlüğü: yarathata günlüğü: yeniden yaratdosyadosya/klasördosyalar/klasörlerdizingmail (%s adet okunmamış)posta hesabıposta hesaplarıGTK bulunamadı, konsol modu etkinleştiriliyorhatırlatıcı: saklahatırlatma: yer ayarlanmadıhatırlatma: yer ayarlıhatırlatıcı: yeniden görünürhatırlatma: ebat ayarlanmadıhatırlatma: ebat ayarlandıTercihler: yarattercihler: yeinden görünürişlemişlemler"%s" izlemesinden günlükler çıkarıldıMurat Güneş %s kaldırıldı%s yaratıldı%s değiştirildiizleme "%s" açıldı"%s" izlemesi başladı"%s" izlemesi durdurulduweb sitesiweb sitelerispecto-0.3.1/po/tr/specto.po0000644000175000017500000005016711041474551014331 0ustar jeffjeff# Turkish translation for specto # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the specto package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: specto\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: Tue Mar 13 23:10:56 2007\n" "PO-Revision-Date: 2007-05-29 18:28-0500\n" "Last-Translator: Jeff Fortin \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Rosetta-Export-Date: 2007-05-10 19:48:11+0000\n" #: ../data/glade/add_watch.glade.h:1 msgid "General settings" msgstr "Genel ayarlar" #: ../data/glade/add_watch.glade.h:2 msgid "Watch name" msgstr "İzleme adı" #: ../data/glade/add_watch.glade.h:3 msgid "Add a Watch" msgstr "İzleme Ekle" #: ../data/glade/add_watch.glade.h:4 #, fuzzy msgid "" "Choose \n" "an other name" msgstr "Seç" #: ../data/glade/add_watch.glade.h:6 msgid "" "Edit existing\n" "watch" msgstr "" "Varolan izlemeyi\n" "düzenle" #: ../data/glade/add_watch.glade.h:8 #: ../data/glade/edit_watch.glade.h:2 msgid "Name:" msgstr "Ad:" #: ../data/glade/add_watch.glade.h:9 #: ../data/glade/edit_watch.glade.h:3 msgid "Refresh Interval:" msgstr "Tazeleme aralığı:" #: ../data/glade/add_watch.glade.h:10 #: ../data/glade/edit_watch.glade.h:5 msgid "" "Seconds\n" "Minutes\n" "Hours\n" "Days" msgstr "" "Saniye\n" "Dakika\n" "Saat\n" "Gün" #: ../data/glade/add_watch.glade.h:14 msgid "The watch name is already in use" msgstr "İzleme adı zaten kullanımda" #: ../data/glade/add_watch.glade.h:15 msgid "" "The watch name you specified already exists! Did you mean to modify that existing watch, or did you really want to create a new one?\n" "\n" "If you want to create a new one, you need to choose a different name." msgstr "" "Belirttiğiniz izleme adı zaten kullanımda! Varolan izlemeyi düzenlemek mi, yoksa yeni bir izleme yaratmak mı istiyorsunuz?\n" "\n" "Eğer yeni bir izleme yaratmak istiyorsanız, farklı bir isim seçmelisiniz." #: ../data/glade/add_watch.glade.h:18 msgid "Watch Type:" msgstr "İzleme Türü:" #: ../data/glade/add_watch.glade.h:19 #, fuzzy msgid "" "Website\n" "Email\n" "Files or folders\n" "Process\n" "Port" msgstr "" "Web Sitesi\n" "E-Posta\n" "Dosyalar veya Klasörler\n" "İşlem\n" "Port" #: ../data/glade/edit_watch.glade.h:1 msgid "Error Log" msgstr "Hata Günlüğü" #: ../data/glade/edit_watch.glade.h:4 #: ../data/glade/log_dialog.glade.h:9 msgid "Save As" msgstr "Farklı İsimle Kaydet" #: ../data/glade/edit_watch.glade.h:9 msgid "Watch Settings" msgstr "İzleme Ayarları" #: ../data/glade/import_export.glade.h:1 msgid "Deselect all" msgstr "Tümününün seçimini kaldır" #: ../data/glade/import_export.glade.h:2 msgid "Select all" msgstr "Tümünü Seç" #: ../data/glade/log_dialog.glade.h:1 msgid "" "All\n" "Debug\n" "Info\n" "Warning\n" "Error\n" "Critical" msgstr "" "Tüm\n" "Hata Ayıklama\n" "Bilgi\n" "Uyarı\n" "Hata\n" "Kritik" #: ../data/glade/log_dialog.glade.h:7 msgid "Filter:" msgstr "Fİltre:" #: ../data/glade/log_dialog.glade.h:8 msgid "Logs" msgstr "Günlükler" #: ../data/glade/notifier.glade.h:1 msgid "By Active" msgstr "Faaliyet Durumuna Göre" #: ../data/glade/notifier.glade.h:2 msgid "By Name" msgstr "Ada Göre" #: ../data/glade/notifier.glade.h:3 msgid "By Watch Type" msgstr "İzleme Türüne Göre" #: ../data/glade/notifier.glade.h:4 #, fuzzy msgid "Display _All Watches" msgstr "Tüm _İzlemeleri Göster" #: ../data/glade/notifier.glade.h:5 #, fuzzy msgid "Display _Toolbar" msgstr "Araç _Çubuğunu Göster" #: ../data/glade/notifier.glade.h:6 msgid "Notifications" msgstr "Bildirimler" #: ../data/glade/notifier.glade.h:7 msgid "Sorting" msgstr "Sıralama" #: ../data/glade/notifier.glade.h:8 msgid "_Clear All" msgstr "_Tümünü Sil" #: ../data/glade/notifier.glade.h:9 msgid "_Edit" msgstr "" #: ../data/glade/notifier.glade.h:10 msgid "_Error Log" msgstr "" #: ../data/glade/notifier.glade.h:11 msgid "_Export Watches" msgstr "" #: ../data/glade/notifier.glade.h:12 msgid "_File" msgstr "" #: ../data/glade/notifier.glade.h:13 msgid "_Help" msgstr "" #: ../data/glade/notifier.glade.h:14 msgid "_Import Watches" msgstr "" #: ../data/glade/notifier.glade.h:15 msgid "_View" msgstr "" #: ../data/glade/preferences.glade.h:1 msgid "Debugging and Logging" msgstr "Hata ayıklama ve günlükleme" #: ../data/glade/preferences.glade.h:2 msgid "Display" msgstr "Görüntü" #: ../data/glade/preferences.glade.h:3 msgid "Sounds" msgstr "" #: ../data/glade/preferences.glade.h:4 msgid "A problem occured" msgstr "Bir sorun ortaya çıktı" #: ../data/glade/preferences.glade.h:5 msgid "A watch is updated" msgstr "Bir izleme güncellendi" #: ../data/glade/preferences.glade.h:6 msgid "Always show the icon in the notification area" msgstr "Bildirim alanında her zaman ikonu göster" #: ../data/glade/preferences.glade.h:7 msgid "Display the notification window in the window list" msgstr "Bildirim penceresini pencere listesinde göster" #: ../data/glade/preferences.glade.h:8 msgid "Duration (in seconds):" msgstr "Süre (saniye)" #: ../data/glade/preferences.glade.h:9 msgid "Enable debug mode and logging" msgstr "Hata ayıklama ve günlükleme modunu etkinleştir" #: ../data/glade/preferences.glade.h:10 msgid "If activated, you will receive more information when running Specto from a terminal, and more information will be printed to the logs." msgstr "Etkinleştirildiğinde, Specto'yu terminalden çalıştırırken daha fazla bilgi alacaksınız, ve günlüklere daha fazla bilgi yazılacak." #: ../data/glade/preferences.glade.h:11 msgid "Pop toasts from the tray icon when a watch is updated" msgstr "Bir izleme güncellendiğinde bildirim alaını ikonundan uyarı ver" #: ../data/glade/preferences.glade.h:12 msgid "Preferences" msgstr "Tercihler" #: ../data/glade/preferences.glade.h:13 msgid "Select a File" msgstr "Bir Dosya Seçin" #: ../data/glade/preferences.glade.h:14 msgid "While in debug mode, Specto will provide more information in order to help you diagnose problems. Logging will save all this information to a log file. You can use this to help developers improve Specto." msgstr "Hata ayıklama modunda, Specto sorunları çözmenize yardımcı olmak için daha fazla bilgi temin edecektir. Günlükleme tüm bu bilgiyi bir günlük dosyasına yazacaktır. Bunu programcıların Specto'yu geliştirmesine yardım etmek için kullanabilirsiniz." #: ../spectlib/about.py:57 msgid "translator-credits" msgstr "Murat Güneş " #: ../spectlib/add_watch.py:165 msgid "file" msgstr "dosya" #: ../spectlib/add_watch.py:167 msgid "folder" msgstr "dizin" #: ../spectlib/add_watch.py:311 #: ../spectlib/edit_watch.py:207 msgid "URL:" msgstr "Adres (URL):" #: ../spectlib/add_watch.py:325 #: ../spectlib/edit_watch.py:218 msgid "Error Margin (%):" msgstr "Hata Payı (%):" #: ../spectlib/add_watch.py:346 #: ../spectlib/edit_watch.py:244 msgid "Protocol:" msgstr "Protokol:" #: ../spectlib/add_watch.py:355 msgid "POP3" msgstr "POP3" #: ../spectlib/add_watch.py:361 msgid "IMAP" msgstr "IMAP" #: ../spectlib/add_watch.py:366 #: ../spectlib/edit_watch.py:318 msgid "Gmail" msgstr "GMail" #: ../spectlib/add_watch.py:372 msgid "User:" msgstr "Kullanıcı:" #: ../spectlib/add_watch.py:382 #: ../spectlib/edit_watch.py:266 msgid "Password:" msgstr "Parola :" #: ../spectlib/add_watch.py:393 #: ../spectlib/edit_watch.py:278 msgid "Host:" msgstr "Bilgisayar Adı:" #: ../spectlib/add_watch.py:403 #: ../spectlib/edit_watch.py:286 msgid "Use SSL:" msgstr "SSL Kullan:" #: ../spectlib/add_watch.py:418 #: ../spectlib/edit_watch.py:330 msgid "File/folder:" msgstr "Dosya/Klasör:" #: ../spectlib/add_watch.py:428 #: ../spectlib/edit_watch.py:340 msgid "File" msgstr "Dosya" #: ../spectlib/add_watch.py:434 #: ../spectlib/edit_watch.py:345 msgid "Folder" msgstr "Dizin" #: ../spectlib/add_watch.py:440 #: ../spectlib/edit_watch.py:351 msgid "Choose a file or folder" msgstr "Bir dosya ya da dizin seçiniz" #: ../spectlib/add_watch.py:449 #: ../spectlib/edit_watch.py:370 msgid "Process:" msgstr "İşlem:" #: ../spectlib/add_watch.py:464 #: ../spectlib/edit_watch.py:388 msgid "Port:" msgstr "Bağlantı Noktası:" #: ../spectlib/edit_watch.py:66 msgid "Edit watch: " msgstr "İzleme Düzenle " #: ../spectlib/edit_watch.py:170 msgid "Watch : \"%s\" edited." msgstr "\"%s\" izlemesi düzenlendi." #: ../spectlib/edit_watch.py:182 msgid "removed logs from watch: \"%s\"" msgstr "\"%s\" izlemesinden günlükler çıkarıldı" #: ../spectlib/edit_watch.py:255 msgid "Username:" msgstr "Kulanıcı Adı:" #: ../spectlib/edit_watch.py:294 msgid "Pop3" msgstr "POP3" #: ../spectlib/edit_watch.py:306 msgid "Imap" msgstr "IMAP" #: ../spectlib/import_export.py:69 #: ../spectlib/import_export.py:70 msgid "Import watches" msgstr "İzlemeleri İçe Aktar" #: ../spectlib/import_export.py:72 #: ../spectlib/import_export.py:73 msgid "Export watches" msgstr "İzlemeleri Dışa Aktar" #: ../spectlib/import_export.py:84 #: ../spectlib/notifier.py:612 msgid "Active" msgstr "Etkin" #: ../spectlib/import_export.py:92 #: ../spectlib/notifier.py:619 msgid "Type" msgstr "Tür" #: ../spectlib/import_export.py:101 #: ../spectlib/notifier.py:628 msgid "Name" msgstr "İsim" #: ../spectlib/import_export.py:110 #: ../spectlib/notifier.py:637 msgid "ID" msgstr "No (ID)" #: ../spectlib/import_export.py:117 #: ../spectlib/notifier.py:644 msgid "TYPE" msgstr "TÜR" #: ../spectlib/main.py:65 msgid "no GTK, activating console mode" msgstr "GTK bulunamadı, konsol modu etkinleştiriliyor" #: ../spectlib/main.py:155 msgid "Specto is already running!" msgstr "Specto zaten çalışmakta!" #: ../spectlib/main.py:237 #: ../spectlib/watch.py:265 msgid "No updates yet." msgstr "Henüz güncelleme yok." #: ../spectlib/main.py:292 msgid "watch \"%s\" started" msgstr "\"%s\" izlemesi başladı" #: ../spectlib/main.py:297 msgid "watch \"%s\" stopped" msgstr "\"%s\" izlemesi durduruldu" #: ../spectlib/main.py:482 #: ../spectlib/main.py:491 msgid "notifier: reappear" msgstr "hatırlatıcı: yeniden görünür" #: ../spectlib/main.py:487 msgid "notifier: hide" msgstr "hatırlatıcı: sakla" #: ../spectlib/main.py:500 msgid "preferences: create" msgstr "Tercihler: yarat" #: ../spectlib/main.py:503 msgid "preferences: reappear" msgstr "tercihler: yeinden görünür" #: ../spectlib/main.py:510 msgid "error log: create" msgstr "hata günlüğü: yarat" #: ../spectlib/main.py:512 msgid "error log: already visible" msgstr "hata günlüğü: zaten görünür" #: ../spectlib/main.py:515 msgid "error log: recreate" msgstr "hata günlüğü: yeniden yarat" #: ../spectlib/main.py:521 msgid "add watch: create" msgstr "izleme ekle: yarat" #: ../spectlib/main.py:523 msgid "add watch: already visible" msgstr "izleme ekle: zaten görünür" #: ../spectlib/main.py:526 msgid "add watch: recreate" msgstr "izleme ekle: yeniden yarat" #: ../spectlib/main.py:540 msgid "edit watch: create" msgstr "izleme düzenle: yarat" #: ../spectlib/main.py:542 msgid "edit watch: already visible" msgstr "izleme düzenle: zaten görünür" #: ../spectlib/main.py:545 msgid "edit watch: recreate" msgstr "izleme düzenle: yeniden yarat" #: ../spectlib/main.py:578 msgid "Cannot quit yet" msgstr "Henüz çıkmak mümkün değil" #: ../spectlib/main.py:582 msgid "Murder!" msgstr "Cinayet!" #: ../spectlib/main.py:593 msgid "" "Specto is currently busy and cannot quit yet.\n" "\n" "This may be because it is checking for watch updates.\n" "However, you can try forcing it to quit by clicking the murder button." msgstr "" "Specto şu anda meşgul ve henüz sonlandırılamaz.\n" "\n" "Bunun nedeni izleme güncellemelerini kontrol etmekte olması olabilir.\n" "Yine de \"Cinayet!\" düğmesine basarak programı sonlanmaya zorlayabilirsiniz." #: ../spectlib/notifier.py:323 msgid "The network connection seems to be down, watches will not update until then." msgstr "" #: ../spectlib/notifier.py:382 msgid "gmail (%s unread)" msgstr "gmail (%s adet okunmamış)" #: ../spectlib/notifier.py:442 msgid "watch \"%s\" opened" msgstr "izleme \"%s\" açıldı" #: ../spectlib/notifier.py:481 msgid "You can add all kinds of websites as watches. Static pages, RSS or Atom feeds, etc. Specto will automatically handle them." msgstr "Her tür web sitesini izleme olarak ekleyebilirsiniz. Statik sayfalar, RSS ve Atom kaynakları, vs. Specto bunları otomatik olarak tanıyacaktır." #: ../spectlib/notifier.py:482 msgid "Website watches can use an error margin that allows you to set a minimum difference percentage. This allows you to adapt to websites that change constantly or have lots of advertising." msgstr "Web sitesi izlemelerinde asgari bir fark yüzdesi belirtmenize imkan sağlayan bir \"hata payı\" kullanabilirsiniz. Bu, sürekli değişen veya fazlaca reklam içeren web sitelerine uyumluluğu sağlayabilir." #: ../spectlib/notifier.py:483 msgid "Single-click an existing watch to display information, and double-click it to open the content." msgstr "Varolan bir izlemeye tek tıklayarak bilgi görüntüleyebilir, ve çift tıklayarak içeriğini açabilirsiniz." #: ../spectlib/notifier.py:484 msgid "Please set a reasonable refresh interval in order to save bandwidth and prevent you from being blocked from content providers." msgstr "Lütfen bant genişliğinden tasarruf etmek ve içerik sağlayıcılar tarafından engellenmeyi önlemek için makul bir tazeleme aralığı seçiniz." #: ../spectlib/notifier.py:544 msgid "notifier: size set" msgstr "hatırlatma: ebat ayarlandı" #: ../spectlib/notifier.py:546 msgid "notifier: size not set" msgstr "hatırlatma: ebat ayarlanmadı" #: ../spectlib/notifier.py:550 msgid "notifier: position set" msgstr "hatırlatma: yer ayarlı" #: ../spectlib/notifier.py:552 msgid "notifier: position not set" msgstr "hatırlatma: yer ayarlanmadı" #: ../spectlib/notifier.py:657 msgid "Tip of the Day:" msgstr "Günün Püf Noktası:" #: ../spectlib/notifier.py:675 #: ../spectlib/notifier.py:730 #: ../spectlib/notifier.py:785 #: ../spectlib/notifier.py:828 #: ../spectlib/notifier.py:873 msgid "Name:" msgstr "Ad::" #: ../spectlib/notifier.py:687 #: ../spectlib/notifier.py:742 #: ../spectlib/notifier.py:797 #: ../spectlib/notifier.py:840 #: ../spectlib/notifier.py:885 msgid "Last Updated:" msgstr "Son Güncelleme:" #: ../spectlib/notifier.py:699 msgid "Location:" msgstr "Yer:" #: ../spectlib/notifier.py:711 msgid "Error Margin:" msgstr "Hata Payı:" #: ../spectlib/notifier.py:754 msgid "Host:" msgstr "Makine:" #: ../spectlib/notifier.py:766 msgid "Username:" msgstr "Kullanıcı Adı:" #: ../spectlib/notifier.py:809 msgid "File/folder:" msgstr "Dosya/klasör:" #: ../spectlib/notifier.py:852 msgid "Process:" msgstr "İşlem:" #: ../spectlib/notifier.py:897 msgid "Port:" msgstr "Bağlantı noktası:" #: ../spectlib/preferences.py:98 msgid "Preferences saved." msgstr "Tercihler kaydedildi." #: ../spectlib/trayicon.py:75 msgid "No updated watches." msgstr "Güncellenmiş bir izleme yok." #: ../spectlib/trayicon.py:77 msgid "Updated watches:\n" msgstr "Güncellenmiş izlemeler:\n" #: ../spectlib/trayicon.py:79 msgid "website" msgstr "web sitesi" #: ../spectlib/trayicon.py:79 msgid "websites" msgstr "web siteleri" #: ../spectlib/trayicon.py:85 msgid "mail account" msgstr "posta hesabı" #: ../spectlib/trayicon.py:85 msgid "mail accounts" msgstr "posta hesapları" #: ../spectlib/trayicon.py:93 msgid "file/folder" msgstr "dosya/klasör" #: ../spectlib/trayicon.py:93 msgid "files/folders" msgstr "dosyalar/klasörler" #: ../spectlib/trayicon.py:100 msgid "process" msgstr "işlem" #: ../spectlib/trayicon.py:100 msgid "processes" msgstr "işlemler" #: ../spectlib/trayicon.py:108 #, fuzzy msgid "port" msgstr "Bağlantı Noktası:" #: ../spectlib/trayicon.py:108 #, fuzzy msgid "ports" msgstr "Bağlantı Noktası:" #: ../spectlib/trayicon.py:143 msgid "Hide window" msgstr "Pencereyi gizle" #: ../spectlib/trayicon.py:145 msgid "Show window" msgstr "Pencereyi göster" #: ../spectlib/watch.py:63 msgid "The watch, %s, has a problem. You may need to check the error log." msgstr "%s izlemesinde bir sorun var. Daha fazla bilgi için hata günlüğüne bakınız." #: ../spectlib/watch.py:70 msgid "Watch \"%s\" is already marked as updated in the notifier" msgstr "\"%s\" izlemesi zaten güncellenmiş olarak işaretli" #: ../spectlib/watch.py:85 msgid "Watch \"%s\" updated!" msgstr "\"%s\" izlemesi güncellendi!" #: ../spectlib/watch.py:98 msgid "The website, %s, has been updated." msgstr "%s web sitesi güncellendi." #: ../spectlib/watch.py:104 #: ../spectlib/watch.py:113 msgid "Your email account, %s, has %d new mail." msgstr "%s adlı posta hesabınızda %d adet yeni posta var." #: ../spectlib/watch.py:106 #: ../spectlib/watch.py:115 msgid "Your email account, %s, has %d new unread mails, totalling %s" msgstr "%s adlı posta hesabınızda %d okunmamış, ve toplamda %s posta var." #: ../spectlib/watch.py:109 msgid "Your email account, %s, has new mail." msgstr "%s adlı posta hesabınızda yeni posta var." #: ../spectlib/watch.py:122 msgid "The file/folder, %s, has been updated." msgstr "" #: ../spectlib/watch.py:125 msgid "The process, %s, has stopped." msgstr "" #: ../spectlib/watch.py:127 msgid "The process, %s, has started." msgstr "" #: ../spectlib/watch.py:132 msgid "The connection, %s, was closed." msgstr "%s bağlantısı kapandı" #: ../spectlib/watch.py:134 msgid "The connection, %s, was established." msgstr "%s bağlantısı sağlandı" #: ../spectlib/watch.py:138 msgid "Not implemented yet" msgstr "Henüz kullanımda değil" #: ../spectlib/watch_file.py:43 msgid "Unknown File Watch" msgstr "Bilinmeyen Dosya İzlemesi" #: ../spectlib/watch_file.py:77 #: ../spectlib/watch_mail_gmail.py:87 #: ../spectlib/watch_mail_imap.py:83 #: ../spectlib/watch_mail_pop3.py:94 #: ../spectlib/watch_port.py:70 #: ../spectlib/watch_process.py:71 #: ../spectlib/watch_web_static.py:101 msgid "Updating watch: \"%s\"" msgstr "\"%s\" izlemesi güncelleniyor" #: ../spectlib/watch_file.py:100 #: ../spectlib/watch_port.py:83 #: ../spectlib/watch_process.py:85 msgid "Watch: \"%s\" has an error" msgstr "\"%s\" izlemesinde bir hata var" #: ../spectlib/watch_file.py:115 msgid "update: %s was modified" msgstr "%s değiştirildi" #: ../spectlib/watch_file.py:120 msgid "update: %s was created" msgstr "%s yaratıldı" #: ../spectlib/watch_file.py:134 msgid "Skipping %s" msgstr "%s atlanıyor" #: ../spectlib/watch_file.py:143 msgid "update: %s removed" msgstr "%s kaldırıldı" #: ../spectlib/watch_mail_gmail.py:44 #: ../spectlib/watch_mail_imap.py:42 #: ../spectlib/watch_mail_pop3.py:46 msgid "Unknown Mail Watch" msgstr "Bilinmeyen Posta İzlemesi" #: ../spectlib/watch_mail_gmail.py:76 #: ../spectlib/watch_mail_imap.py:73 #: ../spectlib/watch_mail_pop3.py:83 #: ../spectlib/watch_web_static.py:89 msgid "No network connection detected" msgstr "Ağ bağlantısı tesbit edilemedi" #: ../spectlib/watch_mail_gmail.py:108 msgid "Watch: \"%s\" has error: wrong username/password" msgstr "\"%s\" izlemesinde bir hata var: yanlış kullanıcı adı / şifre" #: ../spectlib/watch_mail_imap.py:92 #: ../spectlib/watch_mail_imap.py:116 msgid "Watch: \"%s\" has error: %s" msgstr "\"%s\" izlemesinde hata: %s" #: ../spectlib/watch_mail_imap.py:105 msgid "Mailbox does not exist" msgstr "Böyle bir posta kutusu yok" #: ../spectlib/watch_mail_pop3.py:103 #: ../spectlib/watch_mail_pop3.py:132 #: ../spectlib/watch_web_static.py:121 msgid "Watch: \"%s\" has error: " msgstr "\"%s\" izlemesinde hata: " #: ../spectlib/watch_port.py:38 #: ../spectlib/watch_process.py:39 msgid "Unknown Process Watch" msgstr "Bilinmeyen İşlem İzlemesi" #: ../spectlib/watch_web_static.py:62 msgid "Watch: \"%s\" has error: empty url" msgstr "\"%s\" izlemesinde hata: boş adres (URL)" #: ../spectlib/watch_web_static.py:180 msgid "Difference percentage:%s (Watch: \"%s\")" msgstr "Fark yüzdesi:s% (İzleme: \"%s\")"