zim-0.60/0000775000175000017500000000000012140000463012076 5ustar jaapjaap00000000000000zim-0.60/LICENSE.txt0000644000175000017500000004310311544165551013741 0ustar jaapjaap00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. zim-0.60/README.txt0000644000175000017500000001260212132472704013607 0ustar jaapjaap00000000000000====== ABOUT ====== Zim - A Desktop Wiki Editor Zim is a graphical text editor used to maintain a collection of wiki pages. Each page can contain links to other pages, simple formatting and images. Pages are stored in a folder structure, like in an outliner, and can have attachments. Creating a new page is as easy as linking to a nonexistent page. All data is stored in plain text files with wiki formatting. Various plugins provide additional functionality, like a task list manager, an equation editor, a tray icon, and support for version control. Zim can be used to: * Keep an archive of notes * Take notes during meetings or lectures * Organize task lists * Draft blog entries and emails * Do brainstorming ====== COPYRIGHT ====== All files in this package, with the exception of those mentioned below are copyrighted and licensed as follows: Copyright 2008, 2012 Jaap Karssenberg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. == Translations == Translations are copyrighted by their respective translators. All translations that are entered through the launchpad website are distributed under the BSD license. See the translation files for detailed translator credits. == Included Files == The following files were included from other sources: * zim/inc/xdot.py - Copyright 2008 Jose Fonseca * zim/inc/arithmetic.py - Copyright 2010, 2011 Patricio Paez From the default Gnome icon theme: * pixmaps/task-list.png (was: stock_todo.png) * pixmaps/attachment.png (was: mail-attachment.png) From Gtk+ 2.8 * pixmaps/link.png (was: stock_connect_24.png) Other: * pixmaps/calendar.png (was: stock_calendar-view-month.png) Copyright 2007 by Jakub Steiner, released under GPL modifications copyright 2009 by Gabriel Hurley ====== INSTALLING ====== NOTE: To test zim it is not needed to install. You should be able to run it directly from the source directory by calling `./zim.py`. (To run a translated version from the source first call `./setup.py build_trans`.) First you should verify you have the dependencies zim needs. To list all dependencies check `./setup.py --requires`. You will at least need the following: * gtk+ >= 2.6 * python >= 2.6 * python-gtk * python-gobject * python-xdg (optional, but recommended) * xdg-utils (optional, but recommended) To verify zim is working properly on your system you can call the test suite using `./test.py`. Failures do not have to be critical, but in principle all tests should pass. Zim can be installed from source using: ./setup.py install Most plugins have additional requirements. These are listed in the plugin descriptions. ===== Ubuntu ===== On Ubuntu or other debian derived systems, the following packages should be installed: * python * libgtk2.0-0 * python-gtk2 * python-xdg ===== Windows ===== To install gtk, python and python-gtk on Windows see the instructions at http://www.pygtk.org . If you use python 2.5 you will also need to install the python simplejson module. This can be obtained from http://pypi.python.org . The python-xdg module is not usefull on Windows, so you can skip it. Once the dependencies are fulfilled you can run zim directly from the source directory. ===== Mac OS X ===== You can run zim on mac if you have the proper dependencies installed. If you are using Mac Ports packages installing the following ports should work: * python26 * py26-gtk * py26-simplejson * py26-xdg ===== Install Paths ===== If you install in a non-default location you may need to set the PYTHONPATH environment variable in order for zim to find it's python modules. For example, if you installed the modules below "/home/user/lib/zim" you need to set: PYTHONPATH=/home/user/lib Also zim uses the XDG paths to locate data and config files. If you get an error that zim can not find it's data files For example, if you installed the zim data files to "/home/user/share/zim" you need to set the data path like this: XDG_DATA_DIRS=/home/user/share:/usr/local/share:/usr/share ====== PACKAGING ====== To build a tree in a target directory you can use: ./setup.py install --root=/path/to/package/build/dir --skip-cmd Special attention may be needed to run xdg update commands in a post-install script. Recommended commands are: update-desktop-database update-mime-database /usr/share/mime ====== TRANSLATING ====== To contribute to translations onlne please go to http://launchpad.net. To test a new translation you can either download the snapshot from launchpad and run: ./tools/import-launchpad-translations.py launchpad-export.tar.gz Or you can edit the template zim.pot with your favourite editor. In that case you should add you new .po file to the po/ directory. After adding the .po file(s) you can compile the translation using: ./setup.py build_trans zim-0.60/data/0000775000175000017500000000000012140000463013007 5ustar jaapjaap00000000000000zim-0.60/data/manual/0000775000175000017500000000000012140000463014264 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/0000775000175000017500000000000012140000463015705 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Line_Sorter.txt0000664000175000017500000000051112061676023020705 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-12-11T19:28:07+01:00 ====== Line Sorter ====== This plugin adds a menu item to sort selected lines in alphabetical order. If the list is already sorted the order will be reversed (A-Z to Z-A). **Dependencies:** This plugin has no additional dependencies. zim-0.60/data/manual/Plugins/Inline_Calculator.txt0000644000175000017500000000273411622405211022045 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-08-31T22:25:42.585662 ====== Inline Calculator ====== This plugin allows you to evaluate simple mathematical expressions in zim. **Dependencies:** This plugin has no additional dependencies. **See also:** the [[Arithmetic|Arithmetic plugin]] which does something similar ===== Examples ===== Simple expressions can be evaluated on a single line: 3 + 3 = When you press "Tools" -> "Evaluate Math" the result of the expression is automatically added behind the "=" sign. Note that the cursor needs to be behind the expression you want to evaluate. If there is text on the same line before the expression it should end with an ":". For example: Fuel: 30 + 27.5 = Other words in front of the formula can result in errors. Apart from single line expressions you can also do multi-line summations and subtractions. The syntax for this is like this: 7 3 5 --- + In this case the cursor needs to be below the summation when you trigger the evaluation. ===== Functions ===== The following functions are available: From standard python functions ''' abs ord chr hex oct ''' From math and cmath modules in standard python library: ''' atan2 fmod frexp hypot ldexp modf acos asin atan cos cosh sin sinh tan tanh exp log10 sqrt ''' Other: ''' degrees radians log real imag sign log2 gcd lcm phase conj round floor ceil ''' Synonyms: ''' mag - same as abs() angle - same as phase() ''' ''Constants:'' ''' e pi j ''' zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor/0000775000175000017500000000000012140000463021123 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor/gnu_r_plot001.png0000644000175000017500000040775011544165551024256 0ustar jaapjaap00000000000000PNG  IHDR) IDATxw`eǟw^MO .EPDٻz;S x¿:MNmtiMP͍[~{YQণ0h`MHff={qp\ul2hnaO$@hDx6.ǀ[}xٺѳ GI".~0nƆ:rpY$BԜU NPOܳh!t>[6ʂҌgfٮHQH}Z :~g~g ~A1G-ݲ߹r!|l83jm+tz1O={"3B!Ӑh6)gh3wBA X/&-&QfedZ*_yO?x@уBkhZUȿ{+9[Y[43[<2 \laqd5V(z8|3cG;wv>;|;[,y8KEf]+$39R-L!fBA폔gHakc,_ qsg6tfQ><r~=1|;98oQZ֏7̝y޹Ss> B!Mޣ@ChB/2zv<@ݻ6`_<14pd#W-U8p 8/s1l ck@[<-/Bb' u "+t~'騽m78`Ǿ y`_wPD11o.7rmlHQ3jPiyOQ-sVֈcfB y1f~K>+fF>^oX}ݷ+*a|d|HS(3А8dZ᪶MP\ػgѳ\o9 Ղz猷?x8/:y# {8Cm_ř @Au8;F(#2a܌l%$騽M^BG~;8(@/pE> -Oy@h:YGΨ5@9탡xxq: V~|] g>z<; NZE&l&y?Q3i=z c|1$tHzEבZ:u1 Sެ7.<Qvv=F^p+gУW6im @ڔIN b6g n. G~Z g{$c-@7G0yC8yGFvLwL7@Ͼ^nVzp][$:4 G?{rc7Wqg27ٿ0c&L*=\P0{MI!Őd.2u@~տ3ɼp;31ke]0j3K/iqɹz#4-bJ34hcqbuRӳhp}c) Ⱦk#5$騣U3L8G7Fuc}l}. bRQG7&7Y&]b:%r˕Ƙ/~|$߸y:S;v:#^ojUoSЃ,>gRoc-&i`굹J. d= @di&aF>^cGPZ%%O_| dF=Yc;|4c+r~wQ%GikT.cߌum9c]u t-^0Ƹ\dqˤ9 '~F?Py/NG6F(]/M #15->ϫ8m4i2qNS{忽/nۻ+Χ?ƨ:,2}ON{Ho`Yr{Ⱦ6NF_ ;ve{VtLϝzC~[VgL?EASd-###OZFFF" L?Eh~,2222Yeddd)@Sd-###OZFFF" L?Eh~,2222Yeddd)@Sd-###ONYOB7O'm-yf 6mk6ȜA,^${eS'-q|Ux+n|.%|7<\?u,R :%y#dOM ԭzOJΤf$6n3v~ Ğh_eތnªdoI(Ew#]'mf?fK'fggFNחgWM76L޿>h$ȹ"B&ѲtB![bQ%v0#vO' zZS=vܭWٽस '{+vđi7)/6@ñ^lԭA/~ݯn9R%,0ޒV>pF#%u~чmGF6- *ɷs_|݀h_YC*^E_[qb:'_}u$^A&m֜'^ ?q* WJcw~N'l>L]zūN뵬V V-Y>זd_tcy5[O7`av@ΫFg6B6*R b"qrW!5?fBemsRDqG6 &6B=FekH|K0)7 έ;skJ|"On)w'cw{؂^`RڨN$vHAqεחvw~^VƱQM KH߱&BtMt*B]eV|aj~ɗӭYx_6+ ffG‰zjY-)mPS}mH'H ikC!DG"&FfVK ey_:˜zN r̾wtC,eBBn2?^*^O߰z{| NVXj5h$0Y.IX)ڎ| 7f [֞b:}mWS8/4,,#w{)Jd*Oxrހ&ggI'M8Iū24g!fxYu7Ȕaj& >?hUɻH⍗gr*g~' ^;U!E"k296(^nAR n/[_"-sW_~b0O6Gk.w&S2(#v8LA{iR[DRDxU[t!!%, ѼBR'k, NØGS\ pI4.u5JpkQ%? t吮WJ5L1')є49 )MjUZD' Gλ~W^>Gl\W /{wLt& =eIp<6Q(R'PGHUd׌e} !"TOg2Sk"6erbdBP㣧~PZF  ) L1ӴkߝWw GSJYm>}k@v·2H 5K6C_>ԍޱwܾp0no`uj>4@Su 3mS)! +%~ fCiTH+濙sPwlH;XTymEnly5?pwQOF%O1TDNUۧ6f]Tx͝>ƻw:fuA'r+LG(cPɫ3\IW8RMsfzsc'Y0ͭ#Yf'id 0.rf ʎ 4ŧ~gkCd;n}{~Levu|xljP}Nzϝ"r}&iJ7+1j ;//3Ry-K5Ut^E՘h|t>}`R E1 DA/zF o%u 3#dn7N(fx=*Ioʘo_9߮{J髋W֬h ~ӷ7m䍬 I<؏9IN@# ‡z[-~ wxȦATGɐR/$L]>< GU|Ax:3O7'1fޟkP""dc'ټ}zC )j9jbjbݐj j==eO~˫{#_y}$OHޠ(9)89uMkZθi!f'^Ke<|9눖͒LsփVuIm̧2g65캨5/٣ Z:)qX" EѪA^})Q!DŽcB09o.r{4tD8HDqD4hY]lrcoêKW"F?wl𛹞5, ig㉣f@hk u:񮸃P\:1@€0j[|5sjY@4Gӑ4P%IRi'C0?$:{-ߓioČcZ$TLX8 Em{S%cԸPogL Lu)X_g+U *QAbv[ Tlĕl#C<"j7 _^{Me_f`3jݫtvM/y;W|eb)b=qir][񭚄"Nɭ'Փ?r|{CU< [0ܬ!Grq? «t;GnpZ_Xݍȍmh]mƱ 2a['tޔhLViuC>xcvR2$(jv8 BxTurkC\\ٜC~i^?#0)(*X[c?p|tH0U[" aF]gc3?ul]܉H'ln |˹-8T3ZuU;It06p}Bz/Ч{àdȸ%fHBS?ulYZKUAH~T:Sc~ӊ`aH,4۠R\nj#'"HEfģL9H#)p uvKQ"s}J.\%zBp&'sw/J>YmZɡ@cF'r*SIR_O\V}c}kI2>\X{p4©AU,|9 B@(ivt7)Yl/) !݈vRDգõ#¿,oq$5ٟ؏[jH$n#a-^/j@TKֹ޼_PNH(|L o;AKkzaKkgi S" tPHkrҚc==05ܷ2'eZX{kwum& GsVXs.'.kXv}U8M+=o-jMZw@+I%IJ p&1A Gn&TY_Yyq!H>QeLVE HM&ߢ`g}.ћz*iWn,]t7ouQYʬ:|o*&l=X 잉 cTm(Qfl_RB"ZyY"՟Y/W4_ C#3i?5+i^[3N%m]װ-jhzG|ΏKff5b^ jUmLJ4S{m22T &3ojZt&HI<&nV^1! Vzi]J1u$x43 sN6kDv`QYo 9-L*3󼖽1 kxMz(ZRgSLyõ솒9=ȱQ2$2PfzvL?a 4V))8nFz`D˥;ӄn9j >vZ^mGR5RAvVS81*!!-j@yh2HA`%,F1+HSs_-1vy"0;_@".| IDATc8i=4>\<>l<\vͤ@K e/ n-aV.lI+9> i^(`;+=yk.u_s,XeMV@uHM D!;ܭ3> 8eFӃAO6?͍ 8gJEpx4TTf2ќscir?sw]X[9..> 8`I[2b脠],o(i<2:k+Lk e3Ņ}\Z rɰ)[JU@bcr2&[*D*F[xeƇ&a{K'(@"5_I/ qa@R 1z.hjԟبd\hp)Ull~(h~ܜ3 ~t[μO["fx|B`t^eu ZB;R_zދ9 <[6_W=O%>K?5VIS,I򳑎zfcAhΫ5ce[e$&<Hf)EM߷:LJeP4m;f Dj A0h' X)5#P%q#c02K'uOI"cy~$37P0oT&BZ͐4C*TW ?C(Lߴ`:'.Vk>HeŠ i#.8YhT4^ @ML$OCd J L_ULr- .p##'W԰ QuH =}XZQ /e|s+*/;ȐR=qy~/f GHf?uD ˞vQ]V(M~5oW"F( H9ˍٰ3k$^-rjQJxz%x4lL`B7e"sxջ򀆟$,k7^5!4T2-R QC3Ј7&$N$a31Y/J< Lr%W]QӲl糁+]Og|3ZjgBC,>ې2=fY0 qM#?.}&W$]s}3nxWZA"sZS˪{# t{&|n.UP6Z5-2c@n3mZ(e a9" 3RT&0Dr4[\Qa Z̐!@CBRQtr R۲F ;O]Р0Qa.L OzI!QVs"$f(07 R+'Y(]E £"ˌZQUTCC" QOvY]]-xrٿsD|M}X=fO@@H+nTܠpeUaFkQՍGE_FM"'[*VB@9a%U6pv飅LF󾃽^ւkhFدH) !dhVzȏcZBJ y"HO SB U)frs0m!37TӻtG[f9RŊd eR ~C,Эgg2Yf} eú_\(#?Ro"HX>* HAg 0#[i.3nf 4ƿ"EIi١BgJYR \UE?7 J PO&UBTNh&y&08p%M4".gN}%C26~#miWah]%aK2{eH'j Ϯ5x@F'_[1m:mmEk,=C1Ay)#0>FQ`Nl2 }g޷#dVd K>f!R="Hn(XQ*!t]8R#H!E,@q"xF=Je-@$&洆5(CDHO}V: xurXZmXuZ(b&3ĵ+*gZw};a# =>de~VemWkNoة.E:-]ʵ*A/'qq] jW25\s]ľDrĸ3kf=:V6SȰh9Lϊ]QǏfIjTIL +ۆ),"մvU沔E,i S11̐iW7-6b@5"hqO:[G of)LN ;pc`-։ f_oU(bV`y 7*Te|ciihK<1k'ŚQVQ13:6~mVK)bF~4&HqT:b)F 'vE7|}Z,DG}KC2@'yZҕbG07Xёй^YTT2^M8,sN^8d`1Alg#bR.V˗X@uU >5 !<D4 5Y.䰺\^nL ]wN?x]S- nJTfƨ@1)jn31#&6w୕q+IPc v[6!$Քy1;z*#c|!{9u l'&fruF kvQL_PlZœ]f#K+,'WyO9'xѰJ1LٖzMC*M/-DIz{md97ښH;&4!UtT1T0']YVJ)7!iovXgB$4#괷kA@S(?)4Cxsb-Z|κ+VznC;'J Vu凮()<џ8.Mu:* +WrBGَi&@&Fz.62ys̋g4y ԇv0!BDprlz:@zz|@D<̀匀:?iA2&W:d+=cUE&*me<KBU|b* P^駆KnOn@Z( | RfW'32+k"-2ohPHf#((6#l(ElK*  J*ZVce$oƙF2y;ar-\VW]\- (ϻ6ƭ0]ڠ(jDD%V-<К3b'7NGd<Io%0 #x+J6`3hh" 7[\{?^RӲxgЍSQ[,݂61*ݞA# 翓{|`仅 FֹU_ t#ʺڜOX#B`׺$(^iE(sCJ0JV$h"gYHal3&N̻>}~r/P&!ڠ[|.B$BZQ{c +vwϻV`bT}K 냴e0h|`yʫ寚z!E#82W[l|x+TڱwoFv?>Ѥ绯x9m|> ~U3sԵ77ǮJfS["S,4Ah+MdL"+~uᓦeiB@f#{4 iw-4@䐺A |%cVjNaΎ8-w @q5` vc>}C'̑ %i}nLekM'%:]Q4@rJB{MY^/lMdk75qcmZler7Vv#7ad*MAHܒ_ƽ*yal aLB$I$O> ܁4[X؅k\o-k$ z ww:nGqy)[3=un݈D]ݾ|3ӟ\Qo:L}kӃts5g\p?2_LQ*orښ!g6㐘բ1UT9i4i "0A,~CA*Q|8UHq{tq7x[*FE?\q 'گhhT GufBz7H&['cz$wFH|Us}W20%X;6$u:v$*7P,aPCXX5>X1:,̛HK.v{۵fEuԼiӼ|6"€OTIIe@ pL[~y܍n&VTۣRd_(YZ϶!MˮoltDUlwӐsTk1fVnwnUqɽMjKeo[ޱƃ`!z풦E:tRQ*ZIX桘M$HBj+r̈Z\&Qek$iA!B}J%U~S,C*E i NP;IO8 HRVt i\]lFޥL4nF 8,j<0|D#j$~&rDᘕʦfꊢt}tnCuX \:jd3&ҘV T4il fZὕ116 ȷ]_z1:ۤ(pKiḥmcok;i]Tt58Ԥ81C& @aGAaız` H*NSE |F%M<"q 13ZٷCk&%FiF@OFt\8g\ڧz-x\"J UO=-oI t"R3&QjIA%=Js4eM~Z(Ϗg󳱬 Xtv zNˮpW]\uT uZQH$紏(Ў]U[UybТ]/,3Uakd7lKh W l z\ol]п\A:'}A mzPbFӇ7VVq">kg* Hl;eh,VIjC>Pۑn{J vΎMv IDATBt{mA ! qzO0iF V?9R l<ZQyz0Z0?7 e/͚VB$<gEPw_Sx2YTuq]C=(-ory̕"jڒQћ-F'}m[%2by%H)Xίa`lޝ<* )Чn7Ǯ9}F!!s{rK}*M) J5vVnb:v[Nȍ&%uܲlMˁ2ˏ>ȩxzq|x+n|w}wAշviZ;?޽Sè`~u߾:(z"*CJM`"hݿ3ZԜFP=R _AxqW^˴x,E˄ñlS)%]J>!wZ*a$hDVvE9hF)575(eMyC>ϑme  ~1T΋5-Ar: HGSH%Y46, a-ʉ1^$ {%9qVu_qSHlM͠_4 TuaGΉ$&4콋YMAQƖk~SinxbZD:a_u0+RV:D1a2ШS<"& 4g* S] p OMo+8rwr6]NF"h~;:lW-gӢbϗ/޳Ѷ Q4wK:$OtFkQFt; .oLʏ{hG~n m5RI4z0=%{$wݙ}9/N"UU :[9@`)"sj;Lrqa1\W~&V5?E xTU?h5%lΚbS(P/oUQ:<\J)M%*k圡tL0[;*&4a@X6`=/b rwV9*e>z%D(L 1wTi- gKJ#!~!=e%=I)F O*Ծ+Yk$}Fa_ףHxL(~ӹ"}wT{6` bo$&{Mbnbrcb"TTE ,l/3;ev9ӖeA J~g9=eNy} "$ Ih5{`umүԌ'?mpY?+mعcД7|gUT̺?<)\o 缧UyDm9(U \.ȠC-J,WӞ(txo 0dfF++#4t5ÕKr6Ri}WYtӐvVҕ)cgwPQ4/圪F  ?kPBC |&rLVG7tpC2ؼ6:h* Bg*LW%ڨb~ &`Cw9E ay)i|7rttT2RcAjg7逅Ga'V|-7p5,*:ē(Q1_|ruSb ~Ϫop*F|}tSO@ '.3ba:" <Mkjς>@E(jM~W5BM4]~D~iէC%eo)&XsF˛TK4C#'"eYtyDe^C!R<{()flNvR xX!Q8&cn&M{52# ۂvZ`%^4 ,uQ #%xcGAY{]gթ L$9C{Cx(6ӵ9 fz@ ;Abɇ`ƬO ShXvd7 :er7oΗ~ѡ kIlKgi@ݲԲl5(h ]CvIsI燋3yP)l]颍 MAHV qIUښ?9FXplR:WU|ߡJлFb' $/`t^(Yݒ4NKCe(%q,BFCTBZ eB`ǃƩ|$V +_;(6b @e Pf7hD{ÿ7T(˝-c?(K.@&q C'hQ"b^;]*MdV2ga/4p׍=r3jfgu< /\M_s}&O4::,ŠNmjA ɨu78Sf3n2vP+i) 4pB^鹲s_>Ɲ> ukݟ?Wwj.5^4p.YeвÔPپ.edCٻS ~-?Q?eY4XQJhI#vSQvXO,1ٔtFƼ_+[І(BHcuG ej$F.-֯1/m7Q A.~H)a!$̬ DBB#8!#%dhjkU j5dtO1_FK@n;ϫZ7];ymi2nyZeEH D\ɐXPtBfTf60/~tm; a8d#MƇ1t{|^O*62lm V_#FP$ds^k?,n 3u Y0>9`1~)Y}vJu7>@ ?nwF@Zγ*Pe42FT}JG~" )EIiOSbєQŒG%e;XT.{.tO'LBD'4!NF#wjHh.:3hF1c|)&04Xr~٭_ga}s%*N 6kra=#8 @(IU/{I=#$>)f3&=tf"%僲aPA>XRq[7; ,(sst-bMe3p/"y9^HrAɡ7\1JMB/1T$mP{hբre ðAvcd4PX+*%XbSirwuw)R_+LoⲧY^0~)9琵~?P*6?&3_=dlIH~YZT7\$ ̈ܓM@ ?wRr b?t9n]L;8(`qcÒcQ:ϔch: X%P~+igHAN/`K޴8R[$'h !^ow; c1 [O~rI?fln}#͠(4kO2 t֤hUts9&@ +=!Ϙg@DEį FeOE;%CGh4_PN0vZ..J 1 Rhnh{sbBS+8AR1*L]%qѶ5k*52Xœ D˸8XyΒ LrUji\b9n//dmy1YD]S<5DI|/% /]`e!? T.IKEXG*@;֯5F)C ngWskUP,*ɇ]MnFk0*ߦZD4'pdX|ŒAJ}.WwZ6.Ρsx$  %2ĎըPäЙG 3poT|pK0 :cutŠ z}0:NqԎO:A.e- (6.2^gzdH5d'F5΋)'$GNsSYιUqWa;F⋼UsGQΔ%tRgfdTg{vޅLc!8 ygʅ8u:'f#?slA1]4ȗF1E`8:e c'+^)|5m 뒕+KҽZSa]r /t;3|ŧqT`OVɦU1|iv8z(_ 4;7keʢXBR0JY-n]Ѻ2$a%wIU%DR ٷ*Ve`ITƎ&K&(KG<<g)wE1(n8LݵqgiXII W^Ó\a'B2/X닒sP2+}&>I ^1|ZK@S%a_ȑ#qm ߹Up :o~{(&tl 0i`OoG]K$0ulC|?nX7~hҝe`y$k7A{rGΙ! \k\SipC2 %V5,!ԐLL"vbg]P9OZǭ ZՑ nzW?QE` 6p2 GeSBD'Rd^+pcw(EkO)]yogѹt.8-i۹MkvUzԸr5goez“Xw<.g,jKgf+<@ٷ+ ɇ SL녿Gr.) GbTD9oH~!a0tTݼ\N1c/lקk믯|WyAbdYv*AN{`=ǐԞ6l;<ԕsym#=H ZhuMTL_o0NR7љȗMzmUȄDc] tqn 63yù %r5ѽ[Ya yK#dDo۲Tϔ18{akfu:1^6هW0L0YiQ6(%H L3Iˊ 4n;UwDZ)1OA5?괷~UB0$ bjcB<0\"VԄ # ꓭw{|!(xb#}_3m{?ة؉u #O4}KFJKIE><gfC \Y>0ID4vGS9'L>/`P~:K?eA`t\eJ櫈a1T"uOg,ѪD>>3t;Fk6[aw܅`e9`Mjxwx{yz:=wp_Z_> :j#QT&U# yַ; C/uPtV-]0!3(FA*'G|$1G6AuЇ@PrW_23%2%>͖r嚿&@X!_}OdeLqi& r_REOza IDATҏש+7wuCjYiHT ݤոԌxPUnM{..@8Wٻ/5.^ !OKq/j|>Ah~͍,7mnm-˓Xbn78AGqq)VA,-O-~ xA"Tc,UOD>T/KBH?u=giW%Бȯ"|ة!ċ,>B(+`@sQú <%O!zdnوRoK{R9ke< ampK7P;Ƥ PĔh7.GCr}ojO,j~w_]bI I0,Ԏeaol0HחHl@]y0>)aI# O 2*,0(uVv -Pgovҹ;Y\o(p;*%!mO\6,k[ǝ 7i\<7zy[:X"ߴq,:bpE[D=# 2Al\LqZ2F ]/ǭ;. ?Pʦ1BZA E0VsQ0P 3B oZ@^ (qE xA@A;hx/rk;E3逸ӓȘrDl!*M0ۖ U/ fW$>4cį=;ivX3iRAd3V運 gfh ;.kV/ څBFxGO-+j^v;w;̒(2_dXV|swr"4రyg/>!<⭓4÷OhY㮚(SY{_бXӝW3b7zf]ݵsxfSa"Z-fHj"-'ឤٷIrϪ9Jt,gt{é3;Kwq|ȴ(G:tH.M|hp]i:٬YJ铱kzr$ۖ2<_5714z#P7¨G 1q0ȸS-ow" É=/L.s_fo5xWX0k׶$+5l$ 5$;שk~Ht"~*=?+QeEHq2.#}kMLg2NYA״A7inʻ"v&ǧ5v(TT4B||j-|r{%TAɇ ;L!iƕ“f)-@h|7dHE]O7!Y {l eQ̶N(SE9HJq=3::{ݒ cL!L]MS425n,#k1t+IIw-3 @T^:⒦~TAj.n-Ij1#6.;3(|9p$0l1TpZ M {2+|r-;,/P"z@{:7hݷ1P%ax/墙xϤ`oS);9%/|2sQuҾ{{g#"w5q q;BasItN6)Urers3DC:}|za  463 ЭzeR/c6>.`]6.nE1P 8}o:U$D׊EmAQ|1+ H@FO'' Q$C1R]]*QhAY1Ķ  "<kp73H{_Rs 1dAy\%6.SuQJ9idž^K lG,3<E`Hj4xRg/OGn"# Qxre%OMY׊"Off>i~D*g.?L‚RoU1xUX! "Q[,f],DܡZA@ S }O#U-;&~!q%AS­KغaEW C"h\3o4Z>Ѱ$RZ!nzW;qB]܅|o.qeTpeNE8 7ur 7K}gF;5-bXWnR:aY"Ԥ!_Wi1d:rABa;'Uev2Lť_fh%D~5W\o&PJ.NhR̮͢]z`+йVueē5-k ZxW|5Є sZ2wF@!BnY"&GۨP]4[̒_zv#_w^3{L <HB:O Gc Rؾ!r@>1;)3ek h@Rn ߺ?>Ʈ~jG<8V)u lխx䣿o.ӏZ}cD2 ޚS8*B[`QLlդ͉ ?P *1/yeo٣{z?:Mˍrmd~Pbe7[][;ꮝ w>FUNZ\ph_uӯ<Ǟ]/{{À䀒2F>5;!(XY:zK (ҸT{5"42@!ØDfiϦ*њ ÝcuT|}uV&ӂ"7浱j$yk"{~7X) AlǮs{#]r$t>ŕTm?=TSyţ¥%@a_Iw3eSO/=cVi޶q|cAe29WKxKyP'IR\!Ҿ5a0A~l˦z0hJ/wS 919n_9o}{/1!圧@Jp0ɦ1u*Srx#i%Xy5Ԝ\1obǓxΛypŻSZfՕ$N=^<ց 0k&Y8 &6$\LՄDJ*IL$Ǡ<.F,v'WUSB(;cg{ҽۖ:131Z{+*W#1s*.D{٧aR Cr]+FBgU.:t#yR@{Fm\[g*[ޡy3&bAB@maifħkD'K^>z~f¾ÓyG ln]8Xu\\jhBNQ >@D\DO2:6 "!q HlGb‚jvfj9UO4+bg̔<S_[3Rw%lh=H W('ZK*o$Q!XeE$ tD\ȎΠG3Ɣ@|8Ew-~xHI?E3=h[Xi:-d:ef/+0@]![cWc9H׸5_kVX O $V!y9boTLp5fTPbzU3+gg=V*}VaQl".Y1Vx1=/KܘlH&Yqmv=*&kUdI'/1 SR2 p4i>>mmV)9Ȫ30z" Goy"ؤt{Mj@9/?O$,cQ\5SHrhpdkf:诖HCN+iGÂ.G81` `jD &+̎{(k B6h%`> ,pvg*o a-8!)ԇrRY`W#y_-,@ymvR`0L}픦J>Z2. ,H.N!IhޣLq^;9C港8~z4mzS/{Ֆu^^/տ߷74) e֩ӮgvE2F8?C(xS5I`1.&|Fᡬ"DHkvrTȄۍDZ88wt\Q`nERW% ;n 9vLԁW7͞rfѹ5,]׈{IV{IuӖ"zMŽ(vePN ϊZi!%"pUjµgEnRza[œ(}DvMWOjH{RfM?NEeճEƏՒ@EDrc{s/:eQx] mԏ$Ǡn@AYC{uo/h%Na2c=Ͱ9`xqJ 2: oY'̻d8Կ?}+W}Fz\DK'Uȡ@fLMI{2iL>c?SVwl @UW"a5e;L$_|_OJm$T:[c ꣆MK 7#<͑hjE@t2y`śe/6\PKt԰vGL2\(6)Q2AT"%<.MΡzbH!Qhru=8wR<.F % Hgq?+}$᣻qGD.{k#EO#܄`LޕX>ɐY89--/!3e7>p+E_|]!/#7]KKoaF:7MXtd]>thRh,l!hH̊3Hq3jXzON? L!{x2tFTE*FwlxGOa ˰GtV/*K9G<o|qɜuW _&!d(z_*dh|MVV.vJo4ZBBQd4 Cq$ΘXE1{ 4شp\,v?$;R'VbioЪԑǺc1Kd;J.TӘ\|$N WoZOrR1$O|DVݛɡ%t] `Ͻ6q;n_AORFf&chgY/e@cRP&bQ˸U =7sr REhfH:Qc`NP8?U24.e#¡i>*[qI&ɪX8rN΢j0suN'iVq0 IDATWͬru%U\AӎȤGWm*y8E$hj 0NY58c7w5<.$6ԇu.˛Wf Ƅ0J#S].׽׮թר7i +L5? jHA;Z; Ph?=}˕ÕMRNy28ج4?V11& KQ R~B$능h %T< ]oHjҩ~,=Dq}W\ TYqS4+ܷKQd8ŗfT\qt}"H@2w%ܛM ;ݮIweB#N}dЪ 7i8  jrΤ<'Q¦-{UuPsyC#lM@u`<'^Z|C:>?%whH:#0@n.h&WkyE-QH@bHC8*ZV_JOȧ|8'{>'EsR0EbB_H WU=Vcqv`P&] yu&]\X#&ꃖR CRjͶE +6~>9}֙$U#=v^1h}mYrP6qvyܻz}[B܇G҅ ׍L0~ % =zd{VO*9&u n4 䴿Z8sl]wÒ*4'HѵL ᡷǗȋ8#~63zI6q!iDY_J` ur,&B@Yn!Ǝf7FȉQ1~% \ǯӽ攼cZ #!aj#?^$'sC#d~Ȧĸ9J"w̏lZ&Gj.͆1f^017Sui B1N# APR Q5ж2:nI1Je#^0N(Se5 &PglOu4Z4{  0_]9r:j!eںjOGPPs'註<3 9i[*pePpAQyb 6Q6 ]XqGVVEAnKs xmnp"g(B:+\{#` %?^aܩ ^ $W+t%p/}wFל'KvT O9jJD9*1v[,zkyLDȒGC6ԟ=Θpo84 S'PE`ϝaeZyU59~FEy[T9O4ϏX|GxY^_+SY2󆖎!q9:5Geݛ"ҡ@u+Ϭ <`2l'/3ieK3ZPRU7iPoE6 %#ٷ;t>UF^gbeLB2j"M'9<_}tT+7j!6'ªɾe\)^l/)=c@&_63 gCT-g2KZ7|vr(z)l4;w%;;D:1o}?l}sL/WY/b=[zS~SSysTI6ULM&;ȅ'LpV=2S/ktiIP~F!ߔeq@|D1 Fݰ~P5dqc0VM 4*5$#49D6aK c z%OlEM;'>]rthF-{-bCE` zz(#{;UMy ~1c] ˾WO }R6BG b{cv8:IB%f_?~ AP㊚[i{D^d`Gr*A[!}Ćw%#@3R*(pRctpu7G˳5G ,d j/!5VT)D,rcW$}]$97@}o=#썞d lW zOh3寥oE譈vO@wyPq mTv4IKJ쫪Tb}7y[? U.>)`? {~ӝh*?*Q?bS_S&r׉+ M=yH^bS-+*o +i G_nb72GYwc%!ʻ"w_RaĆ"L ( 'ܹ|T<&( (9isoLzEYQf!qwcLT;4ZXEk$D\Mk`jv˰ )ܪҥt3.,Iޫxݙ]9NtHLm{[!<\a`ȱiWQ>%S@1& @Ayܳn0*=#*ao-#bcׇ[ uF;eIV\(eK`lH*! }CPm MuIScß7`RNASaZ^J@"BˋK9* q~+I*4Wn6?H,K.iJ$Z:.裦d͋$vvTIjD'5(ZW|+s1dw*rvH$nJ.wJC0''?5eK֩p֠xC WKH\6znDs5ေ{mbMSqI!}9"tԞ>,~Fs2ԱB%| \x'Hft gSvU`Q7/L723 ba  f9 Eؤ+XQ|7qHVOED"E eJL W9=w]2 =rvl&oF, 5.tBM!P/P!JDOu]jqكCGwhw˱!168CEᵵ[ /ԊV ܢU<5r&+94=N\~8Ѻ2^SX^;u+ n%,ݘձ4sq]RSp%fK+oV,Y,ʋH jUDEX$Q+Q Lyu (zJ',h"Te&ưT "%v ApABF}=UrΞqx~%"/Uo׾ _ߢ]ɯTl? "}R'm|e-=:3}DqB>9=G#OWSTh>T ~] MoYW]ULqa7-^k5N#Q2Dz[>?;MCEa YPh O>>C $BezG2 XIn"5XǶ`#ْ?nkH`E 50!jY0 a>D~TD8OKﳉZȈHvA?ZTOfp-kLAGusdPiK]Di"~YT,fYQyg'ϟrX7 XRq/) oia^,2m2K ]*])*ڭg+k'ZEq1Z{9=}[lGm9.C B{ߕ pﳝ!?K{~;E{IHg! IDATʲ2a^$֠աiKa}>6N7lzp 6_$ݰ3hhJ5&g8!u"-L]Z,h|`vO?T :Ft%kpo:/pM믅L8 \U9YƎh7:BR.1o0iz# -D`y1+A(1;&] :^(dFAoاa(DfK>e *#HK(EH9`UЎhEߊ8A&${ >Y/]$e!l| HIy@Y.I4Z0C!91=D< Di>/+_hgvf`*) IfM21.Z*Z5WEݳM { yXQY|\a؊ ˙V.ej䝢 :USyJI^RG2axe20&T'sF8wG~[dI7 [Y :eCsU/ UEʥ7 ݐ/o4s +Ϧys \E]ΈqB?:6@4<G~فy \"* P=W,O3֛Ǿ #G:<lU Zb J:Hf=s CNydE}*g DY&(5[4%4-"҆\<F4cR>1@^-$$kĔrfb*./jI&TK}gJ/ MJSИ_Rw\׶ȋG1Á\y,S+U}hKgL~J^Wܧ6ƕupڹsWɏ^Q,GG}{OꗏLSqB8q߫S C nP PgܙMw 2o87830m`K /ɑk mz˳dd[,=l7G;ߢs'ͿWvv]!IDѨ'iY|VPja :+R~gFQUrH1;$x:X :ʈXOJVJ :)' IOUVi&eDN~I嗈U+|<1㤜:ƑD8fvKQ/Yohĉo AU!KT4l[(j"#{^8Ma+Ϛ/BOpUWޖDFWWUMϽ~€2~ Aw=DIBlV.$q.^0",Gv|-=.\Uhv&Vp#?8 s o=-ľ-X`yr6w&cqnh[/ y%}q¾e /ԜT@E}Ʋo{O81Y;=Exᄌpqw Q'-9){a'e|[)OM9h$Q` !Ms^qǁrՂѠRzg`)S."g WHά| )p.1VC( V/=;mi͡Ȓp7/sxD-]dv~ͅ[oU 2g=|5HEN^޷Gqj"#ߥT-S:\p_'αq@G9y ΰNb҂zqaT{qJm1?iM"yI-jc9mA0Q Wuʜ{Vl@L; If#ԸS$Ej/՟( UP}_j+ycntLLQƛ bdEQa@t A~SO`=NaN2[Qx}]O8|M9Lc;!9bLHy/!cGiS];r[7wO^mn(r&v ھ?x@O1BW!>an&"C褋A]=nhySkb*'U͏ƌDesB"ރA)pbTR)D̾EÀ=4_C2  .jEK_7d2w R|s],}(8B[Js(t7T/8ȹ^kXI£K2zjJ,19uZT);wk[/ㅽPa!˾ֽ{ڧOh6O3X4't밮SJaY8dR#SEo@\5gDK$_UݜD@^hC™b3Bޭ#X㽳.I'63 z>^sEi9:Ik>{ z;: }cwc^Dͯ7No|rkG"9O|plwۏۏ ~ٽ6&q#7VW :i5hz?' W;ba[#U_+ghU'hL(=]e9_)nU萬6@|{?++ThΧd4IlqԔxD(s`aB=Dkګ94wu[5ri.vJQ3E Ƿ.(Z'I\-; s$e)б8.s\_o}`hp߿: M%%Khy8'=z⁘Ѩk |%ή@C6 dLmA"i߽%B`S]^rڏbh1QWzKy+ͥ޻jMaRʅnsLOIJƈY;IuFsŭ\'AǶugg"QgZM&IgXk_+>h";Do cԲ: 5PHv"8T܉ܛ[LPB)yjKT_Q]L 1oBZ~~gs<9_nZ)Q >~[[t$R"iX0P9Gn2g24 \aݛ&"E߹űB*8~R#[JE%P)Eŵ,APQW/nq\.L y~δ-WÍDh)`mO3#AH ΐ^+rtfKaכzB?uV-&h0߬VT~]u@<_X+e`6+فWrvH'Dy,l%1<_6D'^6]ohז˵ a mHϨՓ3#p_c%/D"rX_*T=j h=T CڇGH;)DWu߲[%`eP'(0:VT.6tlx1u4ˎS]0vM^.^S]Onz?ߺP/o0*a_z%O:H'IV}Dc<{=g//R-v7bSU'tDP=EJr.. 1R@}\,ޭ 8]b(PT'toYl4Sy勒ޙձͺ2YlioE!|$*O2練ܰT[#MDï[fc8l͵+qGBiВMZڪL9;)іզO)a$obAʫodc(Jpq b4}?iylP$.=2YA(9%Q/r-{##-.a6}{0kMg*o|v_qp]J: JxLd:H&1ZqДN#)w~.6.7R!B0(%t!_[ek24Ll: 9Y4=Sgڹ~!P@Ԭ'g#2<|EDZtr I nmDł&Vu~PʺUu9^:&qCh;;>rtH6 0*ZXX>ïuu yǜ UMW}$2 {Ewra\\ -߉ %H]fbv,ԕ޻~`!<4_Y,ECu3\떷98qh$}-!pȇN$b]lXQBf98*!LPPK]jh;kWs}׾65P|~sWKWom[FdY9ID4d,&KT€ˌ?fPdu⼂a>wiS naav QAXCr#b }[P^|LSAz?9[:yt]% &\yN&`st aw}tdƺ9q}[䅤X#w\]!9 ٣*H.6)KSoQɔm]{~n :A(K[URׅ@$}\F*糨a`v?UY02N%q9(qyhp׃ڋ}#{ 'Řh0.LJ"A|$.}y@*d|.2|◗UNQy7mWgI~_Zn#rعs/kgjW8KKqřOT sO!04F(,=hdQ]EdxD2=¥.JGat9#[Dϩ128BJ4NK?wtV.=1sa & $i8=7(V `$iɦ,fCDݟ̪rWo??6XSԓ(@AR[-SW(|d=4jm4+S0krZwwۗ+W:߀VT[X?;'vbe_)cJ~ Fl`Yi΋gwSf(NˇZ4]q>M 3ͭ*#1 E-Ew' y# r>~qÏ?xO;h>UL"ЭdXHAۦGԕV_gT+7:6{SxK[u3/rnzrL7Y(%ja+d3'ў|ˌ Wh&B;|; ˦^Ӵ= T80S-_dܗ5h|q)7KE'$?IP.?EF=ׄ+>M"jXXt=٧Н>Uo[.jh>F;Fƈ8_JAM-cfrB,''\ @&un`çMD|c9^ MrHikFٲgo4.bnC?%D¦:'zb> U,\I"L9;yxʵ;juJd傒Mc&RSo- scےV0\( Gp0. / JY8*o|7ƏTH[,_Pı(,Ft$!Y># 8.ol@ǣ6f\e5& i{*dO:qvl*! z)4dst=X\>|v ER MIj0V^3~bUa;flT_ FKӇ?$>tlwR,ÈU {}r#%1oP^sBvTRVs5HV tc^RUZm..C[n)&H %R=YccO"8QCYk10$;o{hZҳAX|{ݾcѳ2,O"!/q$/bhT09#Hۉ =u;iwOw ]Q>^p4BK#Ayؙ[x#ն+*XɐQֺ̳7ore_CŭsV)*+G0B&|6 bDeA -JgVg<Ƽq] ź*h5dgUAqMTh>zbqo߿lcC VRyjVRJ}BuxxG@`;,/onC9^(T. y\(t"f/r%yJK:nt|շz.}MǼBrK׽;>UkR4rɎ9eq| q%N1΂ŜDC q1p(pwGE4(D0ΩD`Ra9%R  E5XּȼG$)gL^Q,I0 h#0nwQX*Juʤj>rڕud$NnYU!?Ab ~DZ`j^=<^|Ҵ-qQ+14,p1V=T_ۚ+?K(]36OlDph2ma+O86xR0jXu%o/ N/gaA/ Mq5Jv&.glAwxm> Ruv"hp DP[BkMm{-l,=]]ah܁V45CXu6}i;#hIJ;LGge寑`"(06p_Gax?[u0 2V `" X"SmSv\2=}vq)8i?GrW<_._ҭU0:e "|jֶ*=rvlqwe~MD< W4ިS9:6L)Q"9f(^(^X\߂2lS{' N\/Po;1w@ct 0J.7Ԇs $q?7*y7j%N!b \r6jٶ(?uʅܭ#mi77G6=wAnk˜[u-v;`cOCPSXcLBKqhfqr̂1"pCtiq{ml ᩣ=Ǣʛ]1XndyVoDU|y.t~xq>L$+*d(Ao]ʋƋS_0_UQ^kګ>Up?W'Ep?p%n Y5)>,z~iy97vCa%͚=SCrP@ Ja1fPhbケ&Le45 `!9R㘫^m{,Edѳlv"Z`4#%t4x2f L~S@S)X&4#8y6GEe2OBvXIҲȊEKHfu_POB Xߦ<V1RT$tChnq6Ԛ`.NYLE|8Q2B5(_ǪcS  TlkRTFf1rf`m@O\s|j /j69QSN~wyAGYYY0`m 7P40a#g.sCbxE<.EZG=,EKGLEpVQiD`7}ݴ|[5#m )<.z=m0,@"!$DlG$J D'7.V FhƩ9N -"@SDcL]pr~TՂ <KhjJQB uDrujInh*E[>L`qE3]ES5X|H| c/f/)"h?6hjqjS2#f:y@ fG\.Pa+RxP؏`栂= ~>{OL 7pa])qTKtb.5:7QcHyuօK;ۗ,BͯYc\Y15L'R2WGъ;0Vځi./g`Pp\qy)VT? ŢfeyX"]=|q39aR>C0p$$BTuLqPT Hmvq9Y#6 wجX,2ϕL:M-&|܄T G+|ٙs?;Z^E]eIxa[K~*1W8`WQk" ҽIA}*0 "IǎZ9pkzS56 LAf幏x}oʑ޿WR葩 Ж8AQeARUATfv1z,sE7˯u]~3 8uݵ __e9 Y$Z6+P,Ň52`ܠgUrD" ɖUJt)Rc(<|ve#hhU-M<jh;8 ϶K VS2g>:m6=Cߚ>~w_f45*LSUUip >9!Z±k|Z!76f~v&~-34{ߏnȿD(!1)滬ˤD $R8K%mD/E]KrNrXh1-&'Rz ;f_Bt&n֚c7iܓؤo\C $rq*ū\KeN"cK4`?)hYÕWz)@fh=booO/6EGh7mooѵRW2vzsÖk F dT,Dw?j[ :3VqZ%l.!Zǿxfc :BVaK`Զ5$y"Zl&@t.ro@$s*XH{*bƬ$$(G~O|7k6F ==(4Tbԅ"1r1Pz 1.S: pV\ju~Oxq.SlD-{ aQ$ųS8;*\@ìȒ:ZV{}U-9[t\פ9ӡ:u:%ʳVx ~Q:r2(;rMJ"V5MqD[(5_DdS i@ gwޒs3:j*³wӀo5{VEꀮ4QJur=m<'e;nC򼢷^|`b5yհ %k"K*aw7mj3N %qm΄4;?"N FXod/Er-1Aw8"*U#TG:c9GUJeJE㳞Ĕc˦ضmKF&agC:"2FK;#Y+Ebc-礷|7zIz?@Ue,Tdhj]ӻqUcdQ "ʛmG/IVjRǠ[!bxvDSDQw8=Y|oGSw U-b BDŬD0C7̭e}rE$LOw_CBD*}a a"0GH=ޕlރ"aͳt":3HBB,8KP7-tbS9VY:( %T2iy)-Bj'\7򮢟xW銧3e+(* glͷ9b$FOALR` ɪ)@J(S[2I\! *1Jj+d(He^a^)/UL8I泒 T MUL\,*ouU<EZjj )1"9dIB8juj9{\M=G'<ЗYmRK!.iE' .:7jIG4Ȋ첕qɊөpթ޼=J,=;Tg(JO`-cC gՀJ5TCzөr` 崅. ߭* :ߪoeǖbi9R &Zff34!%dtmo H (JTbm)*gtQD7rm"K/ΓLG#i.>'c²aR4bJҵ,B&.L!>)iz9&"JDL/)%%| i:kcՎofڶ6\E2`0:Ԏ·,˱Ih]-.=y|..i&xT=,U}R춈fUKsړŞ x 3J/\>wcΥ+y7nPYSWΜǠ لQ"d,JD$ *lop**󤔥dZAC$XMX10U$QΒpJ$'"Cd! t`o[ (7Kdh@T3Q )et@blmnB t;(f)PU@E@T" '*:ae(\T|&sI-PCTjtEεn6JB VJ2Ҷ2V܅rm0wı-If8p69r 3f%=䨹 :S]$quq́J FTƞ"Tư-ߎ*CfpΊo Ce;,[#񛊋β7G;7q?G[R&T]ݘ%ͳזlbfʨ*lWr|?]k^LUB{K Y"JIx)]-%(><t&r%Kză !RUqj1@RtŰ"# bcƂmIQKYkw2EUFĝ2- ?^wùݻ׭Ed*+7ZtuZ t2^)6Z|HZ!C+)Nlur]rlxjs}gV{~z4)W;Btȥ]xq 9s;Y/,t9[ m"qO#FYdf/Qxʢp|5٪LMӚOݦS/M'MsY#RWyv'b*,M+&R :gw[ JO.Ez!\LK/X4T2 @0*(` 82淌l092PBl@=Wjc̿l\D?hϜ^?:ZO_ގ-[eREDJXJU03NqP(A_J4H]qyh!R1R<ŖiUl v:5/P|qEHk+ggO-g ŝ^Thc_\$AU/~j^w 6l'n^,t)@[#g!%2m-2aЏ;HBZVk>9|?7$^3dr^=Z[?L^ߛc Dl@@v/]7=lamyۄoH׎,BD9Aoػ"T~%%838B-]^P?HS8 U,jGyj[\{/bA,QXDJp6i 4FtkӷP16ʃ69ǤdPƾ&ɥv0[]'=\g;=v&]dD,7s.!`:.%'H 49T8`e:Y0=iyY\[_rGX^Ps{+LŒʼnvgͻ8ͩly4Ç@ rV+͎U8#24ↈ \|tX`L"cd. GY#l)_VkdbnJ'UdaZ.2j N׮y$f)dFԺC$P hXcXP"c硄Gy%p$f`[1a]W&>ƚ6A~l>+>z,LAFï (UXy}W0/~(k=8+}|b7dB}3?SDR 7I=|#rAHjq .%CJhSFR S)FTATAA *@!@I5"YT dvȢ MЄ%۸d  'Xfm֤Ձ0Umdf.@a`(5LFR$tDbeW!7b  !{Owfc^5C5}=?@) T@*=@"O댭L8}>菱tzI\qH[+ Sf0?Bёc,$$Ѵ95 tTs&e{'3=iRd0 fXq2mY: n\C v?ݤ wK@Q8îOͮyҮven@`.z0x4Ux"ǟpp Akǟx]@Oʚ<F*0Pk2!%G %R]֬KsT(X4dK7Z$탑BNZ'ƞ K[aɔE B0plMno_ئ7ܖ !yd]Nt^Nuei/?D4ϦGURkjbwHV)R?D]M"J NwMSNN" ^{ܻ۰ETLOb;F1=sK~_4HpgRT3e}7Wчq@  H,wRJI%R"wDl7\)*4NH-83wjHΝPW1QSb*NI# sHH`6eR*POUB|{˭6AߧĽ49N&f4Gީ`#q,OCTKOK` lu@喱Ws::;|Z6d ̾&T# ,iꏵ➆aI[R?AlÜRJO}aĶ{ xy™o/Uȝ-On~B587yD5e~Q3t,;[V1 El[!0Pٍ7 hvrGPIVc5f/i y -`*s ;uN72ќuo^Ѵ,xn]5E"8s:dI< Q4XyHDBYLV 7s+AG̚GˊB +BLI%צ!{sGb>nnhj9gvѹw}#Den1Ksѽ͐ޏзuۮ&k5PJYݙM d)c,]my _rɜ2{NT/>vrz)^MΝAE믞%tcGU9ONqwױz[i୫:[˳s 96w Ri)HUA̫͒\UDX 38g!F"R*YHeTbL(ӑ$!gl=4RN\kO*՚RidTReZ mUAM ѼQA2lML(7t.&2EϹ9Dyf &@2I}EGM]jI 7lc}5Hj.r%|~CG;0VK:lV׉IJN ) _H0EK!PJ"g[GӦ.'r+Yz9?Ϛ1$sB]-jI%"cs f{2Aibêkm5{~yekۖ kUØ| uw†NmEV}dM'K=T:ʂ2s]DHuf6'^]k6rn0moikDmVqRS-jw(׶{[fO>sɊv#>4$u^+VĚ]ؘ < 'uq*~i._qpRPJikj-c9*1mʾqӷ깢/+* 2juE|"HCHr 3IS)>9?V[7Uāx-?$pDOCoD]j))޶t-R\b~h+9++WJ )L#{[e}-$yV0X: 6ټVyjhk^k$KFE*/jCZG15YnߪoWS_e"]72Kl9G|}i,f.}ڋ=r7a>o5%4 ֝D35e'%MxpN抷,g*~צlҧ4&X ΂3YzBB8SgL"BZ9Cr_mjwK4ZtLqo1?\Vth6Lg&C'+!:.VT%SXܳ'XӷqoM}%&UR5 lUwq۾I=g&&b6^{yo,sa"rOHsHnX6V,O̵e2RzUΔeTA~g|xqJw]?Uk5ɾ+;pCW*l|.G󡍟^o74/tPpTr]f˃HƾMtlc>:u'YAL+#O=кfGAtfP ]0ooUv9CU7d:2SiagǬLMSP`/2*`O|ng.lEce\}3?l\Y)\e NtCƒ;&#O~ecٯ}}wx/.* 7%EKc#L)M9F0LdF$( 3$/IXyv ?" J`Wr2(cm懋ɤeEdd"$G}Eu oڠO-,MNt ]&of^}57FiH*:=|efWݖO,)vi9&&SȺ9FKfd ٖSCj 2UNWXky(}4$=,FbxFE:O>ufBhc/ʢ$ ]*^axi~3n^kq Yk?ڡF ʻ[, ٷcSvQYw(IR6v]b\П&!Ԋ𦮟aSU4쭓Md<}]{YiǍ-xmT tn8KY^&0|Tn*:QJbqrDvFLȶN5ahĈ)MaIr6c=mglbˣLFmYr.ʷ`-g[ї@kw cw#[ PlVt̲#(*8 1+gBrVTI)6,+_cE&J:~s˯.Jr# mvQyLƨ ęҪBJjP@`bnmy=yjWYApA2ն˄W} {2cu=+"xg֤YFdqy#,h]?X3E>'Sنr5ptc؆ȆUHꤠU4tC_I {|/tҾ_?UUUUU|_>~uY[>HEoSD7@r{*dǐ^wO~$ ̠2=wT`ȽV )~}841Cݚ{ƨ靺G0ڴ?Z{;e4(e4r- :.pi%(˾޴| 4fj߶`]k;ґd$ ӿuYOgӚCHSپdUZI{~4<Fc#<{öe&X4F3Ɲk8]Go8{ѝ3fj]f qDgכm3oRSogՙ:h1g`m6*7@ 4YYu?/|[=Yaݖ4DӀN&N4Z^atrp7c\ϛFc}t}p7Lo >|L_#(k|;hwR?by'}6H@mZ̰g (,M?eKLIԴ?38Q-][؜@.\k]KSL+$ω bӍ(50<5ے\Ys]䢢W>B g .sVDP6``%3S Q! Mjwv"**RUI;պ-/ӒATF+d3;sB S$H/h~w[j%*>Y};ȑFm"WWp#@V m !j.2$"jgWI/#ُsآHoʉCW5G+i`.vҾt5Yd1aJ` mX/%عAoyp%Ox:)4~ZٷXo@ )ӭsм_iv],)#r)I١s0qo_D$@*%@IHf9Mݾàt} |ml$1 @_w?dAY{B9{}~ sJGd0h7ȄDm6ь2V` t&+ʔ ɀ$ C*7fĽ qn#!! WtMvsP:0R78 @6ȍ'$R ّ`lc#RiP6zerSؕzG&)A W̚;#uZJ+ڷ1`D3QgXR7& ~WPo韶r@"6)QO_^KjRkfƺAt>%R7NFRAJ,iDziӉ3Ugft/VB$1-9@\=4[->65T7{JwsV' I,ͺ?|tڃ986V1s 4"IE-x*WȚtWsxg,)їk, V˲:ux"ʳ{[7tn6Q CmPzVԶ  Oc;&oX|qbɆo ,pTVhup䇬Z0E[[GTKc~{Ŋ"\5ŗ%hSQ)yu|M' u#L7GYp߫kuX&a+{Q8sz4'|x'hFs$Mygb\"5)_X8ZUw53빹elc|KftDҚőMӻOfiJd䌦PT٩~9]_!1Mb)w=m[WL8{`8f_`>hNUӼd(W']FT&yḹ Tb.xb[D ֵga4v 1w1ڦM_XukV' _k`,€*$!%@U4.W~]Jjse# ԲJWQ爞6l&} |tt٨YY`Tҫ 0"&CLol߾0ߝU4QP} S 7sy*''?6> E!b}\| $ɟZF§] &m 0əQh=/::\bE;<)X9ev" Y;9[9m&s&^{7/Bhg~*g;MxNᳫN<;=GY=--=)#B n9kuarF&a}VFvV.8w ݚ@dߕ][ x[R^dpV5d;u_Ds^vU-YxoZ. dk*.,LW'PcdOx싩et*~N Dl'XwRj$tfW VR)eB[؊8ycx@2'OeA׿MoW3ڮG16b&_YLk8Q4gͳ{5r@,nF"XJȧ m&;qHU5P& c6%||ҷ fvJszêox+VS,824Ii)XQ46|N Μ~hvdӆ3:Il{ [7LI $˒#|X[ghFgFrKLze`~{J ʝ* c3{"L:zU c> _JsuRKKރޖ@`lv&V1TL "(lo ztɀ  **9xcjUԓF)Dٶ)XAxFD UؑhWQdi Z>!X!t[!p{ͪ%"&J ƻSθӔBy-G>#`)r[$`Lo„qM"Zn#'p!*s7v1sBDĊf.t͆hH_(0ɂwD,+XL|4,醑GEu8I3}pY:a}}P#qN+7ݹm3K{w;Lm+}zN80F\;WvXq]W#nNb&s@jaTDIh~_+Ӡkf,F⫾9}aަH&؉u_3BE;6-^$v:)e>.TOQĻ-5͂ SV% -i J@thllql|qk eM[x4yc6]#-2Eo]PB^C%drk4+e6=q}<>fs،8u^轶e j|^c5}shղf0иx#i934d!V , ޽ b8޺ֳ/'EmpZ91x*'ǟ9np _q}:=5fgv'q`G:V|2 UQOvǐs <Ш5uϱAOp3RoIΐ5~Jǘ-l\SeH*0t?8;V0G*^mIBt]i+S=h!Sھ9)K|#MY` ~ %VU''>ā%똑hPx \C܌A<?o ԏ% jzqę3н5qg3}Ϟd˸fvIBj0~I?AJɭji #Ns +d2U)6B\N~:>|*&Fb]d_68M1OnZwy{lXE MDIz,˒vIعI\\ǶeK%YVz( b{٩ l)>ݝ|;=恵,Í|`閇S=q=hdij.e;hKHu82GR͊&%ȓR_! B ЫCWWH ⾈+LtܞuY'=5H6^,MLcp‘,gC@ ^N}}*/,>Ffҍu{.:R 񎵩@f`RvjvCS%v`L2TVg hRSsȖJ,9C:僔ޮΌXB29V{;9.K9\c=XkMV&6#o\;6.5mVlqF|9Y+&͒)re${Y2LT:+}gA&ݙ\!xNy8f`qüݱ1&sDK'\r!7y 5#Mg&Ot|=#|N @{|(, 4hz??aRnA^V?Ԋ8mR)b)t83HTt0;ꜭ\b*YkLjYU:a_Y3U΄ J+0 9}#Cy;|gT^aݬ\wXr-m}b*r힂a8V{QV9LGG*{e;6ĂMpIGĞTmو=A"so)pI3gյ]i<Ή|i[=#QszB{eٻpɎNT{޾kƅhQNic4`4"|sLmM߯$SJ,o5pOe狖2d3Us]?08<5! *Z$z!yRҐjF I1:]aE%ifK4Y۔̥,3щ̿a6;6mD&JKP"q|v4:rkKK=k'v} kcϽX#ܡʅ{}a2;QƩ׭ B (YYs{NIh6af#E$= clԱ_Hqt6b˷[n#8!%ycdw̍&_Ph8j.Q;1 s/a_"/+Q`.'ߎFA%4 HN51J ӆڛj={); 7еo*B5wMyK~i1bGÄ1F?/?bM#PO9]&$ E}+NDoʺrD5{(X*>@] BY& ǂo5s?)|N 1阎]S8a[$bקc?PZFN! 1OvgwRYXQ)H,nstl5wC/|mr"C8;w yu1Ӿ_nf 5>c-׮kwp{@ŲWk}| e^ShX  z 5Iyk.+zI4nY[I}Ψ~!m>4Uefy-KYt{NJaV0([M{J0,jcAAX@!дk}±2r)9e4DK='{ d?4NNDn&]ԏ1 aeUvZY)beOɾ2v~Ah!x02t؊hL.a0|=X~$!BL<莤ԣvCԻƏ H4`ᾌgϢBFFLd֬OEǴÅ iSvA" G$nڬb\M]vgj" MVUnGhϯ<0D:o+ՙ fO)NjKMEҗYjyϵ[ٛjf eh4͙c$K !^g7Xkz="NE?g 5sVHhy #4jkoO]eK"|3! 4Bs¶;GsZ F@a&!yh}\Fl]ۦN.Zh>@Y 71~s牴tn53Sadȉ(h2$՞^MW~g-Mכ*= Νɡ,1&p}4,E},Q9%Ѫ R]yg#h91ё#;-ۧၑ4 ʜ XaioMgp' #1sԼ푝ݞwѱcH'W4/aI "!K 'pQ$;cNk։lJgIrl-kh(t."z09+Wc6ϭ)`8l=qd 57%N; %I*&w%S"²G$R!Ui&EG.F*t9S2&)<Q ,*wo&t KHN~eY= ҃Qhׂ}qh :e۟z 8^K=QIEQUlFq?14UBbL\IF3ON:$C*i:mI$A?amiȉ(Dl SH* A+eq?pѧBqp/i[v-M\2_=??TIY]ޝ?}zϯOo3ԑ+7}UXV-DF,gمj{_Vá\57f& ڨTh"rOܤZ?Y͎uhjN !-Dފ#ŇJQ8WO8BYk~ ٬- a*q&Kd"K!SŅj` ;ϒ7v=GnwNe 5.L=IMS6^9lh3 |MFUSl ;tQ2ݽ|(Y'gٛ3PS)$94VVgZ +E;kk [7OuJ]Buܴ- %+z}պŔR k\|Ks kn ޣKjsȼ|4^ԊimxAc4/Dh\ˤT{M?ɩ*Qyc89D=]5)FfU{b4N}db"%qn<::ԗ0֝V NWM\\zR((FRGوXʨWFkwz~.㔉i{׬`h 58J֪}lih}pk}Ǝ!IBLfT8f7ߙ,kil90{w~h22۳ "28<{ ngˍWq$b7Kkqw=?lm3}ptQ̞73 Zp/7+&:g h'} *Z9 4+MIbRK}֝:AZyu^E!'oq,>[Z>,oJ:si%Zek~~<6kF8̖W]r5j‹A"6+;Y+*Ē!n:~jU{l<|y*ܙ2%]1+6LfXȚE@T+e ҨhY.i**JÁ1NT$cuV>Y(\Pؚ95:8d'FGiP^FtN K8.9<|WzͽϾ濥8IVoZ]|7v}V-[j1/j'ߧNm|)cWА3| , nS\ט C6)eՄK2***Ÿݦlu0I PJB@UHɀ o] 5*X00|0 :%b@ kf`,|r2h9-F"FxDlȹңx`:h9c_Չ=ƀ@oy?~~% 2P4ufO;1e]vém&Es7H}浆˗CHHoIs8| F>v$6L(~LfcmN~Θ ƚub鍳1B蓊`&c,ƛKT 沩qmͲ5iFM=ȫC6}XN e2sp̜se қ~L4ٔ8|>W[XnIxwZس5ׁO6e %rseg@{\| W+; )vi#d?=sve LO`_,ipй 2TD20дEkҥQ 1p^{4}"C Fǿo_ǵbPC׾z?֔<ͳo=_zO{ͺKGG''NߵӂjGN9KU^{x}x ~`h_4aXN3V /8!(K ]+ʦ{bQC7 1FcVƵ%㉱"4fsvu9.6k~ښFS/ Ͼ2/??OÜ|Vni} Ms6o$?TZ+<;W칽iҠ8*6 V:66VSblqu7]|pd}lF#ő+FC IDAT  q9`38X| FT{y\euqbۣo:!1gْ x7_1g(4 @+f_DeVGj8IAzeB$h.SsÕKz8bqY>y#'S`,3eG[ޢf66o۷1\Ӻijmk ҕfɱkk+m?}SyBcݫʖf>T99E6L`3|chvy/Cޣ!`vaPV(7+V(e :H@։n +!RMr^-Ыj@X)%L&;F~/`] 1:rCK1$G2Y @^n?TMf5"qCd#aJ%ybZV53S=ё`=&`sRlR| #~zHu2WP@m|( {*O8=Pĉu$=^K5ҁBo?Ǽ_tQm!OON\dkzCKmR\::'^6c -*/̶%/ođ,짙pMZRF '^ɩ+~K \a6R)4]T] ogV(x͠bn}x/ ?wJ|sk7RpeJh+DCN}duD%tZDC vEr%9NZNe~frx: d5gէʲp&vQiu 9݌3Bqg HC?gO=jo\w^avCɃã7Y4@(;چ ֮cRR kjA^8F:JV s>W0%{tZ /+O &/JpOeM)cmk~w!2~zkk'yg+[;.<4By@~d*'u5KJ2ȥ0ϭW1ԌZAV`X䔀S!i$tzc3}kہ@熤_Kxk) TSn08eGHpN] (Pvͷ\(aDAԜ𰩲"#UE`K9**HB%BSGGijXH5^ Že, X()*[jGXK =H\Ksl}K^=K"ӔĴ! ԹHӟ}ݖXFkTA>䢄, ˮ ^H`;:1# 2\7ar-ֲˎqF =]ݣ A1ݣ/]9,E@X C#W&/lzD;rxyP)*X-؇.9uTLN;b3j& @ybcC*htK @q,R5&gmS٥YC]UPo9$:;Z Q>΃3nwz{uodEq2gS\~1%^꼹@agc~֓:l5v[;'xAä7wÃg'?(B^[ 7׷y%|._|+k1ϒ ͨ^eҐOf| Ӗ 7-Pl`#Q:P*2cUxP8|" #MiqhUۋO}" rpoorcFMq%HsX<I ]rɷRxn9gMG7QИVْ~XvFr[m0nAҴd :u?H[׹ڪ"hdjjMNn:az'/Ӽ`]Fw "j}XY'>#T_4_jƌ17,M [y=-5Lx)Lgԥ r D8$!$J6x>}\źv[~rO‹A5{~]eŁM<&떜Za9yEFX Iqfb`y< % 8hQ?@2) 4Bn6WX*Uk;bbL::4k-c=m8B#Zqud E*gh9 >{֌j=KksutYalGrm^FM'i4AW"KS3c]ط ipZ@=-| @e8%Ht:Ii>)9bBdkNa9z>ُ&7?5Xց CfjqƂCOVS.'Πb2UҦLBUFc_/UI|P@j1~K&Ȑ.7[(Y^AO]Ib1u)\ե uI MN%n*tvܒyJわAK}_+¯12ThFxS_Wl]i:kEyBG`]p:Oa`c gЬB"VɎRwg\Bg-q [jZ,aŝ$Ѭ #LbcNTlב΁}QM%wu/+{}h;yt$R*]: ?6֔N ڬ˱UsOö$SHPѷJG NȬFkج>օ3!sيL縆ih|&.8|^SUlȲt!VvQtHML#Y"Ө MNԪ$%;VcD淛#̉&FT0VLB3Scq y;")3/a5¿>m0@:BV5VVHѬ9281NSSI\4-:w_o{v&߱l]UjX('Ɩ]OgF4<3m4c7w~z?gYk o{޲5 `H)W,WHY] 3 %F`IYyG1cyԧçMǐtHP} rEBqx݂~"3B+R6MT`"~!id"U)XM~dsbZD9;c`_}!㉻׫/gnf:rJ)YF`P4pp4'bP:4(̌w]W-Ʋloz6Mni,+1HnNꅾ J;ӻ\?E*J,y?|;9S(B亮sA$Cttm^mqн:u(eR@sI aGgЅϕdߚBSSƑr<Φ 4hLNzj@%J%e'm֤ JDi֓%9d epz;~vݒ0Vf 447;O6l\n7A.ѹ3驒eӒ4#W_b,Siڡ߽rjp*^=v*K[fc x=<5cl[~_ k !ilw4ӝws\\mgJba־c>Wk^TtX7nT0I̝ynJu8w]2J!GHup|L%پ*LB&HA~|@8HCqsŅg!BHWvy$R{,l-/ͻMA@E*HjZue, J2U"1ЗSIC AAtGy[?{צ/[?-g `Ls06BW*=я~|_K8w&攖Gg<2{'sn>+Q8Үrsq̭cMm3|"Or/6?`1.HgG$}Y_m>6yLF+V/Ȟ-rTp;6wt!LU3{𜯉' L=W$& Lέv˾&Ae24}1i6!Դ5UmhM$@*HRA& 2CL2]!X=#sYy GsV[l a[at_\4@L4Mf)hޝaExN00 eꥉrjb'tUqȣN2J7L h3&Fc n&28mm)L5j65}`Ӿ4<リ,6 nrc2?7pli+m8OācISoBVZ\HI;yzcӚs!2 R4UAyZO)UMI0fZtg=' P8N\J$טY6%ڈ|yfN`+]_Z W䊈BI)Ƽa%U7?oH_#ΰ:wnaUъc"Yk5 <2V0>S SLx{u!9TcR 5>oz#43ZW@%z(WNA.ؙa\hFƳjF`,rTOKd#ene`8X6oIVדfLZѱш6Sl*regzO%K }UʎmEi[|YC0|]{ow]RU1|7nv\2E&ŘNHLHNsVp!n($Xb ]@L`ro<6.GGRZ |>Ci[owW^wWqrVt Wj}l3=h+E*53PSH=YMWΕ\ӌޟU.7XD#T}pkp Da߶Lxt} }yc}*>ozBBl Mɕ:lúP)\g5_ՠ2^$P2qIoXKDM*L((ι4Ʀsʘb3657ͥ ﭤ^WvlU=+ {vˆҥg}*=SmW =W`l 24Kͮӓyihq߱Ikc1й%2'btՊK菹6@;ʏ~UT{ZX~fKu!oi\fӪ=w||8bo@["%R*]<)<)ݩ[KPeuv9Aއ޶ՕGKU_[zmƜobLhj=ֳ3л[׸G> px0MPx77^אoi 9 z~->-Tl;,Z)D!:d9pw2B֌51[+#vpspU?DE1fσu~̒jBp_/m]4,_?]/3/MƎ?'l#;<0b(%hJMq0XLI1-=oV @"x IDAT8FWk6,8Ҳ`+]_j ^ khXe_JJ2a!M|62{9rX;I^H2eh1 69&cm1uNL.Ĉšs(I܄U^?g ӕ@OTSZF,t%Dxs2=N] =7L &)a9!2hq3NۘiyЯ up;VOzZE{mhIt}e1Y%qݾ̫¢64].|6b<* )^Ut 9w`?K{C'OuT^v%M~d*URb,TB썵Ĕr,aoIH oty 6wӡVW'wgl<|⥾wS|;N ZތAG NObL$4՝ gcCDo0V@B/jE=c?Vw|G5Wd(3VC==?ņSR9yQz `jɬ&sT3BS16JuǗdYM' 'Z3[|ϗ5]wrL[Y%xي[oC*G-z|Ml/8 T-I@ t#8snIV !@!!TRHR B$܋,kUWw~J]K A]fg9DMݶ"Ko  XK}@sdEM{ٙ6i>+k"mg M-acİrMYqnHIbXS'fE{eO17Xhm09 ᓚ=oEYcMY׳%{V{.e˯ѭ6-n*UzW?ʘچ+bj.v_[Xc2-6EZO*>1`g-tyTXEJ|KFcH#:x (bEl: 8nxI߹z b9ľ$^Wi*Q'NLp$Yѭb<4),`T&hLCdEțVQh Ęu1 G;29:#/ 8DW,̖7АicCk{msKjMi쓰z*?!מ(jdnŜf2' HEǘ#`w@Aq:T2Zxu$pj:_cG瓾vv7wҦcLjBK}'UQOvbSaN-(H~C IX'Ϲ@G}W89jQ[Umͺ`!2)T2k}rzobEǿwxr]Kʛ`3?8BHchc'7VRu( 6+$ u:@X "]Ϊ2UQ&`1,3jxź 3pF\`'$]g'{Ckj!oh_(ovєǤFUcv˚~GyC .9W~քJ0%ѭU^ OT>S0Iڄ9'5'ϻ Td-dtٶ,N Wjp3#] rƽZFޗ?ONkF6OmY(UUJr`}uW-owJeFwmU ?bn(Awڟ}ݿՎ\tq[TID]ܗ c{caU2yӌ;pZϯonHU}yn\=c2s330ټ? ~hYM(U'P]y}Ȑ(U5f$VE K-q,"JB\OWЈr\,6G64y2<+u6UW]DpQ`JV( Bg,I6SfX " G ' &0BXe۫oTLن&)ϼI@1:Ya!F56|1k|kJ$X ш0*乁~CE ]/hbXnӜHHN @=V BpQV%khv|uf^>8ĵW$?fO+?}̧Ͽ8}/km*]Sհw⼔БIǥ2Ì]*c"&cn)0˙d):Pg lNY--Y:c !)^|^N?8 (Ng62Opdc)ZqVLbHk}l_yXZ>0TXtj̚:| ܍xWh[z߱!sM"j G~c؈=G6 22C5_נ"`4FSPۘ\CX~n)}Aq"}+KS_ZfrOA?s?r69}%?End#R"WlF.F+VW/PZD^ۍ$IA ?cu|:B!B{HA%$ߒbE 筿]iZvۘY1yMMrj8bɒl1*w_|np!9j}ş;#'oteSZvT{K+OeC0D:p mfuqz@І#{͜ymdiJDľ@)DrjYI(֓R0 ne;4ثq <? 6#o3igv=.akw-iD ͊'rBYd \ZxO l`4)j)iS*'\LCLߚ1t MSB~}l)uo& (K䵚Ȓh# ,*}5hSn#,N 9SaqDAj1j41» n4[xtSFb&` ]oa} {ΖWm]Vs΢uŸ#=~S[VzBP;ޡr91+ɽ/n_=H홶Յ#(R5]cBMhb}ĴY4gG I%M!KX)FhjudƜK+l:ixd4-EU'ƙg7:*酕F]-NR )CTbγAѳj {o8K3&>K ɩ[u߸SCF&V|&8˯;)חOff.scxA7&,#MIXK9A2#_h_;)1.\|$a(@uW;mt!LsY]&s1,ܑ 7!5]YXƔ|vmu/ ES)S?N|c纟+m%Y0(19_IɋY 0z֕pS/g "1zcg]*1 xzuGCO)%nrt`eL3@ ى,Z%476o*K.Y#sqHK$դ" ":u/5k21e~9˘5 W&8?H=Nc>kz T be b`"LĪacㅛ= bjv%@Třv9zYjD_^0ٍ.Qn阨B$hS{f1aYtաq}R$\ P!! !K]*XQݬPrL` Z|gP ;i"/˜a:]\' iǣ,*Fv7.DU漁ykS4:yMp!&&[o&&a u%^]9d+1Z:<6[ o+0TiZ~(ge{bSCB`'FY M#X"bُi#(+]椞8NgW@2#\jP~71=Nl皋oyrV~O|K =G8r;-k-KizDW=?IoEMgicO5'|/9Ǯ@ho uI\{bkL5m0J`\Mo%ɂ%,kBXhweh6¨v "B$SĀ@2É$ RE, xع8qkW*AQm`>-]!-=>f.4Dશ:* !6_Y 3Fy+7>N`sk28J=b礘hɷ5Ϸ/vicU#j^Y{޲[qk푾W6Nn'[,R:_՟X`>NHɩly,0!!;xXLŦÃaΆ;5tEZM>Rq#DEMBfBY&z(s)C%NSu7&Z.l ^Q e*eod`ܻM'%HVK;I?P!IoW|&ιO-qUDҬ')8XKʒXZlg9&ھ',8%q cIȹ<f߶ӢICJ\r(]my2ت0[j-j#zTA@oSc$;D/qѶG[?  'ýOorU-zLW~i^8m12ϢkN=丼 ..3YJqS_(&FpJK8DCS<09);:9j\MZx[`jFI ѤQ\G1pvL c&Z? Hc-D?M_iZM G[= ]RFI0K@g!NQJy=VZ'*!%vq>%MzǾ}Ge}}%vOhl.vi)}R+t(<XxO kF:44%Ich5952%(d++ֺPpY>Vp_[|c=CIL5l_tW/wkvۿq_S.XTyzF%l˶sj&=1Z!L]%i{D2Rb,;9\&`o΂ko2;gQ5#`OPҜe!av/x%<=H@ ,Ŗ3עo*Pڙd9SEbu,*Woy7,lY=3RdΥׯR^lnք[. ޿(m 8] 6^8DGZ (w{#Fh>#W@t@o6cT |jwE)Jc'?ӌx&S,!` aMCsF3KMѵ/xL9#hmڝU;H"1$lh٩[kRSmevc[fL`hkL\,KKhݨ@ꔱ/%LCDtԷوS=짇o}ޮ8ӎGpWW<G 8X^Bş:k,UgY1CE~}ˣ \E=YgDX04k$;1#dm8sl#'7}H- Bz{jas4+nByO/ՐF=_h(لKEAA%*%Eh162@ [$"EwͻnZ"5p9brfHj,PIP8D|ť '/ u4O_c 8 - ѓXrw AMW[E[A6(@$S1K_fql&;+S;><4kIOg]dnHZ)[XK4Fqal9@١ȫv]}~Xѽ{lMɂf֫R?ꮅk]/xfTծl̽1EVD]tӍW]t(-uf }sK%k!GM_RdZvώ\2:~ Ä%҄BV/ 2Ƅ6X[lZ* T{GW5_mdl; ٯs6Kt=;t<5{ x8IQ2̢<H)Ol9yX-񜡖c__=h,LT#I pƈO3A냋?)ZJP.2yڃRZpPSFua^qVwMsuߑ*/b= r@-wѝbḛb++wwݯO*oBKN.z{=[=/FVߌooznL6vgJ4'zdX 2MHÐ" '˱_{I4WE="Ų TePcvV#RE-iҏ9p6M䲕1Hf͊7&9wH #ޝx7(h nD^8цi 8 &7[x)o˼Vԅ͍;E4=Qʶ[wUh䕳/|W֕07ȍ`#qxqlֹßcq~ql* m?-X)9͝B\͢61تyۆNR?, |brvȻ: 8^I*/}X.=C7N;o%i^W{ Q*ECŎ7;e']L0=\Stg %m&T,E@"k.0pV[iV\kr?a 53xɧ&U#3j&\Zc%E85I:Xno %/K9r1w|# L Q.DK@KIMIW$v&{k3 E*QG:֩ՍSR =lS9R Cbᾃ1 .Ō@^ϟfzNЄ7. `+W&e~S"DXpOǃ+#w bcBnN8+D,Aŀ&Z\^SKXL>n!X5 _I _{J U][J粚H㍿kҵYw'ꭏ/,! iPj45Vi ܎RbnpSRj/ D}q1,-QYI-ζfbdbʣYBj/ y6 Gc֙g9Ugs hm[( Q1bsjUPxXA)Y2O;3buSҴU @5*`cV :aW-{S{^?5w;ĭy}GzG?&Xqg_WC|Yivb=%o9'o'8m5^1)}I,Pc"ﱼѕ_Wҩa0+姾4^4swYdkS%7}Z vCkFTݬI5~H I*&XU.MÛ~Cg f1DETY78kJcʮ̶BDda09 7_o!lz 1Du7]pBg.4CU@ p=Bd4h AKs*f|7"ccl$Bt0{g̱]¤>;LgTINk }H@w}Ɨ5T归}?)DE|Dr@̫ بPg}%3|f?*u鳅7 2#xܡ16R{<XH0010bH.p7\ c{~}7kFݢ] XHgqp‰]Q*j=kΜcPɼ6^YxiEƂ,ޑU bo#Zivɗs?X$Av- IWFxX5z'ޣ}}0jlZ%;' 10rђkijv9"exi@`W|Yx| MGZ sjOf^XtED"20ARn˟-|؜cóߣmՌ_}S1HLbCkFtk,8&4L]7h8 ];g>3%1|9jM7oU 1<˓ ^kuhlB/OԢiR`P)ǂM7ш4@l:^wd37A*(qXjN'0%=cG RJrY{F) y[il! C^=_לڰ:o5\/sF dIY;@t=nm0ObJiKXb(ݨO&ۍ ybDVu`^2K& xCD5,n.mjƧaF(H~{\ASak㌟=#$o0ӟq3jcϺ"[jL4(KPp^ Zl646c Bt.$ɂtNlM0Kix>BsD_u-c g,N[XAkCi%" cLw BY91l8^<*pn}ct$κUYaYaS2C\lqŖzCjnҮg eRA;njV)>o}(>+驙밂iFw8E@dt;I@r)D_۪D^o9Qc\ja.3aJM HXLkC2`|8~6 L4"|6@̰ւ'R)96`hY^5#A&q;ҘHGqB3r%T,Xh4& XqK͚`DG,l]cy5r=%iWU{[F0_5in .},OɒKK I)D[hy>O?IF,Bl_-}w{AE=+WO|{ QJPo nLJj?m1ApѤXzm+ݏr5ҎDGk.Wh4L+qfK kHS>+A%GG O>77J>0D*oIΩpQ*uQ\j=K>5Hq~ƮKT?L5@2e4c٩cR#12EMUڍsUuK˞=v^`u-  {9ɐzGC}{t@JDk-`1k$A.UKߴ'N]p V h-|AA֭q^%ѐ<Ȋ< ? ըDƄ;)D- qǸ㪋(t -t.~hSurV֞%VcS9@W"tS7Jx'D0L>YMg7M xn^ GX"#L:P'<U֫l?ZVqV(Pjy:W(5.mYeEzͭ2%2C2KddPԅ秊{ѐ&#Q" s AÎx?=*Pp,x3G~Y !-.*6]|OiǢ:m{XD(YtF`Rr) Q @epՠ.Wp0!9%B">b* 3ao;.e\*P0ADņ6nײ,R b-,$g-{/k en mѕׄ*d6~)yLY2{iVOጿD}Vm`RUEI x9Jf"xDM)$H様)R$ggfd+< S7m(F&sU3?$f$d`#OnpƓwg2i#*fd% x"Rda0>yHC%~H@3`^_1"^5E,/]_j`=f5gN 2AObXqhc҃&1d˪P뮍VF+S5L! ao5-IMn9EKktǯ/<p}G{ʣ}>-LP@?}~zqG>L8Jy_ଐw|Zd)&봶*KH9;;qjٹછՎ'YRV5MT'n؛]֫ FM}f& Swt}!"RhoQGVZ hx,ʀkֵ&}I~2hH72AdyynZZNG<e6eH(1[vhDaܭX?1-ZfW<%73G ;) fӇm`(: $v7E(0BBc;$ϭ]q:Nٜٙ% (  AD$A6<=tJ0Cu͇ݮU=<l $@X%u]]wg]h(!׊+z]goC]iLZACaEd,dMU_t@!˰ڦsSE֯̿np s/*Z4D˔w) 4~ylt['Z|l:5JM_Iw=kφoN(eFs1yEN>?ZzEӮT] ,K$$HuIz֥`Ԉ:G)0ih$̂ r(E.Ы0u nE[ڌb3^?i n68NoDE}>@ː5  @߅Lt23@`U#2G:ϖC&`i`cr/{^-}z/Z#%MXb\7n9#NŐ|YS a:.PLjMkky\ĝRt]}_{Fr@B!pe 8.> =>\]v:w`ijP_lyZm6`DžM_RҊ?$>7߷L/@-kdb덋o v]-eg c+w icK1NE'UԳF*c OP|1謰O@4m2wFbJB@5p٢tbbۖAt`4e n(Ty7lMWRL:Uzrh5Z1ՔJ@/ý| ! Ƣwcx8r.GbɃSyIbt`uw dC? [7Xr#ف7>NU 4F+ mGQ D7ѝ/zumen?m.Kq+ms^ v.tyns^8?8MFUI#)LR(970HRҜ*9_HRO,}>#3J,>{P.mSM: Y8%Bk3{Ve #rYZ}sU4s99 ϻ2QHJe*%®3@B `Ȗ1ʣ=U(>8Rrke (I*q^&ofS!p , б&}ML-EVz1':3 ׄ|SrSe8&^(;E>.G=Y ^#F)*o_38ξ3B rI߁G/Fk9: 4iaF]5}ZN 9e*`<+o+p::\pEpjis \Ǒ]xZI mtR% 飚/- Pncfݚ~ۖzV}GgqfIe'M.-hVE82CfmD&mHG0`6)3KyW?HH#D6D)υA/;CHd(/EvóH>DUdvfA#ddLP}~zo^R*`źu+NU6loJKc?2??vp A_c }Ka?11竲V6ՔggU:puX*in9}g;{_> _ң!ߣU-o4KWdT^񛊅 R#Xf9gcDSw=\R[w(D@tmeaȾe_vZ~MdѺc^u63Fm@iᕖ11WPi$MC$}X~߷ wTKŰ&A/Muv1GJrŘ W NAet֐qʐ3ƅ)e'o1f`eބIm 7 0 >f{JE418 wHr˫(Zr3|L^6͖M'^.Պq%oU{x E`fKi+&+vy:ϱJYܬsq'J:uqw,zޠI+%ܔ5WVjv93w(jLN Ӷ_Q8E[?{fHw Pwi>MbcR}B[gAYR@}ő[YvL9y2K(F-wIo3&|'l`}֠Gg 7zI @e =uPw,u7eXi` lԭ + ޥֵ}oIzooJ{ 2pkgVrg5KEZW%/;a$Mk{wfM1CP%YvRNjX4}/c޴ݶ>Ыwt;o%KHoV?j8 HW+kkU1xLTrKmxYBfq:;2&$8duj/'iy"ب ]Oh%'Z!4 !BD:u-0}d9%ƺSFvnyQ1uV -m\Ҫ\ٹm..k h/uv:P;QBE{L 3rVk|Y6^gHfC 6>Q8I*c]OT}P6:]ތ:h%C69޻ } 5ޕYls܎G ,J AНO8C[UݠnW"§Z􎍹 >bL&I瓕Ov~[VǫiZQILIgif˯5_T2$2@E@2j$JTB^Z?ZNaPlfyT<1h@/X30,ȪBNԬ@bzM"D -A_$L^c6{?0!»,}50M%15E1QMYmFҮYHNJYY3QΊhj4C`UqnFBL@dl!-M9 mFͤi8d qrUB"6V2lK.씴ibPN Dl O5d&Q/!009bH(3$-ÒԢ4T,NQȢP)m5B>2A^60@w.XgIwW`nl!N9o>ջ΀ ƙ i3ް+>֖qcXJw^I#BkΑn3k*:!x~bbaL!U49oڎão浅SE1*F9{B)Z֛7!Bd `G zT|U4*n&v>j;=Qf߭O3ݯ2-Εcygc=W~E'}}m.S̪ gCts'JVMjd}n }/yTLz3tu0"h^){z8{[*H#anBp<=?lvW1,@p*2k@H [ob |'K?䗯Ꝕ1O,|Sj .e }fWyܾϊ ^wۚg:Lzv,w vo~w:xbސQ{[_q|^Q9ڝfLCoȎau,}-d~9C˒ɢzOT:]8JQΜ4]KCN$ piZV4Z8Ɇ]?[4]1&#QJD[FTuBX<170 &;Y}YYcnķpx ] m3mb b;XWd06i@O0Lt tS#c9I$ IDAT) G":"u8 gdHQJGkB 3熰IBH=,S}s2@4LFY#VodZ((`y󊀠;Fl~ѱPDoџr6saOiwsΘ9j[qaܳV㟽2+Yܭ HHW( ixXQte`уջۥUV뽼ϲ\sG]ܠ0['m RʒHC!F$ߝkjngM۽j1"?LIňm7,9p&bBQ^bEi_ |1ŻD emJ5ݳ~[M&a2 dR 3d)h47@ֵ5J 0Sx%4Ča}Pb}R⦮کU_'v\_a٪HGl226xrh_gz̅8[w}ww(-kX?˭7:z.^9m+r*K7~e}'G75S]^3PJBh3{W(-5~f0&qi?Ώ:=\=eyQNy7+oW߮p`~L j]V%*1O:EAF g/~Z=!ʟuvE)ia\Zw0'u'h}ޫڞEO&(d*>瘹_҃.kk@grORim$1#0QP\v2ٙȁ,jomɕClS9ywcC!f : u`arsV'co9}*_2jetOZo廹4̣^q0A*3o?\ۣZT}pQ"*T>V$<8%% /J6O>"PK.Ik P$:@fډN oCp-u E!)BAt.RlR"#T*;8[%HBt:1sǎތ}d0%K|.S`K+c #KjKHqVSͰXj6BE.c-}Qyus~.#pkPT+< plL7(I2k哢tf߳߭MvS䗢3 :tD< B" ~'q=2`KyȐ1`VPRղ")ow Ktij%/y_[ Y+CZ`&L 7)˔W3\ÈKQn(/QKp')G#^%@ UꐤN,,7-M,cT7McRٮueR=Øx{pAK*èl6Y~\%(fm|逖_xɽ`ٮz`qo秳DIP b CIƢu H"-Axd0+hX<>_x~Jynȥm\xXu6XѲ_﫸ϟaX 4MI e34fdy.o4ϋ[I+įMdi Y46 yu} 7pLG|gh(7%(R8$P藑uYoI=ȥMċmsyL\LkC0mdY97eЩ\d l -Q4nx<H iGa_V)JH- tKv5VWv2dJӌ^)oDVWmfTH)7k 1=~ԼXSMۖ3$|ള4_臽iIUtG^| ZtOU hɘ%/:'`8X~OI0:qPxA([(!񲻻 k-> {HwU :]THG!UbwgpɀSj0T1p3X{[55b 1l+^5MLjb8M+R#DS4^z+a4mY:40P8w]Uc]GFu(h)zMgQ:MS5/D$)}MZKD+.|f0_paʢuoNc'4S{ n͹6H{4VKb5 wUQ Yun&"Ls7 ?17M{k^iUl> R"2KrLjԐ aC(pԾʷgfټ 3SS$K=d4dI`Ԣy%"2R^ȴdlseiqS+2#&ĸ>8dwwT# D8%`uj;|9=D\}² eݛ^7\SN9S >|'exK-`+n)v sI-[O .xʧk "elDA, zEZR _x}r 6E%k6}ڒ5՗Iq"0zWuf%I(Ɛ^6l"z ~n?f8-LGkYկ;&(;rHV5U5 aBEOFhȌ{מP&7"[#|8N`Dȸ|G(}p"s@Ji"/Iws @B @C̨ B {X$ >"=9t6 Ջ”;c`\gxYvuIc޴lP;sZ1\r }᰿Zv]!sLBetЊY[Y{V(!:Iz}T@=+6ЈµvV]]l{md/9Fk,9c Aq>j6}1T1Pb=%ֱkWA}:U{SieUe!&MX/=ptαm{6ڎ$#.vm -m3KΞkz4:Ig%%BC޻n *}u?rui: ZM;" P[Tn.^-(*|h02 ScO79%8Tq!L6q]jRH&f4Fz%QrNHP)JR=\z^& (UYbt+Ҝ@Da37kJB̜ju=c0 !mWUQIض2Q]wSSQ&fȞ8hI=PB ?$q@SY%N-X@7;Jr:GC(Dg\䩗QΚ}REfqj(Z"M6~K yr i-32E8^:ĸ^p@vk[-{.kJdE5fa& X/E18߶g@߷yל5]/ir_D`&S Y*) E !u(,MQY=Ʌc ԧ6겼b&EUY9jtp`SlJrƙfh5xQ|ʫq8vUd!NQ8 -zrу\ C:-NsWHՍ}5!j3}Ubӏsܴw9&/(1O۶U4伌qJ3]-7&Ų tnHד-`Dϝ~5}="O <~rg lTf#.)fTWtKC[~$]&nnӕ=x^61Y{gDh>b|WAD@HD3 =9)དྷ;`!W HR )qs1FgrqVȕwz1hd|H)C)`qxm^PP0;9yG{]Áq;0[{6Jv7psw[~wn6ta:'4+*%=.HWmeDݛCzIR"ʡYT+zPUm/Yl%bzuγ#Tgp*:dl样ArD~۪zE_IQyKz?nFCT=gKx [ݭ6\:;2:o8I]nҐck&AYYLk\Ttjۋ뉯'J&L&LW&E ˀP{%ӃI?wW1?eHDm'4.k:5j3b;d”E~JM1BOy]tȦ~u#]RѴQ^M ZΊ/C)nY_km+ J8y5}\Yxoͮ |Vh;3Tg.`UN(4DiS.++ FI>~ª~]j6Sv!6F \f5(1 kd#φj[TL4 yo:z}Q5{vֱJE_SE35+ ǿR ΁_HYFdctƭxfY:NgjvŪ,T=y^DYD"Q$Dq@ v8ԫQ` Ck Z_pHLvV8[f:3$:BAs96p0]H!Z6b/z ) 96Z) &AY6*g;N Ji;4>$!lENJއP\[̱fIj@6) boj7]6m4/fHE{L&$S0]g؛ݾpu߼'%tgo+L5J 3ԃGueI̪k YsG)B?!Oj+ kyo^+t^*{|$’MVnΣWM<0SҗOBBȾÔh:PLcjjkbMOV/=վ0Hk& %FӊJf}j'SM׊6V_ Y+XD_;pOMIon|=X:k1*uk-{^ʗۇ#rz=E+~߮8XZD]ix\4i" $bΣ]u. CHet [&DSQ:(銿?ˊ:p-Ȅ}ӍfoZ0szUƕϝPr&| _/&Knk^YՊTѦ{E7M̻evsn{TXnN. )lU@ι`BQe$%HdUHcztÅ(}-w?Ljn3\M[aQ~b4vi}hZ TF I&a"#?+`w}q`+.GY, h bj T =jeTeS#dn4yCw] 9.M]+̏,XKޙ4.&D:+ xcqdq }i al,\n.W&hqhiq&BPc ;8e'YMG Xgk/N(tTK{?`Uo:l^Ct%/AzL_m~o5YXtXݝlHeuϲ_.H" ! _y13(by{/lʄٽTDb)KvgY͗HnlѡNW5GƋ[qjچꙑlaK}Q[NAz)nzo=1FØ0%D,yîK$2D@(hSMzv^ܻκ#HVlC#ۆtdZ?sHV ,YúNUky4>r~PQ6It Td3)3^5N7_t{ hPq\"@NcB}܃cwW2jBwVErj"CV< _[XyoM,WjI! pQT9nhЎtzk4Z[}WwUBEGEVdž6_L|PМGv^+~[d2өdpb=*Z`iLa:'uʃ>&+g,dͣ8V#7;!%cG 5s'Gos}y˪,# 5Je\zyAdHΙ]CpA~OeFtn=S $zZoAK 7{,1(ULb4Tm^g{nMXOv|pAZ"eVe'e`}ͼOUUh' ,cr`azeՔ }UJO6DTi?ߐ%vYwdQl0hQ:`ibσ^`xW;W)뒍%RRm֨W=vqm$zUN8kk}?4E37Zaļ -mW0eOJ#'{_ l?&rtG%ש/PeKfGd"*v5bq)LhybÃTdbMވ!aVv7;a?2Є6Q?43tH'!%@IFrfiYl;dSWbT~㧯An} e0?;yyRDثU!E ; ѿ`Y@Uu_T3m1ia޳u DuRx#}[9̤|MFSYlʬ9cVa|Gڜ Ԥ}ҌKvvLŲM6:Jh歟X0PD1K \2f;n?qPI` ! ɳ yR"h1dH5焴@zVa X2(.+6Ŝ}^=s~_'_˟|[@ p &ap:E?栁hokf6ǚ -`g 1 Fy~Njb^!wyԬi%PF;:jXUrQ,ɏ}=6sjRݎ @ ڔ0%JoY7m?( ?|.e NNap¢6wpmqȃPҽ\ #-*]:;*nCu(NU8rpv1m\vhըnIp }A3;.b߹2bOAgUeHS5'sH#SOi5fw5e&= gnaiq[Vpgn.4rnYnF5S+2;9t(7gQ]쏺Ȫ$ 4JW~ţ<@\hzǟ -K $=N#}n0AHD6_П66FKh(c.{"Y<ͤcV\@:vM )_zU`ՐW>Wal}&{Cdy7_3/XA҄),f).+?XL_ {i+t*;NpZAO/j+J%y(GGoj|P^` Nx=ͨg.BQaRJt`[dEɞs 3`-=*FDe*jH0vcE-'Ũ}x~ 2đDqnDM5dV*Fw;Ph~'YRrBc"/&7lh?777-;J{G~j^ڔ?&e%G>S.i%G9=GL*Tv5fv4g{ L9xĂEyb˜fUΉN/HIshn2皙]o>U>n-7آf3&3#Xg[+gvZRLʨ${`=4M(:N Y[|W~/Jdr(AC^ږ;Ju2mXZSg9W~}'HwO+R;5f0\ou;'Tz t@f p<3}? ~`k\'aheOy{_$Yx7]ӅK .CZ\Wt8Nи6eh{Lr 'Y$uu\/btSxϝ̆:dxEJ`4V;yap1.|lJ|6ؖZτ<2\4Bmp|޸iRlR6s N,8CrnX %HHv]On79nN-4瑪=j Ehj6?5H[O ]fk_b4 h[--t8vpՎ-h ;۸ȬBؘ&j 3j6 h="ZF@l{QUj ]yOf5(|5}yg V;>jgf{IvS6 $ "zQAD*^EWrUb\#1{'g&}f&fl9WL}vgA*.ِ`%d?1⺻F%PUH {k8Px aeja-.7 @ںuV \Rg bhB% Yp'REox<0 dsqZ6MUBM q@L.V1kACGC.,׾ǕSϗ9Ynl3>p$`k]Mv\ꚨ풶MQ.F_+1~ 3Xj!zM .jY4jZno,%픩XTV|Q"aky*ux<>.Ts!yv k=#K=~] *f_])k.V2L/x54Q![g*NO8w]i 7,Q/$Gl]k!\sS{2NbE0ɜ_TX'| UTW:B0ľykh@>:̡3Зg(6L:X_ 8zc *aUBf>HVp^oޥxUM*s5k9=t\W+_G8穨2AII 7 +Tqe쩉܁O긚]g*oH4"Qt0b>q(6="mSUԂг|{SHB%"T#xiAI%$ۋ>$" 'Cd1ёbQ?'OiQ"mRJƬu|76(2"~)S$^NIn,ju%Ub[D %anΩepryǟ|4Wb'dSgctfE z+=tYB5R'h zsI =Ϙ)y}vFo+g~ZtKE -eJK h9`* &,Uzelsd cìrye ΢"$:dcL8ajE.Al# 77o5-?\kB`S@=w /(է1+8SUn_қG sjD%46nJ*q޼iC(Eaq#63Myy.Z/fsQ`-{9@DPziYɧZ DnHDAEs(ZM>wdPvEBma q}6$mtN0lpĕ E*>&JW>] ֖uK HEQRO*Wbipau5Z⻇`KzclC pjVFܘu8P>{ݵȍ@;N4L٭l׸x:H$X(>UZ;AQ'sr8 ҝ#Iqi7$s,XҶXg$;UZB]tGs}tӣPb-`0Da[T7kawK#dhV3poə;u˩T 2kF h\p%~qxvS]' &edq[,+Jb Aw汖o䪹/UM:8ͭqK&l N|췱'u K.YBmYJ)DKu.Ve1 &uɹ5YȽLioNϮu=ɡNU欋3q4CU錞bmrgj#vÒ RX̓dۖUxSH2.qkq%d+%T]?[pHud 8%{vEBYTk-1[". ̬;v,PW}>J?xag'h}|h"}b *3F95 ,a\Kr6dƱ'h{#8h'uWMus$MixX)9ȈnC^khGF霾GC6P>FtRvSޢfr`ʙLi{.Lt>((̆ À""Z3A#eKzRII.vOWcT/Ɏe|_n1@F9ߡ}}n*4ߺQ&vWqGW=\& r*Pu$KLX] #@y!!˫6OXqIw8ДmT-Wh8ZN[I㦶"QK]K#V'B!8:W*fۃmi2 Q3+,&}<5O4b\1ˏF}ovGN轈C̿.@S;#sAҵ \!Nw&Iݧ6 WSmc}5Ԍ4jtF"_#GV[lS6E럵o>H ;(]gS/]{]G&׍9RM:3nݨ-SU/a%eumAM;"/v t3XF[`kܞNdCeV lUhW6TmZXb)fSU^"Pq]\&bk \AgFaJbّd|S4EAR7bSTh)~%ԫPoge-\Ovn7B9;YR夵Fb?Ɯ{0({>:GJ9R<1Kh*ۍ:zrts f$Pģ8HLX*H]IF?3(^I naMB\n36٪YV,E~bttIRjx9vYJw;$ZnK5bUgځ]| }v0wbP3oaŹqj% o0G}x&Q!1pt=P`G7>wI8VHn܅M`E'|P^A_b|IDATmf3nlFN`Z?ڻ8p x+,o/AaJHlcR]޷j3Bmtt@lZ53=żnÉѧhQ)D 8"~ۦCNM\MeVw7*-}ћ]6JmT JM?};mݣx@bMߝ&r fV_8n-?ȱOu3cq/[9-~jXNf3VA_\u:u%v5 dyΘվO$9>;A,D g>":̙3zcƌ B8yd!4*++gΜo+#GVXo+={V^o+}@ F F  4@(H"@A@  fqz:ەIl}-lgtke?%k\pe*{mՠF Bw3("Ih$m@ nA@  hP@#D@ $ F  4@(H"@A@  hWdݷpkڻ<+Ki˿'f u_.#E3_'Snuy_Х:UysD~)Unb&E,F@Oa$7Z3n㦍SqT^߮FWx$jv?-đS'\\Ժe3 lXF=iF3ۥ T7YLsel7Q߭עhD`@:&|q(~ƢU2Yw@|bĻ߽dm`8#796ܽ L Cfy?]^ 油aC|}YCxl6W:_ב:o|3d]/OJ^h䕻4FnF[яD6%-EsJv|c<^]{TOulk,3%Eaƿq 6*ܛ`Ӗ<&z}{aܧDŽqrtu+Bw }`$ЈɅ{95^[df˂z2\X~悭*!i/l|tܷ.]]_ks:M׿韕4z^Mg?uچA&a:Ll_yLW|QsrJ9)cUT,9k: [_aK'<89fKSb MB%Bz;!nC@#I/ƒrtף+$x}JJ^; cmh^UxGRE8w~R{~_h +Ό`_]<&OV2@pSbҔ襩P30 w 4LTڣZZ|6%*y6핻^S:Lm4$CU)2]A#_:ff:1^畈yZ>j^XiAR})Bs7sf2;Rӟ33>|k'\s.8?]e~. !B5s:zm2D'qTlN$gqB2|s M b8;\B9N:n(s+3YGV?/bqCMPKݗ2x{B@~ J?y{5)xlc}/Y[j.fs2H9=.Dg+/vу?C$v{/؏Ł@ ԅDZ^X"u[4ѳPsJٰ4I7zC9M1Q-?%ـYIENDB`zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor/gnu_r_plot.r0000644000175000017500000000006711544165551023500 0ustar jaapjaap00000000000000x = seq(-4,4,by=0.01) y = sin(x) + 1 plot(x,y,type='l')zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor/gnu_r_plot.png0000644000175000017500000003300211544165551024016 0ustar jaapjaap00000000000000PNG  IHDR) IDATxy\T?sfETRK ؇MWR\Zne}oj悀,`Z殈 ,bCu@Yfsy= z8jgu:QPơ` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hF` Q(hFQh;wRBU* :##cɒ% A8>#///'''C\\dq\||s=G8رc8Ơ` Qt]q\mT<\tرcW\rJ{H ڊVVh}/6H\tiҥO<񄓓S>}JKKO8GDDL2Ύ:)%uڵk׮TVVFׯ_KJJf̘*Unݺ5..novǎ m$yeo8kbe`$@-Y$..gIII k9366=z]|||j-[ m'\A^yegtZ>: F***ڵkСCFk׮iӦ4!pbȫ ?Z6 OAhaÆ=s32jङ7|3dȐr%+O圭qg{׼9T4@~mhhh/0gΜ"=fgԻg7\SF|y~buԩɓ'[O>mGu dnKr/tPp.bс=Y6 vQzI֯_S<<<ϟ?zTKKK\ DivJGzUlq}=sܹcǎݺu ?~ۯ_?_<000>>~z2 QofXXXPPбcǥKv(h%'' iӦ#G.j(h\vO>Y)+V̘1C^ (ht{믿677vfzW --VА&@.]?{'tC/jfF3K/͟?[m]gϞ-}PXvc=ֿ6Sq*j֬Yͣ kccF/QQQgΜpu@Atܹs{wHP HcN!k(h֭6lX4 444,ZhƌA7S ͛j5{{Ad  @`/"uf5k'|BBPB۾} uf۷o]]ݹs稃 @h_|*DnP:zmnݨ nܸADvPꫯPh3f,Z:젠STTt  -U]]MD^PYxөSB_juyrA:u:TWWgeeEEEQi'X:H/_L/k֬W(377ɡ"#b}V[p!u XgN&3fX`u rA꼼<|,طou6իWmmmaa!urA4qƍ[f u ofʔ))gSH, :>>~ݺu)@n޼YUUBDςrssUɢ;t| ;?SBBu y>***55:ɢ94iOdgӦMRz^&LX|9u KA:t:H^^ހڵkG vիWH\ 㸘[RY|ɓSPBBO?DBdT&Ln ?bܛSRRt:uɒQA;88pw5 7oNaX^^^A$KFqW^MdaO=u v7%IIINw;;; y;wP&ytv{#GP[j$?7 _ 㸄F6l0?~$$$++:H7۰au ]As7~+WRi߿uAn޼:ɱy䑢* AAAA*%ӂ8nȑ7nNnݺcR NahУ۷oWTTу:Cٳ:tȷLMM_N$"))I=B2dH^^uoAs7f|UqѣGS 6vXr葬 :***99:HAEEEmm=ub^^^G".h ˗/S۲e7y~СA$Bqܘ1c0nӦM#GNp+WWSfyu2_"""RSSi3ؕtN:Qac0ʡtʏ[޾ݘ+NwV=C_Z33N:QKJJ>|8u Pa8Nn=ػ&xؙX=:|\Gi& b[lAAkԨQ9  έ\BݭRpm6 Veee A2`'N`+h~zy|ļ).8ߨ$,XRQJNNN___h;$+(}JNt6?ϼx#F`qho4jԨQxO0w8cD?K6 6,%%:OeeeMMMΝ0'8th##{kv't ZO-ZtߋOݻޓXXXtСA KNNN"罽v~Q m?Ҭ^xay3f UIIIϧNs9PmbZK.A5xS7_ >$eddDDDP`Bpww+mln-yfx#FX_m7"@fz u޽: W OY0>*RO pmFCD ;;;00:T*UϞ=Ϝ9CD0v :ŌAt [l戍ŊV.U.SW}9\;Xll,N8NDBCC333Sӟg׫W˗/kMO|oooо}{kkk:(eggSNJJN!J(EGGc.<ؾ}|}}SV ~tAQ'OݻR"666uuuA}?nEuVh4⃂nVرCVS[Rt#q%4VVVADgϞ׮]BA7BRuŋA9۶mN!J ({ghTJJ vo([R(EFFoF"J^^^N!2(YZZ<- b󼛛۱cǨ IINNN!bht"##1 khh8}t߾}X`` Qht\\\\ApׁHBLMMqRw޽) X@9l`.m޽ P-~oo|@QRQ=GGNJj  ~Rzi @,99 ¨SHS͇~Z}v@IZ[[SGRCXZZr,+++88:t<߿_:.,,  ;]TT\oEGGcLt:o֯_? EBPrz @ѣX@w%%%AXnbB|:sPЭammj1d&={ N!G|쨨j,ӽ <<<\x `ݿYlCfX*%)d?'':CPЭcd%&===$$:a>( ʢNQSSSUUhyzzbݽPЭgmm`Lrss}||SȝBpvvƙCAI```nn.u Ѓ̰0co(60d8p`РA) > CA B˂N:ٿDP899]t: &1#w $QPmj_ tL@A]yy9+??ۛ:Rtpp(,,BCˣNX31BAAXXv|,QaZFAs(hϧNQTTdmmR?8::hZ PzT*_NZl`SCAGhh(&ۉQfffxx8u hrBt]q\mT<I 㫖M`aTy>(zUҋ0Cٳ:4Wyy)uhR= i_jNw20syzN+Y13@¢:4ˎ;A pAd,# F6$V⻯fQ8I,j5u xp9,Vl}}`UC:E喣%fw*{!fCwk~sIֱcGc\=z:o>B@A\hhmۨSPl68Y 1H9::Rd;uܹ:L߿$FTvY#(h! :T&Cf JKKB鉌(0 M%//LJ:YHHQB>tu 9~JzX^^j ZJNCfB޻w/u BA $22R-a-mȂtB ;??:aboo_^^.; S*9DA G>SF (22R;ۡ#mYw!CP ݾ};u BA GCfz&IwCA GTҥKAd2{nLZZ Z%<ʁZlhԔa;98pGQЂ?H\nnu ݑ .P1SH\fffdd$u HddT7#CA -22RCfN W;(hyxx>|:]pG m!b<߫WӧOSm۶a|Cn$9r& !3` K=&V1 m ښ:ѣ)MҒJ L IDAT?믿R34 |6 @˖$GQ4$0t[~ବ,zѻwg644PGzxxPA M)$2'+(h2л@@&**Jb)4???/ SSS @ʕ+Z:ޠɘJK!m۶-:::4%rQJJJDDu & Rxx8 wy{{߿:ޠ)UUUi4 {n)J)mF&"KNN4%Q41)=L>I }PwI,)lǏ׏y KKKR)%(hzXRF111)!YRLBİDBP|\buu+++, {u޽HK QT*Un.\@DRSSA[@@]S QQQ)D)555**:0gذa)))) ̈́4h쨃s:騃 R$L y]'ɢY+-[nN&(hVDGGaX]]}Q (mfSiiiuu5uسgСCSLLL  !AAA;wN!III)i#F4CbcclBBt:݁H&Q(hԩSADȑ# `xKKKJuM $+WWSfyu2? 2d߾})D ))i)@ŻbENq3~})ʸg6@F)!3dggPfdXur0s]#h 4HJ'ٳg{Rk4,'`A7ܹUy㟗bVaZbP(/O h,\A{5'MYvNǁF }'eň#6oLiX '_޾~p[%S: g?իWmllڷoOD555AZHۙ;<:88ぇ|VUU۷%|JիשSCE6m1bu ۷ngZ 4_6v^^ƍ{ȑ#]v5|4b#FشiSbb"um؀?2#GOP-`#iBBBBBB{^(++3l,> oƖA@ds9V+?X".]۲e 7uEwp]WD?W<|ܒ:˨Q=[nN4jԨ:EWЋǭ1l5Mm}}/˦lX"ޙsM筭1wZӇB :y?jgR(Tf\ 8Sbjjjoo% Q@@ W$,lF۠.{YѣG72ڲe 6(p=#ie9X+vO-*^`D'<<\[WiiB"ohCivFf.)į}.\pqqBS@/w)l4;3F\Ζ-[A]\\S4 iq܍71ԩSZmkXfZvuv 6n8rH wN,(h֍;VD6={ :Z)W\Сu޽{ܹs:áYgllܧOcǎQ!nݺ8 ))-kƔaÆQI7nڵkS< Zsss%RA~=zЯݻWVV޾}:CE@P۷:kS 9r$!>>~)dggc?QuOOǏRT~~(522~:uAAưa䶪pO=u ,*DAF||USѣ LAPТ|֭ NR־}{'NPi ZLƌaYrSM0aʕ)>Z^^^YYL$'ܻwo}}=uơҲSNΝbpk׮nBfvs;L0a) nӦMcƌN0a„+VPh ZdjΝ;ɓ]tZZZZ^^N(hQ*;vb@˗/8q"u f'Dgĉ˖-Na(ZvϞ=A@FWWR N\)))F.tӧALHHuYf})NծZ G[< ZRJKK/]D!VZ5zhSSS LCAKͬYRxo矧:\~?̨-AͣN8Vw͘1:%֭[lN9P;)O PԿccP/rԩ&&&A-Y[oEJJJ233 Zz1`M6Q˜9s̙s)={[ou ܱcJJJ Z:v駴1t:믿.5LAAKܤIrrr.^Haޮ-q</2UE͞=*xݽO>k֬!:o< (hY;w… KJJoffB ҀSSO?T***}/BțH Z.|||\]]8}cǎ@bP22wիW:uJ{ݺu ^Rcc~aʔ)Aotuֽ 䡠y'NtEYYԩS-[flll[ Zv"##=<<Νk֎?O?ڵ! +(h95kօ N4iRBB~ Ot]q\mT<>G}7 8! :7-htue{/1S266^z˗'MԺm/_1rW^yEdNa|ղI, U{;ϧEJzQ(RgꐐCZjܸq5jșpw0syL-1vX_~sΉ]ty?p[osNT` 40[n7oʚyfKZP'VsM[yuT*,#ſP'yՄ66>S׬ F#X O-pqݘؕ]ˣlyGLNDmv=j}8UjO׭48`k! +?b,c3o<Jss㩮/;mg<ׅ?Q'"Il ,`h5r~ip+:.D>];q~G 48IKB)AA0  (4PBA0  (4PBA0  (4PBA0  (4PBA0  (4PBA0  rn?PN$^QgP}qճ/,Hc4 p3~Q]xbnj^i!%5tLCAԜ]2}oLJT40 C /~88y?9&?ZБ:@PPBA0  (4PBA0  (4PBA0  (4PBA0  wDT_+IENDB`zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor/gnu_r_plot001.r0000644000175000017500000000072211544165551023717 0ustar jaapjaap00000000000000# Maunga Whau Volcano Example # Copyright (c) //R Development Core Team [5]// x <- 10*(1:nrow(volcano)); x.at <- seq(100, 800, by=100) y <- 10*(1:ncol(volcano)); y.at <- seq(100, 600, by=100) # Using Terrain Colors image(x, y, volcano, col=terrain.colors(100),axes=FALSE) contour(x, y, volcano, levels=seq(90, 200, by=5), add=TRUE, col="brown") axis(1, at=x.at) axis(2, at=y.at) box() title(main="Maunga Whau Volcano", sub = "col=terrain.colors(100)", font.main=4)zim-0.60/data/manual/Plugins/Gnuplot_Editor.txt0000644000175000017500000000070311561555066021426 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-03-28T21:59:01+02:00 ====== Gnuplot Editor ====== The Gnuplot editor is, as its name suggests, a simple dialog that allows you to insert plots rendered with gnuplot. **Dependencies:** The plugin requires gnuplot to be installed. ===== Syntax ===== {{./gnuplot.png?type=gnuplot}} ''' plot sin(x), cos(x) ''' See http://www.gnuplot.info/ for more information about gnuplot zim-0.60/data/manual/Plugins/Score_Editor.txt0000664000175000017500000000710012032024636021035 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Score Editor ====== The score editor is a simple dialog that allows you to insert score into a page using **GNU Lilypond**. In order to be able to use this plugin you must have GNU Lilypond installed and the following command must be available on your system: "''lilypond"''. You can control the look of the scores using the special template "''_Score.ly"''. **Dependencies:** This plugin requires GNU Lilypond to be installed. In specific the "lilypond" command should be available in the system path. ===== Syntax ===== Refer the References section for information on GNU Lilypond syntax. Following are a few examples generated by the plugin: ==== Example 1: Pachelbel's Canon ==== {{./score.png?type=score}} ''' \relative c { \clef bass \key d \major \time 4/4 d4 a b fis g4 d g a } ''' ==== Example 2: With Chords, Staff and Lyrics ==== {{./score001.png?type=score}} ''' << \chords { c1:m7 f2:7 c2 } \relative c'' { g2 es8( c4) es8 f8 es d c~ c2 } \addlyrics { You are the sky and my rain, } >> ''' ==== Example 3: With multiple Staffs ==== {{./score002.png?type=score}} ''' hornNotes = \relative c { \time 2/4 R2*3 r4 f8 a cis4 f e d } bassoonNotes = \relative c { \clef bass r4 d,8 f gis4 g b bes a8 e f4 g d gis f } << \new Staff \hornNotes \new Staff \bassoonNotes >> ''' ==== Example 4: With Strumming rhythm and FretBoard ==== {{./score003.png?type=score}} ''' << \new ChordNames { \chordmode { c1 | f | g | c } } \new FretBoards { \chordmode { c1 | f | g | c } } \new Voice \with { \consists "Pitch_squash_engraver" } { \relative c'' { \improvisationOn c4 c8 c c4 c8 c f4 f8 f f4 f8 f g4 g8 g g4 g8 g c4 c8 c c4 c8 c } } \new Voice = "melody" { \relative c'' { c2 e4 e4 f2. r4 g2. a4 e4 c2. } } \new Lyrics { \lyricsto "melody" { This is my song. I like to sing. } } >> ''' ===== Template ===== The Score plugin's template has following three variables to customize your GNU Lilypond document, used for generating the score images: * **include_header:** Common include header section to include GNU Lilypond predefined files or add common definitions. * **include_footer:** Common include footer section to define standard footer section to be included in the GNU Lilypond document. * **score:** The actual user input in Insert/Edit dialog box in used. Feel free to tailor the template file for your needs. ===== GNU Lilypond Version ===== Syntax of GNU Lilypond could change with new releases, and these changes need not be backward compatible. For this reason, the version of GNU Lilypond when the score was created is inserted into the score text by the plugin. When a different version of GNU Lilypond is installed, the plugin would use ''convert-ly'' (packaged with GNU Lilypond) to convert the score file to be compatible with installed version before rendering the score. ===== References ===== * Quick introduction to text input in GNU Lilypond (http://lilypond.org/text-input.html) * Learning Manual for GNU Lilypond (http://lilypond.org/doc/v2.14/Documentation/learning/index.html) * Notation reference for GNU Lilypond (http://lilypond.org/doc/v2.14/Documentation/notation/index.html) * Snippets database for GNU Lilypond (http://lilypond.org/doc/v2.14/Documentation/snippets/index.html) * Other manuals for GNU Lilypond (http://lilypond.org/manuals.html) zim-0.60/data/manual/Plugins/Score_Editor/0000775000175000017500000000000012140000463020266 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Score_Editor/score.png0000664000175000017500000001147311775776762022160 0ustar jaapjaap00000000000000PNG  IHDR5y 6iCCPdefault_rgb.iccxgP} tXz*eIK,K!b"4ER$VDY$(1ETP;}~=;眙@@ERR|?{NHh!n ( V}](1<X|^:_f ]VTR9 ,~HhrXq_}XQ_}X?@}Q( 1XAN$?bqspbc9*AL!-}?!.^F/{ ؾj]RT0 _3(H&%؂7@(lC !aA 샃P-.yxK:DED A.b8!D qH*#;Ar # db( e:rQ; @ףqh{*=vW(*D_ `T)as0,c[bkڱ^l 9#c88]%2p[q \w7}rx f|'~?O  JH$l&: ÄIH&HXD&$^"HT"ɈL # HVEiD%-h&rKC"/Q(+J%REi\SRTe9՗@NޠNP?i4Z8-vvNmat}/~A)'&-MVKdD5Pc1603;9QhVZsc bL1C1oRVb3Dquq'hBcW'S1w2טS,KJd~f %%%$r%j%.H[NfO?IKIHl\*$͑vN/-T'-+#sD̜,KR'[,{Z*-'Yܠ܂||U9BBEYEbb%ŗ 'S+)*e)5( )-)k(*(w(?UpUbU*TTUUTUTոjj5ԃwwhHiiiik5m4345kZIZj&ڵwtPS:ëWj\5KӵmӝcyuW߯? ٠aaFF¾}?Q.VW>y@WoVW:$VW\_3Zk_Q'Wnp#GK?M8QXMAM?qjii.i|<߉Vֲ6-mdɻ?;Ӯ(9N%=Ni?vY܅tm s?kޯ+ q"bŕKy._weocߓ!W]vvnX8[[ݷMow vf[P;=w8b3r];: ñ13yxqxSѧ5{Txaqb'WdS`RIDq& (7`PrMR9)4u]۶Ϲ\n͍0VVVcōeY4;.09v0 ( ?T*o4]qfff+FC1??ڵT*qdO<9::~߿qz}>C)X^^j+#Ǐ7oތr ~9^Nqq4M[[[sBQrxcjq\-fوo>۫hiiiiiiحjN#^|>8%ܬ[,E^TZ*n.=m߻w/ɸ(۶-˚Vބ] _@qST feR%˟ ز,0/B,..r9uF /hPĥR),..l6+m{cccmmMUU]{!pUUeUd/^x" xaR]@ZʋG !l.J+*˲l^{irbZ !J.`Ʒ&=KjħMc 3 ;T\/ۿ~~}vtƍQw ! uwAѸrJ׎hzј?{0JikR֭nQqϟ#%xA' !bۿ|(ommMOO񣿶=@eR4M޻bkˋ;#u=^>u9\}OUUMӔ;%q_#K%` _%z8uL&JeџFS#7eɚ@Q֝o:0MS/ܑg2x/a*iT*1#`dD5ͭs---]t)bQO>^3==Nż':(xVx"wXDZoOwE]do{Ndi(Ov8,K0ifZe7麮z^/]:8aeY.\h~5C`tYsSTd"ZZL4 #9Sˉ2놭84;;k/f# /r0BusB&VQǀj@&}C,R̙3UiF?| 7<-UT]׭Vryx1"d2e|!0b'aZvLo|ЁFjZ+ِ뼒)T*jFضj\^'C'&? l6Rk8::j}1㒗xl=9zrt(?N(x7rMp%ڣÙ )l޽{޾zL1={,.FAgv&Èh˗]ow ;w.#;|#o޼dc%FӴvaTeEQLugff>}T1JS8tM"!:N8IZѣO7/V䲛7f:{.֣'Tj6>¾}?Q.VW>y@WoVW:$VW\_3Zk_Q'Wnp#GK?M8QXMAM?qjii.i|<߉Vֲ6-mdɻ?;Ӯ(9N%=Ni?vY܅tm s?kޯ+ q"bŕKy._weocߓ!W]vvnX8[[ݷMow vf[P;=w8b3r];: ñ13yxqxSѧ5{Txaqb'WdGRbú;88̖MelkT;@r355e B!U3|&M1kRg-~@Kn&cuݩvݘcI1t@ɍ8a?-ˊtF]]׍: of#˲,ԋ-UUApgbb4M~m6<| ɶ1UU3m|6nIRuŜ+s̆1&I(qXSK4^@$I4-GlV_] X,"d2)B6m Z-U*kznMn|Weu4+Pr#baJk?~< 2A3!?|!@d'7|Mezv,//?޻$/~ plpⰀrPo7@~ע+:S;X^^^\\9{"clϞ=!bXT0ᄄ@,˺pBQt@wf,;::J `4p-Tuu!n=:==1@8&KD}!SSSȲ@ɍ,˶mASA0legΜ: 8o~󛨣ɍeYӟN{^%8?/mh֎PΕ+WٶQ“'O w߮]cO<݂C J@l/_]]}ꩧ}%H.]Z]]eر zuZ͛eή:uBUs `X5?????ϟyƇ~۽{͛7c}}} )ׯG@S >==MF>f>333777>>[ZZJ$۶mkf^Inʖӧj-Dr3;;[R׿_w``>`m߾|c7ܹsdd'+xfԩNR|1c,A3 qɤ8ieYif[L)C=t…|>/rUeYǎzjHB߿ʕ+/_X]]]ZZj>jFFF( صkkkﴐdrm$7TvLuu]4UU Hmrõ3<ß?K.{D"\v=z|&q {) ؿ?᳟,S5,0 zNEq]0 oKCLӤA7̆1.,+O?_*j)۶SN1nܸqyX"}ڵ۷zӗVŋ`zzڵ֭[ݻwS$~;y>cIN(ꫯ?a ;cyyܾ}w!ymm-B@3|JϞ=K,,,ٳ3334(o2Ɔ&''xFwYpLrC;z.\pĉ/~A>i5" 4,//ޡV8P>ow)9uÍ8cF*J&dyu(VL @$y]ץl6K6(ڶ-B:AکAUU_!֠zQ]iFm6:>e > %EI$Ic@UUU3$< 1MuFk$%UEUUiUD|e @$|JTě,,,?̙3t+Gyn0OK/=sΝ;cO?tC)mw}5D$a3|;6 ~^.R$I,|cT d8&hP&Ny ͏p5.0a)_574w؁aj0,Ќ@6Lُ{۶SLK$MdY.+n1jxGGGٲ44ڀ6 S i+r鲋ӝwc.,,lllЁ\z1Ƌ~_W'>5W0fjOC}߯;_;hɗڵk/o^YYٹs'J,R2}}}_җ7O~뭷~sΝ;w#q< ꫯرGFFFfffB+E0D]>o߾F 赾>33S~=PʢчE.P(|MʩHAkrk@/o}[97Ќsn\5Moz451]51V9He>mcbF ou^8t/)m'IJk ( ewwF۶} 3 EQQV)^at@*;$HA>B ?۟Sv.[|6r1W,K0osvh||Oжmj/$B&u]kme3ldYdM՘❏ ل8A޻|eRwu]˲|$m]c{._lY.ӥB x _qaa7X[[CB/9ReMpdY>܆'F>U}E+zX4bT*޽;`~t'H|>O#[@lT,0 `+n⺮iy9cYV2h/ol!\`ul~u]'ԎqMT-/U*KRkt Q$&0$I4M4RTeYed2<e9DBA$UU5M$IBP#MxR>/J4~Ao\}4`?i/t1Q"oF[M\,bI i4sVbX,yl|7>:4&5Ӊ+ #I=VUT*5:1W;q52jG]6T*TSC"/enllNnEJ%Ƙ(UM41dB-l6pw{BB@Wwz5MGc](Ao-a& 9߅ï?) }oX>,E0 1fv.;A;{ru]UKit嚏6c{ALTA]wwTD^mR)?I [ղ,ߊMK0U"8ދC:}sCR|Se3 R; V=鎞h9::Jlj罤o}!H>F[7+ ;uUU2:"Je8q>Jm>Bk UD$fR@ Uy1q)MxV_* ౅{.q&wG:òd2iYwP#뺮뺷MEUUs84>X&D=;-f⣋{nh~9m_])!t/Lt]vu7M0MhrCMζm> ʫlk(Jд2f8Bj`v̾9_a$8 D=>W|չJ %:T{?4RjGX,b` [UJu7޽hV(=.B P,Ve[d2<(0$y4щ'jG^VٲY 1W;qA5KBj dMCg%IY㥆FC{FhY  ]I& kucIB@6Crm:M4ufDQ}q9JQtjpp1c`l5Hn*]nZ$P֕IENDB`zim-0.60/data/manual/Plugins/Score_Editor/score003.png0000664000175000017500000003355011775776762022403 0ustar jaapjaap00000000000000PNG  IHDR  6iCCPdefault_rgb.iccxgP} tXz*eIK,K!b"4ER$VDY$(1ETP;}~=;眙@@ERR|?{NHh!n ( V}](1<X|^:_f ]VTR9 ,~HhrXq_}XQ_}X?@}Q( 1XAN$?bqspbc9*AL!-}?!.^F/{ ؾj]RT0 _3(H&%؂7@(lC !aA 샃P-.yxK:DED A.b8!D qH*#;Ar # db( e:rQ; @ףqh{*=vW(*D_ `T)as0,c[bkڱ^l 9#c88]%2p[q \w7}rx f|'~?O  JH$l&: ÄIH&HXD&$^"HT"ɈL # HVEiD%-h&rKC"/Q(+J%REi\SRTe9՗@NޠNP?i4Z8-vvNmat}/~A)'&-MVKdD5Pc1603;9QhVZsc bL1C1oRVb3Dquq'hBcW'S1w2טS,KJd~f %%%$r%j%.H[NfO?IKIHl\*$͑vN/-T'-+#sD̜,KR'[,{Z*-'Yܠ܂||U9BBEYEbb%ŗ 'S+)*e)5( )-)k(*(w(?UpUbU*TTUUTUTոjj5ԃwwhHiiiik5m4345kZIZj&ڵwtPS:ëWj\5KӵmӝcyuW߯? ٠aaFF¾}?Q.VW>y@WoVW:$VW\_3Zk_Q'Wnp#GK?M8QXMAM?qjii.i|<߉Vֲ6-mdɻ?;Ӯ(9N%=Ni?vY܅tm s?kޯ+ q"bŕKy._weocߓ!W]vvnX8[[ݷMow vf[P;=w8b3r];: ñ13yxqxSѧ5{Txaqb'WdO0,DTb.LDfIpA7 MtFFy&BDEiZU`6q,!Qn"'ƒW7 $häs5 BDExpCEQķ eY"tQ0,mOQ0`09̚|>H$7aEf!"<j*£3cDQD"a]?6tEP$y0qWXMе<0L2L,]5,DK7Ϲ( 7+asl?9JU|>o _ ֙,kYrah(M>f,J+:Ӗe}#I7>o?tJ]>iwuݳ,}0Gzj`i˲|छE +7˘ øJδeY͢ sn$I0e9N׺A T+:Ӗe}#I7>/ۦ]7|Ӈ7jii/MZe?>Ѥۻ}vhٙLƇ7ЅwpٳK6 ͟?Ƌ/N6/qeА?ѼpB5JݩFr;W$[>£R(YUU({7666::J }˗/'-ZDaF4=Wv0k踲Pu]y撍N!;qݞ={ 6yAeٳgo~~;/>}c__!Dm|Zƌ3VXr 6pc۶m6mB|100#p>d7Y7ccc={u낮ѤiZ*xƍ瞙3g.\o%|hkkxg}lܸ… /^tҡC!oOĉ^z)ܸ륗^#+AWgx"yʕgϞ=|?/BƢ^xA/s֬Yя~t%q޽TSO>?[2yGfΜ-{}}c=J=tcgg'  VZEO$AW&2Yxc=@wu+aZ1/@}ѷz'.0مwͱc7[hjՊldZ1 s7?~Cin(w܁ǽ{̙3yLiرcHPZwm={X|MSSi{By(hllD4㡦PDKoKٳB|ÏȘq200ࡇ "5TƁÇoܸ_=6tcP䓧Ed|c;U6,~~mĸ},Yx7n|h7!W_5i[.JӍw_J|lWy+EV>vcӧ>,+6o\ e7[l :2o$xCD{pC׮]XY߈oǧOƃcѣ/ l><.\X~Oa=kJb+-Ə>qePVj 5a;Ypay{0m$ZCa(k :xmܹDW`BCIQR/R&y炮8gϞL&S\C7"af8/b`` b WnJ {ccc<9sstﱱ1Q.\HCoD|CK_]EBwkx.m۶w}_:EM`c(wY_fPUow˜=22leF ={6#'Cm6ј?!Aziq_nJ* ,Z_2_XCUX܈(˲GUNQEQ$(J7jL&Eb,Jwߔ즡٬iR+4j 7twB⎎Yy^b8?3 iZl6[t:-ri( !*٩R|MCzpF3<>FfiZGGG.V% FeY<;ZC)IRggP';x },ăRJWVG.r|ʲq^TT*HdYEQW"[8L;x },ă+7Ƒ =eYD7VדdP'PXܘ&C ˲%sx6ă|o}0T7{9si*ɓBbMohhjM?ꫯ.ԩSVZu5]p m3f<8o޼^{-芄;vlݺ+Μ9ݭ?x߾}###[nOlѣz+΍@4ьݻwA"B7o&XL&^&TBΝ;S/^ܾ};q…ƴpۆhUkuyEYhQuX%׏ۄ_ܹsΪPp&b_E4mW)Gtӧ;aM%TJMtByꩧ]ݻzj:ٻ3gtR2NB֬Yi&:/a\?"Oio<##f L;žhڮRh.^\.7^^&0 TztN:6nrdIɔ>͙aA:/a\?"uVB֭[xxT,h_O/ [7X+Qx61έ顳m=^,LaBH&qRxXB:;;VPW:И2cqwD}+ O7XbpS]M.G6d2,~'PԸ]" qr\,a\?"JPp,hw"fkq_ n3E=[qppb~d nC*w,a\?"Y(Cx8wG4]׻bM?:?/7ՙ )㌷8}ܖoxC1W8)a\?"Y(Cx8wG4]׻bt΋/7B֯_o44C7o_ikkkhh3g$Iŋkxxb|B>&;)a\?"owoFEhw"#>}:LRGG6k׮ݰa{hhr BW^mܹs]\̙3uX%׏8I7Y(Cx8hw"#B*JnK鳙5r/5qD<Jqr;f Ժ;ʾhu^lTu n=?3===PyaJ>al^ ZwXUr|4f tw"}t>kc_ n#lpC?_}z/ďJӵamsR*~D^Pph:׻bt΋/7ՙ nt33Vfv-fŋ._d2;\­bV# >6:И2c{wD3c{wD^k{_ n3Yٳ߽ϟ'lٲӞ2e !DQK[g9p@}}=!ddda͚55-6k.ŋEQJQ pBñ;ñ;|w//V$/XhQSS!ohhȘ=} twwB]Omjj6o|W۽_~~Q[ouw,\ƾǎkhh֦8`W^yeŊ?jFzVgu\?3^{%ǎkF]E$i&>|m]wup]%O w ]XxOZٮR.[x6ׯ_Ǝ6.}~OuThzq<˵Ѥj7w6R]f:AeM!e2Q;::2 _:\|(惛NeSUBPxJea<OBH.4-HoidYfLF0@*nYK.Ed (TJL&?z p&FM:K__bE{{5pEӴ*v:uvN}hs]x1 Zm2gϞJwIl}6vq !.\pRlPA%QYhL]lфeǽ*!ICӴl6KI&/ Qa>QEϓ$P(oLg-JȆj\p2rpٳg09::駟:9pfϞbedq29m.rwm)sq(#I˲>ŋ;Q'~馛ܪڜ4dfhp NvݪI a簷u2r#B6!+"r8YbEccC5[our,k׮u2>8 .V9,,$I8];+I@UP<2q0q> c-Q@`p 7+@`p JmQeY*Mb]GG,1[M bi^V jTU]tq˄@uʲ( !eNO K$IcY1G4I]+!DQBTdi$bA2(b @4MK$􂍑(pHdȆq˲l6N{[;&UU٬(s!jKK竼f޽ӫ0|>_,Ȇ^oQI. <5|~mVfip={6-%2Y0 %MT!d-'O߿߸B&ihh: ^83g! v۴iBU`~assW_mqÇ߿~wwwtMU&tԩUV]s5wٱcUW]566Fihhhll\bw[Dm߾MmM}XtykAW$BZZZ+̙3}BnI{U#v6nsυ e٣Gzύ\.f͚|p̙tˮ]^}ձM6566zTUh޽j b֭[Z߅R,υBAs:`hxWXxoj#!`QKK [V8>ʯf<[$smr@|PEUUQ[[[Ea&Nc%@҇-|>$Nd.PDC^G*YYdj$JP>IZ if]q\OO2]/#_~yتNt:JI5QCY-eL&ѷNQ3fly]/d $k-و>b*!dΝUr/^ܾ};q…(:a/$ޙ3g()o<8g!Nf20q>(4 ÅBAKH$0@[ !|&@ >0O4M_7JzUU}e,\YZK0@ Z  ,>0rCF8NȲlB5ߢi>}n<&ς `d6}t+%}0{LR+W4&]ti s̩+4Ǐ/I !\Xe]IWKYj]|4ԓ'OtSTpkV\;}Ǿ}\HH$#G7=e]&Ơ R3I߷o=֮]a}cww!ĉ˗^;郤s:wuu=U3 wH[vuWZdoR=IC^Գ K;TLRO>,Q?䓂 X\azƕM}}} (B*8T9sO?;"#hޥɻՙ̹s$zi9_,[8ٌkdYkmm3ጓ\>cs\2L&bQ>h4m2HDxYC l׿]AWfY^aYNnoHYjA,O$ *LMoppppp./хxdpC鷨q m>B*YzMeMӐ `~;, P(Tgϒπ=!]]]U3{Zhkk۱ch"Tp'!:Tp?dYV_kN`4XeYf݀mHwULre !oKdYfLFϥ~]7 r9BҥKEQ,y(TJL&Sj2I78nԩ]]]%O_bE{{{MKy(fӧOwt@+l$Ch!qRk42H-WW4::z1sooPpg7n|衇b oի͛t])D3N͍7!>^>.i%KOB@,Y>sS+il|}3(IIT(J7xyT*VU|z @8nTU5Za#]M|3yp rڂğyT* !tS/QOEŅ3Ƒ(,L&#r*3l蓈 XoBC$ItLl &~Bip|>_e(eAesqWi( ˲t RUUeA&ۓ*Qz3҉ 7R a',w7ז ťq^\Vj>,B+7 튢Tc,Y:KFNj獻*WU5{Pf-tk*7&OWwD/]6Q[[[DQ_&r"toCyk,z ߎMZ[[%IjmmM$Ν[WWڪtVR5MK$|Uvjy@Wi^"hmmf(ZiDJhKcMRX|cZVi/9 ;A{WX.#<_B@zxX$i,Es:6-3@%Q[0 C?Ef2Z !GOR$q r9y}GtL& !DO3cJ>fNykP`xJ3ڎ9YMJUj^Bw& B88NO١kJwRRa۵A@si&*%ϻjZEQ٬~YPv,tvR)TQT*Ef-4>L]XeYV_V/qxN aPlTOV%IbYDPqgRA @ e<"߀yPcG3 TU4m,wM@jH5^RcUF{=H4zPe9+!CmF$/Q&IR(r'IRӓJR5إC%YbG{&~;:I\GP[l6j&qXRoY#&"0L& ]Exy>N("G@fYM;bDžE{΍ut=s3,ˆPd2;tdR1lS[BF \S $I*ɶ\Mt>IháEe~,>n[щJUUAh6W(k>5;,˦ibJ}Q\.0L2yC!ږ| ~?8/>*/TeZ(ʻH 2T1̌#tf>zim-0.60/data/manual/Plugins/Score_Editor/score001.ly0000664000175000017500000000027311775776762022235 0ustar jaapjaap00000000000000<< \chords { c1:m7 f2:7 c2 } \relative c'' { g2 es8( c4) es8 f8 es d c~ c2 } \addlyrics { You are the sky and my rain, } >>zim-0.60/data/manual/Plugins/Score_Editor/score002.ly0000664000175000017500000000035411775776762022236 0ustar jaapjaap00000000000000hornNotes = \relative c { \time 2/4 R2*3 r4 f8 a cis4 f e d } bassoonNotes = \relative c { \clef bass r4 d,8 f gis4 g b bes a8 e f4 g d gis f } << \new Staff \hornNotes \new Staff \bassoonNotes >> zim-0.60/data/manual/Plugins/Score_Editor/score002.png0000664000175000017500000002325311775776762022401 0ustar jaapjaap00000000000000PNG  IHDRj 6iCCPdefault_rgb.iccxgP} tXz*eIK,K!b"4ER$VDY$(1ETP;}~=;眙@@ERR|?{NHh!n ( V}](1<X|^:_f ]VTR9 ,~HhrXq_}XQ_}X?@}Q( 1XAN$?bqspbc9*AL!-}?!.^F/{ ؾj]RT0 _3(H&%؂7@(lC !aA 샃P-.yxK:DED A.b8!D qH*#;Ar # db( e:rQ; @ףqh{*=vW(*D_ `T)as0,c[bkڱ^l 9#c88]%2p[q \w7}rx f|'~?O  JH$l&: ÄIH&HXD&$^"HT"ɈL # HVEiD%-h&rKC"/Q(+J%REi\SRTe9՗@NޠNP?i4Z8-vvNmat}/~A)'&-MVKdD5Pc1603;9QhVZsc bL1C1oRVb3Dquq'hBcW'S1w2טS,KJd~f %%%$r%j%.H[NfO?IKIHl\*$͑vN/-T'-+#sD̜,KR'[,{Z*-'Yܠ܂||U9BBEYEbb%ŗ 'S+)*e)5( )-)k(*(w(?UpUbU*TTUUTUTոjj5ԃwwhHiiiik5m4345kZIZj&ڵwtPS:ëWj\5KӵmӝcyuW߯? ٠aaFF¾}?Q.VW>y@WoVW:$VW\_3Zk_Q'Wnp#GK?M8QXMAM?qjii.i|<߉Vֲ6-mdɻ?;Ӯ(9N%=Ni?vY܅tm s?kޯ+ q"bŕKy._weocߓ!W]vvnX8[[ݷMow vf[P;=w8b3r];: ñ13yxqxSѧ5{Txaqb'Wdn׺1M1&B6?E=7-NApwn 7dmN*nDQ Dm(k Z7yo>Qpg}瞛lRꫯ{>|ꩧ?XRyǏ?ﶴgooooo/-r NwC:Ν;_'&&Z>sssqo}[=hUlnn![a4V,c[1(JH4ͱ$I4?`1 1muu5-g!|9WVVdiiiii߭-%v8N&MBjyyY4i|"J_%IFUUqctߥ݃iFSѿ(R\u,VUȲlYi4X9>ibJ@F4DgΜw`h-nLRt:XNI+E:vǽp= ~7v7H&t:h ۶x>_j,q #n14==ju}}ɓ'Ç.____y&qAQ*]v~=[[[mi<̋/ ryii)WQ^> 7}wܑe9C?>;;;X3^:55u֭$ Z*bX1-gn=t:ÅY;(wU%QKR'6DX,֛A-ܨJAixܶt:](iteڶЬd2<Ĕ(3!3lX,fYNT*ſ 4y%&IY;li(|޽7qht]ORQ%1㘦if>tҥKyn̙34p;o+B(YUUm;c>YSDrMӲlA0DSMtBroZ8m.cR|GG~njɝV/^^/n${$¢(JGu] &S>)ze 17.H*U#.^x&O'7of:Qpwۓߟ𳒰Ǎ7^z%z{{޽{>"BKE+ʵkמٶ͍4AƳ&q1yݻw$?XQ]ש$)R |.m㧸Iq,ˢyyė(J K/MY! -fMLRB ?խ?t]id?mSq$[A8C!NKozUa9DQzs\AƘaD"HC_躞 -w$9{Lݞ;ZA%crG4Ox <74c,g2=mZ{!vJo'UIeY6 m yq2Չ{e9277G˃{Rprr/>( NӮ-rd[nٳg؆^RK3#y…'O4/3 ^Vwvvx|vv݅į_~޽Qp>C->'|kܹ@0ca|rmw9@d=??Wյk~4Mumdmτ.[G~ШWѣG4ߏM Z{FmۖeMOOmR:CZXԫ ō84,ƽtIIjS9J&,>Si=]˲O ;V+Q$s?a@3G\Ve_jmuE!~qJp۶5M.>D1Mzg<ùbU ç`GIs>OlnݻwMA+ 4!˲~_7ꝙ2M3M':k@}&]`R-Zm1&r&D"QΗ9YxX 0۶=^u4u]qFW FSi)NKMDQ kT[i&I40ܹqgkk4&Pp"$) /ipʆas~q(J>WųeYceoJKGzмicc\.1mUUiLM&Izg_ȲTUu'NKDT` i?~3{;_17t^4~?\`+I !'N\7EѶb wfeYe^9UpkҾ}vEQ\[[$ill I:-^x`曍B?яڊ ̳!kK $Qg\$ 7uO$OvD(n>, ޥv'87\;Đ{p&l1f p~Q h6(n>GDoݺ\@4`i,--]xh˜ѝ&cǎ'hQ`w„ *(n` ̙3lnf{ =j=C1-ê:}cijuggT*csss]TcO<=*J׮]EqVjϟ|RtM{0Msvvٳ^爸~{q*+WWEEY51tqM:O}{9Dߙ3gc"螆 mS=BZ%bXKӹ\.N r3(q__Zmpr:ōgLmMEQ,UU)#/..] D(sss/{X,jڵkrȑ# ǏW姞z_>|=]EQ'Oχ> ߜ"mQgy_o=b:th||7dgg'ussOd ~;wBwx?W^}vc@D cP(xVl6,EX4>>O8qe0NBbNBwzQpT[Jbr\Xm[ɲlv<'LFUl6[,yU|>JonVa8 ~8q۫xҥK#2`d՟FEQE&GɈ(Im3TU4M|>_G]i2ۡC~ݺu7M,;z(q~_wqZêA*|=FQ4}.;'aijNEQ4-\ʶm 7\.xdlۦmJ駟A!oo;?+ˌw?0d+n{8cLEnIu`y~Zt.}cѣ1clrrrggdzIcKg.^xEpr\.mFq0d(n,ˢ9oAX[[ p0Q~,˂ y۶Nj@r4'믿7zԝw~\%Q ðmş'\766q1Hhjի>|RLLL:u*~(w}1rn}}ϔbG9tÇ?~~nF0 ~ ƘgʀoV;;; >$jQىόZ戂QRzvے$ur,w؞陙QcX,$ieeeeeˆa&QG6 Nt[mjg@PF_!i-eYrP'Zflk*I}TU5uҤ'?O; DA(8z"`i0BzI,ǯ2M?yd'{hW۶d5M =H$ UU?3R1Z1})jd7\>xUUhSY{=Kzf((TOG?w;_!Fx<8atEqiڶMM[[g2%E) ,==Ϡp'HxJǏINeYNFbefáwasCsMn Q;&P$A5]zN~aHm(xZ}䉟hh{{{R43bV2$&QGK.i^pKiW^% {=|vޮT*ju}}1vyZ-U*'|r̙x[9ꡌBG\ۈ@wfUb(2~l~YnZ3H\A,v\I0? mee:(xkƓ+tglk/JZ#(xkQp螶ז ,JiCǡAm[5==n{ɤ{SƘ,kkk~([C3!y0tnǏ׽]]ֵ 7dGyq#I7_Ͷm]EO?u?rdw̓|dnjYV:]4o;D{}ڎB`Xl ?y>v[*nh7_9AP=s<8ZK?vmG0zWܸٶ,Yefħ/EfMIF:!nFt@Xp禅pƢ(I466s'-.Im֧ۘrԣ/Wv]87A*rycc՛%9 Mebd2s7|kz=]]/|^trum5dzc$۶>4555;;F>+:HDL@49d~~رcm<]|+Ю^t:gFu~߿P\.4c϶#:P=H> /Pgqqrθ+?0虑(nٍFc/o.AWy宍_F!]DڽTr#.rm.AFpm4Bt( U \0RF߹I^B+Fh-9W>ѺsCq M`VqCmħIENDB`zim-0.60/data/manual/Plugins/Insert_Symbol.txt0000644000175000017500000000217012012764113021244 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-05-25T16:06:18.373201 ====== Insert Symbol ====== This plugin adds a dialog to insert special symbols and characters. It also enables autoformatting for these symbols and characters. Shortcut codes for autoformatting are shown in the tooltip in the dialog. So for example the typing shortcut "\alpha" as a single word in the editor will replace this shortcut by the unicode character for the Greek letter alpha. Similar typing "-->" as a single word will be replaced with a unicode symbol for a right arrow. In some cases you want to be able to type a character without the trailing whitespace, e.g. when you want to type a formula with several greek letters. In this case the ";" can be used to close the sequence, so typing "\alpha;" will result in the greek letter alpha without any trailing whitespace. The list with shortcuts can be edited using the button in the dialog or by opening the config file "''symbols.list''" in a text editor. You may need to restart zim in order to load the edited file. **Dependencies:** This plugin has no additional dependencies. zim-0.60/data/manual/Plugins/GNU_R_Plot_Editor.txt0000644000175000017500000000365512132472704021707 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== GNU R Plot Editor ====== The GNU R plot editor is, as its name suggests, a simple dialog that allows you to insert plotting scripts in GNU R's 'S' language. **Dependencies:** This plugin requires GNU R to be installed. For specific notebooks which others have created, bear in mind that they may have used GNU R with additional libraries installed. In this case, as well as GNU R, you will need the same libraries installed that others used. ===== Syntax ===== Some quick examples of the GNU R syntax. For a complete reference see the links below. {{./gnu_r_plot.png?type=gnu_r_plot}} ''' x = seq(-4,4,by=0.01) y = sin(x) + 1 plot(x,y,type='l') ''' {{./gnu_r_plot001.png?type=gnu_r_plot}} ''' # Maunga Whau Volcano Example # Copyright (c) //R Development Core Team [5]// x <- 10*(1:nrow(volcano)); x.at <- seq(100, 800, by=100) y <- 10*(1:ncol(volcano)); y.at <- seq(100, 600, by=100) # Using Terrain Colors image(x, y, volcano, col=terrain.colors(100),axes=FALSE) contour(x, y, volcano, levels=seq(90, 200, by=5), add=TRUE, col="brown") axis(1, at=x.at) axis(2, at=y.at) box() title(main="Maunga Whau Volcano", sub = "col=terrain.colors(100)", font.main=4) ''' ===== Features Available ===== Be aware that this plugin pre-sets the png device to render graphics. For that reason, you should not try to use the other device commands (or to redefine the png device command). For example, the 3d plotting devices that render to OpenGL rather than png should not be used, nor should the jpg output. Aside from this, most of R's advanced plotting power should be available to you. ===== References ===== * An Introduction to R [1] * The R Website [2] * The R Wiki [3] * [1] http://cran.r-project.org/doc/manuals/R-intro.html * [2] http://www.r-project.org/index.html * [3] http://rwiki.sciviews.org/ * [4] http://cran.r-project.org/banner.shtml * [5] http://gallery.r-enthusiasts.com/ zim-0.60/data/manual/Plugins/Distraction_Free_Editing.txt0000664000175000017500000000406112061674251023354 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-11-30T23:17:54+01:00 ====== Distraction Free Editing ====== This plugin adds settings that help using zim as a distraction free editor. **Dependencies:** This plugin has no additional dependencies. See also: [[Usage:Creative Writing]] ===== Options ===== The options **Hide menubar in fullscreen mode**, **Hide toolbar in fullscreen mode**, **Hide pathbar in fullscreen mode** and **Hide statusbar in fullscreen mode** toggle the visibility of the various widgets in fullscreen mode. (If the the menubar is not hidden, you can also toggle these elements using the "View" menu.) The option **Maximum page width** sets the maximum width of the pageview in pixels and the option **Vertical margin** sets a margin in pixels along the top and bottom of the screen. The options **Text background color**, **Text foreground color** and **Screen background color** set the color scheme for the fullscreen mode. These setting affect the base colors, see also [[Help:Config Files|Config Files]] for more options to change the color of links, headings etc. ===== Usage ===== The effects of this plugin are only seen in fullscreen mode. The toolbar and menubar will be hidden and the pageview is layed out in the center of the screen with a fixed maximum width. To fully enter distraction free mode you should also hide any side panes, although you can choose what panes you need while editing. Useful keybindings to use in this mode: '''' to toggle to full screen mode and back to normal window '''' to toggle side pane visibility ''Shift'' to show all side panes '''' optionally to temporarily access the index and hide it again Of course all other keybindings keep working, but less discoverable when the menubar is hidden. **Note:** by default zim already hides the toolbar, the statusbar and the pathbar in fullscreen mode, but you can toggle them on again. If they are visible in fullscreen mode and you want to hide them, you first will need to show the menubar and hide them from there. zim-0.60/data/manual/Plugins/Gnuplot_Editor/0000775000175000017500000000000012140000463020643 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Gnuplot_Editor/gnuplot.gnu0000644000175000017500000000002311544165551023060 0ustar jaapjaap00000000000000plot sin(x), cos(x)zim-0.60/data/manual/Plugins/Gnuplot_Editor/gnuplot.png0000644000175000017500000001524211544165551023064 0ustar jaapjaap00000000000000PNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ___ߟ???=F+IDATxYz0 "z+4,IIdf44~PuAAAAAAAAuN~y@HTD!Q@HTDA 3[98c69l2cc Vm0TL!?.͘/B> [ {{Kh]6#Jl>Ow^C.dvgK|8lV%pjf-Ӱ{xgw{.v.ImDmpzy5vwVRm6ຑ[]O6|Nsp|k>l ܗz-M|Ʒ]_[< `p:[Z T @#\pogeQv?r8g߅h-}_h<;#XпmfA8Q43GpT dOh5;n M,;pl~T^L=e6z[`EI6*ܠLҰ8; >W˷ܻ~9m26ߏ߂} 87wϾܖcnM۫ ; |[oݵx;[/A/LОz. ޫs;tK~7:6?;N_ [Ƿ8VbjOguݠ?h%iׅ@ϔ-ߩ?#Ty-ȩŊ1hsK|jxt@(m.΂@~HFY[\_hQpؓ?7O;58\n\`=X=ΦJNmx @׽a-S ~6<7#ttAQ ͠y5apIiEWh-KN2W)~gvɵ dQf0^: q|ԃLŶE4.Iap.(-Op% }x tY"<ٔpUsMHvɋifHb8LEKW4.Ej jɢuie6\Ɋ.f\~M6$%\FYdE(钺qlֆKp 銬{>ζ`wg3"%x&e=fl%Vkmm6:$ME ùIyi&tr㺌 9.W&Z'y 3t\mtBk$P@\ z%Ց]FyIXKPcMrIm+ RM+%tyZ b){C!Ck 2lkvZkrfR:轮Gh)CoW||%mrV3W"θ s|V>K>#ˀ#AژˠM]Fxژz:'!t-A< @Αzvɭ%mFN [:#%u/擐M1HI۝2 9Pp xq l_0%U0+c}Y )0,.K87  Fz2&,\*_jodkW0]pT`2?}P%X,Wp+~`ƊxLqo``8V+fg{x060F^jkQLHdƂs%3 .Wpk t WC(ZLW'o @l TܶF1莔?w 6m$YFJgTT6\yDˤѥv_}я`Qz ~hk[MՄkvFQ4/З l#%= ,k$LDPLGnlƶ4#%M97D NQ;[@w0*>tFJڈ~ Yqh e6k Ӗ /ޫei ]CX ab##`j ,pO6*EE+nMz.Kl*%L^>J0.L_>J Z!.p+ Kr@?2$LR\L!Bn uX FИzGk s"UeM .`N46, .`N46, .p;LMAPVh LM4@ UR@E K-3c 1vAp 3cJEkRfؕe%i Hj ̢5%6LV% cyRZ(`#%]o빓F2_ ˑNk3ouzDo?H|ԐU>v`||HIo=_~x'%3HI]Ou'_NZ{!PGk^>ƽV>E . chp HIa 1[@g$߷ |6feM%.FJ*|s(+^$k-dvi @†p^Tj>/,p.}`iЇs 3B% ͎XkáB@Dk 6I10% A,.O0W`(d $%˵^.ZFk2-. Mt 31 +%mI6%yT(HF &FvZL=U@H/-A],.c\-GN01 ˑ!&GydF>ۖ_K6#'HZH3;" ]H W Gk25"!AHIrpx>I:R+0&`ڶZ^nfǔ*RiSiP7RAMlohͥRFA eTU-XFd,yTFQm-$WFQ[0fam%$ \.@¸Z[J-mYX4.$kR~e@.$[ tq`F{liXY-MYֶ `^dHfDtwn0sI t%ZX 2$ s" _͌h% hb@-yv?L]:clLN;P{-/DQ߂lk@^d 쫸>ic97dk[ʦA@vj̭j.ȼ(p 3d6\ h 0C4]췖4ePXK)=ACֆKT J b+94Z.`lֆK|`~Ib@$oZPO 94fA@;7Vt +-Vjh6\Zp#1&TYK&rJS,0Y%VqZ.`Xӥr0n8%fƇ`qkL0) *1 LJS`Β/)914ܬT簥4Mc.茔cUHPcw)z)ifǕ.9GJR^`,BgkINPZ5]<hiBt8+XXDZk%ޑƿ``='!smspY@֑Fa X8EE i)s^v8ZHIcgj5˦))d,ХZ6`qZlm]`q*j%py\ןVtYPKbg Ul.`i2[w2XLgkmtֆKH1G썵ZLjgk'qX0FNg@.?XNkkm鴶ֆKX1p鵶vrgs?e2pT|0,6RׅhVc.`FyF.`F>sVl706dkPt;>k\ϴ|椴f#%4^oil˩G}D|Ț|R~fܴdpAjou:T&l-4 ;PpJɗZ8 >_޹6% `zRv8R7,V[.NB^#%'֦] ir/sj蒸k<=c"߷hTlg>ؤea"u1l7K`b]vZ XK8<| 8XY70HvВ]#]d"[@Z2TOS-,AAAAA4C64\$BxT˝=4\$BxW)=kv!) L/hb1O? w\HJ 1X&w?@.|%\IyXWu׸~>H kF1t8)PId_z< |Q8PE&X$DE] L׿ #{|tW4\/D ѳ;Eޤ>t:.ď ŀ          MPIENDB`zim-0.60/data/manual/Plugins/Quick_Note.txt0000644000175000017500000000156011544165551020530 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-04-24T13:49:51.331910 ====== Quick Note ====== The "Quick Note" plugin offers a dialog for inserting quick notes into a notebook. It can be invoked from the commandline and can therefore easily be bound to keyboard shortcuts or used in scripts. **Dependencies:** This plugin has no additional dependencies. **Commandline: **''zim'' --plugin quicknote [OPTIONS] **Options:** * notebook=URI Select the notebook in the dialog * namespace=STRING Fill in the namespace in the dialog * basename=STRING Fill in the page name in the dialog * text=TEXT Provide the text directly * input=stdin Provide the text on stdin * input=clipboard Take the text from the clipboard * encoding=url url encoded utf-8 text * encoding=base64 base64 encoded utf-8 text * option:url=STRING Set template parameter zim-0.60/data/manual/Plugins/Version_Control.txt0000664000175000017500000001030612056367204021612 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-02-22T15:44:37.508437 ====== Version Control ====== Zim's default installation ships with a Version Control Plugin. To enable it, go to ''Edit -> Preferences -> Plugins'' and check the box next to Version Control. Zim supports [[http://bazaar.canonical.com/|Bazaar]], [[http://git-scm.com/|Git]], and [[http://mercurial.selenic.com/|Mercurial]] as backends. **Dependencies:** This plugin requires one of the supported version control systems to be installed. Currently Bazaar, Git and Mercurial are supported, so one of these applications is required. In specific the "''bzr''", "''git''" or "''hg''" command should be available in the system path. ===== Options ===== If the option **Autosave version on regular intervals** is enabled zim will save (or "commit") a new version every time you close zim or when opening zim if new changes are detected. ===== Usage ===== If you want to keep track of your changes or if you want to collaborate on a Zim notebook as a team, version control is the best way to go. Zim integrates very well with existing version control software because all relevant data is stored in plain text files. To save the current state of the Notebook, choose ''File -> Save Version...'' from the Main Menu and confirm that you want to enable Version Control. In the next window add a comment describing the changes (probably something like "yeah, first version" at this point) and confirm by clicking Save. You can browse the complete history of saved versions by selecting ''File -> Versions...'' from the Main Menu. You can view and restore previous versions of your Notebook and view all your changes between two versions in the window that open. ===== Sharing ===== TODO here should be documented how to share the newly created repository with your collaborators... (Depends on the backend chosen) See the [[http://bazaar.canonical.com/|Bazaar]] user manual for various scenarios of collaboration (follow the "documentation" link on their website). ===== Technical Details ===== Technically speaking a local repository is created when enabling Version Control, depending on the backend you choose, this repository is managed by [[http://bazaar.canonical.com/|Bazaar]], [[http://git-scm.com/|Git]], or [[http://mercurial.selenic.com/|Mercurial]]. Every time you save a version, another revision is checked in. Zim just uses standard version control systems as backend, so you can always view and export your history using standard tools. On startup zim tries to detect the version control system used for a specific notebook, and use it if supported. So you can manually initialize repository (e.g. by branching) and then open them with zim. No need to tell Zim that the notebook is managed explicitly. ===== Manual Version Control ===== This is for advanced users that have to use another Version Control System or have other reasons not to use the included plugin. To manually manage revisions of your notebook, the following files should be added to your repository: * The "''notebook.zim''" file in the notebook folder * All your pages (*.txt files in the notebook folder and subfolders) * All files linked/embedded from/into your pages ([[Help:Attachments|attachments]] etc.) All files created by Zim are in plain text format and only change when you explicitly change them so you should get readable, reasonable diffs and merges in case of conflicts. You can and should ignore the following items however: * The complete "''.zim''" folder - this is a local cache that will be regenerated * Anything you manually put into or below the root folder you do not want to be in your repository The files in the "''.zim''" folder are caches of the index and some client configuration (window sizes, scroll position etc.) and some of it is in binary format, so you do not need or want it in your repository. If you want for some reason stop using version control and throw away all history, you can do the following: * Disable the version control plugin * Quit zim * Remove from your notebook folder: * the .bzr folder and .bzrignore file in case of Bazaar, * the .hg folder and the .hgignore file in case of Mercurial, * the .git folder and the .gitignore file in case of Git. zim-0.60/data/manual/Plugins/Tray_Icon.txt0000664000175000017500000000324012056365357020362 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Tray Icon ====== The Tray Icon plugin adds an icon for zim in the system tray or status bar. This icon gives quick access to the zim notebooks. Clicking on the tray icon with the left mouse will popup the current notebook if only one notebook is open, or show a menu of notebooks to choose from. If any notebooks are open this menu only contains the open notebooks. Clicking in the tray icon with the right mouse button will open a menu with all known notebooks. Also there is an option to quit zim entirely. When this plugin is enabled windows are hidden when they are closed instead of closing them entirely. Quiting a notebook will really close it. However even when all the windows have quit there is still a zim process running in the background. Select "Quit" in the tray icon menu is the only way to completely exit zim. **Dependencies:** This plugin has no additional dependencies if you use gtk+ version 2.10 or newer. It is not available for older releases. **Commandline:** The following command will just start the trayicon without opening a zim notebook: ''zim --plugin trayicon'' ==== Options ==== For Ubuntu 10.4 and newer the new style "app-indicator" tray icon is supported. This tray icon is integrated with the Ubuntu system tray menu and always shows a menu on left mouse click. If you prefer the classic style instead you can select the "**Classic trayicon**" option in the plugin preferences. If the option "**Show a separate icon for each notebook**" is enabled each open notebook will have it's own trayicon instead of one trayicon for all notebooks. This option overrules the "classic trayicon" option. zim-0.60/data/manual/Plugins/Journal.txt0000664000175000017500000000504212056365722020103 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Journal ====== The Journal Plugin turns a specific namespace ("Journal" by default, but this is configurable) into a journal. It can either have a page per day, organized by year and month, or a page per week or per month. The plugin also adds a calendar widget to zim. By default this is done by adding a dialog, but optionally it can also be put in the side pane above the page index. In this calendar each date is linked to a page for that date. This plugin is intended to help organize notes by date like you would do for a journal. Another use case is e.g. to put minutes of meetings or class notes on the page for the date of the meeting - possibly to work them out later in pages for the specific subject. **Dependencies:** This plugin has no additional dependencies. The python module "''babel''" is an optional dependency to determine the weekday conventions. **See also:** [[Usage:Daily Journal]] ===== Options ===== This plugin has the following options: The option **Show calendar in sidepane instead of as dialog** does just that; if enabled the calendar widget is embedded at the top of the side pane. Otherwise the calendar is shown in a separate dialog when you click the toolbar button. If the calendar is embedded in the side pane, the option **Position in the window** determines in which side pane the calendar is shown. The option **Use a page for each: ...** allows you to set the calendar to either use a separate page for each day, each week, each month or even each year. The **Namespace** controls where the calendar pages are stored. ===== Keybindings ===== * ''D'' - navigate to the calendar date for today ===== Tasks per day ===== The [[Task List|Task List plugin]] has an option to automatically set the due date for tasks that are defined on calendar pages. When this is enabled you can put tasks on the correct calendar page and they will show up in the task list with this implicit due date. ===== Template Properties ===== The Calendar plugin adds the following properties to the template for calendar pages: **calendar_plugin.date** Date covered by this page **calendar_plugin.start_date** First date covered by this page (same as 'calendar_plugin.date') **calendar_plugin.end_date** Last date covered by this page **calendar_plugin.days()** A function that returns a list of all days in the week, month, year covered by this page All these dates can be used with the templates ''strftime()'' function to format the date as text. See [[Help:Templates|Templates]] for details. zim-0.60/data/manual/Plugins/Task_List.txt0000664000175000017500000001644712132472704020373 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 12 Aug 2009 13:22:10 +0200 ====== Task List ====== The Task List plugin adds a dialog that lists open items across all pages of the current notebook. In a way it is a specialized search function. An open item or task is defined by a single line and can have tags and a priority. **Dependencies:** This plugin has no additional dependencies. **See also:** [[Usage:Getting Things Done]] ===== Options ===== This plugin has two options that can be configured: If the option "**Consider all checkboxes as tasks**" is enabled any checkboxes found will appear in the task list. If it is disabled only checkboxes that have a task label (like "FIXME" or "TODO") will appear in the list. If **Turn page name into tags for task items** is enabled, each task will be tagged with the path components of the page name. E.g. a task defined in the page "''Projects:ProjectA:Phase1''" will get the tags "''Projects''", "''ProjectA''", and "''Phase''1". This is useful because it allows selecting tasks from a sub-tree of pages at once using the proper tags. Also pages with similar names in diffent parts of the tree can easily be shown in this way. If **Implicit due date for task items in calendar pages** is enabled, tasks found in pages that belong to the [[Journal|Journal plugin]] will get that calendar date as due date. If the calendar page covers multiple days (e.g. a weekly page) the last day of the period will be taken as the due date. If **Flag tasks due on Monday or Tuesday before the weekend** is enabled the highlighting of due dates assumes a Monday to Friday work week. This means that tasks due on Monday will already be highlighted on Thursday and Friday. The option **Labels marking tasks** gives a comma separated list of labels that are used to flag tasks. By default these are "TODO" and "FIXME" but this can be customized. The option **Label for next task** sets a label to start tags that depend on the previous task. The default is "Next:", but you can also customize it. If a tasks depends on the previous task it will not be "**actionable**" until the previous task is marked as done. This is particularly useful if you want to breakdown a task in serial steps, but not put all steps in the task list at once. Tasks that are not yet actionable are grayed out in the list. The option **Tags for non-actionable tasks** allows you to specify tags that will flag tasks as non-actionable. This is for example useful when working with a [[:Usage:Getting Things Done|GTD]] method to flag delegated tasks that are not actionable right now, but may need to be reviewed again later. A tag like "''@delegated''" or "''@waiting''" could be used for this. Multiple tags can be given separated by a "'',''". The options **Subtree(s) to index** and **Subtree(s) to ignore** can be used to limit the namespaces that are indexed for tasks. By default the whole notebook is used, but if either of these options or both these options are set, only a limited set is indexed. Multiple namespaces can be given separated by a "'',''". ===== Usage ===== ==== Using Checkboxes ==== The first way to use the task list is to define open items by checkboxes. A list like this will be interpreted as a task list and each individual line will appear in the task list dialog. [ ] Buy rice @groceries [ ] Call Susan to invite for diner [d: 5/1] ! [ ] Print menu @desk In this example the second item will have the highest **priority** because of the "!", the more exclamation marks the higher the priority. Also the words with an "@" will be considered **tags**, so the dialog will show the tags "groceries" and "desk" which can be used for filtering the task list. A **due date** can be added by putting a date in between "[d: ]". Zim parses a couple of date formats: ''' dd/mm dd-mm dd/mm/yy dd-mm-yy dd/mm/yyyy dd-mm-yyyy yyyy/mm/dd yyyy-mm-dd ''' So you can use e.g. "[d: 5/1]", "[d: 2010-1-5]" or "[d: 5/1/10]". (Any other separator character to separate year, month, and day will also work, as long as it is not a number or a letter.) **Note: **dates are parse in European notation, so "dd/mm", not as "mm/dd" as is customary in the US. Unfortunately there is no way to resolve these unambiguously. A task in a checkbox list can also have sub-items. This can help enormously to split up a complex task in step by step action items. For example: [ ] Organize party [d: 19/8] ! [ ] Send invitations [d: 1/8] !! [ ] Cleanup living room [ ] Get rid of moving boxes [d: 10/8] [ ] Buy vacuum cleaner [d: 15/8] [ ] Buy food & drinks Such sub-items will also show up in the tasklist as sub-items below the main task in a hierarchic tree. Note that sub-items that do not have an explicit due date or priority set will inherit these from the main task. So in this example the "//send invitations//" action an earlier due date and a higher priority, while the "//cleanup living room//" and "//buy food & drinks//" items inherit due date and priority from the main task. ==== Using labels ==== The second way to use the task list is by using labels like "TODO" or "FIXME" in your notes. Labels can appear at the start of a line or directly after a checkbox. The rest of the lines is parsed the same as a task description after a checkbox. So the following will also be considered a task: FIXME: finish the previous paragraph Different labels can be used similar to tags to distinguish different categories of tasks. As a special case labels can be used to flag a whole list being a task list. In that case the tag needs to start a new paragraph and be on a line by itself before the first checkbox. This usage is especially useful when the option "Consider all checkboxes as tasks" is turned off. Any tags on this first line will be applied to the whole list. However no other words should appear as that would make this first line a regular item and cause the list to be ignored. An example of this usage is as follows: TODO: @home [ ] Call Susan to invite for diner [d: 5/1] ! [ ] Print menu @desk Now both items will get the tag "@home" appended. ==== Non-actionable tasks ==== Non-actionable tasks are tasks that you can not (yet) act on. For example tasks that can only start after a previous tasks has finished, or tasks that you are waiting for someone else. The tasklist dialog by default shows such tasks grayed out, but you can also hide all non-actionable tasks. There are two configuration to help flagging non-actionable tasks. The first option is the "Next" label. This flags that a task depends on the previous task being completed. This is useful when you write down an action plan, but don't want to see all at once in the task list. The "Next" label can be used at the start of a line like this: Clean up the garage: [ ] Make space by bringing old stuff to the dump [ ] Next: buy new shelves @shopping [ ] Next: setup new shelves in the back of the garage [ ] Next: move stuff from side wall to the new shelves etc. Assuming each of these tasks will end up being done on different days, it helps to write them down step by step. But the tasklist will only show the next one coming up Another way to flag non-actionable tasks is using special tags. E.g. a generic tag @waiting could be used to flag when you wait for someone else, or @review for plans that are not agreed yet. You can define your own depending on your own work flow. zim-0.60/data/manual/Plugins/Insert_Screenshot.txt0000644000175000017500000000072312132472704022123 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Insert Screenshot ====== This plugin adds a dialog that allows you to take a screenshot of the desktop or of a particular window and directly insert the image into the current zim page. **Dependencies:** This plugin requires the "scrot" application to be installed. In specific the "scrot" command should be available in the system path. On maemo devices "screenshot-tool" will be used as an alternative. zim-0.60/data/manual/Plugins/Ditaa_Editor/0000775000175000017500000000000012140000463020235 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Ditaa_Editor/ditaa.png0000664000175000017500000001334311731343730022045 0ustar jaapjaap00000000000000PNG  IHDReIDATxyLTW]Tpi֭uبnըtQ[VZqئM,*AEUeSQ@*" 'L0̽rϹۜ{f=!ӎBBBR!DePBBUH!T!!PBBUH!T!!PBBUH!T!!PBBUH!T!!PBBUH!T!!PBBUH!T!!PBBUH!T!!PBBUH!jRۑj0 Όa(k[QsSN T!ï*0a(jo#8B__߼<W G} NgggmӧOk"Tu-{* i0::ZM\]]QtT3~xlٲٳE~Qp T!ïR@kkkOO]vɨ[v]xƌe[ZZzyyݻWƣ¥Kr/*$&B^g-**Q ~PyeeeUSΌUhd~58UH(|KRm,* B* K S-]=*Zp!v2dǏQ_5Bm?O'((H8˖-svv~(@j*:Ժu\]]mll|}}BcTSFS^^>oyHzDP/^̎#`Sٍ7Diii(-E{j]*&Ov*4^FHHHS{a`nnr N8PUb|Í/?,>brS7;-Uh*LHHpww QWWWPPk.!۷/ڳgAo; A6o7o #/?,>kU4IS7;-Uh ˛2e6gΜ8jܹbMi7|S Fwb*|Qsfgӈl߾]FofHkӾYYYEEE孜\D30XSTzU 1TI_6mZJJJmm+WCT!UHQQQQaffF1  bnnnooNRmWϮ&888&&&999''tQ~1N^zM2%22RI$SzR's^paΜ9(.Z*T .M*4%JL4 5RMtt/Fkkk|56sL1Ǿ}:C zα!38Giee0y似'zLlcZ*|YIZ9iJ B0!!5#F<᳘` (J6e{qĉK.!ܾ}{y3dž6bGOOOk׮ϵtV6)g%i)ƷIR Q!jpx>11Q[sF/}t[Sslۈ7UUU<ȤUၔHlVLl|zT!U"@n@W娔Ḻ!?(JC=W&Bz~Ҕf BPÇ_wik/[HJ(?>H i|PZ VP;w6:@uHqơx!KVa('gϞm 姷W6ECM"_~mB*aԙ3g6xF|m"&h4XʪW^'Oϟ߆ !^{P~zyOl`jRTU c^SN~TEazq5Bs^n̴˛>>111))zy(k͙3gN>{TT, 9~8ѣ]]]mmm7UH2 *UaNmܸm rwy7Xv;ݻDZ8Ad0^x1###++W\Xu%l-p .99"q4T>z Z }nnnuQvj6B2 Vaqq1/dd9ٍ;vŊHd>P3;ƭ>>>Ǎc {nYƹ'OLHH@ L5͍7KJJJKK)z6EEE_zGXa<ŒǏGΈa5oݺ)T6k,UXxx#Y!Hxy޵޽ G߿>|*`{syy9\ EhМ# +̈4|SRRp޼0y&h4ךf%8NMM 0,n4 a/N um[n!G頍h)ڋVA%PGFx8|pPPІ >ٳg#6lX~v*}\RZԩc.^x͚5#Df BCCqXhW322`"KžGi# (e[Fǩf"[頍h)ڋV#J@(==3 *T%̈cX:`A5Z~aaaH6#:o޼SNCHq\ åUEqZ-Z>kpR3=@ ڈmkFPQP ȏp9b›FNN=0vᬔKQzTE(#G,k ܇]o"3q.^Bb,TUU5Oyt2 HzopfDΈ1+Weff0G a7 jPhZZnEhDr.YD$%%#W JaF ]ܹy 9JEn9OVXF=b Df ǡK.ݴiUh9x`ID?hH0ݐB/A=B}O<n@T'''///P^#G-өB"3w\UVQT!!jJ͍* Q#gΜ BBT ?CPkf̴UԖy !/ éBB:t ONBիWVxn !ϗUV55;BuMj۷oS* !UHi~+w'""O>:tx!zMc_ ~P_z쉃gdda_ ~P 2R MssPo1___kkk+!* ϟfaaѽ{ٳg ϋ唔fٲe^_~cǎ? UHԥB^9r󱀢Dw=z4j` IO?x/^ ~G,߾}c=X@q֭X 98ѦMRSS0}vؼK.vvvgB:"{ڄQG;=-8xBCCY 3t\bFLxxU=.^*$jT!ƒX+ݻ(RfwETb(!7 uܹs 2FcE f s.qiZTn߾СCn U .\=Ii'zU!6+VX|y׮]ŏɰJs5z"Qioo/6.//WMT 6s jk߾}SWTT۷k1dnQ!bm,YwRR>#dTx9GGG, 0 ;;[ Ü*lm*LLL6nnn1*Jsɨ /o?~}*dB]%ɺ 9w߹sgݵw>}7oޔQQÇt>SQ'Jf%Bpڵ^zO T!OUh O1aBB !*$bH O4 ?!*T9... CV ZůE_ !T !*$BBB !*$BBB !*$BBB !*$BBB !*$BBB !*$BBB !*$BBB !*$gV!!BBBy'>IENDB`zim-0.60/data/manual/Plugins/Ditaa_Editor/ditaa.dia0000664000175000017500000000053311731343730022013 0ustar jaapjaap00000000000000 +--------+ +-------+ +-------+ | | --+ ditaa +--> | | | Text | +-------+ |diagram| |Document| |!magic!| | | | {d}| | | | | +---+----+ +-------+ +-------+ : ^ | Lots of work | +-------------------------+zim-0.60/data/manual/Plugins/Spell_Checker.txt0000664000175000017500000000251012056366150021165 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Spell Checker ====== This plugin adds inline spell checking for zim. It has a preference setting to determine the language used for spell checking. If this is not set, the system default is used. **Dependencies:** This plugin requires the "gtkspell" library to be installed as well as the Python language bindings for this library. * On Ubuntu or Debian systems installing the package "python-gtkspell" (or "python-gnome2-extras" on older releases) will meet these dependencies. * On Fedora systems, installing the package "gnome-python2-gtkspell" will meet these dependencies. ===== Options ===== The options **Default Language** specifies the language to use for the spell checking. Languages should be specified as language codes, e.g. for Dutch you would set "nl" or "nl_NL". If the option is not set, the system default will be used. ===== Dictionaries ===== The gtkspell library does not always come with all dictionaries installed. If no dictionary is found for your language zim will give an error when loading this plugin. For most Linux flavors the "aspell" dictionaries are used, so for example to install the English language dictionaries install the "aspell-en" package. If you can not find these packages, please refer to the documentation for your specific Linux flavor. zim-0.60/data/manual/Plugins/Automount.txt0000664000175000017500000000240112132472704020452 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-12-11T19:15:27+01:00 ====== Automount ====== This plugin can automatically "mount" notebooks when needed. It can e.g. be used to connect with remote drives or unlock an encrypted drive when zim is trying to open a specific notebook. **Dependencies:** This plugin has no additional dependencies. ===== Config file ===== The paths to be automounted and the commands to mount them are configured in a config file "''~/.config/zim/automount.conf''" (this file is in the same folder where the other zim config should be found). The config file has a group for each path, followed with options. Currently the only supported option is a "mount" command. For example if you have an Ubuntu setup to encrypt the "''~/Documents''" folder, you can create a config file with the following two lines: ''' [Path ~/Documents] mount=xterm -e /usr/bin/ecryptfs-mount-private ''' The result will be that whenever zim tries to access an notebook stored under the Documents folder while that folder is not decrypted, it will prompt a terminal window to ask for the password and then mount the folder. If it fails, you still get an "notebook not found" error. Similarly you can configure various scripts of your own design. zim-0.60/data/manual/Plugins/Tags.txt0000664000175000017500000000125112132472704017357 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-04-04T21:14:50+02:00 ====== Tags ====== This plugin adds a tag cloud and a page index organized by tags in the side pane. The tag cloud allows toggling the selection of tags that is shown in the page index. The page index can be switched between a flat view, showing all pages that match the filtering criteria, and an ordered view that shows known tags as the top level nodes with pages beneath them. **Dependencies:** This plugin has no additional dependencies. **See also: **[[Help:Tags]] ===== Options ===== The option **Position in the window** determines in which side pane the tag list is shown. zim-0.60/data/manual/Plugins/Ditaa_Editor.txt0000664000175000017500000000234411731344620021014 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-03-11T09:47:20+08:00 ====== Ditaa Editor ====== ditaa is a small command-line utility written in Java, that can convert diagrams drawn using ascii art ('drawings' that contain characters that resemble lines like "''|" "/" "-"'' ), into proper bitmap graphics. This is best illustrated by the following example -- which also illustrates the benefits of using ditaa in comparison to other methods :) ===== Example ===== ''' +--------+ +-------+ +-------+ | | --+ ditaa +--> | | | Text | +-------+ |diagram| |Document| |!magic!| | | | {d}| | | | | +---+----+ +-------+ +-------+ : ^ | Lots of work | +-------------------------+ ''' After conversion using ditaa, the above file becomes: {{./ditaa.png?type=ditaa}} ditaa interprets ascci art as a series of open and closed shapes, but it also uses special markup syntax to increase the possibilities of shapes and symbols that can be rendered. ditaa is open source and free software (free as in free speech), since it is released under the GPL license. See http://ditaa.sourceforge.net/ for more information about ditaa zim-0.60/data/manual/Plugins/Diagram_Editor/0000775000175000017500000000000012140000463020557 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Diagram_Editor/diagram.png0000644000175000017500000002506011544165551022713 0ustar jaapjaap00000000000000PNG  IHDRx@PbKGD IDATxyXTWLQ̢ Q&FFc(j0z>M{;cb4iM:&Q jPqV 2 LU~*S<<{uꭳ笽7,|]6p6p\˨T*rrTUUAV* &&&ŐH$pvvD":  DVVQXX\Jc;&&&pqq7#G" ^^^,F=؋&"رcHLLDjj* J!aÆNNNpppD"@ 9D"܌TUU ())Ann.F899!88'NDhh(vJTs0i$ (( bԟJµkאD;w;v,Ν0&GPw}G~~~FE}h=f:u\I$ܹsԩS4Xkjj>#[[[233e˖QZZaHw黎'ǣѣGS||>LMMiWTTаa($$>|u8Z!557Ш L=9G9shÆ =w$ggg*)):NصkQFFF)))$\)M^^^Բz#Z1cлu(SWWG=>111$Jy$ Innn$ Iő =xr&E1+#""cZ&oo~'&DL|>nݺŊ}GGG@V|ͭ۱^7gϲb烈VXrNNN8{,&NiȪLLLCo͈?LMMajj _---Ҥ,S888 III]Rkk*++ɓ''566Rppp'MDDDee˖ԩSH6n܈$H$޽  111ƹsqFШ,ӸۓiN'N&2}]+^fڵ4l0:U/d2b211!LFӤ,Sǣ.ţʒܹs :7Dnn.Ν;e̙SSSڵPt[ly.J׮]#HD;סV޶F`T{J%סpJvv6.H}סpFCCd2 Qy$ СC\uj5-\{w}djjYƪUTi:z)Z˗%&&rjZjQBBFuR`""RI-"XL{:hnnp266yDHj*J nݢ@gʆ^ O?Dfff4n8q0¾}ƆFѧc B`"\'㏩zō7h̙VXA}g0ޯ֭[G4tPڱc<H211!__^7ObPqmzH(O=wܡH277'{{{׿hA FAAIRz9YIJ%=zBCCI #}TWWǸ/ \N9yxx1bEEEޫu/zC]]9r^u%GSL}3M'p%߿+`cc & 88~~~1b{l J(JBdee!##IIIHKKZƄ /㥗^!C8W?ב . )) wHRxzz...pppb1LMMall BR,`ԨQ(//ǝ;w&Bd2#$$&LVϱ_ $*d2R) QRR\}e֫xܸqÇFFFܞkq xtQEEE\\t>/Z[޽vvv:uFnܸL,E{;v`޼y 5 ''}Zdd$Yw  ##yyyXxuoܸP(tx}bwѣGQPPQ;|1b!~T*-,,ʕ++MԩS(//GXXu :T*qE޽D8&&ǏСC5[TT8Cmm-!~-pCC< ~AAJej5>>L1Vุ8 틼hJu`@@pQ3j$ B萇ݶ.m/탱1f͚k^L7)))} 1111 v-,,0bo \\\>|cƌ+WXk.aڴi_+W l۷cTL3j(ԠүNMMEAAA^ L@3txǎѣYajj OOO\v5onnnF\\-Zĺ////'PUU˺o޾};BBB0x`}y{{#??ju_O_=zVy{{nҊر"o4t6x7o… aaaVVVprr׵; Q瑛։_?ƏՕA \^^bʕZ=tЧlix۶m+u(++CSS}?A\VVhTUUVe,Y&&&Z DPFHKKkE~7>L<V6E߿[n;;;`ذa$H`ee7or hr9SiiiΝ;Y÷;f p* p5k022Btttu@`&rkvZݞ>@f{u{e|{裏@t',Y_}ҍA|N? 3gle&mca.bE"׿b׮]Z>ۜ D'qD"<ؿ?K XXn[? H#Fѣ0550Vh>D'`eeaT?\ueggg>}= cazR !QUUZT*@,666pvvD"AYYYgΜ g8طog9iiiĵkאBrRMbq{SpBohnntɄ'qrrj?D+jHLL˗;;;9~~~;w. X[[C /ݶwCCQZZR>| ?{n444AAA4if͚B*BRE Cj:<\oMqqq-sH*7͛7lmm ڵk֭[Ԅ~p⛈]WhÆ Mhرn:*((`SQ*t9 ggg4sL:rVg&O˜YYYћoIYYYL3---~6m|1bƲ.;w+,pSSEGG%IRZv-0kPXX|>|8cuÇ 2ENLL$__ ! Sqi\5k0*//gcS}Rss3Z|>͜9St=|0+W%mݺq=AcKKKiرdffF۶mc#&NP(kǣޛ]\\諯b̞&h4~:^xXZZ"##^^^ ڸ L˗͛_`llgۖP( D9=~@xxx… %,ZgΜӧ1k,477٦%jjjNsz$paa!M$$$̛?~i|MD"γ#`ȑ8p[9rv,,,tSุ8믈3f+&MիWcҥ X,] ؈H]Vgvի{Uԡ.޸q#LLL;0qa˖-׸H$ҭ&4ލPyg?׸.lN>pHk ˖-Þ={4-,,ON޾};Νi̙3allܫ"z:V*HIIĉYuP(tRXYYs}ŋ"RSNɓ';kbʕJ^s!))Iz^(O>NOO'e`ϥBCC;lB>=4~) :T:}Y[[3KOpÃVvv6.]&%%%n/3}t$$$Jeeeشiˍ^3gΠͰaP\\m.;Y~?IR~Q:qc'$$i4k,rtt$Pؕ);{1bo ݿuvE&&&,F5nRZg=`-m];<$$(;Ҷ$S}}=RiL'ƦMŚ5k@D@^^@DOn|!I -X]pLn X,к(TTTDMJ%,--Yk:,gz /_FKK .]z ڷk@hhh@||O7ov<:ͺuM?\]] )t,zdزe 7BT?VX4Жd}uDmm-"""4[__BD=KN@6IO>85d}78vmۦxt"Bxx8dɒ^P(%,v+6n܈\tI[1?;wz R]FjOzb/&;;;fϧ[|7$(>>OvϟOsa(*---JΜT6| |_lkƌdҜ?iӦ5FVSdd$|oH477Sxx8D"Z~=j{̙3I,޽{;b ?Sմ~zD4m4VSNѠA͍~7Fm2KFm^?|2=3diiI6l&F<^yb܇z1 >߯7vuu5}diiInnnFǓ7$(6608r>#H$$Hh͚5T__Ϛj@ǏgGw0~-++^}UHGL*N:E#HDR֬YCլ}6`SXyZRRBW5j}'&N8A+V GGG@AAAsNjllJ D?z=$R`}6 &@&aȑﳟ"dee!##IIIHKKCKK ƍ9s_f=׻3RRR0a`РAZϪBDARR~ppp `aaX SSSCP@T %%%(//GII PÇ#88 6NK;_| Z5;}肂r>lߏ}YasssXYYNNNpqqN8@X锟+W2u81%Kh\сsEEʎ>pB#//PNNN7'O gggܹPݻt0|>,XfuBYY9o0!55P)++hرcסhpՏA ^{dK')++Cccc&\`p'N:\+ R`{{{L|Vu 67oxޒ SSS 2D+_#d2jTTT@W)Jdee @ii޼yD"Q{[nilm=W}7W-Μ9OZz=gddD'^?JH$lee322 V@"pvvRd>rmc} q$t*P( VT?T!C 11Tkd/''^^^8{,!?tS:X$V`ɓ'! ZZZ4ʕ+ӹ{tjd#--M';X)S`Ϟ=k2V*_צpĜ9sO?!<<n477C.UUUZT*bΝ;;G+ ӗ.]ݻw\iԛ4iD"B^ IDAT  >#Gѣ9^_M>;#99/1}tǃB!Ԅ&TWW}\~׮]addѣGc„ 2e BBB4)šCXܾwDpp0YT2+.++ŋ$ﰲ1w\̜9}%`JE4{l dooO˗/xjhh$Rڼy3͘1D"{Gׯ_gşA B?3ϧ)SО={NO(--/yK/QZZ> N{D"Zd kWj:p=f̘A6srrhĉ(<<W?~ȈjkkdOVմarLB6m":t(]t׶ZJ:u*D"OITrҴiH(RtttlI< ]|pXCV_M"^uwuK333֖ƏO\N:EVVV4m4jjjq=8??)44,W\v)44;ݣӔ)S4$Jiٲe=*7jziTWWu8Jƴ}k"C 6mDfffO>eý{͛7c޼y\3̙3벌^o //gϞeny= :֭[i@bb";#L$&&vz\sm5/_$vz\矱dYR~N}6&O̪BK 3gn޼Xd,^...DJ:u*N<i&Osu~|‚s>phhh9...TYY١<<ةy$HPt8WpQQ<<<Zٸt www ::ӑj(JaӦM "]1{|ȑ#x صk6 *}'YVXA'Of>N8 |||?;}4͚5I(>vU.}D"!'rΜ9N h"zY&P}}c=&\ll,xnhll@&L`VS__Oȑ#t-Jgpɚ5k@D@^^@Dhnn^DD222`ee;wvilll:immm{\pжshAA ::wisزe ᅦ+aӶmǃ OjjjX?׶fJMM%@DDL(***++>LNNN6YYYdjjJhѢE(?#YYYuz iC')ę5kVäNT`OOO}_^xsdRDD+۾ҥKI"͞=pJV^M...$ÃSѺi[ZZɉϑQo,/D")UUUuz\;Y+ؘMxbX[[w^@?^uVrvvQ\رcdnnNeee] J%[ou(:Cuu5yxxЧ~m95L$Ѿ}E';w.dDD֭#+++:NOܜrssZVVꫯp'|7$_Qyf̘ANNNu8Ze?ODo{fΜIffftaaZr% 4~mj*g Ht1ml۶) 1j5diiI2{eG&"*((cǒP(v•+Whĉw1!0QI7o&[[[J|Sxx8|7n# F6(22I*Қ5kH.sV瓗ĐZfĶ Fee%EEET*%HD/=zFIhԨQG*Q?+pK?<|H$pBڻwqF8q" ˗3٣3&{.>CܹsP*Epp0ƌÇfff}UVVldeeUY^^;;;bxY__ (HNNŋq< bar bar -> baz baz -> foo } ''' For full documentation of the script language see: http://www.graphviz.org/ zim-0.60/data/manual/Plugins/Print_to_Browser.txt0000664000175000017500000000127212061676513021772 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-12-11T19:34:32+01:00 ====== Print to Browser ====== This plugin provides a workaround for the lack of printing support in zim. It exports the current page to html and opens a browser. Assuming the browser does have printing support this will get your data to the printer in two steps. **Dependencies:** This plugin has no additional dependencies. ===== Template ===== The html template used is the template "Print.html". You can edit it if you want to change how a page is rendered by this plugin. To edit the template go to the "//Edit//" → "//Templates//" menu item. See [[Help:Templates]] for more info on templates. zim-0.60/data/manual/Plugins/Attachment_Browser.txt0000664000175000017500000000104212056366662022264 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-07-18T23:31:03+02:00 ====== Attachment Browser ====== This plugin adds an folder view at the bottom of the main window that shows the files attached to the current page. It allows for basic operations, like dragging a file from the folder view to the page to create a link to a specific attachment. **Dependencies:** This plugin has no additional dependencies. ===== Options ===== The option **Position in the window** determines in which side pane the browser is shown. zim-0.60/data/manual/Plugins/Equation_Editor/0000775000175000017500000000000012140000463021000 5ustar jaapjaap00000000000000zim-0.60/data/manual/Plugins/Equation_Editor/equation_01.png0000644000175000017500000000553011544165551023655 0ustar jaapjaap00000000000000PNG  IHDR9EfPLTEppPP00 ``@@@@@000pppPPP ```䵴tRNS@f IDATx]r*IӴ4U5?Y@"1?0pY>E]DžɁ c #Un0p N쥊 hnId/:i*$ {lg_%Ed/:eCaF's"sp[Dfn1 T婬(nH#UY={ eC7:"ֲT,6;9W^{ X棠tzDyƛ5kȊt2э4|&-T` _OJ:G%S٪[h,4(UrDIJUF XC%=?X@d .sޅVBX>^;k :7Y2+ndhfz x SBх^w{*=H *XNyj1CXKrUgButn#] dy2t*ZC!y^^^^^^-ТVۊs|ejtIuG&~9cU04;˺ zd]ͬI60åfڳzP p.BǏ?n#x]Ulf{9PtpĤ rK8vu(ն?_|՚={أ+]CBc#Wbw@?z-옩#-.UG7x3\xG6 lXԠbvӭkƫ}\vH"z#oop-'s 6ﬧ .w9&y w xIArxޠ;+wݓd.jzRӫ\3a#1Ff.4=|53\zxuk'z\5)6rѽǿ~I919N z\hcqغH_ $~<._% *'9 F_Hrx;FY`LG` U:PaǃfPA ǃ-c`5t}<@>ːxep `y2//////Xʍ}`%oY|* 94j ز9@5} 1Ƞ֥p ӧ3ni60?Mc]C:A$k+.ro(wP,\3z3euqP+}ahb ae$gpe)Ӻ-6#H)s ׀֡?1dC6QD#p_'eU!s3HePߍs_Fj6b#H6dD958\y,#)5tD=\ypF?J8⵵:IENDB`zim-0.60/data/manual/Plugins/Link_Map.txt0000644000175000017500000000320212132472704020147 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Fri, 13 Mar 2009 22:49:34 +0100 ====== Link Map ====== Having a graph of linking relations allows an alternative view of the internal organization of a notebook. The use of this depends on your use of links. If you hardly use any links, the hierarchic index probably contains all the organization you do. But if you use link extensively there is a deeper structure than the one dimensional index. For example in a notebook with notes specific topics this link map shows the "landscape" around a specific subject by showing all pages linking to it. Because link relations are shown for a number of steps away from the current page you immediately notice if all pages linking here also all link to another page etc. Another example is the apply tags by linking pages to a special tag page or to a category page. Now the link map shows this link and also shows other pages linking to that tag as well as other tags where those pages are linking. Again, any oddities in the graph will stand out visually. Obvious future improvement would be to have a page "type" and apply different colors / shapes in the graph based on that. E.g. make a category page a different color from a normal page. Another future improvement would be the ability to directly add nodes to the link map. This would allow the map to be used in the style of a "mind map" basically drawing a graph of related nodes and then, per node fill in any extra information in the page for that node. **Dependencies:** This plugin requires GraphViz to be installed. In specific the "dot" command should be available in the system path. zim-0.60/data/manual/Plugins/Arithmetic.txt0000644000175000017500000000272011622405211020542 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-08-13T13:44:14+02:00 ====== Arithmetic ====== This plugin allows you to evaluate arithmetic expressions in a zim page. **Dependencies:** This plugin has no additional dependencies. **See also:** the [[Inline Calculator|Inline Calculator plugin]] which does something similar ===== Tutorial ===== You may do standard arithmetic operations in a document, ending the operation with an equals sign, for example: 5 x 3 + 1 = Single spaces may be used between the quantities and the operators for clarity. Two or more spaces, or a colon delimit an operation, like here: 100 + 1 = You may use 'x' as the multiplication symbol in most cases, or '*' if you want. Operations can be... (2+7)x5 = anywhere! Press now to obtain the results of all calculations in the document. If you go up and modify some number, press to recalculate. You may do standard arithmetic operations in a document, for example, assign values to two variables: height = 20 width = 30 And define a formula: area = height x width To obtain the result of the formula, press : area = also updates the result of area below, after one of the values is modified: height = 25 area = Other examples of formulas, try modifying the values of f and c will change after updating with : c = (f - 32) x 5 / 9 f = 212 c = f = 100 c = f = 70 c = f = 32 c = f = -40 c = zim-0.60/data/manual/Plugins/Table_Of_Contents.txt0000664000175000017500000000130012056366757022023 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-01-10T19:24:49+01:00 ====== Table Of Contents ====== This plugin adds a widget with a Table Of Contents for the current page. It can be either in the side pane or "floating" on top of the page. The Table Of Contents gives an outline of all headings in the page, and allows modifying this outline (try the context menu). **Dependencies:** This plugin has no additional dependencies. ===== Options ===== The option **Position in the window** determines in which side pane the table is shown. Alternatively if the option **Show ToC as floating widget instead of in sidepane** is enabled the table is shown on top of the page view. zim-0.60/data/manual/About.txt0000664000175000017500000001046312132472704016117 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== About Zim ====== **Zim** aims to bring the concept of a wiki to your desktop. Every page is saved as a text file with wiki markup. Pages can contain links to other pages, and are saved automatically. Creating a new page is as easy as linking to a non-existing page. This tool is intended to keep track of TODO lists or to serve as a personal scratch book. But it will also serve you when writing longer and more complicated documents. A "//desktop wiki//" means that we try to capture the idea of a wiki, not as a webpage but as a collection of files on your local file system that can be edited with a GUI application. The main focus is a kind of personal wiki that serves for all kind of notes: todo-lists, addresses, brainstorm ideas etc. But we want to go further then just a wiki filled with random content. It should also be possible to use you random notes as the basis for more structured data: articles, presentations etc. Zim will not include tools to layout a presentation or something like that, you should use your office suite of choice for that, but it should be a tool that can deliver all the content for a presentation in a form that only needs a template and some layout before usage. Therefore certain features normally not found in wikis will be added. ===== Features ===== ==== Content is saved "transparently" ==== All pages you create in zim are saved as plain text files with wiki formatting. This means that you can access your content with any other editor or file manager without being dependent on zim. You can even have your pages in a revision control system like CVS or use a Makefile to compile your notes into a webpage. Any images you add are just image files which are linked from the text files. This means that zim can call your standard programs to edit images. When you embed an image in a page the context menu for the image will offer to open it with whatever image manipulation programs you have installed. After editing you just reload the page to see the result. ==== The editor tries to get out of your way ==== //The best wiki is a wiki that does not interfere between you and the content// The editor tries not to bother you with tasks that distract from the content. This means for example that files are saved automatically but also that files and directories are created and removed on the fly as you add or remove content in the wiki pages. While working on content you should not need to bother with things like the directory structure. Related features include: * You can use [[Help:Wiki Syntax|wiki syntax]] to type formatting * If you restart zim it opens at the same place you closed it. * The wiki can navigated completely using [[Help:Key Bindings|key bindings]]. ==== The editor allows you to organize your notes ==== The ability to hyperlink pages is a powerful way of organizing content. This goes further than hyperlinks in ordinary web pages. One example of this is that zim keeps track of all links and for each page shows which pages link to it, making links bidirectional. You can also link webpages or external files, when clicked zim will open these with the appropriate applications. Since zim has the GUI layout resembling a note-taking application you can organize your pages hierarchically, allowing for example to group pages by topic. But because you also have wiki-style backtracking of links you could also have a category system by using backlinks so a page can link to multiple categories. ==== And more.. ==== A few other things I would like to mention: * Zim has various [[Plugins|plugins]] for things like: * Spell checking * an Equation Editor * using Calendar pages * a Task List dialog * a Tray Icon * You can [[Help:Export|export]] your notes to Html if you want to publish them See [[:Usage:Getting Started|Getting Started]] for some practical tips on using zim. ===== Copyright ===== Zim is Copyrighted © 2008-2012 by Jaap G Karssenberg. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the [[http://www.gnu.org/licenses/gpl.html|GNU General Public License (GPL) version 2 or higher]]. 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. zim-0.60/data/manual/Usage/0000775000175000017500000000000012140000463015330 5ustar jaapjaap00000000000000zim-0.60/data/manual/Usage/Creative_Writing.txt0000664000175000017500000000051212061674251021352 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-11-30T23:19:54+01:00 ====== Creative Writing ====== First feature to gear zim towards usage for creative writing is the [[Plugins:Distraction Free Editing|Distraction Free Editing plugin.]] More description how to use zim for this use case to follow here. zim-0.60/data/manual/Usage/Daily_Journal.txt0000664000175000017500000000103412056361516020642 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Fri, 24 Jul 2009 19:41:30 +0200 ====== Daily Journal ====== You can use zim a journal notebook by using the [[Plugins:Journal|Journal plugin]]. If you want to mix the journal with other notes you can keep the journal pages in a separate namespace, like ':Journal'. Or you can configure the top level namespace as the place to keep journal pages. For a dedicated journal notebook you typically want to set the preference to have the calendar embedded in the side pane. zim-0.60/data/manual/Usage/Collaboration.txt0000664000175000017500000000145212032047116020671 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-09-30T15:25:13+02:00 ====== Collaboration ====== Note that zim by design is a single user program. So even though you could put a notebook on a share drive and edit it with multiple people, this will not work very robust (e.g. two people can not edit the same page at the same time). Therefore the best way to collaborate on a notebook is to put it under version control. See [[http://doc.bazaar.canonical.com/bzr.dev/en/user-guide/index.html|the Bazaar user manual]] for some ways to use bazaar with different types of collaboration. Similar ways of working can be achieved with Git or Mercurial as well. See the [[Plugins:Version Control|Version Control plugin]] for support in zim to commit revisions to a version control system. zim-0.60/data/manual/Usage/Getting_Things_Done.txt0000664000175000017500000001615112056362734022001 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 08 Jul 2009 20:27:21 +0200 ====== Getting Things Done ====== The **GTD** methodology basically calls for maintaining lists of all loose ends that need be taken care of. The idea is that when all things that need to be done are recorded on a list it will give you peace because you do not have to keep them in your mind all the time. However it is essential that you can access the lists and sort through them so you always know what the next thing is that you can do given the time and tools available at a certain moment. For those not familiar with the book either read it or check any of the numerous websites discussing it. The book follows a flowchart of the life of a task, which looks more or less like this: {{../GTD_flowchart.png}} As the book only describes the methodology it leaves room to the user how to implement it and what tools to use. You can do it using some software task manager but also just using paper and pencil. There are many software tools designed specifically for the GTD workflow, but zim is not one of them. However the advantage of using a more generic editor like zim is that it is easier to adapt to how you want to do things. The downside can be that you need a bit more discipline compared to using a tool that enforces the GTD way of working. Anyway, this is how I use it, your mileage may vary. ==== How I implement GTD in Zim ==== === Notebook Layout === First create a new notebook to be used specific as a task tracker. Create namespaces for the various categories. I use "Projects", "SomeDay" and "Trash" for current, incubating and dormant projects respectively. There are two special pages, one called "INBOX" which is a generic dump for incoming stuff and one called "Chores" (which is in the projects namespace), which is a generic list of tasks that do not belong to any particular project. ''' INBOX + Projects |-- Chores |-- Current project 1 `-- Current project 2 + SomeDay |-- Idea 1 `-- Idea 2 + Trash |-- Old project 1 `-- Old project 2 ''' I also have several pages living in the top level of the notebook with various tickler lists. These do not contain tasks, examples are a list with loaned books or a list birthday present ideas. If you have many of these lists consider putting them in a "Lists" namespace. Important is that the lists do not contain tasks. In addition I find it useful to keep a section with notes as well. These are bits of information I encounter and may be useful in multiple projects. You can also choose to use an entirely different notebook for this and keep it separate from your task tracker. === Defining Tasks === As I already mentioned, small single tasks go into the "Projects:Chores" list. But tasks that are more complex or have multiple sub-tasks become projects and these get their own page below the "Projects" namespace. These project pages can in turn have child pages for example with related information, minutes of meeting etc.. One of the advantages of free-form editing is that you do not need to know what is going to happen with a task right from the start. Some projects start out as a project with a well defined goal, others first live on the "Chores" page as a bunch of related tasks until they take up too much room and get moved out to their own page. To define individual tasks I use [[Help:Check Boxes|checkboxes]]. This forces the main description to be a single line, which is good to make sure each task clearly states a physical action. Of course just below the checkbox their can be a whole paragraph or even many sub-pages with all the details. If the description sounds more like a topic than like an action probably it should be divided in smaller items that actually are actions. You should only define tasks within the "Projects" namespace, but you can put them anywhere on the pages. For example if you use a child page of a project page to take minutes of meeting and you get some action item, just put a checkbox for the task right there -- there is no need to first navigate to a main task list. Now to get an overview of all the tasks the [[Plugins:Task List|Task List plugin]] and check the "include all open checkboxes" option. This will show a flat list of the tasks defined throughout the notebook and sorts by priority. In addition tasks can have tags to filter then. Tags look like "@work" or "@home" and appear on the same line as the checkbox in the task description. You can use the tag "@waiting" for tasks that you need to check on but are now waiting on someone else to take action. Also task line items can have a due date, which will show up in the task list. But I do not use this - timing changes all the time anyway. Priority can still be assigned using "!", but don't over-use it, prios are shifting all the time anyway as well. Only use it for things that need to be done ASAP to feel comfortable again. Finally I like to add a time estimate to a task description. This both forces you to think whether the task is really a physical task with a set effort or not. Also it can work motivating to see a task will only take you about half an hour and then you go home. === SomeDay and Trash === Projects that are still under incubation, live under the "SomeDay" namespace. These are project for which I'm collecting ideas, but require no action yet. These do not contain any tasks - remember that only the "Projects" namespace should contain tasks. As soon as they require tasks they should be moved to the "Projects" namespace. Projects that are finished, abandoned or on hold should go under the "Trash" namespace (or "Archive" if you like). These should not contain any open tasks anymore. If there are still remaining open tasks in a project when I move it to "Trash" I check them off with the [x] checkbox to show they will not be done. Of course you are perfectly free to move projects back from the "Trash" namespace to the "Projects" namespace when an abandoned project suddenly gets new interest. The main point in separating active projects in the "Projects" namespace from non-active projects in the other two namespaces is that at any time you know exactly what are the things you are working on by looking at the "Projects" folder. This also helps with the regular reviews recommended in GTD. === Extensions === As an extension I also use the [[Plugins:Journal|Journal plugin]] to have a journal page for each day with notes from meetings etc. Action items from meetings may live there, but this usage is a bit at odds with the use of the INBOX page. At least I can reference discussion notes of a certain date from a project page etc. === Summary === * Each action belongs to an open project - "Chores" is the collection bucket for small tasks * Open projects go in the "Projects" namespace * Open projects should have a clearly defined goal which can be evaluated and stamped "finished" at a certain point in time * Otherwise they go in either "SomeDay" or "Archive" * Each action should have a checkbox - possible follow up actions can have normal bullets if they are not actionable yet * Tags on action are used to generate lists * Some tickler lists can have their own pages, like "Loans" zim-0.60/data/manual/Usage/Publishing.txt0000664000175000017500000000750312032053054020206 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-09-30T13:22:41+02:00 ====== Publishing ====== ===== Publish to a web page ===== There are various cases where you would want to publish content from zim to the web. Typically you edit you content in zim, and than convert it to HTML to publish it when you feel you are done. But you can also run the embedded webserver to show "live" content. **Note:** If you want to have the public edit your wiki, zim may not be the right tool, since it does not allows to edit a WWW version. There are scenarios for cooperation on a zim wiki (see [[Collaboration]]), but in general those will work best for small teams, not for public internet access. This section is about how to publish a static copy of the content. Basically the way you publish from zim is just using export to HTML from zim and upload the result to your server. The server only needs to serve static HTML, so there are no further requirements on the server and you can use any hosting you have available. See [[Help:Export]] for all export options. If you publish often, you probably want to write a small script that calls zim to perform the export with the right template and uploads the output to the server in one go. Once you have that script, you can add it to the zim toolbar as a [[Help:Custom Tools|Custom Tool]]. This way you can create a "one button" publish option to suit your way of working. Zim also includes a embedded webserver. To use it see the "''Tools''" menu or try "''./zim.py --server -V''". This embedded webserver converts zim pages to HTML on the fly, and will show changes as soon as you make them. It is mainly intended for those cases where you want to show someone quickly what you have without going through a whole webserver setup. It is not intended to run as a permanent server and is probably not as robust as a real webserver. ==== Website design ==== The look of the HTML output can be modified using a CSS stylesheet and the layout can be changed in the HTML template. See [[Help:Templates]] for the template syntax and check the templates installed by zim by default for some examples. ==== Link to other files on the webserver ==== You may want to link to files that live elsewhere on your server. Either HTML pages that were created with different software, or to resources like images, that are uploaded to a separate folder on the server. Here the problem is that you need a way to translate local file paths into paths that are relative to the server root folder. To achieve this, you can configure a **Document Root** for a notebook. You can set a document root folder in the [[Help:Properties|Properties Dialog]]. Once set you can link to files below that root directly by starting the link path with "/" (see [[Help:Links]]) and zim will resolve them to the document root folder. When exporting you can specify how to map this folder to a URL that is valid on the server. This way you have links working both locally and on the server. ==== Scaling images ==== If you use large images in your notebook, you may want to scale them down before publishing them. At this moment zim does not do that for you, but a quick internet search will result in multiple tools that can help. Run such a tool on the folder with exported HTML. As long as the file names for the image remain the same, all links will remain working. ===== Other formats ===== Zim supports other output formats than just HTML, but most of them require further processing to turn them into documents that can be published right away. E.g. to get a PDF document, you can either export as Latex and then compile a pdf out of that, or you can use the markdown or RST toolkits. If you have a script to compile output into the desired format, you could configure a [[Help:Custom Tools|Custom Tool]] to add a button in the zim toolbar to run that script. zim-0.60/data/manual/Usage/Getting_Started.txt0000664000175000017500000001113112061674251021173 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Getting started ====== When you run Zim for the first time, the first thing you need to do is to add a [[:Help:notebooks|notebook]]. This means that you need to tell Zim in which directory you want to store your pages. When you open a newly created notebook you get an empty page titled "**Home**". You can just start typing on this page. Do not worry about saving, this is done automatically. Now you can use the items in the //Format// menu or their corresponding [[:Help:Key Bindings|keybindings]] to make text **bold** or //italic//. A special format type is "Link" which highlights a word as a hyperlink. Try selecting a word in your text and press ''L'' this will make the word a link. Now when you click on this word (or press '''' while the cursor is on the link) you go to a new page. You will notice that this new page is generated on the fly. Once you have several pages you can navigate them like you would in a browser. There are buttons and keybindings for going Back, Forward or Home. It is also possible to order your pages into namespaces. The namespace separator is the colon ":" character. So when you use this character as part of a page name the name will be split at that point. The tree in the side pane will show a hierarchy of namespaces when you use this. After you have edited some pages you might want to have a look at how they are saved. Use your file browser to open the notebook directory. As you will see there is a simple text file corresponding to each page. These text files are formatted with [[:Help:Wiki Syntax|wiki format]] to preserve markup. This "raw" markup can also be used in Zim, try entering some raw syntax in your page and press ''R'' to reload the page; your formatting codes are now parsed into markup. Apart from the raw wiki syntax there are also a number of formats that are parsed as you type them, this is called [[Help:Auto Formatting|autoformatting]] and can be very useful to speed up your typing. ===== Some tips ===== Zim has a lot of little features to make often performed routines quicker. Some of these are highlighted below. Just try out some ways to work with Zim and see what suits you. === Use the "Jump to.." dialog === If you want to start a new page without linking to it you can popup the //Jump to..// dialog using "''J''" and type the name of the page you want. The page you jump to does not have to exist, if it doesn't it will be created on the fly when you start editing. This routine can be used to make notes of thought unrelated to what you are working on when they popup in your mind. You can use "''Left''" or the "Back" button to return to what you were doing. === Use CamelCase === CamelCase is a way of to mark page names that is often used in wikis. The idea is that a page name always is a contraction of two words both starting with a capital (like for example the word "CamelCase"). The wiki recognizes these words and highlights them as links. Zim formats these CamelCase words as links on the fly when you type them. Thus you do not have to explicitly create links as long as you choose your page names to match this format. If you do not like CamelCase it can be turned off in the preferences menu (//Edit//->//Preferences//) under the "Editing" tab. === Use backlinks === You can use [[:Help:Links|backlinks]] to trace all pages that link to a certain page. This can be used to create wiki-style categories. Since link relations are stored in a cache backlinks are an efficient way to find relations between pages. === Drag and Drop from your file browser === You can insert images and links to files very easily by dragging them into the page. For images the image will be embedded while for other file types a link will be inserted. In the same way you can drag urls from you web browser. If you want to include the image files in the notebook try the menu item "//Tools// -> //Document Folder//". This will open a folder in the notebook directory that corresponds to the current page. You can also use a document root for this, see [[Help:Properties|properties]] for that. === Use the keybinding === The '''' keybinding is used to switch focus between the text area and the tree in the side pane. This allows you to switch pages using the keyboard instead of needing to grab the mouse. As an extra feature the '''' keybinding pops open the side pane when it was hidden but closes it as soon as you have selected a page. This is very useful when you do not want to have the side pane open all the time but instead use it occasionally to find another page. zim-0.60/data/manual/Usage/GTD_flowchart.svg0000644000175000017500000007040211544165551020562 0ustar jaapjaap00000000000000 image/svg+xml INBOX Is it actionable? What is thenext action? Trash Notes Someday No Yes Task List Calendar Waiting List Projects Do it Does it takeless then2 minutes? Review Single Multiple Yes No Delegate Defer zim-0.60/data/manual/Usage/GTD_flowchart.png0000644000175000017500000012126111544165551020547 0ustar jaapjaap00000000000000PNG  IHDR[_sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwe?$zHw JQPQ& Oz/""HлtDJPމtq͝lݝ<̝wfݽws2fL' ?/t:6{W{"1r(cuYpc 'Wg)`FǦ,c'EԠ q 4w<^@8,罒 q ë{Bc hoQ~T;LYO1'1?_5˶%]PAAPEcATAU8AA!AAPEcATAU8AA!AAPEcATAU(ۀ gRͅ6~eY/L8oP\?-LEB ZeQ9CejHc,翽]$rAAQX```ƴU ??ăa/{\e9wtw h0!A_QxLdh˹Lۆ:Ȁ7Z?G@NA ̀;-I-gc9ȀC77*c!A%⢖}˙Pef9GÁqB]cA(c#wC`Ky\yr>TƏ+C JB 9i&39^kAcAܣW UDjP e̅OØXr/٤F3APS .a,89m~?1VH+K"(rSZAPcRT̞k/9Hb1ꈙMCW{m2plyL%IKPcڠ8/< ^_,iTj9p:º6-OxAP{f} c鑴 ?v;5I73峓lf.lߛwNZZ&ff[HxUҬfN3~ub͢K$m}L{^wMb%'^,nHC3|gJEḇx5RК?1:q5xhD5N6#N`fnG뀋qAܻH ,nf/}T)£/Öw!1x V^c%pG3;^ͦ:ؕ^4iAҺxn$lG^+OCh|&!AEITBvA"i1c|Rp\4g|ߦcf$xZ; 'ppy/3Q*mpȵf2$$ ÓHTZ:>a52VVi_0pyoxA8.f/.`=`z ck0~ ^4IF3U뻈yA }®` \ofuOϗIfvi?|+ E h,EOV˔ҎHZ $F\ߜd3{cc{l4zBc4qKYl~wZoYA] DoSOnM:jf--:ʘL?)˧ePʘ>FD@Nԙ4az,Y8K:]t$>A&痂弧SiT:avu0S^a9u@,xݺ5 +u < ̍ fe\ 욦ܦH .ٍZ;[ wؾC Se>&yxj-ZT f #jDd;.g9//市S9 fv>'c\ ٌq&3mD0 q n% c~0l#Oc 5(ja!1 !APE0MX! v@-!A]q 5e cT>gb1 !Ahea+9u!1X!GBt*˶!5ō%)`_q&pL@C¸mc0o^-~~^bNu7 㞳;8%Pƪ6;=k9W0˙b9wXׁ8w{sB!Ki@@OsoU[lfA?)elwC/ Xr6K5 -g;| \q2v/ q $#.4X A='m%iSIl}e6רqQ_ZX5*DelS9 90^EcH=b8])CzC`3~k6x2. 4rvb9G?ITR 1 Q:afV 铁2M=W?U8o`y%i\.£W_cV8w?*הrN?'/eAP>,̋ 6!GҶb8UI}FUffٶ2Fs+[%(c69a!Aw.0<#APV0 w01*w (iIjZ_XAzǠ呴>kMf6M`mE iX`6xj%؍%WƦPN4ɳ/̬eB"vP/i%I;KE9w>I BM$Z2H0Q&i}SFJOKZQ4w-N%|!As^ p,ɻXy3- l `3wkKSbS`=țH_W%{/ I:UtKb_oq ZIK3ꭀ#flo'x(fh#!xŌ*- h_tp~#iEvËO_֑W Z3{TKy>?ƗlO]0ɒ.ǕlTt,>?F.t%tl3_m#+kw-ӻ]ҩ):+f6! w>wY8g3{-'L_RtY1FfG=1};3H- W %1+=ӧ&siy 8j^c3 3xBs^{2IDzBkc* wa{ǜgݺo \e뼸{(p[7kw߉EjЪTƳlJtՁ%$bf., p%"oO 3|p<4oձ1aZە}*C:W:.p0p'ť־OSkfQ\tpp߇s낙/i~`5`[>I/Yw PO6U~.p`$p[$^qeZ6&L ![)?IgJm>$1hU֭G.^bfO Ҷפefܷ"*?`!ii$3c~Do\܁S{?@{iaLLj}7CofPv@}lftzcD3{:>4'l{͚/bfH{jQI ">F{fv.pn x#d۴n )3SEx!͸gYI?\hKv}cN`^ꂲV厴ޢ ZwK@ҲxBhJi?n:oyyIsck$'ߖYaftAxVY}u+-vjTHu"u9tiK.RA܏,bfiF=]k3Q3kVYJכ2a6Xi Q$xoSzi* q'sON?pl }`޴~t0.I|\i{Gi3 IDATk5lLf~5d]5&0F;-<ǠU[ϊ1`$.2Iݠõ)L0xڧk wXLB]Lqi4KJXHJCLL½Z^Z$(F<h-mc_)r#/dz4^ |T)}N φi`cВw1%m)5IݑY%zsj63i+└(ҵlz> JںM8)\O %`aZGIsGeljfqkN|,s1)K#҄OwXW=xbO {pݍ)6G 4p:z)=Ǧk߃縜wiqkF3-]ˡ#,:ẻLvi9n`H<ze΂:z\!TصO022)&9XH28SFq ! ¸acK"ت)BTX<e,Sy?_ֵӧkݪP#XO7ؗ"-AJ >B (c 3B|Zu%q,/`:>Oqm&5.WA yj!ӆ!A q ڂȾѦ= q چȞica:!isaǠ΄8mGt0BcPgB$a?4ɽ >-jE:H=55NFq Lct@v0BcPgBSC`FòڇǠchw`a |TAt*.ԙǠh7 aB:t$"!STAt,̃ܠTA4ԕǠYprR!ԕǠjXǠ8CG C%1+!Ahu aǠ(ۀ h%$(m  a읎VU² 2j1&y q *ZM Cttl!+„e <by=IAT#I{M!Hx6/ۖz6(VKf>XCwtK%].雒f* ħǴ`XǕC f$<Я%}Σ]Lz^tu}F#G~*iDaRKqGc4iך@ 8W'pSSIJZmɾSط">2uv8Accn N2Ò~֋pl IHER|=8P5YIIڤYJ1 L^VngI3HrN=&1Kc J}\;%jI IZp 0f,RI*v_Z%O7Y>/Z '/ Cs 5xz]1O+~QANDjIc6p_QĘc#iE%<Α4mV"Ҹ9V}-`U |~6%@^b;3!,1nĻ"4! ٣x>wI .lw߁Gbf/7%-2l7P8e+\<aê*OiL o IҦm'ThI[l-fTaWqz~SzR5TG@a"/w=%TW^z}-l;ےҰ}|gfgՠ<yIkQ5=0lf.F CiߑIWZ-`3{߀ qlgG{E%-]0A/sffWaf6% )({>0pS埨7=Vf6q2f=*>ٳ84B\8XwrJ |,3mEcJ/C+noA5^ί+U1ny[{;&#uLW].j~ }]b:V|LuO??,iǞ~IJ:s_I}l21ytVo]v[;>m>l3o3Q$̾O g/3]\a_ZeH*x Vcg0x3z*_Li٦ӖĽY2DZf8>;J#D|MNqҤqebm}ktewo&49y$( >c-%ngW?X?|S X`qKZw.?;Vb͎s?]Ń6>4 Q js>kc9ϔmP's⨌1f $=/MwΥ;zl;KQ&$|ZEonxӚ-qrܼDZe&;] ,pہ߱X$xVb9/+<*8`˒MtZM5Q gj .\#2F/_s>Bw0 .kȝ4fq ^r~]A2> ?~ 5r(cE|~|x0Mr&(cGE8eLK6Ps_Z?f6ua}1cc36* cl8clS31Jݮ{i!>= .='mwQطsvTfҩ$`RطRj&> \4 ؾ_"|w O؛Le  cl 0)yʶL}cLذqYE=ŻLG-Á(q?1,ٞuqQ6} =ăyV6ߥ6юB%y-)WE6V7{)1OVּnUG{/ E?nsXfF -a$x˩۔1+~q/`9pvfVxrSMB#qjQ,j qQba9;6ڲwq?+9l{!V`n,df7Ѥ`Y`KXFpj'>pl{e])]B ^/ a 弇=X-0/\Y֠]U/HS.$yt2fGBkT*U $%I)>of}J'yzOA 0GYFZǃ6矔SP<`93FSDb)60&vN4Q< N? q$/ItR/GW0?p! &i!I?fwr3O9u<3m(#T`P|hfHcL%k)c:xg+lrb *ssI>\867ta1|˧/H ifKZE{ NO ƃbfoڙ[]7YoS< ho>UxH/Ǔ6\+i8^A~kL<ĽotlN˔|&ev. {MEΆNstw=pゞ_9 Bڍj+%dfG&=4xw\a4!>ê-E3{\IW%*Cq6I?#*'\Uh = Dz+V-16J3Uy\xkbJ])-_Y _c 8q)xW܋,{u(CgV286z"|c+87$=efץx"xV[tl>caa3p5q}y7M> u/-{dÀ %4$zBs3v$wJXUxmQJ'iL{zQIۦʆP0BxA T:Ob>VY{2/ 'Hل4.q,vI^e c (as%.R65d$^J `gˉ"509;nta/8hZA+@Ay>p2~lAQ(e8r.ת&E>'JX MCidAVz?Gp̝3sfysg5sokί ̉.4{$l,&d3;{fgs`K`z+/e(,0ygJ\df\u``1j٫~[MAʴêÿgڋ} z.9W* J<=\#iy37xx V6576J`)|踜v^x{I`p.fWM wJZ7A+nc  |nb|\ -i <3if&&i)3{.NE`u3{Z҃f ZG7Ff6Jk#̛.3csO/Iڵ7>I~|8t|?62,8J.Qf6X#yCìx|}`(:.Aִ ,ϯCnICf}{ޮ,_F&r%?,*_%IZ̞1еDz`_I kIکk*! Zo ~ G>H_-AI_K+SE8 /ڞ 79iՒMqZ 1[/t0IYk|Y2.Ԋ h!A31 ]PwRա!v/;ʶSkJKK(+[e?sE?pi9qy _a@ zOʝ0cvӨbQen͡L:.Mk>e;mO+sg8KGy_zlIDص ڗT{sᑤx5S)?G֩Qɞ9%4:w< 1GJ__B2mw`px"0+0Su }jlfs#]w/5[̬4vMyO :_*-91gm UܶLaS{ܑ;u/UjG<1./wHZ,PO{9NKYx8(-$/XϏy9&麹q/zJ웎 i|.߹N(CC^n퇙܆X*E%pۋYr:rz4kiUqizԅ=qh}WXl;͎|vVcEHNm`f?‡mKh/mZ}shߙ^vH5]7%AV8GSAbX< Iϩ_.uI㑝>/*gS~|rLV`9ȥ$<*i.@2]ySI2_cxn S8&z"ҼDQЂpHMJsΞ4`}G..X={]IGRsp $%||&(#RE}:;,-\/ᐴ70 f)26-[5 M ։GҶ%?١=\@g|m쪂M BhY1rG0fv%9{AHZ_28-1˴8&.|I w n$a UA*3X)ƪ^Hk!D7HqZs4y]Bۓ4dt"0Ac?A:"p]Q-E:5F@m #>*!AP _(iYa\!fm <%i" ̮LJ: z6.fLyPS|'|wJqVPA`flR] a |h(PUǚnm9,a 밪:oRRX琴7+V]*C!APąY_9'lNB< +4ߧe7A0Acs432?/>s}.7!/76lR[#i>`"ᅯGpKv}˛ʃ a Ɠ+\mga0t9)4??D.2=TZ찲>U]G6Ő瘼Ʒ5;mr$ ½ƂMj$ ۽yųAkjŃ a s{0(ܳW#i.I'sJ6:FHV< 3|pM4Y& %/q2_pmo!_(r֕t6.W0] y$nf_aWى0naUIف%߮Hz^?E*$3q`f;GyI'eò6ąUr3,}-&BwCa]pA0I^SSxI_<cXxffcf|bf% l,''M ""u5Z|\Xv3iCEy}^Ҽx08&T pNo򤙙==^f%DԧlhU)ÿ@'Ú6'ߊ%AЂ* D] ˻Zj臸2p|>7x _;7:]7efuq/EaɭpoZ\HmojG<8dF5pqo/ H hAjͭګ@$pX8~{zÇ?LM#'3=~{'Ž6;y~ -Z? #+]bX5ZFyL*CICk%`f7HZX X|̞-܃xt/lI!x#fJz3IxI‡<+%XCV !O}M_t.οv㝜6zxA91-LMêi(`6Bڏ.ԊMeMG|W!ia $q4%݈{R\mua xi (Z0T5>) aAxkpoQ&=?/=FwP</p$0FҌ]Hu+ZPҟ/Iᑱ1j=ӁpwgT8=#iM`zey_ ^S$ofؾ.c&(Aې8N~b4_b#*HJl,0,E,l /ik3{n>*;MhX4~g* '9nju7:_VţrA7T; =kfVf6^Zy~FjdeL['ڂUOHzZ~CJ>S=̺[n8lV֖4}RuYB#fv#p0>rqF!iz\(֢X% Lurje:d/gT?[=\$^ +{IQq03I^jgCړb85jU FJQqt9p.L{%ē EIrl/Eγ%'"a2'뿅|>=sEx& &.@Ef6IP|YŚ.LRgK2Jg"i}xpX<%}{ڋ%g w:)2̺ < agP:x0s^|I|;lj!APM+HX XK!SM)Ft6y i` mfGќ r%1I=1X^IAHaѪAF\RaC5q 1W 8޶A!A=y hB2 IDAT .B3(c  3{Ɛj!A] >lfO7Ԓ j"1*q H%n-;=s  ȗ+B, D I3ҩuM 9Jݕ a $1ƴVA4-19 iyxA!OWg#XA58A/ .+=:k'[Ao q *p@{f6> /v+0?^|3;AP!!AP6.=뀋[ NE hRB$ý;;k\`MIc@FXqf]6MH fFP|u,ռD̮.GJ"2 IRgą %A' &y c] /8RQy# q 2:z/2 (˜Ec$ƌ hB1#2ǠS&WP0f@A8}Nq"1#2%1賔 40f@Aq8}N$!AP !AU1#2OcЧh5a ꁜAUTMbۥ|SNg[^,!AL/ÅqJVȠ'$-l lIףSx_z-p$1h{I3B r$- 2%OMo3"i EHۂztTpl3PWU!A[ӎ˜H8 NOnEf3=lRooVB1#"iz`?|Xt*p!pp}^{l J׀Álj,Ǡ- ˜p,> p k3{6|8X.z 8l $1h;ʄR`vƌȾA(^=Bjf'aO8mE_ƌF|5G_f>Çw4 5B/ cFRҪ`?3~?~&y ie:|e` 3QU_EE,CfVVǠ-a접)?>;gf-yn`tk3;^+ lkfiSwHZe#[٣ZU=!AU,Ol7#;flF$mR7`Vꔖ\l'XFkUuDnՠ)Ka5PlRa4?Hz(CI%/vH:L3&HDҋ.l^S3 i%|\00KY$^UUbf֒00b_65l |ޣxG,piYK ³d' أA37oIU1V57 6f$ 祧~bfglR8-Eci@n}iSǷ=+&;<fBf$`]3{`rCxj7MV Z2a&FIUQom+%'WS':^H6xoۆtxp; #]G~W9=KQ>W$)iL8%4T)5wצoqhkf٫x#)/ivf$ݒ@zї3 ^{;MKc$x~ǹ 3c%H[2 bA`ZTFg* | Io\su-FI3%3 g7xm P9Stllu1rb^sK)ˆhd``IwKÿnŽ/'iG%mdNj% <`O`6)X7m<{-M倫Jm7C#ʞfΟ_)]7|z7.ڞ.,ڀbjë(W1/$~+$<>=,=)gIvNB7$ ڰLp;/'[4mӕh&{$=8;CpmVýS[zxVtf$CqoD,]= zDѶtŰjД,WQJx zz#L3{΁ߏ/\x~//fp~li> q$s#= 1=^ZI[GO~3b0^ +~rnfOkpofϘf6ҷk#63hcĩX`f{ q 3pi|QѱVn~3O{J xUˡX3*u`u\4w=\ӴIQV6ҹwfeyrɮ`fWJr9R 뎤Y)Mh{xdmNcTdM{U\X9pݥdl`I/CL >49?=pUj;>O2x{:^N !itx6#o752F6ϔ*tq`U|Z I]|^nd};`%-M+4 14 f‡.gafWq3xopQefז9_ r w<±b¿>…pG<թɶ;y|(3#O\T'ƽpB+_y{N2.c۾bϕx+_$-]f!kmՆd(4j Ie}VI}Ig 5+HGH ,nMNH.3iMpC q IÓVKSXm~顧qpԃV I+.>X{#iz]7XQ3ACr`Z>?IHLse0xB֦!1h~[ ςSwR^:k69q]7:1(G IK&ED&oZ$TdUI_V&|)ƍx߫%-eV=]/[$]mfvtiIzSuMo4r/ᙅ.]@qFRaso4OJv$3I' O5SWp"9 uZzpIރˬ8f&CK|iۓ8f|']}}̾t.sˤ?$iU3{ρ|O8_\I2x3C9sa|%/;z?;+Mjj{\!A3s{Q)tj?p3;O6js NX9~A$um>JQ?#/3܇χR0lR&a7<Ʊ" 'hF<_ҶH:D6|(꒾!ߒt%(Ȣe@ WaC4Av{fvCZ͵͗QitA%8}2mUM%<Ǡx)W}%kٝv=H>0q"3{.}G!R>EM`s<-%N01k4K߃xz0 ~bW÷8?OvEz'p/qf)IoŇhOܖI ' M`V0>1Y__r+{Q36#bk((')ghIKZ[ҽ^t|J:tstPI?II!Jsi:tw$=e+y^Rt+fv}ҩ݉W.O1׬g,3=^OVj^\ M|I"cKR<+`{7cFc|jNz%gWe}iik_,ES49?F2_\`f==̞3 "p8F٣x|s~fycpq&z >hfvvMƏX?%́]ϟzpcf#uӑy7YjǠ)U Se"$z2 Zr.{;lߏ (]OwUDW W!ŭ d|C8MLo2}߆'2߮/>Vy3i95EqqF%>'LNfT-O$ .Ԓ!iu'#1hj f|`mI6ǫ ΞR=0p)Mya܅$ i}$-P3fr!ͅ=W` d)N1 BJn_m좽"U]>ƴ^;x];0m1iNŋ{32f`$Pkᥢ/Y|˼ 0tAI_CpƦs6H!MG ZtIÊg \ >̚vW8mC_>6ˢ\&tH ‡R3jT/Aזy0 $O9/ŶKϦ X$3n/ҦZ1h;w0ӁMq"%M/0>9mL{!}IKJǀ1D:* v3 -A0]r.kniDDk s.. ch721Hi~̙N?I^ qptx/{_ Yo!1@0!i6&p*TZj^`(.s4 Ǡ遍pns`&bccq!\/=$+\d 1S@0Ւfr`a`p..7ld=lVB>G dcf=mv:<1[f6(;ǠO*K9>I+,a q ,,!AP,!A21'14@0As4@0A"21 ( a #1h@JBc4!A HIbCq .@J'xf`n&` h"}\@0%x-ڭ^:!APe)K3G/{o;u07 q IG`t:Į.^E=ƸޫA IS/O/ Rπ c5 it/GxΘ \\ef6ȼ j$1j@R?``q8k}f6@ %!A hfKmO'9A~(jE53h  ȏs q '1'&_AF6(p"gr/ٱ/i q sX{%GL<8AİjO=L5twA ȏz I$&4III h[B  ș ܑ UCI9^>c( &1'O2YS^h9%im %1.êf.vu%;cΜY@RH=S9?-H/Iswlbo<^A?.f6 ^yNj!<~3oۂ q K3/`;Ilja[!Aȭz A|/`N:w=XGۂmq 8;v(\ýK:N]AnD IF27q^|yRAPBV ȆU ifqEJ AD= hqB ?궔#SjшA4  (#1#< hB ?s '1'< hqB ?& @mBcGVxBfB $ )Җ j'1LҒ&:xx] B ql$ J۬@`P70dZv}|^q3)9J^_> b,V$%δefowrـf.lXo5 IjWMWùSk̶e.0{fyg ('ı4, 07. 30?fg*nw`̃?nf{@/Jo,i&\J[xړ{z8_A `:23xI+/ڀy,%KM8}\.0YT+ҶQQbT)Uq 6I}* r'x`ܴOm.6y7Eol*I9ٖ 䲉ŅvZ3vEcH llkekQ/3{/g 2 WJ4m}$oK$͂k/ ,M]O%\ hf1B y[À_1w 30-c;gp4-s},Z 3o'H 98 \\nf+Ҷv$-QafmOPI(Kx; ڋ!i2|ۥb DҢ+nfv^yÓ;|ldfOkUPO" @>\:#ؖ* 'h~3 2d.IWYA q3 |mfwlRP?bα1xZxmS[~gDn%k傖&ı`f^ԉ:"iN 3{h{G0M 6%!eY=hCs}+mDPBi?P+FcU`Cc}}\Aq[]p Z ȏ hB ?BMq hBfE4(i%}# B*G!ifc7P_n=V35k$-Li5U_éx񺎷RKQҡ%6- <cs1O0/v3p𖤟h[cFԑj=Džj>hIIgKK^M_AW ϱ9~Hp2pL êGٝفEwQZ)zGx-l Εt6t%tZr-tw$t#_FKzCҥ)6KJF3Ɇ$'iɒ6C{C%ݒߗ(͐<ڽS%d`fހ?㋶#l1BdIё. yS%M3omYNZƕ]7}u(כR[fK=S t-^Q`+il\/'[Zr{\&3]Eobl;ގ_(  DDD AE'X(қX!H M4 B "5 $!@cɝ{9綜93|3m{^{J$ҧʱ!i|vL4:׹չh|v0ƾiGf7nYWz5dftu hQxo8n|]ת?H;}/3ڃ뼊w;m5<6+Nkf3aa-#knjhfs$=t+L3 _f'Roofuup$߉9}Ik1 Rs$Ѐ{TҊ}Ca1oc۴|pp"4KN{`TI ]9,_w%{.ofw^wWI:nhk89܊[_a1X 6p2wx %܂ߋ-q0{$]L^=D"U|{o$\A qΒ1Uös\G;WWŝBn.ps:᝸{ n3~e}I71.؏m3 #0'wl/5Us|>ұj8&VZY[_ 79R!&Ǣ[XnfszpއsFޏYut> xoi`Uckc&q2cGj#g%ge4hVm!^B>φnqgԸl]:ޡ~8BiZɪ0xvίy#c3UBXVX*U*#u1׃:lq:05c$"D-G!*HEqH1irlBPk/%#iݚ#]HBƮ]LҾnITU2IWIڸAx=A xTҞ %-j)>'fAa4y$}p%u׏%n+OH#q Bұ x"x5`#o P𰊹M^6Oߵ&iwFyx"Cz"cWn_Ʌ8X&ZZޣ},U%iyQ$Bʱ8Χ-ai]^F[smW+SH1ܪJ<ɽV{.Q޳rċ 9٭9; 1-R-AF[f@DETmfϔ-O)娄!7QTE cͣa؈cП_Xk%#,Dk+Pᕝ7b޽Rmi}}@'c5'K8|KKsڑ%-#k_WRf)a1Kc'VUҾA9\=|pFXHdD?=pq9`>^Q 'Ye5Qٙ+ˁ-%n JX8 o|4 4xBp*p;0ҊXa@/gmvUR17h+ ~;p40:pnIR>UUJ*G%lj- 8R+UkՀӀ/⃑-%ȱ1?Rtd鷄4|!sKڄ6?栄eܝ͚DakXKh7JX__ҺEUKp o(Y~gxqSQ16K\i^֣ %w6|^TR^ƭ4#i;BV]GSjvP˜:M/H %^4gKXYMh/K nl^Dա2X R.[NUFVT;JHY|`8(*0/|fp(%|ډtMo˖*TI9nc)ܠ6;_]l)3 l' ,V0|FQ񩿳dȨ% ~M=lTl_Yu~AGEIVrNZBj#3p eUʐRxbC 1ӣ5Y5;=8݀'-"ڈ4rU9fI{$@I2I>$jIR2הEIZ%uIiH VG^ɼ^${/cj)JUI(*xʱ_HZI[~qP3*Sp=CpWE5.}X-YAqhSOYfefvZ}_1kww{rXpVO+ͬty&YC3Km6,|ՎD)ْ77pEx1[7H' +3އ$ VtRwpum{k!_Mx`{\>0{ $WBҖ$-ayo/i5CEWwx'lU+VHX{gP$jfχmx[$W 1` |2\=l0gHZWG a8I[q3+iIAanntlCRLnmeY>gf6 &իF H,=Nm?V>؝ ެqmugk{-sm y03;o0{9,RپM}K㿱I {91D~&p7>r LgW?ɫ?-Z|Vu$i `=:4r0ObW)p] 6íKsר_)FNo qR|TI/&ib8o5Fw[-4f]x I@<ϱ| /l7ch j(rW - sf6GM|3 t0>  vkAAdͶSzyz\'NxQ}x9fVqJMkf߫!s%Łf?١ڇ@f fy:kSͬn*B3;2;8݂I WPقkfvO8&sux¹ 6a\;% ZfVh<}_PZQ9No>s<On7׵iQd3X܌t/B<1n5ecH0F2/|F񀤿㦲r[6@1Α4lfFkBSB9b 8|45R-7F2CKij: Iځ }m7srN×5U ha~|]m:>߃ŒOҧٵx)ijS-;AҖvg]dh/{Hl jzI塚p?~L0:m3{gt:2"6Mp_4tQ[5)a˂zXN`eZ /^YZ佊[W&G3[ bƠ*r10m E `f%>jfٴpӸ w']?#wIzZcwa߹$=[H{F*I+2Dhסf L*v+`i3m{CX_=ZtE܇H*"pVs;l3{^KwplJn(s JEђ7̎C+3ؿöI!0y0⣾7rka߯GW_^To̮t5j|$׵U\ %inIQBIu7֗wg gKڷS Iwu1钆(|6dM?۟03 ZOH7n\bfoKA}:׺2?t3Iم(㞬KzamSZ_-{BO޴!xx3L` wW~Zwfp7Wpa!NnC<(8~&tff%}O ng*މvQT,⿓/lS ic\i}?̞bBX`gp^ .%g6 pS<֖Jء6"=f\xUr.מ0%su>,_W ۉt%{;x-&J:peT(cNa%oQ𼭳ٖ܌? #r >@vx %,bҘ*ø7n;A ,RC e+x֘q3x>ۄ"5P7#o!FyU76*H쀛Tv~I#\gy8V +Y5)%Carq3ڶ)xYJرFP<K PRbI!2$ %,m)W{X.A2I:m qE98B='J1طY1'5x#,9<^O0+KlFkp >@k)5+XD>e+Uq7b/6 rOu>^K{]s4* soI~% CI~'U K ÖR9V0E@8{=j)? ^.NJsṛ!Cɀ1SYSQ`=A c2& Xtth)-LgGX&Jڑ-!qx6Nw|@X?+s滚IENDB`zim-0.60/data/manual/Help.txt0000664000175000017500000000155012132500625015724 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 08 Jul 2009 20:28:15 +0200 ====== Help ====== Pages in this section contain help on using specific parts of the applications. **Contents:** Function by Menu Item * [[+Menu Items|Menu Items]] Organization * [[+Notebooks|Notebooks]] * [[+Pages|Pages]] * [[+Links|Links]] * [[+Tags|Tags]] Editing * [[+Key Bindings|Key Bindings]] * [[+Auto Formatting|Auto Formatting]] * [[+Check Boxes|Check Boxes]] Other functions * [[+Searching|Searching]] * [[+Export|Export]] Configuration * [[+Preferences|Preferences]] * [[+Properties|Properties]] * [[+Templates|Templates]] * [[+Config Files|Config Files]] * [[+Default Applications|Default Applications]] Other topics * [[+Commandline Options|Commandline Options]] * [[+Wiki Syntax|Wiki Syntax]] * [[+Importing external files|Importing external files]] zim-0.60/data/manual/notebook.zim0000664000175000017500000000016311763734267016657 0ustar jaapjaap00000000000000[Notebook] name=Zim Manual home=:Start icon= document_root= slow_fs=False version=0.4 endofline=unix profile=None zim-0.60/data/manual/Bugs.txt0000644000175000017500000000055611544165551015752 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 08 Jul 2009 23:26:35 +0200 ====== Bugs ====== Bugs can be reported in the bug tracker at http://bugs.launchpad.net/zim. Please see the [[FAQ]] before filing a bug report. Bugs specific for maemo devices can be reported in the tracker on the maemo garage page at http://zim.garage.maemo.org zim-0.60/data/manual/FAQ.txt0000664000175000017500000001207212132472704015452 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 08 Jul 2009 23:26:20 +0200 ====== FAQ ====== Mail [[jaap.karssenberg@gmail.com|me]] if you have questions that you would like to see answered below. ===== How do I create a new page? ===== You can just link non-existing pages. If you follow such a link the page will be created automatically when needed. ===== How do you close these "tabs" ? ===== Uhm, if you mean the buttons above your page, technically that are not tabs but a path bar keeping track of your history or recent pages. The buttons in this bar map to pages in your browse history, not to open pages or something like that. You can not "close" something that is in your history. To change the style of this bar, or hide it completely, go to the "//View"// -> "//Pathbar//" menu item. ===== How do I organize my pages in a tree structure? ===== You can use "namespaces" to organize your pages. A "namespace" is similar to a directory for files, it is a named group of pages. Namespaces are separated by the "'':''" character in the page name. Thus if you link to "''foo:bar''" you will link to the page called "bar" in the namespace "foo". Just link a non-existing page and follow the link to create it. See [[Help:Pages|Pages]] for more information. ===== Why are some pages in the index grayed out? ===== These are pages that are linked by other pages but do not (yet) contain text. You can edit them to make them regular pages or check the pages linking them. ===== Why do some pages not disappear from the index after deleting them? ===== The index keeps pages that are linked by other pages even if you delete them. To completely remove them you also need change any page linking them. ===== I would like zim to hide in the system tray. ===== There is a [[Plugins:Tray Icon|Tray Icon plugin]] which can be enabled from the Preferences dialog. ===== I would like to start zim hidden in the system tray. ===== You can call the [[Plugins:Tray Icon|Tray Icon plugin]] with the command "''zim --plugin trayicon''" ===== Can I make zim appear with a global keybinding? ===== By default zim will only run a single instance of each notebook. Trying to open the same notebook again will just pop the corresponding window to the foreground. So you can set a default notebook (see [[Help:Notebooks|Notebooks]]) and just make a global key binding run the command "''zim''". ===== How do I publish content from zim to my webpage? ===== See [[Usage:Publishing]] for some tips ===== Can I change the colors used for links, underline etc. ? ===== Yes. Copy "''/usr/share/zim/style.conf''" to "''~/.config/zim/''" and edit as you see fit. See the [[Help:Config Files|Config Files]] page for the syntax of this file. ===== Can I have encrypted notebooks? ===== Zim notebooks do not support encryption or password protection natively. However you can use for example [[http://www.arg0.net/encfs|encfs]] to encrypt your notebooks. ===== Can I have full calendaring in zim? ===== Well, if you really want to, you can use zim as your agenda. However, the Calendar feature is more intended to keep various kinds of journals or logbooks. I'm very hesitant to add calendaring features because these are usually tied to email applications. I admit that it would be really cool to link notes, emails and appointments, but I have no plans to extend zim to become an email reader. ===== How do I change the font size of the side pane ===== You can change this by modifying the ''gtkrc'' file, see [[Help:Config Files|Config Files]] for details. ===== Does it run on Windows? ===== Yes it does. See the download page on the website for more notes on installing on the win32 platform. ===== Does it run on OS X? ===== Yes it does. You can install the dependencies using [[http://www.macports.org/|Mac Ports]]. ===== I want to move/backup/synchronize a zim notebook. Which files do I need to take care of? ===== The visible files in the notebook folder contain all data of notes and [[Help:Attachments|attachments]]. ===== What is the hidden .zim folder in my notebook folder? ===== The hidden .zim folder contains only caches and GUI state. It doesn't contain any information that can not be recreated on the fly. ===== How can I synchronize a zim notebook? ===== By synchronizing all visible files in the notebook. E.g. by putting the zim notbook in a dropbox share. ===== Can multiple people collaborate using a zim notebook ? ===== Zim is written as a "single user" program, so it is not intended for multiple people using the same notebook. However it can be used with version control like Bazaar, Git or Mercurial. This way multiple users can work on the same notebook and merge their changes. See the [[Plugins:Version Control|Version Control plugin]]. ===== I have a useful trick or tip. How can I share it with other users? ===== You can have a look at the [[http://www.zim-wiki.org/wiki/doku.php|zim documentation wiki]]. It has a section dedicated to [[http://www.zim-wiki.org/wiki/doku.php?id=tips_and_tricks|tricks and tips]]. Or write a mail to the mailing list, see the [[https://launchpad.net/~zim-wiki|team page]] on launchpad zim-0.60/data/manual/Start.txt0000664000175000017500000000154412032043547016140 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 19 Nov 2008 22:58:54 +0100 ====== Zim User Manual ====== This manual consists of two main part. The first part is the [[Help]] section, which documents all the functions in the program. The second part is the [[Usage]] section, which documents ways in which the program can be used. Have a look at this part if you want to understand how to combine the various functions. For development documentation please download the source package and have a look at the notes included in the "HACKING" folder and at the inline API documentation in the source code. For a quick introduction see [[Usage:Getting Started|Getting Started]] **Contents:** General information: * [[About]] * [[FAQ]] * [[Bugs]] Help section: * [[Help|Application Help]] * [[Plugins]] Usage tips and tricks: * [[Usage]] zim-0.60/data/manual/Usage.txt0000664000175000017500000001003112132472704016100 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Fri, 13 Mar 2009 22:50:21 +0100 ====== Usage ====== **Zim** can be used in several different ways. In this section we would like to give some examples of possible usage patterns, but this is in no way an exhaustive list. Also these styles could be combined in a single notebook, e.g. one could dedicate a notebook to a particular project and combine the organizer and journal styles in using it. However it is better the have several specialized notebooks than one big dump of unrelated material. **Contents:** General: * [[+Getting Started|Getting Started]] * [[+Publishing|Publishing]] * [[+Collaboration|Collaboration]] By use case: * [[+Daily Journal|Daily Journal]] * [[+Getting Things Done|Getting Things Done]] * [[+Creative Writing|Creative Writing]] ===== Use cases: ===== ==== Topic based notebook ==== This is the simplest use pattern where a notebook simply contains a collection of notes on various topics. Each topic can have it's own page or can be spread over several sub-pages when it is subdivided in multiple sections. This is for example the way a student taking class notes would work. Topics can be organized on forehand, like in the case of a student taking class notes, or can emerge over time. An example of the later case is a notebook used to jot down brainstorm ideas, which are unorganized at first and may go into one big page, but afterwards are divided over various pages and categorized. ==== Organizer ==== When a zim notebook is used as an organizer typically it will contain a collection of notes on various ongoing projects, task lists etc. For this use one would typically enable the [[Plugins:Task List|Task List plugin]] and set it to show all open checkboxes throughout the notebook. Now on each page one can define tasks and action items and the Task List dialog will give a overview of all open items. The [[Plugins:Journal|Journal plugin]] can also be used for an organizer. It is not really intended as a planner, but can be very useful to keep notes by date, e.g. meeting minutes etc. In combination with the Task List plugin one can write down his action items as checkbox items during the meeting by date and have them show up in the Task List. See also [[+Getting Things Done|Getting Things Done]] ==== Document Editor ==== Notebooks can also be used to edit full size documents. You could either publish directly from zim, e.g. as HTML or use zim to draft a document and then go to a word processor to finish the formatting etc. The advantage of using zim is that you can break down a document in small pieces and edit each of these on a separate page. Re-ordering and organizing content is convenient this way. Ones the order and sequence is more finalized other tools could be used to take over the editing process. For this use the [[Plugins:Task List|Task List plugin]] can be used to flag places in the document that are not yet finished or need more attention. Typically one would configure the Task List to use labels, with that usages one can have inline comments in the document using the tags "TODO" and "FIXME". The Task List dialog then gives a list of places where one needs to come back later. See also: [[+Creative Writing|Creative Writing]] ==== Journal ==== A journal style notebook would rely heavily on the [[Plugins:Journal|Journal plugin]] to keep track of notes by date. This style can be used e.g. to keep a diary or as a laboratory journal documenting progress by day. This style can be mixed with notes per topics, using the calendar pages as a kind of inbox for raw notes keeping track of the what happened while using pages per topic to organize and distill conclusions or to write down procedures to be followed etc. See: [[+Daily Journal|Daily Journal]] ==== Collection Manager ==== In this style the notebook is used as a database of for example books, movies, stamps, etc. One dedicates one page to each item in the collection and puts all info about the item in there. In this style notebook the Task List and Calendar plugins are probably not used. zim-0.60/data/manual/Help/0000775000175000017500000000000012140000463015154 5ustar jaapjaap00000000000000zim-0.60/data/manual/Help/Export.txt0000664000175000017500000000463312061674320017217 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Exporting ====== Zim will be able to export content to various formats. At the moment exporting to [[Help:Export:HTML|HTML]] and [[Help:Export:LaTeX|LaTeX]] is supported, as well as the Markdown and RST text formats. ===== Export dialog ===== To open op the export dialog in zim use the "//File//->//Export//" menu item. This dialog asks for a number of input fields before you can start exporting. ==== Step1: Select the pages to export ==== The option **Complete Notebook** will export all pages in the current notebook. The option **Single page** allows to select you a single page to export. ==== Step 2: Select the export format ==== The **Format** allows the choice of the output format. The **Template** field asks you to select a template file (see below). When you select "''Other...''" in the combo box you can browse for another file in the input field below the combo box. If your notebook has a Document Root (see [[Properties]]) you can select what to do with links to files under that document root. Either **Link files under document root with full file path**, which means files will be linked by their absolute file path, or **Map document root to URL**, which will result in links with the given URL as prefix. This can be useful when you [[Usage:Publishing|publish]] pages as part of a larger website. ==== Step 3: Select the output file or folder ==== Here you can select the **output folder** (if you are exporting multiple pages) or the **output file** (if you export a single page). If you specify an **Index page** a page will be generated that contains a list with links to all pages that were exported. This can e.g. be used as a site map. ===== Attachments ===== Files and images that live inside the notebook directory ([[Help:Attachments|attachments]], equations etc.) will always be copied to the new output directory when you export a notebook. ===== Templates ===== The export code only produces the tags that represent the content of the page. [[Templates]] are used to create complete output. A few standard templates are packaged with zim, see the pages for the output formats for a list and descriptions. You can also make your own. ===== Exporting from the commandline ===== Try something like: ''' $ zim --export --output=./html \ --format=html --template=./foo.html ~/Notes ''' See "''zim --help''" for all options. zim-0.60/data/manual/Help/Preferences.txt0000664000175000017500000001010512132472704020167 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Preferences ====== The preferences dialog can be accessed with the menu item "//Edit//" -> "//Preferences//". The following options can be configured: ===== Interface ===== **Add 'tearoff' strips to the menu** adds a 'tearoff' strip to all menus in the menubar. This means that menus can be opened as small windows and stay open while editing a page. **Use to switch to the side pane** toggles the key binding for . Reason to toggle this binding off is usually that this binding is also used for input methods for non-western scripts. **Remove links when deleting pages** toggles whether links to a page are removed when the page is deleted (the text of the link will remain, but it will no longer be a link). This is a preference because deletion does not use a dialog since we have support for the system trash. **Always use last cursor position when opening a page** toggles whether pages are always opened on their last cursor position or not. When this is disabled pages only open with a cursor position when they are opened be a history reference (e.g. the "Back" button or a link from the pathbar). **Use to follow links** toggles the key binding to follow links inside a page. If disabled an on a link will just be ignored. The key binding can be used as an alternative. **Show cursor for read-only pages** is used to toggle behavior of the cursor when a page can not be edited. By default the cursor is not visible when a page is read-only, but keyboard navigation is easier when the cursor is always visible. **Use custom font** allows selecting a custom font for the editor window. This only applies to the page view itself, the font for all other interface elements is determined by the desktop theme. ===== Editing ===== **Automatically turn "CamelCase" words into links** is used to enable or disable [[Auto Formatting|auto-linking]] CamelCase words. **Automatically turn file paths into links** is used to enable or disable [[Auto Formatting|auto-linking]] for file paths. **Automatically select the current word when you apply formatting **is used to enable or disable the feature where pressing e.g. to toggle Bold formatting will automatically select the current word when the cursor is inside a word. The same option also controls whether toggling the format for a heading will select the whole line automatically. **Unindent on ** toggles the key binding for the key. If enabled the key at the start of a indented line will unindent the line, if disabled the will delete the line break instead. The key binding can be used as an alternative. **Repeated clicking a checkbox cycles through the checkbox states** enables cycling the checkbox state. When turned off clicking a checkbox only toggles the checkbox between it's "checked" and "unchecked" states. **(Un-)indenting a list item also changes any sub-items** toggles the behavior to make sub-items follow indenting of their parent list item **Checking a checkbox also changes any sub-items** toggles the behavior to make toggling checkboxes recursive. This feature makes sense for example for todo-lists but not necessarily for other kinds of lists. **Default format for copying text to the clipboard** allows you to set the preferred format when you copy some text from zim and paste it in an other application. Default is just plain text, but you can also choose to paste wiki formatted text. This option will only affect copy-pasting where the receiving application asks for text input (like a text editor), if it asks for example for HTML input zim will paste HTML formatted text automatically. **Folder with templates for attachment files** is the folder to look for file templates, see [[Attachments]] for details. ===== Plugins ===== This tab allows you to enable or disable the various [[Plugins]]. Selecting a plugin will show a short description, select "More" to open the relevant manual page in this manual for a specific plugin or select "Configure" to set plugin specific preferences. zim-0.60/data/manual/Help/Templates.txt0000664000175000017500000001402712132472704017673 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Templates ====== Zim uses templates when exporting pages. This way you can for example write your website in zim and export it to HTML using the layout and style definition of you choice. Templates are also used to initialize new pages. If you are looking for information for file templates for attachments, see [[Attachments]] ===== Template Editor Dialog ===== The Template Editor Dialog can be accessed with the menu item "//Edit//" -> "//Templates//". It will show a list of templates that are available, and allows you to view and edit them. Templates can either be system defaults, or custom templates in your home folder. When you edit them, a copy is made of the default to your home folder, and this copy is than edited. The remove function again deletes this custom version, but does not touch the default template. **Note:** if you try to edit for example a HTML template, and it opens in the web browser instead of in your default text editor, the cause is most likely that you did not explicitly configure a text editor in the preferences. Go to the [[Preferences|Preferences Dialog]] and specify your text editor. ===== Templates for export ===== For a list of templates for exporting see [[Export]] and subpages. ===== Template options ===== Templates can also set template options that influence the generated output, by setting key-value pairs like in the example below. A list of available template options for a output format can be found at [[Export]] and subpages. ===== Special templates ===== **wiki/Default.txt** This template is used to initialize new pages. The default contains a header with the page name and the date at which the page was created. **wiki/Journal.txt** This template is used to initialize new pages in the Journal namespace. ===== Customizing ===== Templates are located in ''/usr/share/zim/templates/'' and ''~/.local/share/zim/templates'' by default. You can add templates you use more often there. To modify a template copy it to the ''~/.local/...'' directory and edit it. Template syntax: ''' [% var %] # interpolates a variable [%- var %] # + strip line break before the expression [% var -%] # + strip line break after the expression [%- var -%] # + strip line breaks on both sides [% IF expr %] ... [% END %] # conditionals [% IF expr %] ... [% ELSIF expr %] ... [% ELSE %] ... [% END %] [% FOREACH name = var ] # loop ... [% name %] ... [% END %] [% strftime("%c") %] # current time stamp [% strftime("%c", var) %] # date from variable [% options.option_name = value %] # set the template option option_name to value [% page.properties["Creation-Date"] %] # access dict ''' For the ''IF'' and ''ELIF'' statements the expression can be either just a variable, in which case it is evaluated boolean, or an equality expression with "==". For example "''[% IF page.name == 'foo' %]''" is understood. More complex expressions are not supported. Available variables: ''' zim.version # version of zim notebook.name # name of the notebook notebook.interwiki # interwiki key of the notebook if any page.name # complete page name page.namespace # namespace page.basename # last part of the page name page.properties # dict with page properties page.title # first heading in the page or the basename page.heading # first heading in the page page.body # content of the page without the leading heading page.content # content of the page including the leading heading page.has_links # True if the page has links to other pages page.links # list of page objects for pages linked in this page page.has_backlinks # True if the page is linked by other pages page.backlinks # list of page objects for pages linking to this page page.has_attachments # True if the page has attachments page.attachments # list of file objects for attachments # These special pages have the same properties as the 'page' object pages.index # the index page generated when exporting pages.home # the home page pages.next # the next page in the index (if any) pages.previous # the previous page in the index (if any) options # dict where format specific options can be set ''' File objects returned by page.attachments have the following attributes: ''' file.path # (relative) path as a string file.basename # file basename file.mtime # file mtime, to be used with strftime() file.size # file size as human readable string ''' Functions available: ''url(link)'' Turns a zim link or file object into an URL ''resource(filename)'' Returns an URL for a template resource (see below) ''strftime(template, date)'' Format a date, see standard library for codes strfcal(template, date) Format a week number, accepts: %w for day of week according to locale %W for weeknumber according to locale %Y for the year to which the week belongs pageindex''(namespace, collapse, ignore_empty)'' Creates a page index of a given namespace or the whole notebook ''namespace'': the starting root - defaults to the top level (":") ''collapse:'' if ''TRUE'' only branches related to the current page are visible//, // if ''FALSE'' all branches are visible - defaults to TRUE ''ignore_empty:'' if ''TRUE'' empty pages are ignored — defaults to TRUE. //Example//: ''menu(page.namespace, TRUE, FALSE)'' See also the [[Plugins:Journal|Journal Plugin]] for some properties available for journal pages ==== Template Resources ==== To add additional files to the template, create a folder of the same name as the template. Any files in the folder (like style sheets, images, javascript files, etc.) will be copied along when this template is used to export data in zim. There is a function "''resource(filename)''" to refer to these files in the template. Zim always includes some images when exporting for the checkboxes used in checkbox lists. To customize these there should be template resources named "''checked-box.png''", "''unchecked-box.png''" and "''xchecked-box.png''" in this folder. For the web interface the resources can also contain a "''favicon.ico''" to serve as the favicon of the website. zim-0.60/data/manual/Help/Check_Boxes.txt0000644000175000017500000000267311544165551020121 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Sat, 08 Nov 2008 11:04:28 +0100 ====== Checkboxes ====== Zim supports lists with checkboxes instead of bullets. These look like: [*] item 1 [ ] item 2 [*] item 2a [x] item 2b [*] item3 As you can see in this example checkboxes can have 3 states: [ ] open, [*] checked as 'OK' and [x] checked as 'NOK'. States can be toggle by clicking the checkbox with either the left mouse button or using the keyboard with '''' and '''' respectively. To start a checkbox list type on an empty line '''[]''' or '''()''', this will automatically insert an open checkbox. Similarly you can type checked checkboxes using '''[*]''' or '''(*)''' and '''[x]''' or '''(x)''' respectively, followed by '''''' or ''''''. Lines that start with a checkbox behave like bullet list items, so you can indent by typing '''' after the checkbox and when you press '''' the new line will start with an empty checkbox automatically. There is an option in the [[Preferences]] to have checkbox lists behave recursively. This means that the state of items with a sublist reflects the state of all child items. Checking the parent will check all child items, and checking the last child item will check the parent item automatically. The [[:Plugins:Task List|Task List plugin]] regards checkboxes as TODO items and can give an overview of all open checkboxes in a notebook. zim-0.60/data/manual/Help/Wiki_Syntax.txt0000644000175000017500000000541411717562461020214 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Syntax ====== Examples of the wiki syntax as used by zim. Most of this syntax is inspired by the [[http://wiki.splitbrain.org/wiki:dokuwiki|dokuwiki]] syntax, but with some significant modifications. All markup uses at least two characters to reduce the chance of conflicts between the wiki markup normal typographic use of these characters. ===== Headings ===== Headings are created by using an appropriate amount of "=" characters: ''' ====== Head 1 ====== ===== head 2 ===== ==== head 3 ==== === head 4 === == head 5 == ''' ===== Links ===== Link to another page like this: ''' [[foo]] links to page in the current namespace or parents [[:foo]] links to page in the root namespace [[+foo]] links to page in a subnamespace [[foo|bar]] links to "foo" but display "bar" ''' External links like http://nongnu.org are also supported ===== Lists ===== Bullet list just use a "*" at the start of the line: ''' * item 1 * item 2 * item 3 * item 3a ''' Will be rendered as: * item 1 * item 2 * item 3 * item 3a Numbered lists use a "1.", "a.", or "A." as bullets: 1. item 1 2. item 2 3. item 3 a. item 3a Numbered lists can start with an arbitrary number. However internal inconsistencies will be fixed by renumbering automatically. Off course you can mix numbered lists with bullet sub-lists and vice versa. Checkbox lists look like this: ''' [ ] foo [*] bar [*] sub item 1 [*] sub item 2 [x] baz ''' This renders as: [ ] foo [*] bar [*] sub item 1 [*] sub item 2 [x] baz Of course the checkboxes are clickable in zim. See [[Check Boxes]] for more details. ===== Markup ===== **bold**, //italic// and __underline__ and ''verbatim'' ''' **bold**, //italic// and __underline__ and ''verbatim'' ''' and also ~~strike through~~ ''' and also ~~strike through~~ ''' Using verbatim also prevents any further parsing of the content. To render a whole block as verbatim the first and last line of the block should contain 3 quotes and no other characters: ''' Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. ''' This can be used for code examples etc. Before version 0.26 all indented paragraphs were rendered verbatim as well. This has been changed because it conflicted with the typographic use of indenting paragraphs that were not intended as verbatim. However to maintain backwards compatibility this style is still supported for any page that does not have headers indicating that it was written by version 0.26 or newer. ===== Images ===== To include images use: ''' {{./foobar.png}} ''' The filename for an image can either be absolute or relative. If relative it is looked for in the same directory as where the text source of the current page is. zim-0.60/data/manual/Help/Export/0000775000175000017500000000000012140000463016435 5ustar jaapjaap00000000000000zim-0.60/data/manual/Help/Export/LaTeX.txt0000644000175000017500000000353512132472704020173 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-03-02T11:46:43.066508 ====== LaTeX ====== The [[Plugins:Equation Editor|Equation Editor]] plugin is supported, equations entered with this plugin are automatically placed inside math environments. Embedded Images of types that are not supported by the TeX Engine of your choice may lead to compilation errors. For ''pdflatex'' the supported types are PDF, JPG, JBIG2, and PNG, for ''latex'' it is EPS. Index creation is currently not working. ===== Dependencies ===== All templates depend on several LaTeX packages * ''inputenc'' package to use utf8 as input encoding. * ''hyperref'' to realize links (or another appropriate definition for ''\href)'' * ''graphicx'' for including images * ''amsmath, amssymb, color'' are needed for support of the equationeditor plugin * ''ulem'' is used for underlines and strikeouts ===== Templates ===== The following templates are supplied: **"Report"** This templates is based (and depends) on the KOMA-Script Report Class ''scrreprt''. It generates a title page and a table of contents and is therefore more suitable for longer pages. To display checkboxes it depends on the ''wasysym'' package. **"Article"** This templates is based (and depends) on the KOMA-Script Report Class ''scrartcl''. It omits the lowest heading and is therefore not suitable for deeply structured documents. To display checkboxes it depends on the ''wasysym'' package. **"Part"** The result from this template can not be compiled on its own, it is designed to be one part of a larger document and be included (''\include{}'') in a master document. ===== Template Options ===== === document_type === Possible values: 'report', 'article', 'book' Default: 'report' The exported LaTeX code will use only commands suitable for the given document class (e.g. sectioning commands). zim-0.60/data/manual/Help/Export/HTML.txt0000644000175000017500000000250311544165551017761 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-03-02T11:46:37.806083 ====== HTML ====== ===== Dependencies ===== No dependencies. ===== Templates ===== **"Default"** This is a simple template intended as a base for custom styles. It has an inline style definition that is intended to match the (default) look of zim. **"Presentation"** Template with a little more color than "Default". It is intended to convert a set of pages in an online presentation quickly. Simple javascript included for some basic keybindings: ''' Enter next page Spacebar next page backspace previous page ''' **"Print"** This is a plain template intended for printing pages. It is use by the "Print to Browser" plugin. **"SlideShow (S5)"** Template based on S5. S5 is "A Simple Standards-Based Slide Show System", which mean a slide show system completely written in html and javascript. Therefor these slide shows can be presented using a browser and be put on a website. See [[http://meyerweb.com/eric/tools/s5/|the S5 website]] for more information. Note that in order to use the output from this template you need to download the S5 package and copy the "ui" directory from the package to the same directory where you export your slideshow to. ===== Template Options ===== No template options available. zim-0.60/data/manual/Help/Links.txt0000664000175000017500000001066512132472704017021 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Links ====== You can either link pages or urls. Urls are recognized because they start with e.g. "''html://''" or "''mailto:''". Page names can contain ':' characters to separate namespaces. * Links containing a '/' are considered links to external files * Links that start with a ':' are resolved from the root namespace * Links that start with a '+' are resolved in the namespace below the current page * Links that contain a '?' are interwiki links, see below. * All other links are resolved within the path from the root to the current page You can make any text into a link, thus the link you see and what it links to do not have to be the same. You can use the "//Edit//->//Link//" menu item to modify a link. ==== Relative links ==== All links to other pages are relative to the current page unless they start with an ":" character. Zim first looks in the same namespace as the current page and if the name is not found searches all parent namespaces for a like named page. For example you have a page "''Zim:Examples:Linking:Relative''" now you just use "''Absolute''" to link to "''Zim:Examples:Linking:Absolute''", but you also use "''Examples:Calendar''" to link to "''Zim:Examples:Calendar''". This link works because the first part of the link ("''Examples''") is resolved relatively in the tree above the current page. To create relative links to sub-page of the current page start the link with an "''+''". ==== File Links ==== You can link to files from zim. File names always need to contain a "''/''" character (even if your operations system uses another path separator). You can link relative to your home directory using "~/foo" or relative to the page using "./foo". When you want to "attach" a file to a page you can use "//Tools//->//Open folder//" to open the file browser in the appropriate directory. Once you have copied or moved the file to this directory you can drag and drop from your file browser to the zim page, this will create a link. File links starting with "''/''", like "''/foo''" will be relative to the filesystem root, or to the Document Root, if you have one set in the [[Properties]]. If a Document Root is set, the only way to link to files outside this root is to use "''file:///''" URIs. Proper file URIs for files on the local filesystem should always start with either "''file:///''" or "''file://localhost/''". URIs starting with "''file:/''" are technically invalid but will be interpreted as a local file. URIs starting with "''file://''" suggest a remote file following the "''file://host/share/''" syntax, these will be interpreted as a link to a "windows" share drive. ==== Links to share drives ==== "Windows" share drives or samba shares under linux can be linked in different ways: ''' smb://host/share/path file://host/share/path \\host\share\path ''' The first form, using "''smb://''" is recommended because it is most explicit, while the third form will be most recognizable for windows users. ===== Interwiki ===== There is a list of pre-defined urls in "''share/zim/urls.list''" which lists most commonly used online wikis. These urls can be refered to by a keyword so you don't have to type the full url every time; also you can update all links to a certain wiki by changing the url in the file. Have a look at the list to get an idea of how to use this. This link for example goes to wikipedia.org: [[wp?wiki]] To add your own urls use "''~/.local/share/zim/urls.list''". All types of urls which are supported by zim can be added. Consider adding "''file://''" urls for directories you refer often from zim. See [[Config Files]] for more details. The zim notebooks you added in the "Open notebook" dialog are automatically recognized as interwiki names. So you can link to notebooks using either their name or their interwiki keyword (both case insensitive). The interwiki keyword is for a specific notebook can be set in the [[Properties]] dialog. ===== Back links ===== "Back links" are the reverse of normal links. For example when page //A// links to page //B// then page //B// will have "back link" to page //A//. The list with back links is the answer the question "What links here". In the status bar at the bottom of the window you can see how many back links there are for the current page. To view which pages link here you can open the "Search Back links" menu item (//Search//->//Search Back links//) or click the area in the status bar that gives info about back links. zim-0.60/data/manual/Help/Key_Bindings.txt0000664000175000017500000000766212132472704020311 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Key Bindings ====== See also [[Menu Items]]. ==== General ==== ''' F9 Toggle visibility of sidepane(s) F9 Show all sidepanes Toggle focus between index and buffer opens side pane if index is invisible (optional see preferences) Focus next inteface element (gtk default) Focus previous interface element (gtk default) Esc Close sidepane (when focus is on a side pane) ''' ''' Go to the home page Go one page back in history Go one page forward in history Go one page up in the namespace Go one page down in the namespace (The actual page is chosen by the history) Go to the previous page in the index Go to the next page in the index D Go to today's page ''' ''' Q Quit the application w Close window ''' ''' F Find in the current page G Find next G Find previous F Search in all pages H Find and Replace ''' ''' S Save page (forced) S Save version... R Reload page (saves first) J Jump to page... (either an existing or a new page) ''' ''' L Link selected text Follow selected text as link when read-only L Copy a link to the current page to the clipboard In the side pane copies a link to the selected page (Paste this link in a page with V) E Show the "edit link" dialog D Inserts timestamp ''' ''' 1..5 Make selected text a heading 9 Make selected text normal B Make selected text strong I Make selected text italic U Make selected text underline (renders highlighted) K Make selected text strike-trough T Make selected text verbatim text (monospace font) ''' ''' Z Undo Z Redo Y Redo ''' ''' D Show the calendar dialog ''' ''' F1 Show the manual F2 Rename current page F3 Find next (same as G) F3 Find previous (same as G) F5 Reload page (same as R) F12 Toggle checkbox item to 'OK' F12 Toggle checkbox item to 'NOK' ''' Also all the usual keybindings apply for the gtk text edit widget, thus bindings like ''C'', ''X'', ''V'', ''A'' etc. work as expected. ==== Side pane tree ==== The following key bindings works when the tree in the side pane is focussed: ''' L Insert a link to the selected page L Copy the selected page to clipboard C Copy the selected page to clipboard F Search in the page list as shown * Expand all \ Collapse all ''' ==== Text selections ==== For selected text the following keybindings are added: ''' * Toggle bullets for selected text > Toggle email-style quoting for selected text Indent selected text Un-indents selected text Un-indents selected text ''' ===== Changing accelerators ===== Gtk+ implements a feature that allows you to change accelerators (keybindings for menu items) interactively. To use this feature you need to either enable this setting in the settings manager of you desktop environment or add the line: ''' gtk-can-change-accels = 1 ''' to ''~/.gtkrc-2.0'' . Zim will remember any changes. If you ever want to reset to the default bindings just remove the "accelmap" file from ''~/.config/zim/''. ===== Emacs mode ===== Zim does not support an emacs mode specifically, however Gtk+ does. When you set this option all Gtk+ programs will use emacs key bindings for text inputs. To use this feature you need to enable this setting in the settings manager of your desktop environment or add the line: ''' gtk-key-theme-name = "Emacs" ''' to ''~/.gtkrc-2.0'' . Of course if you use this you will need to customize a number of accelerators as well which conflict with the emacs keybindings. See the section above. zim-0.60/data/manual/Help/Auto_Formatting.txt0000644000175000017500000000262512132472704021036 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Auto Formatting ====== Auto-formatting means that zim parses text while you type. Be aware that the syntax for auto-formatting isn't the same as the [[Wiki Syntax|wiki syntax]] for the source formatting (the wiki format as it is saved to the files). If you typed in source syntax and you want to have it rendered you should reload the page (press ^R). If auto-formatting does something you didn't intend you can reverse it by pressing ''Z''. ===== Headings ===== Typing: ''' == Heading 1 ''' gives you a heading 1 and typing: ''' === Heading 2 ''' gives you a heading 2. But in the corresponding text file these headings are marked as follows: ''' ====== Heading 1 ====== ===== Heading 2 ===== ''' ===== Links ===== When you type a word in "CamelCase" it will be considered a link. Once again this auto-formatting is done by the editor, your source format does not have to support CamelCase. This feature can be turned off in the [[Preferences]]. Also when you type a internet url like http://perl.org it will automatically be identified as a link. ===== Bullets and Checkboxes ===== Another example of auto-formatting is that "* " at the beginning of a line gets converted to a bullet automatically. Typing either "[] ", "[*] ", "[x] " or "() ", "(*) ", "(x) " will give your different kinds of [[Check Boxes]]. zim-0.60/data/manual/Help/Menu_Items.txt0000664000175000017500000002742512056362230020005 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Menu Items ====== ===== File ===== **New Page ** Prompt for a page name and create a new page. **New Sub Page** Prompt for a page name and create a new page as a child of the current page. **Open Another Notebook ** Prompt a list of known notebooks for opening another notebook. This dialog will also allow you to specify a file path for a new notebook. **Import Page** Prompts for a file path for a text file to import into this notebook. The text file is assumed to be already using the wiki formatting used by the notebook. Files saved using "Save A Copy" can be imported again by this function. The basename of the imported file will be used as the page name. **Open in New Window** Open the current page in a separate window. The new window will be readonly and any links clicked will open in the main window. **Save ** Save the current page. This function is included to not scare users that do not feel comfortable with only auto-save. However pages are being saved continuously, save there is hardly any need to explicitly save them. **Save A Copy** This function is intended for saving a copy of the current page outside of the notebook as a text file using the wiki syntax of the notebook. These files can later be imported again with the "Import Page" function. **Save Version ** Prompt for entering a comment and save a new version. This is a snapshot of the notebook that can later be restored or used to compare changes. If no version control is enabled yet for this notebook this function will ask you to enable version control. Only available if the [[Plugins:Version Control|Version Control plugin]] is enabled. **Versions** Shows a list of saved versions and includes tools to compare versions. Only available if the [[Plugins:Version Control|Version Control plugin]] is enabled. **Export** Show the [[Export|export dialog]]. **Print to Browser

** Export the current page to a temporary file and open it with the browser. This is a work around for the lack of printing support in zim. You can print the page from the browser, so pressing

twice will print the current page. **Send To** Open a new email with the current page as the email text using your email application. **Rename Page** Prompt for a new name for the current page. Optionally the page heading is also changed on the fly. Links to this page can be updated automatically. **Move Page** Prompt for a new namespace for the current page. Alternatively you can move pages by drag and drop in the side pane. Moving a page also moves all of it's child pages as well as any [[Help:Attachments|attachments]]. Links to this page can be updated automatically. **Delete Page** Delete the current page and all of it's child pages and [[Help:Attachments|attachments]]. Unless the current page has been stored in a saved version this can not be undone. **Properties** Show the [[Properties|properties dialog]]. **Close ** Close the current notebook. In most cases this is identical to "Quit". However when the [[Plugins:Tray Icon|TrayIcon plugin]] is enabled closing the notebook only hides the window. **Quit ** Quit the current notebook. ===== Edit ===== **Undo ** Undo the last edit for the current page. The undo stack tries to be intelligent and undo edits by word or by logical action. If you start typing after an undo step the undo step itself will also be folded into the list of edits. This means you can actually undo an undo step. Pressing undo after an [[auto formatting]] triggered will first undo the automatic formatting and the next undo will undo the actual editing. **Redo ** Opposite of Undo. Only works if the page was not edited after the undo step. If it was edited the previous state is reachable by Undo, as described above. **Cut ** Cut selection and put it on the clipboard. **Copy ** Copy selection and put it on the clipboard. **Paste ** Paste content from the clipboard. **Delete** Delete selection or next character in the editor. **Toggle Checkbox 'V' ** Toggle a [[Check Boxes|checkbox]] using the "OK" checkmark. **Toggle Checkbox 'X' ** Toggle a [[Check Boxes|checkbox]] using the "NOK" checkmark. **Edit Link or Object ** Prompt a dialog to edit the properties of a link or other object. This also shows the property editor for an image when the cursor is next to an image. **Remove Link** Remove a link at the cursor. **Copy Location ** Copy the page name for the current page on the clipboard. **Preferences** Show the [[Preferences|preferences dialog]]. ===== View ===== **Notebook Editable** This toggle allows switching between editing and read-only mode. In read-only mode the notebook can not be modified. This feature is intended to prevent accidental edits while browsing pages. **Toolbar** Toggle the visibility of the toolbar. **Statusbar** Toggle the visibility of the statusbar. **Side Panes ** Toggle the visibility of the side pane(s). You can also use the (or ) [[Key Bindings|keybinding]] to switch focus between the editor and the side pane. Even if the side pane is hidden, this key binding will show it temporarily. **All Side Panes ** This action will show all side panes that are being used. **Pathbar** Toggle the pathbar visibility and style. Options are **None**, **Recent** **Pages**, **History** and **Namespace**. Obviously "None" will hide the pathbar. "Recent Pages" shows a summary of the history. This summary only shows unique pages and tries to not re-order them too often. Setting "History" shows the full history list. "Namespace" will show the page path to the current page, showing all it's parents. **Toolbar** Toggle toolbar style, overriding the system defaults. The same submenu is available as a context menu on the toolbar itself. **Fullscreen ** Toggle fullscreen display, mainly intended for small screens where it makes sense to use the whole screen for the editor. Visibility of the toolbar, pathbar and statusbar is configured separately for the fullscreen mode and the normal mode. ( Users who really prefer to use the whole screen can even decide to hide the menubar in fullscreen mode. See the hidden option in the notebook state file. ) **Task List** Show the task list dialog. Only available if the [[Plugins:Task List|Task List plugin]] is enabled. **Show Link Map** Show the relations between the current page and other pages in this notebook in a graph. Only available if the [[Plugins:Link Map|Link Map plugin]] is enabled. **Calendar** Show the calendar dialog. Only available if the [[Plugins:Journal|Journal plugin]] is enabled. **Reload ** Reload the current page. This means the page is saved and then reloaded from source. Any wiki formatting in the page that is not yet rendered will be rendered after reloading. ===== Insert ===== **Date and Time ** Insert a date or a date and timestamp. If the [[Plugins:Journal|Journal plugin]] is enabled the date can be linked automatically to the journal page. **Image** Insert an image. **Screenshot** Prompt with options to take a screenshot and insert it as an image. Only available if the [[Plugins:Insert Screenshot|Insert Screenshot plugin]] is enabled. **Equation** Prompt for an equation written in latex and insert it as an image. Only available if the [[:Plugins:Equation Editor|Equation Editor plugin]] is enabled. **Diagram** Prompt for an diagram defined in the dot language and insert it as an image. Only available if the [[Plugins:Diagram Editor|Diagram Editor plugin]] is enabled. **Text From File** Prompt for a text file and insert the text from that file into the current page. **New Attachment (submenu)** This submenu shows a number of file templates for new attachments, see [[Attachments]] for details. **Link ** Prompt for a link and insert it in the current page. Selected text will be used as default value. ===== Format ===== **Heading 1 <1>** **Heading 2 <2>** **Heading 3 <3>** **Heading 4 <4>** **Heading 5 <5>** Toggle formatting used while typing. Selected text will also be formatted. If the "auto select" [[Preferences|preference]] is set toggling the will automatically select the current line and turn it in a heading. **Strong ** **Emphasis ** **Mark ** **Strike ** **Verbatim ** Toggle formatting used while typing. Selected text will also be formatted. If the "auto select" [[Preferences|preference]] is set toggling the format while the cursor is in the middle of a word will automatically select the word and format it. **Clear Formatting <0>** Remove all formatting from the selected text. ===== Search ===== **Find ** **Find Next ** **Find Previous ** **Replace ** **Search ** **Search Backlinks** Search for pages linking this page. Uses the standard Search dialog. ===== Tools ===== **Check Spelling ** Turn on spell checking. Only available if the [[Plugins:Spell Checker|Spell Checker plugin]] is enabled. **Attach File** Attach a file to the current page. Will prompt for a file, the file will then be copied to the notebook folder and a link inserted in the current page. **Open Attachments Folder** Open the folder with [[Help:Attachments|attachments]] for the current page in a file browser. Typically this will be a folder below the notebook folder. **Open Notebook Folder** Open the folder for the current notebook in a file browser. **Cleanup Attachments** Starts a dialog to search for orphaned files. When an [[Help:Attachments|attachment]] link is removed, the file still exists in the attachment directory. From time to time it may be useful do find and delete this "orphaned" files. **Start Web Server** Start a stand-alone web server to make the current notebook available as a web page. Can be used to check the html formatting live, or to quickly share the current notebook with others on the same network. **Open Document Root** Open the document root folder in a file browser. **Update Index** Double check the page index against the folder contents of the notebook. This can be used when the index is by accident out of sync with the notebook contents. ===== Go ===== **Back ** Go to the previous page in the history. **Forward ** Go to the next page in the history. **Parent ** Go to the parent page. **Child ** Go to a child page. If there is a recent child page in the history that page will opened, otherwise the first child in the index is opened. **Next in Index ** Go to the next page in the index. This traverses all children of pages recursively and only goes to the next page on the same level after the last child. **Previous in Index ** Go to the next page in the index. This traverses all children of pages recursively and only goes to the next page on the same level after the last child. **Today ** Go to the Journal page for today. Only available if the [[Plugins:Journal|Journal Plugin]] is enabled. **Home ** Go to the home page of this notebook. You can change the home page in the [[Properties|properties dialog]]. **Jump to ** Prompt for a page name and jump to that page. The page name is resolved relative to the current page. You can also use this to open pages that do not yet exist. In contrast to "New Page" opening a page that does not exist will not directly create the page, it will only be saved after you edit it. ===== Help ===== **Contents ** Show this user manual **FAQ** Show the [[FAQ]] page in this manual. **Keybindings** Show the [[Key Bindings]] page in this manual. **Bugs** Show the [[Bugs]] page in this manual. **About** Show the About dialog with license terms and credits. zim-0.60/data/manual/Help/Importing_external_files.txt0000664000175000017500000000550212132472704022767 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-04-03T23:35:33.816582 ====== Importing External Files ====== **Pages in Zim** Pages in Zim are stored as text files in normal folders and subfolders in your file system. The file name is used as page name. The hierarchical structure is similar to the one appearing in the index. The file names should contain **no blanks**; instead use underlines. So a filename can look like this: "Help_on_creating_notebooks.txt" or "HelpOnCreatingNotebooks.txt". Important: The content of the text file must be UTF-8 or ASCII encoded. If you are not familiar with character encoding, please read http://en.wikipedia.org/wiki/Character_encoding. If files contain different encoding and zim tries to read them as UTF-8 an error will occur. Some word processors allow checking the encoding, e.g. with the small editor Mousepad load the file, then click Save as, then the button on the bottom right just above the save button should show UTF-8. If not and if you cannot save with this configuration Zim will not work. You can also use the Geany editor for the same purposes. The filename should be encoded in the proper encoding for your file system. You can easily check this by making sure your operating system default file browser shows the file names correctly. There are a number of characters that are forbidden in page names, these are: "?", "#", "/", "\\", "*", '"', "<", ">", "|" and "%". These are forbidden because they have a special meaning in the zim wiki syntax or because they can not be encoded on common file systems. **Moving pages into an existing notebook: ** If you have just a few pages then use the import function, see the menu item //Files// -> //Import page...// If you have a larger number of pages that conform with the page description above, then close Zim, move these pages either into an existing subfolder to the other pages of the existing Zim Notebook folder or create a new subfolder inside the Zim Notebook folder. Reopen the Notebook and the pages and the new subfolder should appear. Rebuilding the index may take quite some time, if you have added many pages. It may be advisable to click Tools / Re-build Index **Creating a new Notebook** If you wish to create a new notebook, e.g. from data from another application that allows to export its content as text files, you can create a new notebook folder and move the files in as described above. Now open zim and go to the menu item //File// -> //Open Another Notebook...// In the dialog that appears you can add a new notebook and specify the folder you just created. You will get a warning that the folder is not empty, but this can be ignored in this case. Now you can open the newly added notebook from the dialog. The notebook that opens should show pages corresponding to the file structure you created in the folder. zim-0.60/data/manual/Help/Tags.txt0000644000175000017500000000134211547122746016634 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-04-04T21:14:35+02:00 ====== Tags ====== Zim supports the use of tags to organize pages. Tags are keywords or labels that are used to categorize pages. Tags can be used anywhere in a page using the "@" prefix. Like this: @example @tags To find context based on tags you can use the [[Searching|Search]] dialog. For example to find all pages tagged with "@example" you can search for "''Tag: example''" or just for "''@example''". Since tags are cached in the index, this search is much quicker than a full text search for random words. There is also a plugin that will add a tag cloud and a page index organized by tag in the side page, see also [[Plugins:Tags]] zim-0.60/data/manual/Help/Pages.txt0000664000175000017500000000650612061674546017010 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 08 Jul 2009 23:25:25 +0200 ====== Pages ====== Each [[notebooks|notebook]] consists of a set of pages. Each page can contain, text, images and links to other pages. The pages can be arranged in a hierarchical index. Page names use a ":" as a path separator for pages that are nested in the hierarchy. So the name "Foo:Bar" refers to a page names "Bar" that is nested below a page "Foo". ''' + Foo `--- Bar ''' The parent page is sometimes also referred to as the "namespace" of the page. So in this case the page "Bar" is said to belong to the namespace "Foo". Namespaces can be used to organize notebooks in sections of pages. Also sometimes namespaces are used for special purposes, for example the [[Plugins:Journal|Journal plugin]] uses a namespace like ":Journal:" to contain all journal pages. There are various ways to refer to other pages, either by absolute or relevant links. E.g. the page "''Foo:Bar''" can be linked from "''Foo''" as "'':Foo:Bar''" but also as "''+Bar''". For more details see [[Links]]. The editor tries to automatically turn page names into links, as a special case you can use "CamelCase" to make page names more recognizable and make the auto-formatting easier. See [[Auto Formatting]] and [[Preferences]]. There are a number of characters that are forbidden in page names, these are: "?", "#", "/", "\\", "*", '"', "<", ">", "|" and "%". These are forbidden because they have a special meaning in the zim wiki syntax or because they can not be encoded on common file systems. Pages can have attachments, for example images, data files, related documents etc. See [[Attachments]] for more details. ===== New Page Dialog ===== The New Page dialog prompts for a page name and then creates a new page with the specified name. To create a page that is nested in the hierarchy, specify it with a ":" in between the parts of the hierarchy. ===== New Sub Page Dialog ===== This dialog is similar to the New Page dialog, but it creates a new child page of the current page. So no need to specify the full hierarchy path. ===== Jump To Dialog ===== This dialog is intended to jump to a specified page. It is actually hardly different from the New Page dialog except that it resolves page names relative to the current page and does not immediately create a new page. However you can always create new pages by jumping to a page that does not yet exist and start editing. ===== Deleting pages ===== When you select "Delete Page" by default zim will try to trash the page and all it's sub pages and attachments - **that means all files that are in the folder below the text file for the page**. If you deleted something on accident you should be able to recover the data from your system's trash can. After recovering data you probable need to run "Re-build Index" from the "Tools" menu to make sure zim indexes the data again. If zim is not able to move data to the trash can it will offer to delete the data permanently. In this case a dialog is shown to ask for confirmation which includes a detailed list of files to be deleted. If you don't like to use the trash by default (e.g. for notebooks that contain sensitive data) there is an option in the notebook [[Config Files|config file]] to disable the trash. In this case the confirmation dialog will always be shown on "delete page". zim-0.60/data/manual/Help/Default_Applications.txt0000664000175000017500000001127312132472704022027 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-07-23T21:59:20+02:00 ====== Default Applications ====== Zim opens files and attachments with other applications. Usually clicking on a link will start the appropriate application for your system. And the "//Open With...//" menu in the context menu (click the right mouse button on the link) gives alternative applications. If you want to change the default application, or you want to add additional applications to the "//Open With...//" menu, there is a menu item "//Customize...//" at the bottom of the popup. This item brings up a dialog that allows changing the default application and adding new applications. ===== Configure Applications Dialog ===== The //Configure Applications //dialog has a drop down menu to choice a default application. Applications zim knows about are shown in this drop down. Also there is a special menu item "**System Default**" which means to use whatever application is the default used by the operating system. Note that there may be applications installed that zim does not know about. Setting the default to "**System Default**" may result in the correct application being used, even if it is not shown in the list. To add applications to the list (and to the "//Open With...//" menu) click the button "**Add Application**", this will bring up the //Add New Application// dialog. ===== Add Application Dialog ===== The //Add Application// dialog allows to add a new application for a specific file type. The **Name** is the application name and **Command** is the command to execute. Usually this is just the name of an executable or a script to execute. The command can also use the following special codes: ''%f ''a single file path to be opened ''%F ''a list of file paths to be opened ''%u ''a single URL to be opened ''%U ''a list of URLs to be opened ''%c ''the application name If "**Make default application**" is enabled the new application will become the new default. This implies that it does not show up in the menu itself. If this is not set the new application will just be added to the menu. ===== Technical Details ===== Zim uses the XDG Desktop Entry spec to store and retrieve application informations. The default application per mimetype is stored in a file in the XDG_DATA_HOME folder, typically ''~/local/share/applications/defaults.list'' . This file with defaults is not part of the spec, but it seems to be in line with the implementation for the Gnome and KDE desktop environments. To populate the "//Open With...//" menu zim searches the ''XDG_DATA_HOME/share/applications/'' and ''XDG_DATA_DIRS/share/applications/'' folders for ''.desktop'' files that list the specific mimetype. As an optimization we assume a file "''mimeinfo.cache''" to be present that lists applications entries by mimetype When the user adds a new application zim creates a new ''.desktop'' file in the XDG_DATA_HOME folder and updates the cache. Next time it lists applications for a specific type, this entry will show up. For a new default application we also update ''defaults.list'', but the desktop entry has "''NoDisplay''" set, so it is hidden from the menu. Zim uses the XDG MimeInfo spec or the ''mimetypes'' module to determine file types. As an extension for URL and URI schemes the "''x-scheme-handler/''" mimetype is used. So "''x-scheme-handler/http''" is used to configure the webbrowser, "''x-scheme-handler/mailto''" for the email client, etc. If no default application is found, zim uses operating system specific fallbacks. For files and email this mean calling "''os.startfile()''" on Windows, the "''open''" command on OSX, and the "''xdg-open''" and "''xdg-email''" commands on Linux and unix other systems. For URLs the "''webbrowser''" module is used as generic fallback. The "''webbrowser''" module is also used for files and email when e.g. the "''xdg-open''" or "''xdg-email''" commands are not found. (The ''webbrowser'' module does not only check specific browsers, but also tries system APIs that handle files as well.) So on windows zim uses the XDG system to store application preferences, even though this is not the native system on windows. The fallback is an API (''os.startfile()'') that uses applications known to the Windows registry. As a result zim will just use the default installed applications on Windows, but this can be overruled by installing Desktop Entry files. If you want to clean up custom application entries, have a look at the folder ''~/.local/share/applications'' (or the equivalent ''XDG_DATA_HOME'' folder) See [[Config Files]] for an overview of the various XDG file paths. The XDG Desktop Entry spec and the XDG MimeInfo spec can be found here: http://www.freedesktop.org/wiki/Specifications zim-0.60/data/manual/Help/Commandline_Options.txt0000664000175000017500000000355012132500716021670 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2013-04-14T12:14:49+02:00 ====== Commandline Options ====== **Output from "zim --help":** ''' usage: ./zim.py [OPTIONS] [NOTEBOOK [PAGE]] or: ./zim.py --server [OPTIONS] [NOTEBOOK] or: ./zim.py --export [OPTIONS] NOTEBOOK [PAGE] or: ./zim.py --search NOTEBOOK QUERY or: ./zim.py --index [OPTIONS] NOTEBOOK or: ./zim.py --plugin PLUGIN [ARGUMENTS] or: ./zim.py --manual [OPTIONS] [PAGE] or: ./zim.py --help General Options: --gui run the editor (this is the default) --server run the web server --export export to a different format --search run a search query on a notebook --index build an index for a notebook --plugin call a specific plugin function --manual open the user manual -V, --verbose print information to terminal -D, --debug print debug messages -v, --version print version and exit -h, --help print this text GUI Options: --list show the list with notebooks instead of opening the default notebook --geometry window size and position as WxH+X+Y --fullscreen start in fullscreen mode --standalone start a single instance, no background process Server Options: --port port to use (defaults to 8080) --template name of the template to use --gui run the gui wrapper for the server Export Options: --format format to use (defaults to 'html') --template name of the template to use -o, --output output directory --root-url url to use for the document root --index-page index page name You can use the export option to print a single page to stdout. When exporting a whole notebook you need to provide a directory. Search Options: None Index Options: -o, --output output file ''' zim-0.60/data/manual/Help/Custom_Tools.txt0000664000175000017500000000641612001625073020364 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Custom Tools ====== Zim allows you to define custom tools to extend the basic functionality with simple functions that can be handled by an external program or script. The custom tool manager allows you to quickly extend functionality in zim by shell scripts or other external programs. It is also useful to prototype plugin functionality without having to learn the full API for plugins. ===== Add a custom tool ===== To add a custom tool, open up the custom tool manager dialog using the menu item //Tools// -> //Custom Tools//. Now press the "Add" icon button and zim will prompt for the properties of a new tool. The **Name** is used in the tools menu for this tool and is mandatory. The **Description** should be a slightly more verbose description of this tool. It is used for example as the tooltip for toolbar items. The **Command** ... When defining a command, you can use the following parameters to supply the external program with some context information from within zim: **%f** for page source as a temporary file **%d** for the [[Help:Attachments|attachment]] directory of the current page **%s** for the real page source file (if any) **%n** for the notebook location (file or folder) **%D** for the document root (if any) **%t** for the selected text or word under cursor The optional **Icon** is used for toolbar items and for menu items depending on your Gtk appearance settings. Then there is the checkbox **Command does not modify data**. Enable this option if your tool only read data but does not modify it. In that case zim will execute the application in the background and keep running. Otherwise, if your tool does modify data, zim has to wait for it to finish and reload the current page. The chcekbox **Show in the toolbar** determines if this tool will be added to the toolbar or not. Tools are always visible in the "Tools" menu in the main window. Depending on the parameters they take, they may also be shown in the context menus for pages or for selected text in the editor. ===== Developing custom tool scripts ===== If you start writing scripts for custom tools that go further than just calling another program directly here are some tips: When testing out scripts that directly modify the notebook directory, make sure you have backups of your data. It might also be a good idea to enable version control and save a snapshot of the notebook before running a script. If you want to modify the wiki syntax in an automated way, it is worth considering to do your script in python and directly use the ''zim.formats.wiki'' module for parsing the wiki page. Once you take this step it becomes relatively easy to turn the script into a full plugin module later on. If your script needs e.g. a custom dialog to prompt information from the user it is advised to look into python and gtk as well. The Glade editor may help you to rapidly draw a dialog. Again, by using this framework it will be easy to turn the script into a plugin later on. One limitation of these custom tools is that you can not interact directly with the textbuffer. For example you can not change the cursor position or apply changes which will be undoable. To achieve this you will need to look into writing a real plugin and use the API for the text buffer. zim-0.60/data/manual/Help/Attachments.txt0000664000175000017500000000465012001630446020203 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-07-18T23:27:53+02:00 ====== Attachments ====== Pages can have attachments, these are e.g. image files for images that are part of the page, but can also be documents that are referred to in the page. Attachments are typically stored in the folder one level below the page with the text of the page. This folder can be opened with the menu item "//Tools → Open Attachments Folder//". To directly copy a file to the attachment folder and insert a link use the menu item "//Tools → Attach File//" Attachments can be created, modified, and deleted with regular applications. To link them in a zim page, just drag and drop from the window manager to the editor. **Note:** For images that are shown in the page, you may need to refresh the page before changes become visible. Use ''R'' or the menu item "//View → Reload//". **See also:** [[Plugins:Attachment Browser]] ===== File Templates ===== There is also a menu item "//Insert → New Attachment//". This item has a submenu that is based on a folder with file templates. Clicking any of the file templates will create a new attachment which is a copy of that file and insert a link to the new attachment, or, if it is an image, inserts it as an image. This is a convenient way to create new documents in the notebook and start editing them. The file is not opened directly, so to start editing you need to click the link or right click on the image. By default the folder where the templates are located is ''~/Templates'', but you can change it in the [[preferences]]. To manage the templates, click the last menu item ("//File Templates...//") to open the folder. Now create a new file that is a blank file of the file type that you would like to be able to insert into zim. Note that the file extension is removed in the menu, so give is a clear name, e.g an SVG file could be called "''SVG_Drawing.svg''". Be aware that in order to edit the file, it usually must be a valid file of the specific file type. If you just create an empty text file and rename it to "''Image.png''" most image editing applications will not consider it a valid PNG image. So it is better to start an image editor and save a real blank image as template. Of course it is perfectly fine to have multiple templates of the same file type. Note that this feature tries to be compatible with the "//Create new document//" menu in the Gnome file browser. zim-0.60/data/manual/Help/Notebooks.txt0000644000175000017500000000417412132472704017700 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== NoteBooks ====== A **notebook** is a collection of [[pages]] that are linked to each other. Typically all pages within a notebook belong to the some project; although it is also very common to have a "dump" or "scratch" notebook were all odds and ends end up. You can have multiple notebooks, for example for separate projects. Or you can have a single notebook for all your stuff. In general when you have separate groups of pages that do not interlink, it is best to put these groups in separate notebooks. That way zim remembers the state and history of each of these groups independent of the others. See [[Usage]] for more tips on how to use notebooks for specific tasks. **When you run zim for the first time** you will get asked for a new folder to store the notebook. This will now become the default notebook, everytime you start zim this notebook is opened directly. If you wish to use more than one notebook you can create additional notebooks from the "Open notebook" dialog (see the "//File//->//Open Another Notebook//" menu item). See also the notebook properties in the [[Properties|Properties dialog.]] ===== Open Notebook Dialog ===== The "Open notebook" dialog allows you to select from multiple notebooks, or to add new notebooks. When you **add** a notebook you will be asked for the folder to store the notebook. This can either be an new (empty) folder or an existing notebook folder. If multiple notebooks are defined and there is no default notebook the "Open notebook" dialog will show everytime you start zim. If you don't want to see the "Open notebook" dialog each time you start zim, you can set a default using the "**Set Default**" button in this dialog. The default can either be a directory or the name of one of the notebooks in the list. ===== Notebook configuration file ===== In the notebook directory zim will write a configuration file called "''zim.notebook''". This file contains the settings and state that are notebook specific. You can open the notebook from your file browser by opening this config file with zim (which should be the default application). zim-0.60/data/manual/Help/Properties.txt0000664000175000017500000000401611731414400020057 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Properties ====== The dialog with notebook properties can be accessed with the menu item "//File//" -> "//Properties//". The following notebook properties can be configured: The notebook **Name** is used in the "[[Notebooks|Open Notebook]]" dialog and e.g. in the menu for the [[Plugins:Tray Icon|Tray Icon]]. This name is also used for the window title. The notebook **Interwiki keyword** can be used to link to this notebook for other notebooks. See "Interwiki" in [[Links]] for more info. The **Home Page** is the first page to open in a notebook if you have no history yet. It can be accessed with the toolbar icon for the home page and the key binding. Typically the home page should be an index page linking to other pages. The notebook **Icon** is an image that is used together with the name to identify the notebook. The **Document Root** is a special folder which contains documents that can be linked from the notebook. To link files in this folder start the links with a "/" (see [[Links]] for more details). This folder is typically used for notebooks that are published as web page. When [[Export|exporting]] the notebook to html the document root can be mapped to a special URL. The **Profile** is an advanced property which allows having multiple sets of preferences. E.g. if you have two types of notebooks and each type you want different preferences, plugins, style, etc. you would assign notebooks different "profiles". Practically speaking this means that a separate set with config files is being used per profile. The **Shared Notebook** setting tells zim that the notebook is on a shared file system, or is located somewhere where file access is slow. In this case cache files will be written to the user home directory cache instead of the cache directory in the notebook folder itself. Disadvantage of storing information about the notebook outside the notebook folder is that for example for encrypted notebooks this cache data is not encrypted anymore. zim-0.60/data/manual/Help/Config_Files.txt0000664000175000017500000001641212132472704020264 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Config Files ====== This page documents the various config files used. Also see [[preferences]] for documentation of the preferences dialog. ===== Paths ===== ==== Freedesktop (Linux etc.) ==== Zim uses the scheme as laid down in the "XDG Base Directory Specification" as published by [[http://freedesktop.org|freedesktop.org]]. The default paths are: ''' XDG_CONFIG_HOME = HOME/.config/ XDG_DATA_HOME = HOME/.local/share/ XDG_DATA_DIRS = /usr/local/share/:/usr/share/ ''' These can be overloaded with the coresponding environment variables. When zim writes config files it always uses ''XDG_CONFIG_HOME''. Data files are read only and are searched for in ''XDG_DATA_HOME'' and ''XDG_DATA_DIRS''. The installation defaults for config files are also installed in ''XDG_DATA_DIRS'', but these are copied on first use to ''XDG_CONFIG_HOME''. ==== Windows ==== On Windows the default paths are: ''' XDG_CONFIG_HOME = APPDATA/zim/config/ XDG_DATA_HOME = ''' ''APPDATA/zim/data/'' Where ''APPDATA'' is the default Windows path to store application data, typically a path like "''USERPROFILE\Application Data''". When there is no ''HOME'' environment parameter defined on Windows either the ''USERPROFILE'' parameter or ''HOMEDRIVE'' + ''HOMEPATH'' are used. Make sure to define ''HOME'' or ''USERPROFILE'' including a drive letter. ===== Global Config Files ===== These config files determine various aspects of how zim behaves. They are global in the sense that they are not specific for one notebook. ==== Main config file ==== The default config file is ''XDG_CONFIG_HOME/zim/preferences.conf''. The config file is written automatically when you close zim. So if you want to change it manually you need to close all instances of zim first. There is a hidden option here called "''autosave_timeout''" which gives the interval for autosaving in seconds, default is 10. ==== Interwiki URL list ==== The file ''XDG_DATA/zim/urls.list'' gives a list of urls which are used for the [[Links|interwiki]] function. All files in the XDG_DATA path are read when looking for an url, so you can use XDG_DATA_HOME to overload the installation defaults. The format consist of one url per line, each line giving the key (which is the interwiki name), followed by whitespace, followed by the actual url. The url can conatin place holders "''{NAME}''" or "{URL}", the first will be replaced by the name of the interwiki page, the second by this name in url encoding. If no placeholder is found in the url the url encoded name is appended to the url. Note that if you want interwiki page to include url syntax like a "#" to link to anchors in the target page, you should write your URLs with "''{NAME}''". ==== Date format list ==== The file ''XDG_DATA/zim/dates.list'' gives a list of strftime formats, one on each line, to be used to populate the "Insert Date and Time" dialog. The first instance of this file that is found in the XDG_DATA path is used. See [[http://docs.python.org/library/time.html%23time.strftime|this link]] for documentation of the strftime formatting. ==== GUI style config file ==== Zim has certain defaults on how to display styles. For example it displays links as blue text without underline. To change this style copy "''/usr/share/zim/style.conf''" to "''~/.config/zim/''" and edit it. Each style has it's own section which starts with the style name between square brackets and contains key value pairs for the various display properties. **NOTE: **The display styles for the GUI are not used when exporting to HTML. If you want your HTML to show certain custom styles you should write a HTML [[Templates|template]] with a CSS stylesheet. Example: ''' [TextView] tabs = 40 font = Sans 10 [Tag bold] weight = PANGO_WEIGHT_BOLD [Tag italic] style = italic ''' Known properties for TextView: * **indent**: //integer// - indenting step size in pixels * **tabs**: //integer// - tab size in pizels * **linespacing**: //integer// - line spacing in pixels * **justify**: ''JUSTIFY_LEFT'', ''JUSTIFY_FILL'', ... * **font**: //string// Known style tags: * **h1**, **h2**, **h3**, **h4**, **h5**, **h6**: various headings * **emphasis**: emphasized or italic text * **strong**: strong or bold text * **mark**: highlighted or underlined text * **strike**: strike-through text * **code**: inline verbatim text * **pre**: verbatim text as paragraph * **sub**: subscript text * **sup**: superscript text * **link**: hyperlink text * **indent**: indented lines * **bullet-list**: lines in a bullet list * **numbered-list**: lines in a numbered list * **unchecked-checkbox**: lines with an open checkbox * **checked-checkbox**: lines with a "v-checked" checkbox * **xchecked-checkbox**: lines with a "x-checked" checkbox Known properties for Tags: * **family**: ''monospace'', ''sans'', ... * **foreground**: ''grey'', ''blue'', ''#cccccc'', etc. * **background**: ''yellow'', ''#cccccc'', etc. * **weight**: ''PANGO_WEIGHT_BOLD'', ... * **scale**: //integer// * **style**: ''italic'', ... * **underline**: ''single'', ... * **striketrough**: ''true'', ''false'' * **wrap**_**mode**: "''none"'', ... * **indent**: //integer// * **linespacing**: //integer// ==== GtkRC file ==== Gtk+ has it's own config file that allows you to customize how things look. This is the gtkrc file and it is typically saved as ''~/.gtkrc-2.0'' in the home directory. Some widgets have a name so you can set specific options for those widgets. Widgets that have a name in zim are: * The textview showing the page: zim-pageview * The treeview showing the page index: zim-pageindex You can for example set the font used in the index by adding this to your gtkrc file: ''' style "zim-pageindex-style" { font_name = "Sans 8" } widget "*.zim-pageindex" style "zim-pageindex-style" ''' or this example to make the treeview a bit more compact: ''' style "gtkcompact" { GtkTreeView::vertical-separator=0 GtkTreeView::horizontal-separator=0 GtkTreeView::expander-size=6 GtkTreeView::fixed-height-mode=TRUE GtkWidget::focus_padding=0 } class "GtkWidget" style "gtkcompact" ''' To change the base colors of the pageview widget use something like: ''' style "mycolors" { base: "#ccc" text: "#fff" } widget "*.zim-pageview" style "mycolors" ''' Check the internet for more examples. ===== Notebook config file ===== There is a notebook specific config files called "''notebook.zim''" which should be in the notebook folder. This file contains a section "''[Notebook]''" which contains the properties that can be set in the [[properties|properties dialog]]. There is one hidden property, called "''end_of_line''" which determines the end-of-line convention for files written by zim within the scope of this notebook. The value can be either "''dos''" or "''unix''". For newly created notebooks this value is set depending on the platform on which zim is running. Main purpose of this property is to ensure that a notebook which is shared between e.g. linux and windows machines does not change the full file on every write. When desired the property can be changed manually, which will affect all pages edited after the change. A second hidden option is "''disable_trash''" which defaults to ''False''. If enabled this will cause zim to avoid using the system trash for this notebook, see the section about deleting in [[Pages]]. zim-0.60/data/manual/Help/Searching.txt0000644000175000017500000001771712132472704017647 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Searching ====== There are two kinds of searching in zim: searching within a page, this is called **Find**, and searching through multiple pages, this is called **Search**. ===== Find ===== The "//Search//->//Find//..." menu item triggers a search box at the bottom of the page. By typing a word here you can find occurrences of this word in the current page. You can use either the ''N'' and ''P'' or the ''G'' and ''G'' keybindings to go to the next/previous occurrence. If the word you type can not be found the box turns red and the buttons become insensitive. The **Match case** check-box makes the search case sensitive. The **Highlight** check-box toggles highlighting for all results in the buffer. ===== Find and Replace ===== The "//Search//->//Replace...//" menu item triggers a dialog for find and replace in the current page. The "Next" and "Previous" buttons can be used to find the next or previous occurrence without replacing. The "Replace" button can be used to replace one occurrence only. The "Replace all" button can be used to replace all occurrences in the current page at once. The **Match case** check-box toggles case sensitivity. The search is by default not case sensitive. But it can be useful to match case when looking for names or acronyms. The **Whole word** check-box toggles whether partial word matches are included. This is especially useful when looking for rather short words. The **Regular expressions** check-box toggles advanced search and replace where "regular expressions" can be used to matched text patterns. When this option is enabled also escapes in the replacement string will be expanded and groups in the pattern can be referenced in the replacement string. See the [[http://docs.python.org/library/re.html|python documentation]] documentation for details on the syntax for regular expressions. The **Highlight** check-box toggles highlighting for all results in the buffer. ===== Search ===== The "//Search//->//Search//..." menu item triggers the search dialog to pop up. This dialog allows you to e.g. search for pages that contain a certain word. You can have multiple search dialogs open at the same time. You can not only search for multiple words, but zim also allows using more refined search queries. See below for the query syntax supported by this dialog for advanced usage. A normal search runs through all the pages of the notebook. Special searches, such as searching for links or namespaces, search only part of the index and are correspondingly faster, which may be important for large notebooks with hundreds to thousands of pages. ===== Back links ===== This is the last item in the Search menu. As a special case you can search for a page name. Instead of a full text search a cache lookup will be done and a list is shown of pages linking to the page you searched for. Page names are defined as words containing a ":" character in this context. When you open the "//Search//->//Search Back links//..." menu item you get the same Search dialog as with //Search// but the name of the current page is filled in already. As an alternative you can click on the "Back links" area in the status bar, this will pop up a menu with all back links to the current page. ===== Commandline usage ===== You can also execute a search using commandline arguments, e.g.: ''' zim --search Notes "tag:home and tag:foo" ''' which will print a list of all pages that contain both the [[tags]] "''@home''" and "''@foo''" ===== Search Query Syntax ===== This section describes the query syntax that can be used in the search dialog. === Summary === **Operators:** + AND and && all the words must be on the page OR or || any one of the words must be on the page - NOT the page may not contain this word **Keywords:** //details on keyword searches below// Content: Name: NameSpace: Links: LinksFrom: LinksTo: Tag: === Details === The Boolean operators AND NOT OR give you great flexibility in searching. If you have large, long-term notebooks, it is worth the learning curve. AND is the default: it serves to narrow your search by stipulating that 2 or more terms appear on the same page As in most search programs (e.g. Google and Yahoo) logical AND is **implied** by default: If you enter a couple of words in the search dialog zim looks for pages that contain all of these words in either in the page name or in the page contents. For multiple words an implicit AND operator is assumed. >>If you search pages containing both words foo and bar, the following queries are all equivalent: ''' foo bar foo AND bar foo and bar foo && bar +foo +bar ''' To exclude pages that contain a certain word from your query prefix the word with a "-" or the NOT operator. It is the opposite of AND. So to look for pages that contain "foo" but not "bar" try one of these: ''' foo -bar +foo -bar foo NOT bar foo AND NOT bar ''' For pages that contain neither "foo" nor "bar": ''' -foo - bar NOT foo NOT bar NOT foo AND NOT bar ''' OR is helpful is you are not sure, which exact word occurs in your text. You can enter words with similar meaning that might have occurred on the page you are looking for. In our example the OR operator serves for finding pages containing either "foo" or "bar" or both , so to find any pages matching "foo" or "bar" the following operators yield the same results: ''' foo OR bar foo or bar foo || bar ''' When combining the operators AND has precedence over OR. So a query like: ''foo OR bar AND dus'' gives all pages that contain "dus" plus either "foo" or "bar" or both. To match phrases, i.e. strings containing whitespace (blanks), or to match things that look like operators, you need to put the string between double quotes. So when looking for a literal string "foo bar" and a literal "+1" use: ''"foo bar" and "+1"'' To match partial words you can use a "''*''" as wildcard. So the following query ''' Some* ''' will match all words starting with "Some", like "Someday", "Someplace" etc. **Keyword searches: ** So far we just searched for words in the page contents and page names. If you want more control you can use keywords to specify a specific page property. Such searches limit the scope of the search, they are not only more specific, but in some cases also much faster than normal searches. The keywords for defined fields of pages are: **Content:** **Name:** **NameSpace:** **Links:** **LinksFrom:** **LinksTo:** **Tag:** For example to only search the page names you can use: ''' Name: *foo* ''' This query only returns pages that contain "foo" in the page name without looking at their content. The "Content:" keyword only matches page contents and excludes e.g. page names. Content: foo AND NOT Name: *foo* will find pages that have foo written somewhere in their page content but that do not contain "foo" in the page name. The "NameSpace:" keyword limits the query to pages in the index name space below the one named . Essentially, the namespace is what you see in the index panel. The exact namespace as needed for the search is visible on the bottom left in the status bar. Suppose under Home you have the page "photo" as top level page with multiple pages below it and you want to search only the photo part of your large notebook. You want to find all entries about depth of field or its abbreviation DoF, so you type the following search: ''Namespace: Home:photo "depth of field" or dof'' The "Links" and "LinksFrom" keywords return all pages linked by a certain page while "LinksTo" returns all pages that link to a certain page, this is used to find back links. To exclude all pages linking to ":Done" try: ''' NOT LinksTo: ":Done" ''' A complex example would be to find any pages in the ":Date" namespace that link to ":Planning". ''' namespace: Date and linksto: Planning ''' The keyword "Tag" can be used to search for specifics tags like: ''' Tag: home ''' Note that a simple search for a single word like "''@home''" will automatically be converted to "''Tag: home''" zim-0.60/data/manual/Plugins.txt0000664000175000017500000000373212061676267016502 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Plugins ====== The following plugins are standard included with zim: * [[+Arithmetic|Arithmetic]] * [[+Attachment Browser|Attachment Browser]] * [[+Automount|Automount]] * [[+BackLinks Pane|BackLinks Pane]] * [[+Diagram Editor|Diagram Editor]] * [[+Distraction Free Editing|Distraction Free Editing]] * [[+Ditaa Editor|Ditaa Editor]] * [[+Equation Editor|Equation Editor]] * [[+GNU R Plot Editor|GNU R Plot Editor]] * [[+Gnuplot Editor|Gnuplot Editor]] * [[+Insert Screenshot|Insert Screenshot]] * [[+Insert Symbol|Insert Symbol]] * [[+Inline Calculator|Inline Calculator]] * [[+Journal|Journal]] * [[+Link Map|Link Map]] * [[+Line Sorter|Line Sorter]] * [[+Log events with Zeitgeist|Log events with Zeitgeist]] * [[+Print to Browser|Print to Browser]] * [[+Quick Note|Quick Note]] * [[+Score Editor|Score Editor]] * [[+Spell Checker|Spell Checker]] * [[+Table Of Contents|Table Of Contents]] * [[+Tags|Tags]] * [[+Task List|Task List]] * [[+Tray Icon|Tray Icon]] * [[+Version Control|Version Control]] Plugins can be enabled and configured in the [[Help:Preferences|preferences dialog]]. A number of plugins have additional dependencies, like specific external programs, that are not required for the core functionality of zim. If one or more dependencies of a plugin are not fulfilled, these are marked red. ===== Installing Plugins ===== If a plugin is distributed as a separate python module, it should be installed such that zim can find it. For use specific plugins you can install them Python's "per user site-package directory". For example for python 2.6 this folder is: Unix (including Mac OS X): ''~/.local/lib/python2.6/site-packages'' Windows: ''%APPDATA%/Python/Python26/site-packages'' See http://www.python.org/dev/peps/pep-0370/ for details. ===== Writing Plugins ===== If you are looking for information on **writing plugins** please download the source package and have a look at the notes included in the "HACKING" folder. zim-0.60/data/menubar-maemo5.xml0000644000175000017500000001473411544165551016373 0ustar jaapjaap00000000000000

zim-0.60/data/globe_banner_small.png0000644000175000017500000002712611544165551017351 0ustar jaapjaap00000000000000PNG  IHDR@Ph1sBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<tEXtTitleEarth GlobevtEXtAuthorDan Gerhrads2tEXtDescriptionSimple globe centered on North America9btEXtCreation TimeMay 1, 2005h IDATxyE?oYfߓ$!$dD!#*Ȣ z^pA.xыMUD@MdCX@LϜK?̙3Y<9UoWw}zJT1bx'"1m9@{.?_53Rm N?r:}#ARyє)FCƒ@$qrq˂N U0sPa4>C\.G:jQҝԇ_h#FcLi@yW2IuP@N.°n{ 7&,Ueҁ{>ƺ mobĈe5 [*rŞ{v'T~bΆĄDo.Co&1D"8߶p1bj9,Wنel/RDXJ/OwMjrwm]'a7" w~]I1bl#Vm= eXHss?u5-Zjf;:h]׎r-dh1bxsX$R)\V(Ho" };rR,wݤ吖}кn=)2+*%?,FCX#ݞЯ@^O ե%)qUM45atrƵttc &[M$T5??-'.YbĈ1rSxjXaOD Bp#U/xk6|Su\ce˰ρZmC0$8B]]]N4)w֌1b>),ƏD`rʑ»u['V8ݙNԍ/ |y}cٗgGJрVU_EqbVi `JuC] w9?Q"vD>9^.E>~F_m] zߨxk[-CDW[>~ 0c]Ri4EYί{Ʋd"Gx~fzߞpMX n<_.~:b=#9"?3 9Eo5UpHG{Aa O?=Ԛ{v=#7!%~.u=rY;#("Bfm]?^4Tl U$RUFƈ]9=}Q姦r ~Gi8t.%”<!kW]3eծ9 <%<#E#fo` MިͶ/Ny/P qw P]dMUo!LBUGqlvށ4<<:ϣ<ҞGp<< CʆY8R͞|㇟]7+8nIf9'͒ffd2f2Dz}Tn 7>]'ѡ^h@DfFU/L Eh;dӦG gowUDf*oc`?9GU\ͦ$<9^U#F!6O黵U PD̓DjDޭO{f[g>jJ O`T Ð0| s>aدlVS7V~};\o7sI:|K~Òlp$pR,"[輽sÎ-kb/9@6PnUTj%dㄳ3BFi_nPl?PvQUśd)'jH}my.x#mŽ*((",wW:'LJ{u:LW"a6m 0MZW^?UuEq=/ GL6&R7د*?L̆}a?~8@Cv5k^dӍڊ6sv|QU:Zeq9`<0-J;T9 $9;91tx0%O7CU%HtCo'8I|]uB*k<~[foAE9m<"Pfj`N;3j'!8+fC<`iXL[zҢN+vi.Xfh׊'rX7xii` ``ߊ8U,zT(z_ |k_?*2܋[x\ѝXۓ#ưbP<ÚGl\ O&Aʗ!<c?)"~5qهN wfğk)|'+N2˖ѹ9 !A;'RzM͍7$]~٢۱3纬8;c8{/r(+Kr}jbf'{տ|r:v ߓ-/xj  5c ;4+.: {΀PY 3'/nY슚Ϯes5ɝ*~3k@GͯHFeLBXTTȚ|k"(\3yYVknʼ6Ug0 Yuڼ12u Z[$aS؋J1˛=˚xJ&_35U57Uoi^mȻw['F-ėU&! iwSU$ Y8h8xDߖH%H$IDMI7*Om8NH8s[jE^rm:n,w#:+)'%Հ[Z/1"|8.ao{0TƷ-ye1 2i!\\8ɚ[_ɤ%CSAlxT3MjЅ{U5 7B[{Q^L:|մ KADzznꨛaWE˜aatWM|Ikࡶhф|rA҅ђ'Fa 泪:It>ܴ'='LH}8}%]Q`' NhJ?ͬ$D&t:e?%@+8O!pSLcxoc҅:sj0m0cK/k.+˺7g6Dd. *Uђ'Fa%@o{|& deHt mڧi>$%ۗīJ&Mٲ4'x)Oh]FoG8SAyW,\D,h[U>I@@/jDNц4aGzTDI?i10XV5횙}{N"UpY 11˙=@1yaamd^MbC !x\y}\F{&P$Lȗ^8&֑L C^]9iH˴2&@Ю\<{84!" ȋC`Lj=0N<&uTyΎ^ն&le.z #;FI3iֹGp:>~69`w'z+^3 Կ>G6ي!ϩtH(8kS$  gH@{ץfTzˏ8~$ӛʨ@2P~6\=M(قOS$N; Nj8YquN={7Ι}=6xk'3;L\r \3(mda`<.4}3좩Y %Z<@f^O+YQs  I [,e6cbX0U>?&vv 9k*@%'5u:{~X3NR [Hml^\N3nf B2/4PCzʐ,v$*sfoh4,1bP2Hm} I<|΁SICگ;%u%q3ՀJ&ԝo&\.=Zk7KK[[28#keGKj2o7 JhK l<3`k-TfAyLdQ\Ag7FmƐ 0j 63U ?ʼkkc&>PQk OokwLMbi?:Gw\~zĭh,"ܳj#P ~ ;]IHߊ#FCv!QD|cUjb?_c?ˊWPG 6v?cB 01SN2ByNjaU>ݳJ^T. `P7Fo DMaGtc0?9qe?م%6(\v=x?<6"mwc,Ƅ1&$ oΜCn4 zcĈPDdSc5В]g#dulE`pl:)n,$nWGYQA;]=c #mPr΢8uULƈ텡k*eB;M1/MkΆ  ѧ_K>8]WHQ[+0ai_ ,f (P1bĈ0TLkq 8!_ěgXߣ6XL `=VN {F' a a ;ip-PgߔcĈP 0g^? X(uq֔zɛ>CITUx>>aPAL$ |'a`{]>1[3F ކ\AA}$Q 2]ySIc2\/A!ac0 9F=D̮x5LaYް LjcǐPUsed/[A`Vm-yS8`; u_3u2APY 0 1 QHɰdgX j*+,@dU3h)3X1r tt~/X L+Ԅ=c1e^! ~+$BF@[q4X٩LRBu[LĈvM`UuU35, EfRfkX ΗpzLMG}:;~S$82 5Q}da$QmxCq<Z8|+;@R#Fd8:4EIlW-8HH6x\ ;ASPH UYeSH5桡itOcm]?^=Nr/YSJ5%TID%%_$,քWT}(#;B|}"ޏ9Fq,9h4C(/a{q!{ NcØ)CM#j }~V1^@ud^ J8Yנ&3-~겡U1Dj22y@8Y("TUu!&y,.jM1]QTM p0R\S-<#Fw .%9Z٣יD8bD'BMQ!H=Nj8Mt/D|/~ ~bT o~w#F%DWT&I8m6Wߠ?DfA HCgd%zN+lEfb}Нǀ1Faݪk; " Xwmk%Щ,; DKTz|/U]8RD$ ݪ]x-#%a~倓jf ,&r~r={CYU꼂/6L@s*&y ZO{׶i`11$DmYv01}-e3E"R52m ^A`n mG_޳&->wCkJ:g$W[* Ӄe"r'@U_.u4;t銶hځCUs]#jHb[h=]oo``~re'B~@I\ rmHXm^U>rj9 di?]"XLx$uA6v'?bLDF"' z2e+=M#>Z +8m&"I`wޭ+uwI2s3/hOR4m4]44^:ITd*E:*2z.R`/Ix;V/Jضa-,M[]cS3pNRJGlv G+"'7gc8_Rװ p !s"rѐQDDZJD*E["Oy]D.&_D䋥  +E)iU"r9H"yVDO#wlEd<'"F/f!"GFY=OEdI$"2ȷKG~(}HDƉQUo:<$"o-"+`ȧ"Vk"r4({Jt6Y."Bmvgm_ȭ"2KD.ݢ""7w\#"/ *!gDHY8|smVTN_SMv#m6oMRd6TMĀ@S&hʠg,]M=PaJk|$造g9xl^Kk g[k"#,&("ǀ`5ǀ/Sӣk%aTYiǀ/a="r>\ ._qX%1 (IDATX`|@EdϨI$2-X "21𤪾 "I6`HcEdnNĖw^To_"R<=,RW܍mӻS{>]%}F!"{j6;;%;Pl/  PD`]@"r7ys(sɶOj7ӢT=}"2X$1(u=$*tKakovb8WAq 0ü^ ,y؇=|Ac< _DjTSU}y K. "ǒ㗊@EyO*CU( Ha5-Dp|OUK>^º#]#Y>[CڧىȅOsG5YJ3˓ȡ]K"y.'`]+ {Wտ\7WEF 죪V*"%dFDky\D)"@MkX ɪFǾ\\76^7gKpdYOl`pyoXE։5 `ͅ*$[M[YzD}/v*UEUVV4[BdF^(5o1m.4jDdJAIf?c!#"gG_ɓ_Kh02,yE^뢿{]$bve9{z.vƾP-$~/H`)+4g[K~".~} SOjYH~`_7V՞{cXb5KUB=>bBƒ#_{~i3|˩J'0ʲb~|w#HxQD~Hvj* sɇt߳o417VJ7\YHwH}`MS?`ۦ8l73AzgDg;a+Rx`x$ڿxKtbM$5 S3Ey_3<`3۬P޽qI,_/^gb`'"-J?ě=Szs)m&̟/%G y$3b(t6I"r=(VjY.Uz[s^>w"6/" K]>,THkF>TaCѡC^r('Oϊ>:7r 6B=?Usc?f&ê(L,ٔѾ'?<^"1i76ʾ7^1ZE2DU/FD׉'nq? +Zʢ>Kf`Rq`-' "c7SO)Oji$k++""D{柍C$14?5;{[wvX.vt0{l]*ƨEM`|zVDfb.(9)oւis-CU{D乨b{>]"jPi)XՎZּ5`FH+·y=A!YYhN>{Uf3M2TE"rkABsr+Yg/ƶ>l# {]!k{Q>a=Oam\}(c@YR|k6sEgc?8%݅5eoÚJutib X ғX',H?ESZ^%^lKcI >WGA|#s *?a謂-Q{?QZyܵ?=_>o`:xSQ't~>ۂ|Xͫ١rnt*,JK`gvN?>::j㻢w+KXWAxsۏG@G[aMjjO+q_M>XMI̢7)`CP(g? ع "jX;:Gڰކ|S|Ej{OlC7E[U}&r[|h_#X~0 0'8oWM$oqX"WfDd2Vk?/(PߣcWfX+C\ɷ`?U{҇au8Ɵv聟 S*&zLۡ#& UlycD}Vc1C 㩬MTj}޾c s<-16!"k!Clƒ <#8;Iʍk{ҮKg..Z7Ĉ+=.&"2 knKy cqD2db(w1 ^ec`۫±E :x-h171jo؞u)LlCt9C?F1c"h2ԁkDb 0FCX"7c: OåX 8,}KA1bĈ3a0 T{o1c? [% page.title %] [% page.content %] zim-0.60/data/templates/html/Presentation.html0000644000175000017500000000506111544165551021333 0ustar jaapjaap00000000000000 [% page.title %]
[% IF page.properties.type == 'namespace-index' -%]

Table Of Contents

[% ELSE %]

[% page.title %]

[% END %]
 
[% page.body %]
 
[% IF pages.previous -%] < [%- ELSE -%] < [%- END %] + [% IF pages.next -%] > [%- ELSE -%] > [%- END %]
zim-0.60/data/templates/html/SlideShow_(S5).html0000644000175000017500000000271211544165551021251 0ustar jaapjaap00000000000000 [% SET mode = s5 %] [% page.title %]
[% page.body %]
zim-0.60/data/templates/html/Default.html0000664000175000017500000000445012061455421020240 0ustar jaapjaap00000000000000 [% title %] [% IF pages.previous -%] [
Prev ] [%- ELSE -%] [ Prev ] [%- END %] [% IF page.properties.type == 'namespace-index' -%] [ Index ] [%- ELSE -%] [% IF pages.index -%] [ Index ] [%- ELSE -%] [ Index ] [%- END %] [%- END %] [% IF pages.next -%] [ Next ] [%- ELSE -%] [ Next ] [%- END %]
[% IF page.properties.type == 'namespace-index' -%]

Document Index

[%- ELSE -%]

[% page.heading %]

[%- END %] [% page.body %]
[% IF page.has_backlinks -%] Backlinks: [%- FOREACH link = page.backlinks -%] [% link.name %] [%- END -%] [%- ELSE -%] No backlinks to this page. [%- END %]

[% IF page.has_attachments -%] Attachments: [%- FOREACH file = page.attachments -%] [%- END -%]
[% file.basename %] [% file.size %]
[%- END %] zim-0.60/data/templates/html/Default_with_index.html0000644000175000017500000000434012061460250022452 0ustar jaapjaap00000000000000 [% page.title %]
[% IF page.properties.type == 'namespace-index' -%]

Document Index

[%- ELSE -%]

[% page.heading %]

[%- END %]

[% page.body %]

zim-0.60/data/templates/html/ZeroFiveEight.html0000664000175000017500000000615212132472704021371 0ustar jaapjaap00000000000000 [% title %]
[% IF page.properties.type=='namespace-index' -%]

Document Index

[%- ELSE -%]

[% page.heading %]

[%- END %] [% page.body %]

Backlinks: [% IF page.backlinks -%] [%- FOREACH link=page.backlinks -%] [% link.name %] [%- END -%] [%- ELSE -%] none [%- END %]
zim-0.60/data/templates/wiki/0000775000175000017500000000000012140000463015750 5ustar jaapjaap00000000000000zim-0.60/data/templates/wiki/Journal.txt0000664000175000017500000000136312100717176020142 0ustar jaapjaap00000000000000[% IF calendar_plugin.page_type == 'day' -%] ======= [% strftime("%A %d %b %Y", calendar_plugin.date) %] ======= [%- ELSIF calendar_plugin.page_type == 'week' -%] ======= [% strfcal("Week %W %Y", calendar_plugin.date) %] ======= [% strftime("%d %B", calendar_plugin.date) %] to [% strftime("%d %B", calendar_plugin.end_date) %] [% FOREACH day IN calendar_plugin.days() %] === [% strftime("%A %d %B", day) %] === [% END %] [%- ELSIF calendar_plugin.page_type == 'month' -%] ======= [% strftime("%B %Y", calendar_plugin.date) %] ======= [%- ELSIF calendar_plugin.page_type == 'year' -%] ======= Year [% strftime("%Y", calendar_plugin.date) %] ======= [%- ELSE -%] ======= [% page.basename %] ======= Created [% strftime("%A %d %B %Y") %] [%- END %] zim-0.60/data/templates/wiki/Default.txt0000644000175000017500000000011311544165551020107 0ustar jaapjaap00000000000000======= [% page.basename %] ======= Created [% strftime("%A %d %B %Y") %] zim-0.60/data/style.conf0000664000175000017500000000265712000045626015035 0ustar jaapjaap00000000000000[TextView] indent = 30 tabs = font = justify = linespacing = 3 [Tag strong] weight = PANGO_WEIGHT_BOLD [Tag emphasis] style = italic [Tag mark] #underline = single background = yellow [Tag strike] strikethrough = true foreground = grey # Verbatim gets a slightly different color to distinguise is easier # used the dark "aluminium" color from the Tango palette. [Tag code] foreground = #2e3436 family = monospace #wrap-mode = none [Tag pre] # This style is used for multi-line verbatim blocks foreground = #2e3436 family = monospace wrap-mode = none indent = 20 [Tag link] foreground = blue #underline = single [Tag tag] foreground = #ce5c00 # For the various headings we scale the size relative to the font size. # The color choosen is the dark green -or "Chameleon"- as defined in the # Tango color palette in order to fit with the default color scheme for # most desktops. [Tag h1] foreground = #4e9a06 underline = single weight = PANGO_WEIGHT_BOLD scale = 1.75 # 1.15**4 =~ 1.75 [Tag h2] foreground = #4e9a06 weight = PANGO_WEIGHT_BOLD scale = 1.52 # 1.15**3 =~ 1.52 [Tag h3] foreground = #4e9a06 style=italic weight = PANGO_WEIGHT_BOLD scale = 1.32 # 1.15**2 =~ 1.32 [Tag h4] foreground=#4e9a06 weight=PANGO_WEIGHT_BOLD scale=1.15 [Tag h5] foreground=#4e9a06 weight=PANGO_WEIGHT_BOLD [Tag h6] foreground=#4e9a06 [Tag checked-checkbox] #foreground = grey [Tag xchecked-checkbox] #foreground = grey # vim: syntax=desktop zim-0.60/data/symbols.list0000644000175000017500000001300012027374265015406 0ustar jaapjaap00000000000000## Entity table copied from the HTML::Entities perl module by Gisle Aas ## # Some normal chars that have special meaning in SGML context #amp 38 # ampersand #gt 62 # greater than #lt 60 # less than #quot 34 # double quote #apos 39 # single quote # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML \AElig 198 # capital AE diphthong (ligature) \Aacute 193 # capital A, acute accent \Acirc 194 # capital A, circumflex accent \Agrave 192 # capital A, grave accent \Aring 197 # capital A, ring \Atilde 195 # capital A, tilde \Auml 196 # capital A, dieresis or umlaut mark \Ccedil 199 # capital C, cedilla \ETH 208 # capital Eth, Icelandic \Eacute 201 # capital E, acute accent \Ecirc 202 # capital E, circumflex accent \Egrave 200 # capital E, grave accent \Euml 203 # capital E, dieresis or umlaut mark \Iacute 205 # capital I, acute accent \Icirc 206 # capital I, circumflex accent \Igrave 204 # capital I, grave accent \Iuml 207 # capital I, dieresis or umlaut mark \Ntilde 209 # capital N, tilde \Oacute 211 # capital O, acute accent \Ocirc 212 # capital O, circumflex accent \Ograve 210 # capital O, grave accent \Oslash 216 # capital O, slash \Otilde 213 # capital O, tilde \Ouml 214 # capital O, dieresis or umlaut mark \THORN 222 # capital THORN, Icelandic \Uacute 218 # capital U, acute accent \Ucirc 219 # capital U, circumflex accent \Ugrave 217 # capital U, grave accent \Uuml 220 # capital U, dieresis or umlaut mark \Yacute 221 # capital Y, acute accent \aacute 225 # small a, acute accent \acirc 226 # small a, circumflex accent \aelig 230 # small ae diphthong (ligature) \agrave 224 # small a, grave accent \aring 229 # small a, ring \atilde 227 # small a, tilde \auml 228 # small a, dieresis or umlaut mark \ccedil 231 # small c, cedilla \eacute 233 # small e, acute accent \ecirc 234 # small e, circumflex accent \egrave 232 # small e, grave accent \eth 240 # small eth, Icelandic \euml 235 # small e, dieresis or umlaut mark \iacute 237 # small i, acute accent \icirc 238 # small i, circumflex accent \igrave 236 # small i, grave accent \iuml 239 # small i, dieresis or umlaut mark \ntilde 241 # small n, tilde \oacute 243 # small o, acute accent \ocirc 244 # small o, circumflex accent \ograve 242 # small o, grave accent \oslash 248 # small o, slash \otilde 245 # small o, tilde \ouml 246 # small o, dieresis or umlaut mark \szlig 223 # small sharp s, German (sz ligature) \thorn 254 # small thorn, Icelandic \uacute 250 # small u, acute accent \ucirc 251 # small u, circumflex accent \ugrave 249 # small u, grave accent \uuml 252 # small u, dieresis or umlaut mark \yacute 253 # small y, acute accent \yuml 255 # small y, dieresis or umlaut mark # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96) \copy 169 # copyright sign \reg 174 # registered sign \nbsp 160 # non breaking space # Additional ISO-8859/1 entities listed in rfc1866 (section 14) \iexcl 161 \cent 162 \pound 163 \curren 164 \yen 165 \brvbar 166 \sect 167 \uml 168 \ordf 170 \laquo 171 \not 172 \shy 173 \macr 175 \deg 176 \plusmn 177 \sup1 185 \sup2 178 \sup3 179 \acute 180 \micro 181 \para 182 \middot 183 \cedil 184 \ordm 186 \raquo 187 \frac14 188 \frac12 189 \frac34 190 \iquest 191 \times 215 \divide 247 \OElig 338 \oelig 339 \Scaron 352 \scaron 353 \Yuml 376 \fnof 402 \circ 710 \tilde 732 \Alpha 913 \Beta 914 \Gamma 915 \Delta 916 \Epsilon 917 \Zeta 918 \Eta 919 \Theta 920 \Iota 921 \Kappa 922 \Lambda 923 \Mu 924 \Nu 925 \Xi 926 \Omicron 927 \Pi 928 \Rho 929 \Sigma 931 \Tau 932 \Upsilon 933 \Phi 934 \Chi 935 \Psi 936 \Omega 937 \alpha 945 \beta 946 \gamma 947 \delta 948 \epsilon 949 \zeta 950 \eta 951 \theta 952 \iota 953 \kappa 954 \lambda 955 \mu 956 \nu 957 \xi 958 \omicron 959 \pi 960 \rho 961 \sigmaf 962 \sigma 963 \tau 964 \upsilon 965 \phi 966 \chi 967 \psi 968 \omega 969 \thetasym 977 \upsih 978 \piv 982 \ensp 8194 \emsp 8195 \thinsp 8201 \zwnj 8204 \zwj 8205 \lrm 8206 \rlm 8207 \ndash 8211 \mdash 8212 \lsquo 8216 \rsquo 8217 \sbquo 8218 \ldquo 8220 \rdquo 8221 \bdquo 8222 \dagger 8224 \Dagger 8225 \bull 8226 \hellip 8230 \permil 8240 \prime 8242 \Prime 8243 \lsaquo 8249 \rsaquo 8250 \oline 8254 \frasl 8260 \euro 8364 \image 8465 \weierp 8472 \real 8476 \trade 8482 \alefsym 8501 \larr 8592 \uarr 8593 \rarr 8594 \darr 8595 \harr 8596 \crarr 8629 \lArr 8656 \uArr 8657 \rArr 8658 \dArr 8659 \hArr 8660 \forall 8704 \part 8706 \exist 8707 \empty 8709 \nabla 8711 \isin 8712 \notin 8713 \ni 8715 \prod 8719 \sum 8721 \minus 8722 \lowast 8727 \radic 8730 \prop 8733 \infin 8734 \ang 8736 \and 8743 \or 8744 \cap 8745 \cup 8746 \int 8747 \there4 8756 \sim 8764 \cong 8773 \asymp 8776 \ne 8800 \equiv 8801 \le 8804 \ge 8805 \sub 8834 \sup 8835 \nsub 8836 \sube 8838 \supe 8839 \oplus 8853 \otimes 8855 \perp 8869 \sdot 8901 \lceil 8968 \rceil 8969 \lfloor 8970 \rfloor 8971 \lang 9001 \rang 9002 \loz 9674 \spades 9824 \clubs 9827 \hearts 9829 \diams 9830 ## Additional shortcuts ## \pm 177 # +- sign \neq 8800 # not equal to sign (may also use =/= ) ## Some arrows ## \left 8592 \up 8593 \right 8594 \down 8595 ## units ## \ohm 937 # same as \omega ## Additional typography ## # See http://en.wikipedia.org/wiki/Arrow_%28symbol%29 for more codes # convert hex -> decimal before using here --> 8594 # same as \right <-- 8592 # same as \left <-> 8596 <--> 8596 ==> 8658 <=> 8660 <==> 8660 <== 8656 -- 8212 # em dash aka — in HTML =/= 8800 # not equal to sign (may also use \neq) +- 177 # +- sign +_ 177 # +- sign ## Suggestions for more shortcuts are welcome - please file in bug tracker ## zim-0.60/data/dates.list0000644000175000017500000000030411547122746015022 0ustar jaapjaap00000000000000# List with date-time formats used for the # "Insert Date eand Time" dialog. # See man strftime a description of the format. %x %c %A %d/%m/%Y %A %d/%m/%Y %H:%M %A %d %B %Y [d: %Y-%m-%d] %Y-%m-%d zim-0.60/data/menubar-maemo4.xml0000644000175000017500000001474511544165551016374 0ustar jaapjaap00000000000000 zim-0.60/data/menubar.xml0000644000175000017500000001665512132472704015211 0ustar jaapjaap00000000000000 zim-0.60/data/zim.png0000644000175000017500000000725311544165551014342 0ustar jaapjaap00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<(IDAThŚyp]}?{*=l8 (II\XIӤI҅d i:I)&i.4fBٍm0blk,ws~=ڌ-3}mGJD+)k0\ "0g\MéJ)4"86]%7JrtLF)* ?͚3| HN$}( 31s]LcDs]J[[<`%p%ڮ~UH ]ũC')Rg `}kK ~͟LU#8QR:?eaUjљ8J }Mh^v' i: ЦT-Qc.b)A1wp|B7g`ܥaAG%a<|"g?r 5y܉ D@^6Ӭv`UVtx'~{o4dhqq]+( )>aP$ !AQlB;72R]>U( #*@I -۶lrNQS,e;>{9˿$h]CÐ0 0È( ,J).^Qm^)~͛e1 ֭; LU9n6ƪC`c0.K, KKhlVI+Ծ(a֭;Q0|N +K-|Ab!"($ K;Qt>:ϯE*]oB^DDW"S?'[[m?^{i 4`peGfR|_]#)U|HqݼR6-/?>۟ܪtr@)IߔJEDqLFDQLē"\U%ާ籠SHNaẺ~%(>0DzUWyAa<A%kMb2%| #&VQ՜8񉪮+Vzh֭pDz G+>ޕ)%HRTxky**3d]d[5N.cZc3ַDvGTpP֎eWUK3 \k2^Z *s$M-2^q]/S5N|6:1쇂|Sg ͟$^J' F?trU7T uO(wǦcJ ΫMaF~SPB^^+7l.'C>(p"yLw_Zᥫ{>pkrw`({~̿IN[.LˊdRiDd{܎BUnEob> t97 i?+Y'Tn/Q1OovWq6]wRc<*'Z"Q$̨Rzcn*;Mw'fUL'W+U@V${^,Cm JK:-7oצ;֒2C| &Dq^e-]j]H-4E'{̱ ;z0i&3:x9;`H ^l1$DGO7o<~ғ@ZSvr* LdY"S7Ϗ?OuCWuuk1y5ѐ|fCUA kR0cD1dǎq2_ŗ' L)i ߽NjO=XQ4+Tcv0$5Z24oբ8F+.;E1QX|o%˳P; GTr@A:ʽ‘eF1ˆ/PJ&sU1 W)uwf @ɿͪՊT )Qdё)Z}a~V nXk*%;1M39"T.m9T83J k=q<6l_puMj_IENDB`zim-0.60/data/urls.list0000644000175000017500000001267211552070476014720 0ustar jaapjaap00000000000000# This file is adapted from 'interwiki.conf' from the dokuwiki package # Each URL may contain one of the placeholders {URL} or {NAME} # {URL} is replaced by the URL encoded representation of the wikiname # this is the right thing to do in most cases # {NAME} this is replaced by the wikiname as given in the document # no further encoding is done # If no placeholder is defined the urlencoded name is appended to the URL # You can add more InterWiki shortcuts here. wp http://en.wikipedia.org/wiki/ wpde http://de.wikipedia.org/wiki/ wpmeta http://meta.wikipedia.org/wiki/ doku http://wiki.splitbrain.org/ freecache http://freecache.org/{NAME} rfc http://www.ietf.org/rfc/rfc{NAME}.txt amazon http://www.amazon.com/exec/obidos/ASIN/ amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/ballermannsyndic/ amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/ google http://www.google.com/search?q= google.de http://www.google.de/search?q= phpfn http://www.php.net/{NAME} go http://www.google.com/search?q={URL}&btnI=lucky cpan http://search.cpan.org/search?query={URL}&mode=all perldoc http://perldoc.perl.org/search.html?q= # Standards from http://usemod.com/intermap.txt follow AbbeNormal http://www.ourpla.net/cgi-bin/pikie.cgi? AcadWiki http://xarch.tu-graz.ac.at/autocad/wiki/ Acronym http://www.acronymfinder.com/af-query.asp?String=exact&Acronym= Advogato http://www.advogato.org/ AIWiki http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi? ALife http://news.alife.org/wiki/index.php? AndStuff http://andstuff.org/wiki.php? Annotation http://bayle.stanford.edu/crit/nph-med.cgi/ AnnotationWiki http://www.seedwiki.com/page.cfm?wikiid=368&doc= AwarenessWiki http://taoriver.net/aware/ BenefitsWiki http://www.benefitslink.com/cgi-bin/wiki.cgi? BridgesWiki http://c2.com/w2/bridges/ C2find http://c2.com/cgi/wiki?FindPage&value= Cache http://www.google.com/search?q=cache: CLiki http://ww.telent.net/cliki/ CmWiki http://www.ourpla.net/cgi-bin/wiki.pl? CreationMatters http://www.ourpla.net/cgi-bin/wiki.pl? DejaNews http://www.deja.com/=dnc/getdoc.xp?AN= DeWikiPedia http://www.wikipedia.de/wiki.cgi? Dictionary http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query= DiveIntoOsx http://diveintoosx.org/ DocBook http://docbook.org/wiki/moin.cgi/ DolphinWiki http://www.object-arts.com/wiki/html/Dolphin/ EfnetCeeWiki http://purl.net/wiki/c/ EfnetCppWiki http://purl.net/wiki/cpp/ EfnetPythonWiki http://purl.net/wiki/python/ EfnetXmlWiki http://purl.net/wiki/xml/ EljWiki http://elj.sourceforge.net/phpwiki/index.php/ EmacsWiki http://www.emacswiki.org/cgi-bin/wiki.pl? FinalEmpire http://final-empire.sourceforge.net/cgi-bin/wiki.pl? Foldoc http://www.foldoc.org/foldoc/foldoc.cgi? FoxWiki http://fox.wikis.com/wc.dll?Wiki~ FreeBSDman http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query= Google http://www.google.com/search?q= GoogleGroups http://groups.google.com/groups?q= GreenCheese http://www.greencheese.org/ HammondWiki http://www.dairiki.org/HammondWiki/index.php3? Haribeau http://wiki.haribeau.de/cgi-bin/wiki.pl? IAWiki http://www.IAwiki.net/ IMDB http://us.imdb.com/Title? JargonFile http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect= JiniWiki http://www.cdegroot.com/cgi-bin/jini? JspWiki http://www.ecyrd.com/JSPWiki/Wiki.jsp?page= KmWiki http://www.voght.com/cgi-bin/pywiki? KnowHow http://www2.iro.umontreal.ca/~paquetse/cgi-bin/wiki.cgi? LanifexWiki http://opt.lanifex.com/cgi-bin/wiki.pl? LegoWiki http://www.object-arts.com/wiki/html/Lego-Robotics/ LinuxWiki http://www.linuxwiki.de/ LugKR http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl? MathSongsWiki http://SeedWiki.com/page.cfm?wikiid=237&doc= MbTest http://www.usemod.com/cgi-bin/mbtest.pl? MeatBall http://www.usemod.com/cgi-bin/mb.pl? MetaWiki http://sunir.org/apps/meta.pl? MetaWikiPedia http://meta.wikipedia.com/wiki/ MoinMoin http://purl.net/wiki/moin/ MuWeb http://www.dunstable.com/scripts/MuWebWeb? NetVillage http://www.netbros.com/? OpenWiki http://openwiki.com/? OrgPatterns http://www.bell-labs.com/cgi-user/OrgPatterns/OrgPatterns? PangalacticOrg http://www.pangalactic.org/Wiki/ PersonalTelco http://www.personaltelco.net/index.cgi/ PhpWiki http://phpwiki.sourceforge.net/phpwiki/ Pikie http://pikie.darktech.org/cgi/pikie? PPR http://c2.com/cgi/wiki? PurlNet http://purl.oclc.org/NET/ PythonInfo http://www.python.org/cgi-bin/moinmoin/ PythonWiki http://www.pythonwiki.de/ PyWiki http://www.voght.com/cgi-bin/pywiki? SeaPig http://www.seapig.org/ SeattleWireless http://seattlewireless.net/? SenseisLibrary http://senseis.xmp.net/? Shakti http://cgi.algonet.se/htbin/cgiwrap/pgd/ShaktiWiki/ SourceForge http://sourceforge.net/ Squeak http://minnow.cc.gatech.edu/squeak/ StrikiWiki http://ch.twi.tudelft.nl/~mostert/striki/teststriki.pl? SVGWiki http://www.protocol7.com/svg-wiki/default.asp? Tavi http://tavi.sourceforge.net/index.php? TmNet http://www.technomanifestos.net/? TMwiki http://www.EasyTopicMaps.com/?page= TWiki http://twiki.org/cgi-bin/view/ TwistedWiki http://purl.net/wiki/twisted/ Unreal http://wiki.beyondunreal.com/wiki/ UseMod http://www.usemod.com/cgi-bin/wiki.pl? VisualWorks http://wiki.cs.uiuc.edu/VisualWorks/ WebDevWikiNL http://www.promo-it.nl/WebDevWiki/index.php?page= WebSeitzWiki http://webseitz.fluxent.com/wiki/ Why http://clublet.com/c/c/why? Wiki http://c2.com/cgi/wiki? WikiPedia http://www.wikipedia.com/wiki/ WikiWorld http://WikiWorld.com/wiki/index.php/ YpsiEyeball http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl? ZWiki http://www.zwiki.org/ zim-0.60/data/pixmaps/0000775000175000017500000000000012140000463014470 5ustar jaapjaap00000000000000zim-0.60/data/pixmaps/checked-box.png0000644000175000017500000000225211544165551017372 0ustar jaapjaap00000000000000PNG  IHDRw=sRGBbKGD pHYs : ߸tIME ,0A(itEXtCommentCreated with GIMPWIDATHǭk]EgsɹӞڤ=1-5TQzAR,> "CA[AXA1/-HEy0%R6sיCq[6x&hnLMhƄ}M KFK""2<>7xm?݌ZOa4_T[Re SLLL)RcbݳK?c !B%sdz_1;;Ν;<4Mm$՛QJ)QuCq`f l<42!8L[Ȝ-[HE,D-?#M@Kbm!˴3JfۅlU+H2=i#PJjCexԯ"ٮwn h4VLNlAySC#Gw76r"X=# B˻s%+vٵ%{CT0K./e ؜!#BO(x..MTѻ]])Sc eYlsƲQ$NѣGocV'B7ϖ X.XUfeQPli4r?A(ģ׮`xxQZfs? !jexK'oIENDB`zim-0.60/data/pixmaps/xchecked-box.png0000644000175000017500000000232011544165551017556 0ustar jaapjaap00000000000000PNG  IHDRw=sRGBbKGD pHYs : ߸tIME  LtEXtCommentCreated with GIMPW+IDATHՕKhSY&5Lf"eꣵ݉LW7Ju\ƥ .*.lt!R\ZpჂH}Z3Z4m̢ cktFp3[=̀x'}Cp7I(:V]P p  t+@HUgϖth?Z[+R.ӜL>>N _J;M{2&]0BQj[^&ew0 Í*A$aKBai{w7z,a۬%r:"+d3>t /MM$΢9J=5e$ aد^?wl&@Zc#mmpjlȱ@/>9Ia`c ǡ H==$#>6E|JklcONxݻ|,@(՞=dQ5&n)BvEEqXxϳp>F$"D/\DjA%m8AHЀ4012I6% e q ծY˅4\"6)@c1NBmmE>jH9B]g'nhBx~ԭ[d]@ O(W:ْmu ktgq!8AU!ҥ/ˬ ( 6B?}Kd&v>f## a^nt FH4J--_&󴍍7 EP7m" dY͛lŘܽiH"u33d@BcDVBԟvϷì;~f!P,7lxza';?vi ( ?hIJIV9n2R"Y 45w,~b<FEƎ ˅8H ?K\8l}ۮ TjM,*KIENDB`zim-0.60/data/pixmaps/unchecked-box.png0000644000175000017500000000062011544165551017732 0ustar jaapjaap00000000000000PNG  IHDRw=sRGBbKGD pHYs : ߸tIME *!otEXtCommentCreated with GIMPWIDATH핱 0EK.N.N\NK[h-PӃ pE[3^__nV[13iB]HιRJ80#7=!dY8{s6m߾k5(3?v@D!|oK3CxRʻ,R,_눬ϳHeY`Rɇax sTUc u=i,oz`YݮIENDB`zim-0.60/data/pixmaps/linkmap.svg0000644000175000017500000001207211544165551016665 0ustar jaapjaap00000000000000 image/svg+xml zim-0.60/data/pixmaps/favicon.ico0000644000175000017500000000217611544165551016636 0ustar jaapjaap00000000000000 h(  j,(X@? 'x"D7d`fo>bP/M^ fh  RN }O:]T(=fV2ә ]NNNO<`R ?`Qe3lRYONNN;_R&u.J`-~Yi VNNO>bP@`P"2RZ7sZ1xfP TO=cP@`P (tbP4]%h[=cP @`P >bPy=dQ9rV>bP@`P8@`PD `zim-0.60/data/pixmaps/attachment.png0000644000175000017500000000172211544165551017347 0ustar jaapjaap00000000000000PNG  IHDRw=bKGD pHYs oyDIDATHǽMh\U,$1N>&nԈ4Ә;) .j .l@ ,VIiJ֊ bU,vQkP2I @&SySS\t&{1-z?{?Fxx ;.ǩou8r>o55kp\y#\ѲWzӀ}>t|~R ) #iYARU}Im՞Hk&.$rּalK&{b"¶m[=򚝎-@E $qJ%ykU]OY}=#*xm*M~;>rt(wW,V*e9ZT5@>5]8Yd_r DߏJ"坭JL/.#`930Mksg0C?ڻgϜ9,Z;FWS 5u*/C .k_4WF&`< `khq FvDiJ=,7}vף߷hąv?{6yK}}JiOmm"B}f1wkx $oӗ.ΌweJ!] x2[jn(ro߮I̓"zTXtSoftwarex+//.NN,H/J6XS\IENDB`zim-0.60/data/pixmaps/task-list.png0000644000175000017500000000152511544165551017133 0ustar jaapjaap00000000000000PNG  IHDRw=bKGD pHYs  ~tIME >tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDATxŖ?LQ3 .^c@W j#7C4P4jcgbbPO JOl J+(LѨ;o9۷o7 ll@j^, ^j&dk rgL&9n<{ր߻/+BX,J>P6s?b5jo?IFr\zzz}]렽oUlv$ZXi3 ayyAEHQT#THR QAL@TP@EAD0u%"D9: RI6'()Z?= e#0s>Bft D|Y[!r834ROZ\`c|||UTZd\kqwzD;=Q:c灥8TFc /i?NvZhg9:OV. ισFB/LoxWWl{Qą  AB aθ|DU˰Ne5#$h^EP6Cj6K 9 H+2GL2M C Hj zp# z= 8R?|$V[oi?^SaIENDB`zim-0.60/data/pixmaps/link.png0000644000175000017500000000112211544165551016146 0ustar jaapjaap00000000000000PNG  IHDRw=bKGDIDATxMhSQPzVbt*AHPFp!EBԕEE\"5TX+D &A7O_sQ 5yVt\!!XBh-Bh+h;z w,z1_΁@Z;=}ۢ} <#Bʓǽm*Bh RhOO;1Vsî:;/#v./?*3N JUj>e?>rWQ/2;=s2_*Ys&Zx< <]q=REw RU _%#`b퐮+Ul(H29LScafor27;C.ZwvɎʨ_[}چJ-+R%Hz\77DM jԖ2fFGY?5iβ8vmDiߧ޽N66o} 5{J?֬!gY$V%j3)o^#.'}[9qcI߆ ; +^TꛕZq6[,^`FVdw1[-4>zxT"T 0"|`SHE=F7؞uہ)R@(@|=Ȯ0D(txojP!5L!> _mSYXk@E@TUD~{aEwR,uu{Zw?"WlغY5pSd0 6M‡֪G+yU8tnHq ruNLw0"1})zq ZX"zO}AN8זۘY:2lтp &_$=b*7N\voLWu_| زUFyVR^O ,1(p(sPF8go|<|]n΀Hoѷ܏]*`8`>׮Qn鬁 -n 8 RzzzR1o'ykH_쫔Qi":t֭ar5"@ggD"zӢ0}4@ݻly Tmm!2*q}lɆ,j +VاQx)M2L @Q)D иE"  E0)Pb\M(HDW[a"#!qֳXi[m{O] S^\le1ZlJ,5hU  4.EWu_41%#bL&"]sx?lݓ.nުOpn\+1Fʅ3s pRscn2.-vڔޫ.XHt !elw= "FtN#F( b IIo߽I$΋fBkvvcVKV8r$Z%V Pd2~IGv@F@ I^^Bt38nk(Sʥ"źf1v:1&f7HBLh$j}; t(OUǵ8ETQvO m6˕o1 q}8:|+`pOi:GN6yS6|v,7}ak,ZƮ}{Xv?|h_ѿO d Earth Globe Simple globe centered on North America earth globe northamerica Open Clip Art Library Dan Gerhrads Dan Gerhrads May 1, 2005 image/svg+xml en wmf2svg zim-0.60/data/globe_banner.svg0000644000175000017500000015064111544165551016173 0ustar jaapjaap00000000000000 Earth Globe Simple globe centered on North America earth globe northamerica Open Clip Art Library Dan Gerhrads Dan Gerhrads May 1, 2005 image/svg+xml en wmf2svg Zim Invade your desktop ! zim-0.60/zim/0000775000175000017500000000000012140000463012675 5ustar jaapjaap00000000000000zim-0.60/zim/parsing.py0000644000175000017500000003256512134044426014735 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg '''This module contains utilities for parsing strings and text''' import re def split_quoted_strings(string, unescape=True, strict=True): '''Split a word list respecting quotes This function always expect full words to be quoted, even if quotes appear in the middle of a word, they are considered word boundries. ( XDG Desktop Entry spec says full words must be quoted and quotes in a word escaped, but doesn't specifify what to do with loose quotes in a string. ) Also a comma "," is handled specially and is always considered a word on it's own. @param string: string to split in words @param unescape: if C{True} quotes are removed, else they are left in place @param strict: if C{True} unmatched quotes will cause a C{ValueError} to be raised, if C{False} unmatched quotes are ignored. @returns: list of strings ''' word_re = Re(r''' ( '(\\'|[^'])*' | # single quoted word "(\\"|[^"])*" | # double quoted word [^\s,'"]+ | # word without spaces and commas , # comma - (allow "words,word"<<) )''', re.X) string = string.strip() words = [] while word_re.match(string): words.append(word_re[0]) i = word_re.m.end() string = string[i:].lstrip() if string and strict: raise ValueError, 'Unmatched quote' elif string: words += string.split() if unescape: words = [unescape_quoted_string(w) for w in words] return words def unescape_quoted_string(string): '''Removes quotes from a string and unescapes embedded quotes @returns: string ''' escape_re = re.compile(r'(\\(\\)|\\([\'\"]))') def replace(m): return m.group(2) or m.group(3) if (string.startswith('"') or string.startswith("'")) \ and string[-1] == string[0]: string = string[1:-1] string = escape_re.sub(replace, string) return string # URL encoding / decoding is a bit more tricky than it seems: # # === From man 7 url === # Reserved chars: ; / ? : @ & = + $ , # Unreserved chars: A-Z a-z 0-9 - _ . ! ~ * ' ( ) # although heuristics could have a problem with . ! or ' at end of url # All other chars are not allowed and need escaping # Unicode chars need to be encoded as utf-8 and then as several escapes # # === Usage === # Encode all - encode all chars # e.g. for encoding parts of a file:// uri # for encoding data for mailto:?subject=... # return ascii # Encode path - encode all except / # convenience method for file paths # return ascii # Encode readable - encode space & utf-8, keep other escapes # for pageview -> external (e.g. clipboard) # assume reserved is (still) encoded properly # return ascii # Decode all - decode all chars # e.g. for decoding file:// uris # return unicode # Decode readable - decode space, utf-8, keep other escapes # for source / external (e.g. clipboard) -> pageview # assume it is encoded properly to start with # return unicode # # space is really just ' ', other whitespace characters like tab or # newline should not appear in the first place - so do not facilitate # them. # # In wiki source we use fully escaped URLs. In theory we could allow # for utf-8 characters, but this adds complexity. Also it could break # external usage of the text files. # # === From man 7 utf-8 === # * The classic US-ASCII characters are encoded simply as bytes 0x00 to 0x7f # * All UCS characters > 0x7f are encoded as a multi-byte sequence # consisting only of bytes in the range 0x80 to 0xfd, so no ASCII byte # can appear as part of another character # * The bytes 0xfe and 0xff are never used in the UTF-8 encoding. # # So checking ranges makes sure utf-8 is really outside of ascii set, # and does not e.g. include "%". URL_ENCODE_DATA = 0 # all URL_ENCODE_PATH = 1 # all except '/' URL_ENCODE_READABLE = 2 # only space and utf-8 _url_encode_re = re.compile(r'[^A-Za-z0-9\-_\.!~*\'\(\)]') # unreserved _url_encode_path_re = re.compile(r'[^A-Za-z0-9\-_\.!~*\'\(\)/]') # unreserved + / def _url_encode(match): return '%%%02X' % ord(match.group(0)) def _url_encode_readable(match): i = ord(match.group(0)) if i == 32 or i > 127: # space or utf-8 return '%%%02X' % i else: # do not encode return match.group(0) def url_encode(url, mode=URL_ENCODE_PATH): '''Replaces non-standard characters in urls with hex codes. Mode can be: - C{URL_ENCODE_DATA}: encode all un-safe chars - C{URL_ENCODE_PATH}: encode all un-safe chars except '/' - C{URL_ENCODE_READABLE}: encode whitespace and all unicode characters The mode URL_ENCODE_READABLE can be applied to urls that are already encoded because it does not touch the "%" character. The modes URL_ENCODE_DATA and URL_ENCODE_PATH can only be applied to strings that are known not to be encoded. The encoded URL is returned as an ASCII string. ''' url = url.encode('utf-8') # unicode -> utf-8, so encode one byte at a time if mode == URL_ENCODE_DATA: return _url_encode_re.sub(_url_encode, url) elif mode == URL_ENCODE_PATH: return _url_encode_path_re.sub(_url_encode, url) elif mode == URL_ENCODE_READABLE: return _url_encode_re.sub(_url_encode_readable, url) else: assert False, 'BUG: Unknown url encoding mode' _url_decode_re = re.compile('%([a-fA-F0-9]{2})') def _url_decode(match): return chr(int(match.group(1), 16)) def _url_decode_readable(match): i = int(match.group(1), 16) if i == 32 or i > 127: # space or utf-8 return chr(i) else: # do not decode return match.group(0) def url_decode(url, mode=URL_ENCODE_PATH): '''Replace url-encoding hex sequences with their proper characters. Mode can be: - C{URL_ENCODE_DATA}: decode all chars - C{URL_ENCODE_PATH}: same as URL_ENCODE_DATA - C{URL_ENCODE_READABLE}: decode only whitespace and unicode characters The mode C{URL_ENCODE_READABLE} will not decode any other characters, so urls decoded with these modes can still contain escape sequences. They are safe to use within zim, but should be re-encoded with C{URL_ENCODE_READABLE} before handing them to an external program. The result is returned as a unicode string. ''' url = url.encode('utf-8') # in case url is already unicode try: if mode in (URL_ENCODE_DATA, URL_ENCODE_PATH): return _url_decode_re.sub(_url_decode, url).decode('utf-8') elif mode == URL_ENCODE_READABLE: return _url_decode_re.sub(_url_decode_readable, url).decode('utf-8') else: assert False, 'BUG: Unknown url encoding mode' except UnicodeDecodeError: # Someone did not exactly follow the recommendations in the spec... if mode in (URL_ENCODE_DATA, URL_ENCODE_PATH): return _url_decode_re.sub(_url_decode, url) elif mode == URL_ENCODE_READABLE: return url.replace('%20', ' ') _parse_date_re = re.compile(r'(\d{1,4})\D(\d{1,2})(?:\D(\d{1,4}))?') def parse_date(string): '''Returns a tuple of (year, month, day) for a date string or None if failed to parse the string. Current supported formats: - C{dd?-mm?} - C{dd?-mm?-yy} - C{dd?-mm?-yyyy} - C{yyyy-mm?-dd?} Where '-' can be replaced by any separator. Any preceding or trailing text will be ignored (so we can parse calendar page names correctly). TODO: Some setting to prefer US dates with mm-dd instead of dd-mm TODO: More date formats ? ''' m = _parse_date_re.search(string) if m: d, m, y = m.groups() if len(d) == 4: y, m, d = d, m, y if not d: return None # yyyy-mm not supported if not y: # Guess year, based on time delta from datetime import date today = date.today() if today.month - int(m) >= 6: y = today.year + 1 else: y = today.year else: y = int(y) if y < 50: y += 2000 elif y < 1000: y += 1900 return tuple(map(int, (y, m, d))) else: return None class Re(object): '''Wrapper around regex pattern objects which memorizes the last match object and gives list access to it's capturing groups. See module re for regex docs. Usage:: my_re = Re('^(\w[\w\+\-\.]+)\?(.*)') if my_re.match(string): print my_re[1], my_re[2] ''' # TODO, mimic complete interface for regex object including # split, findall, finditer, etc. __slots__ = ('r', 'p', 'm') # regex, pattern and match objects def __init__(self, pattern, flags=0): '''Constructor takes same arguments as re.compile()''' self.r = pattern self.p = re.compile(pattern, flags) self.m = None # We could implement __eq__ here to get more Perlish syntax # for matching. However that would make code using this class # less readable for Python adepts. Therefore keep using # match() and search() and do not go for too much overloading. def __str__(self): return self.r def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.r) def __len__(self): if self.m is None: return 0 return len(self.m.groups())+1 def __getitem__(self, i): if self.m is None: raise IndexError return self.m.group(i) def match(self, string): '''Same as re.match()''' self.m = self.p.match(string) return self.m def search(self, string): '''Same as re.search()''' self.m = self.p.search(string) return self.m def sublist(self, repl, list): '''This method is similar to "sub()" in that it substitutes regex matches with the result of calling the argument "repl" with the Re object as argument. The difference is that this function takes a list as argument and executes the substitution for all strings in the list while ignoring any non-string items. Also it does not substitute the results in the string, but expands to a list where each part is either a piece of the original string or the result of calling "repl". This method is useful to build a tokenizer. The method "repl" can return token objects and the resulting list of strings and tokens can be fed through this method several times for different regexes. ''' result = [] for item in list: if isinstance(item, basestring): pos = 0 for m in self.p.finditer(item): start, end = m.span() if start > pos: result.append(item[pos:start]) pos = end self.m = m result.append(repl(self)) if pos < len(item): result.append(item[pos:]) else: result.append(item) return result def start(self,group=0): '''Return the indices of the start of the substring matched by group; group defaults to zero (meaning the whole matched substring). Return -1 if group exists but did not contribute to the match. See re.matchobject for details''' return self.m.start(group) def end(self,group=0): '''Return the indices of the end of the substring matched by group; group defaults to zero (meaning the whole matched substring). Return -1 if group exists but did not contribute to the match. See re.matchobject for details''' return self.m.end(group) # Some often used regexes is_uri_re = Re('^(\w[\w\+\-\.]*):') # "scheme:" is_url_re = Re('^(\w[\w\+\-\.]*)://') # "scheme://" is_email_re = Re('^(mailto:\S+|[^\s:]+)\@\S+\.\w+$', re.U) # "mailto:" address # name "@" host # but exclude other uris like mid: and cid: is_path_re = Re(r'^(/|\.\.?[/\\]|~.*[/\\]|[A-Za-z]:\\)') # / ~/ ./ ../ ~user/ .\ ..\ ~\ ~user\ # X:\ is_win32_path_re = Re(r'^[A-Za-z]:[\\/]') # X:\ (or X:/) is_win32_share_re = Re(r'^(\\\\[^\\]+\\.+|smb://)') # \\host\share # smb://host/share is_interwiki_re = Re('^(\w[\w\+\-\.]*)\?(.*)', re.U) # identifier "?" path is_interwiki_keyword_re = re.compile('^\w[\w\+\-\.]*$', re.U) _classes = {'c': r'[^\s"<>\']'} # limit the character class a bit url_re = Re(r'''( \b \w[\w\+\-\.]+:// %(c)s* \[ %(c)s+ \] (?: %(c)s+ [\w/] )? | \b \w[\w\+\-\.]+:// %(c)s+ [\w/] | \b mailto: %(c)s+ \@ %(c)s* \[ %(c)s+ \] (?: %(c)s+ [\w/] )? | \b mailto: %(c)s+ \@ %(c)s+ [\w/] | \b %(c)s+ \@ %(c)s+ \. \w+ \b )''' % _classes, re.X | re.U) # Full url regex - much more strict then the is_url_re # The host name in an uri can be "[hex:hex:..]" for ipv6 # but we do not want to match "[http://foo.org]" # See rfc/3986 for the official -but unpractical- regex def uri_scheme(link): '''Function that returns a scheme for URIs, URLs and email addresses''' if is_email_re.match(link): return 'mailto' elif is_uri_re.match(link): # Includes URLs, but also URIs like "mid:", "cid:" return is_uri_re[1] else: return None def link_type(link): '''Function that returns a link type for urls and page links''' # More strict than uri_scheme() because page links conflict with # URIs without "//" or without "@" if is_url_re.match(link): if link.startswith('zim+'): type = 'notebook' else: type = is_url_re[1] elif is_email_re.match(link): type = 'mailto' elif '@' in link and ( link.startswith('mid:') or link.startswith('cid:') ): return link[:3] # email message uris, see RFC 2392 elif is_win32_share_re.match(link): type = 'smb' elif is_path_re.match(link): type = 'file' elif is_interwiki_re.match(link): type = 'interwiki' else: type = 'page' return type class TextBuffer(list): '''List of strings. Allows you to append arbitrary pieces of text but calling get_lines() will recombine or split text into lines. Used by parsers that need to output lines but handle smaller pieces of text internally. ''' def get_lines(self, end_with_newline=True): '''Returns a proper list of lines''' lines = ''.join(self).splitlines(True) if end_with_newline and lines and not lines[-1].endswith('\n'): lines[-1] += '\n' return lines def prefix_lines(self, prefix): '''Prefix each line with string 'prefix'.''' lines = self.get_lines(end_with_newline=False) # allowing end_with_newline here modifies content self[:] = [prefix + line for line in lines] zim-0.60/zim/errors.py0000644000175000017500000000453111622405211014570 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg # The Error class needed to be put in a separate file to avoid recursive # imports. '''This module contains the base class for all errors in zim''' class Error(Exception): '''Base class for all errors in zim. This class is intended for application and usage errors, these will be caught in the user interface and presented as error dialogs. In contrast and Exception that does I{not} derive from this base class will result in a "You found a bug" dialog. Do not use this class e.g. to catch programming errors. Subclasses should define two attributes. The first is 'msg', which is the short description of the error. Typically this gives the specific input / page / ... which caused the error. In there should be an attribute 'description' (either as class attribute or object attribute) with a verbose description. This description can be less specific but should explain the error in a user friendly way. The default behavior is to take 'msg' as the single argument for the constructor. So a minimal subclass only needs to define a class attribute 'description'. For a typical error dialog in the Gtk interface the short string from 'msg' will be shown as the title in bold letters while the longer 'description' is shown below it in normal letters. As a guideline error classes that are used in the gui or that can be e.g. be raised on invalid input from the user should be translated. ''' description = '' msg = '' # in case subclass does not define instance attribute def __init__(self, msg): self.msg = msg def __str__(self): msg = self.__unicode__() return msg.encode('utf-8') def __unicode__(self): msg = u'' + self.msg.strip() if self.description: msg += '\n\n' + self.description.strip() + '\n' return msg def __repr__(self): return '<%s>' % self.__class__.__name__ # Defined here because these errors are not specific to files, but can # occur in different storage models as well class TrashNotSupportedError(Error): '''Error raised when trashing is not supported and delete should be used instead ''' pass class TrashCancelledError(Error): '''Error raised when a trashign operation is cancelled. (E.g. on windows the system will prompt the user with a confirmation dialog which has a Cancel button.) ''' pass zim-0.60/zim/signals.py0000664000175000017500000002356512132472704014736 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import weakref import logging import gobject logger = logging.getLogger('zim') # Constants for signal order SIGNAL_NORMAL = 1 SIGNAL_AFTER = 2 SIGNAL_OBJECT = 4 class ConnectorMixin(object): '''Mixin class that has convenience methods for objects that want to connect to signals of other objects. ''' # TODO connectto with whole set of signals # TODO connect variant that wraps with a handler that catches # unwanted arguments def connectto(self, obj, signal, handler=None, userdata=None, order=SIGNAL_NORMAL): '''Connect to signals of another object E.g.:: self.connectto(button, 'clicked', self.on_button_clicked) @param obj: the object to connect to @param signal: the signal name @param handler: the callback function, or C{None} to map to a method prefixed with "on_". @param userdata: optional user data @param order: if order is C{NORMAL} then C{GObject.connect()} is used, if order is C{AFTER} then C{GObject.connect_after()} is used. @returns: the handler id ''' if handler is None: name = "on_" + signal.replace('-', '_') handler = getattr(self, name) if handler is None: raise NotImplementedError, 'No method "%s"' % name if order == SIGNAL_NORMAL: if userdata is None: i = obj.connect(signal, handler) else: i = obj.connect(signal, handler, userdata) else: # SIGNAL_AFTER if userdata is None: i = obj.connect_after(signal, handler) else: i = obj.connect_after(signal, handler, userdata) if not hasattr(self, '_connected_signals'): self._connected_signals = {} # We might want a dict here that is cleaned up # when references disappear, but for now this will do key = id(obj) if not key in self._connected_signals: self._connected_signals[key] = (weakref.ref(obj), []) self._connected_signals[key][1].append(i) return i def connectto_all(self, obj, signals, handler=None, userdata=None, order=SIGNAL_NORMAL): '''Convenience method to combine multiple calls to L{connectto()}. @param obj: the object to connect to @param signals: a list of signals. Elements can either be signal names or tuples where the sub-elements are the parameters for L{connectto()}. For example:: self.connectto_all(self.ui ( 'open-page' # defaults to on_open_page ('open-notebook', on_open_notebook, None, SIGNAL_AFTER), )) The optional parameters are used as default values when these parameters are not specified explicitly per signal. @param handler: optional parameter @param userdata: optional parameter @param order: optional parameter ''' default = (None, handler, userdata, order) for signal in signals: if isinstance(signal, basestring): self.connectto(obj, signal, handler, userdata, order) else: arg = signal + default[len(signal):] # fill in missing positional arguments self.connectto(obj, *arg) def disconnect_from(self, obj): '''Disc all signals that have been connected with L{connectto} and friends to a specific object. ''' key = id(obj) if hasattr(self, '_connected_signals') \ and key in self._connected_signals: self._disconnect_from(key) def disconnect_all(self): '''Disconnect all signals that have been connected with L{connectto} and friends. Typically called when you want to destroy this object. ''' if hasattr(self, '_connected_signals'): for key in self._connected_signals.keys(): try: self._disconnect_from(key) except: logger.exception('Exception in disconnect_all()') def _disconnect_from(self, key): ref, signals = self._connected_signals[key] obj = ref() if obj is not None: for i in signals: obj.disconnect(i) del self._connected_signals[key] def call_default(obj, signal, args): name = 'do_' + signal.replace('-', '_') if hasattr(obj, name): method = getattr(obj, name) method(*args) def call_handlers(obj, signal, handlers, args): for handler in handlers: const, callback, userdata = handler if userdata is not None: if const & SIGNAL_OBJECT: myargs = (userdata,) + args else: myargs = args + (userdata,) else: myargs = args try: if const & SIGNAL_OBJECT: r = callback(*myargs) else: r = callback(obj, *myargs) except: # TODO in case of test mode, re-raise the error logger.exception('Exception in signal handler for %s on %s', signal, obj) else: yield r class SignalEmitter(object): '''Replacement for C{GObject} to make objects emit signals. API should be backward compatible with API offered by GObject. ''' __signals__ = {} #: signals supported by this class # define signals we want to use - (closure type, return type and arg types) # E.g. {signal: (gobject.SIGNAL_RUN_LAST, None, (object, object))} __hooks__ = () # name of signals that return first result def _get_signal(self, name): if name in self.__signals__: return self.__signals__[name] else: return None # TODO: iterate base classes as well def connect(self, signal, handler, userdata=None): '''Register a handler for a specific object. Note that connecting makes a hard reference to the connected object. So connecting an bound method will prevent the object the method belongs to to be destroyed untill the signal is disconnected. @param signal: the signal name @param handler: callback to be called upon the signal, first object to the callback will be the emitting object, other params are signal specific. @param userdata: optional data to provide to the callback @returns: an id for the registered handler ''' return self._connect(SIGNAL_NORMAL, signal, handler, userdata) def connect_after(self, signal, handler, userdata=None): '''Like L{connect()} but handler will be called after default handler''' return self._connect(SIGNAL_AFTER, signal, handler, userdata) def connect_object(self, signal, handler, obj): '''Like L{connect()} but handler will be called with C{obj} as main object''' return self._connect(SIGNAL_NORMAL | SIGNAL_OBJECT, signal, handler, obj) def connect_object_after(self, signal, handler, obj): '''Like L{connect()} but handler will be called with C{obj} as main object''' return self._connect(SIGNAL_AFTER | SIGNAL_OBJECT, signal, handler, obj) def _connect(self, order, signal, callback, userdata): #if self._get_signal(signal) is None: # raise ValueError, 'No such signal: %s' % signal if not hasattr(self, '_signal_handlers'): self._signal_handlers = {} if not signal in self._signal_handlers: self._setup_signal(signal) self._signal_handlers[signal] = [] handler = (order, callback, userdata) self._signal_handlers[signal].append(handler) handlerid = id(handler) # unique object id since we construct the tuple return handlerid def disconnect(self, handlerid): if not hasattr(self, '_signal_handlers'): return for signal, handlers in self._signal_handlers.items(): # unique id, so when we find it, stop searching ids = map(id, handlers) try: i = ids.index(handlerid) except ValueError: continue else: handlers.pop(i) if not handlers: self._signal_handlers.pop(signal) self._teardown_signal(signal) break def _setup_signal(self, signal): # Called first time a signal is registered - for subclasses pass def _teardown_signal(self, signal): # Called after last handler is disconnected - for subclasses pass def emit(self, signal, *args): #signal_spec = self._get_signal(signal) #if signal_spec is None: # raise ValueError, 'No such signal: %s' % signal #else: # pass # TODO check arguments return_first = signal in self.__hooks__ # XXX if not hasattr(self, '_signal_handlers') \ or not signal in self._signal_handlers: call_default(self, signal, args) else: before = [h for h in self._signal_handlers[signal] if h[0] & SIGNAL_NORMAL] for r in call_handlers(self, signal, before, args): if return_first and r is not None: return r r = call_default(self, signal, args) if return_first and r is not None: return r after = [h for h in self._signal_handlers[signal] if h[0] & SIGNAL_AFTER] for r in call_handlers(self, signal, after, args): if return_first and r is not None: return r class DelayedCallback(object): '''Wrapper for callbacks that need to be delayed after a signal This class allows you to add a callback to a signal, but only have it called after a certain timeout. If the signal is emitted again during this time the callback will be canceled and the timeout starts again. (So the callback is not called for each repeat of the signal.) This can be used e.g. in case want to update some other widget after the user changes a text entry widget, but this can be done once the user pauses, while calling the callback for every key stroke would make the application non-responsive. Objects of this class wrap the actual callback function and can be called as a normal function. Note that when a repeated callback is canceled, only the arguments of the last call are passed on. @todo: allow an option to check arguments and pass on all unique combinations ? @todo: add support for async callbacks, in this case block the callback until the async process is finished ''' __slots__ = ('timeout', 'cb_func', 'timer_id') def __init__(self, timeout, cb_func): '''Constructor @param timeout: timeout in milliseconds (e.g. 500) @param cb_func: the callback to call ''' self.cb_func = cb_func self.timeout = timeout self.timer_id = None def __call__(self, *arg, **kwarg): if self.timer_id: gobject.source_remove(self.timer_id) self.timer_id = None def callback(): self.timer_id = None self.cb_func(*arg, **kwarg) return False # destroy timeout self.timer_id = gobject.timeout_add(self.timeout, callback) def __del__(self): if self.timer_id: gobject.source_remove(self.timer_id) def cancel(self): '''Cancel the scheduled callback''' self.__del__() zim-0.60/zim/stores/0000775000175000017500000000000012140000463014214 5ustar jaapjaap00000000000000zim-0.60/zim/stores/__init__.py0000644000175000017500000003452312132472704016346 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Base class for storage backends This module contains a base class for store modules. It implements some common methods and provides API documentation for the store modules. Each store sub-module should implement exactly one class which inherits from StoreClass. These classes can be loaded with the function L{get_store()}. Storage Model ============= Stores handle content in terms of Page objects. How the data that is managed by the store is mapped to pages is up to the store implementation. For example in the default store each page is mapped to a text file, but there can also be store implementations that store many pages in the same file, or that use for example a database. The store is however expected to be consistent. So when a page is stored under a specific name it should also be retrievable under that name. Pages can be stored in a hierarchical way where each page can have sub-pages. Or, in other terms, each page has a namespace of the same name that can store sub pages. In the default store this structure is mapped to a directory structure where for each page there can be a like named directory which contains the files used to store sub-pages. The full page name for a page consists of the names of all it's parents plus it's own base name separated with the ':' character. It is advised that each page should have a unique name. Symbolic links or aliases for pages should be handled on a different level. In the store interface page names are always assumed to be case sensitive. However the store is allowed to be not case sensitive if the storage backend does not support this (e.g. a file system that is not case sensitive). The API consistently uses L{Path} objects to represent page names. These paths just map to a specific page name but do not contain any information about the actual existence of the page etc. The store exposes it's content using Page objects and lists of Page objects. Each page object has two boolean attributes 'C{hascontent}' and 'C{haschildren}'. Typically in a page listing at least one of these attributes should be True, as a page either has content of it's own, or is used as a container for sub-pages, or both. However both attributes can be False for new pages, or for pages that have just been deleted. The index will cache page listings in order to speed up the performance, so it should not be necessary to do speed optimizations in the store lookups. However for efficient caching, store objects should implement the L{get_pagelist_indexkey()} and L{get_page_indexkey()} methods. ''' from __future__ import with_statement import sys import re import codecs import zim.fs import zim.plugins from zim.fs import File, Dir from zim.parsing import is_url_re from zim.errors import Error, TrashNotSupportedError def get_store(name): '''Get a store class @param name: the module name of the store (e.g. "files") @returns: the subclass of L{StoreClass} found in the module ''' mod = zim.plugins.get_module('zim.stores.' + name.lower()) obj = zim.plugins.lookup_subclass(mod, StoreClass) return obj def _url_encode_on_error(error): string = error.object section = string[error.start:error.end].encode('utf-8') replace = u'' for char in section: replace += u'%%%02X' % ord(char) return replace, error.end codecs.register_error('urlencode', _url_encode_on_error) def encode_filename(pagename): '''Encode a pagename to a filename Since the filesystem may use another encoding than UTF-8 it may not be able to use all valid page names directly as file names. Therefore characters that are not allowed for the filesystem are replaced with url encoding. The result is still unicode, which can be used to construct a L{File} object. (The File object implementation takes care of actually encoding the string when needed.) Namespaces are mapped to directories by replacing ":" with "/". @param pagename: the pagename as string or unicode object @returns: the filename as unicode object but with characters incompatble with the filesystem encoding replaced ''' assert not '%' in pagename # just to be sure if not zim.fs.ENCODING in ('utf-8', 'mbcs'): # if not utf-8 we may not be able to encode all characters # enforce safe encoding, but do not actually encode here # ('mbcs' means we are running on windows and filesystem can # handle unicode natively ) pagename = pagename.encode(zim.fs.ENCODING, 'urlencode') pagename = pagename.decode(zim.fs.ENCODING) return pagename.replace(':', '/').replace(' ', '_') _url_decode_re = re.compile('%([a-fA-F0-9]{2})') def _url_decode(match): return chr(int(match.group(1), 16)) def decode_filename(filename): '''Decodes a filename to a pagename Reverse operation of L{encode_filename()}. @param filename: the filename as string or unicode object @returns: the pagename as unicode object ''' if zim.fs.ENCODING != 'utf-8': filename = filename.encode('utf-8') filename = _url_decode_re.sub(_url_decode, filename) filename = filename.decode('utf-8') return filename.replace('/', ':').replace('_', ' ') class StoreClass(): '''Base class for all storage backends Defines API that should be implemented in store objects as well as some convenience methods. Note that typically stores are only called by the L{Notebook} object, which does varies sanity checks. So although we should still make sure parameters in the API are sane, we may assume the requestor already verified for example that the path we get really belongs to this store. @note: Do not call store objects directly from outside the Notebook class ! @ivar notebook: the L{Notebook} this store is part of @ivar namespace: the L{Path} where this store will be 'mounted' in the notebook ''' def __init__(self, notebook, namespace): '''Constructor @param notebook: the L{Notebook} this store will be part of @param namespace: the L{Path} where this store will be 'mounted' in the notebook ''' self.notebook = notebook self.namespace = namespace def get_page(self, path): '''Get a L{Page} object If a non-existing page is requested the store should check if we are allowed to create the page. If so, a new page object should be returned, but actually creating the page can be delayed until content is stored in it. If we are not allowed to create the page (e.g. in case of a read-only notebook) C{None} may be returned but a read-only Page object is also allowed. @param path: a L{Path} object @returns: a L{Page} object or C{None} @implementation: must be implemented by subclasses ''' raise NotImplementedError def get_pagelist(self, path): '''Get a list (or iterator) of page objects in a namespace This method is used by the index to recursively find all pages in the store, so it should also include empty pages that do have sub-pages. Otherwise those sub-pages are never indexed. @param path: a L{Path} object @returns: A list or iterator for a list of L{Page} objects or an empty list when C{path} does not exist. @implementation: must be implemented by subclasses ''' raise NotImplementedError def store_page(self, page): '''Store a page This method should save pages that were changed in the user interface. If the page does not yet exist it should be created automatically. Also all parent pages that did not yet exist should be created when needed. @param page: a L{Page} object obtained from L{get_page()} on this same object. The object must be from the same store to allow stores to sub-class the Page class and add additional internal state. @implementation: must be implemented by subclasses ''' raise NotImplementedError def store_page_async(self, page, lock, callback, data): '''Store a page asynchronously Like L{store_page()} but with asynchronous operation. @param page: a L{Page} object @param lock: the L{zim.async.AsyncLock} object to use (typically the notebook lock) @param callback: a calback function to be called when the operation completed, see L{Notebook.store_page_async()} for the signature. @param data: user data for the callback @implementation: optional, can be implemented in subclasses. If not implemented in the subclass it will fall back to just calling L{store_page()} and then call the callback function. ''' try: with lock: self.store_page(page) except Exception, error: if callback: exc_info = sys.exc_info() callback(False, error, exc_info, data) else: if callback: callback(True, None, None, data) def revert_page(self, page): '''Revert the state of an un-stored page object Does not return a page object, changes are in the object supplied. This allows to revert an object that is being edited by the user interface. Kind of opposite to L{store_page()}. @implementation: optional, can be implemented in subclasses. In this base class it defaults to requesting a new copy of the page and copying the parse tree to the old object. Needs to be overloaded when the page has more internal state (e.g. a file object with mtime check). ''' newpage = self.get_page(page) page.set_parsetree(newpage.get_parsetree()) page.modified = False def move_page(self, path, newpath): '''Move a page and all it's sub-pages Move content, sub-pages and attachments from C{path} to C{newpath}. Must raise an error if C{path} does not exist, or if C{newpath} already exists. If C{path} is in fact a L{Page} object this should result in C{page.exists} being False after the move was successful. @param path: a L{Path} object for the the current path @param newpath: a L{Path} object for the new path @implementation: must be implemented by subclasses if the store is writable ''' raise NotImplementedError def delete_page(self, path): '''Deletes a page and all it's sub-pages Delete a page, it's sub-pages and attachments Must raise an error when delete failed. If C{path} is in fact a L{Page} object this should result in C{page.exists} being False after the deletion was successful. @param path: a :{Path} object @returns: C{False} if page did not exist in the first place, C{True} otherwise. @implementation: must be implemented by subclasses if the store is writable ''' raise NotImplementedError def trash_page(self, path): '''Move a page and all it's sub-pages to trash Like L{delete_page()} but instead of permanent deltion move the pages and attachments to the system trash so they can be restored by the user. @raises TrashNotSupportedError: when not subclassed or when trash is not available due to some other reason. @raises TrashCancelledError: when the user cancelled trashing. @param path: a :{Path} object @returns: C{False} if page did not exist in the first place, C{True} otherwise. @implementation: must be implemented by subclasses if the store is writable ''' raise TrashNotSupportedError, 'Not implemented' def get_pagelist_indexkey(self, path): '''Get key for checking cached state of a page list This method should return a key that can be checked by the index to determine if a list of (sub-)pages should be indexed again. A typical implementation would be to return the modification time of the directory where the pages are stored. The default in the base class returns None, forcing the index to always re-index the page. This is not very efficient and should be overloaded by the store. @param path: a L{Path} object @returns: a string encoding the state of the page list for sub-pages of C{path} @implementation: optional, can be implemented in subclasses ''' return None def get_page_indexkey(self, path): '''Get key for checking cached state of a page Like L{get_pagelist_indexkey()} but used to decide whether page contents should be indexed again or not. Typical implementation would be to check the modification time of the file. The index will try to index the page after it was stored, so it gets the new state after L{store_page} was called. @param path: a L{Path} object @returns: a string encoding the state of the content of C{path} @implementation: optional, can be implemented in subclasses ''' return None def store_has_dir(self): '''Convenience method to initalize the storage dir Typically used in the constructor of a sub class. @returns: C{True} when the store has a C{dir} attribute set or when it was able to create such an attribute based on the namespace and the notebook C{dir} attribute. ''' if hasattr(self, 'dir') and not self.dir is None: return isinstance(self.dir, Dir) elif hasattr(self.notebook, 'dir'): path = self.namespace.name.replace(':', '/') if path.strip(':') == '': self.dir = self.notebook.dir else: self.dir = self.notebook.dir.subdir(path) return True else: return False def store_has_file(self): '''Convenience method to initalize the storage file Like L{store_has_dir()} but initializes the C{file} attribute. ''' if hasattr(self, 'file') and not self.file is None: return isinstance(self.file, File) elif hasattr(self.notebook, 'file') and self.namespace.isroot: self.file = self.notebook.file return isinstance(self.file, File) else: return False def get_attachments_dir(self, path): '''Get the folder for storing attachments for a page @param path: a L{Path} object @returns: a L{Dir} object for the attachment folder of C{path} @implementation: optional, sub-classes may implement this method. The default implementation assumes the store has a directory set already and applies the default heuristic for mapping page names to file names. Sub-classes that do not have a directory or want a different layout need to subclass this method. ''' # TODO merge with _get_dir and _get_file in stores/files.py assert self.dir, 'Stores without a dir attribute need to overload this method' if path == self.namespace: return self.dir else: name = path.relname(self.namespace) dirpath = encode_filename(name) return Dir([self.dir, dirpath]) def walk(self, path=None): '''Generator to walk all pages under this store @returns: yields all pages under this store as L{Page} objects depth-first ''' if path is None: path = self.namespace for page in self.get_pagelist(path): yield page for child in self.walk(page): # recurs yield child zim-0.60/zim/stores/memory.py0000644000175000017500000000703311622405211016103 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Store module that keeps a tree of pages in memory. See StoreClass in zim.stores for the API documentation. FIXME document nodetree FIXME document subclassing ''' from zim.formats import get_format from zim.notebook import Page, LookupError, PageExistsError from zim.stores import StoreClass class Node(object): __slots__ = ('basename', 'text', 'children') def __init__(self, basename, text=None): self.basename = basename self.text = text self.children = [] class MemoryStore(StoreClass): def __init__(self, notebook, path): '''Construct a memory store. Pass args needed for StoreClass init. ''' StoreClass.__init__(self, notebook, path) self.format = get_format('wiki') # TODO make configable self._nodetree = [] self.readonly = False def set_node(self, path, text): '''Sets node for 'page' and return it.''' node = self.get_node(path, vivificate=True) node.text = text return node def get_node(self, path, vivificate=False): '''Returns node for page 'name' or None. If 'vivificate' is True nodes are created on the fly. ''' assert path != self.namespace, 'Can not get node for root namespace' name = path.relname(self.namespace) names = name.split(':') # list with names branch = self._nodetree # list of page nodes while names: n = names.pop(0) # get next item node = None for leaf in branch: if leaf.basename == n: node = leaf break if node is None: if vivificate: node = Node(basename=n) branch.append(node) else: return None branch = node.children return node def get_page(self, path): node = self.get_node(path) return self._build_page(path, node) def _build_page(self, path, node): if node is None: text = None haschildren = False else: text = node.text haschildren = bool(node.children) page = Page(path, haschildren) if text: page.readonly = False page.set_parsetree(self.format.Parser().parse(text)) page.modified = False page.readonly = self.readonly return page def get_pagelist(self, path): if path == self.namespace: nodes = self._nodetree else: node = self.get_node(path) if node is None: return # implicit generate empty list else: nodes = node.children for node in nodes: childpath = path + node.basename yield self._build_page(childpath, node) def store_page(self, page): text = self.format.Dumper().dump(page.get_parsetree()) self.set_node(page, text) page.modified = False def move_page(self, path, newpath): node = self.get_node(path) if node is None: raise LookupError, 'No such page: %s' % path.name newnode = self.get_node(newpath) if not newnode is None: raise PageExistsError, 'Page already exists: %s' % newpath.name self.delete_page(path) newnode = self.get_node(newpath, vivificate=True) newnode.text = node.text newnode.children = node.children # children def delete_page(self, path): # Make sure not to destroy the actual content, we are used by # move_page, which could be keeping a reference to the content node = self.get_node(path) if node is None: return False parent = path.parent if parent.isroot: self._nodetree.remove(node) else: pnode = self.get_node(parent) pnode.children.remove(node) if not (pnode.text or pnode.children): self.delete_page(parent) # recurs to cleanup empty parent if isinstance(path, Page): path.haschildren = False path.set_parsetree(None) path.modified = False return True zim-0.60/zim/stores/files.py0000644000175000017500000002544712032004674015712 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Store module for storing pages as files. With this store each page maps to a single text file. Sub-pages and attachments go into a directory of the same name as the page. So page names are mapped almost one on one to filesystem paths:: page notebook_folder/page.txt page:subpage notebook_folder/page/subpage.txt (The exact file extension can be determined by the source format used.) ''' import sys import logging import zim.fs import zim.datetimetz as datetime from zim.fs import File, Dir, FilteredDir, FileNotFoundError from zim.async import AsyncOperation from zim.formats import get_format from zim.notebook import Path, Page, LookupError, PageExistsError from zim.stores import StoreClass, encode_filename, decode_filename from zim.config import HeadersDict from zim.formats.wiki import WIKI_FORMAT_VERSION # FIXME hard coded preference for wiki format logger = logging.getLogger('zim.stores.files') class FilesStore(StoreClass): def __init__(self, notebook, path, dir=None): '''Constructor @param notebook: a L{Notebook} object @param path: a L{Path} object for the mount point within the notebook @keyword dir: a L{Dir} object When no dir is given and the notebook has a dir already the dir is derived based on the path parameter. In the easiest case when path is the root, the notebook dir is copied. ''' StoreClass.__init__(self, notebook, path) self.dir = dir if not self.store_has_dir(): raise AssertionError, 'File store needs directory' # not using assert here because it could be optimized away self.format = get_format('wiki') # TODO make configurable def _get_file(self, path): '''Returns a File object for a notebook path''' assert path != self.namespace, 'Can not get a file for the toplevel namespace' name = path.relname(self.namespace) filepath = encode_filename(name)+'.txt' # FIXME hard coded extension file = self.dir.file(filepath) file.checkoverwrite = True file.endofline = self.notebook.endofline return file def _get_dir(self, path): '''Returns a dir object for a notebook path''' if path == self.namespace: return self.dir else: name = path.relname(self.namespace) dirpath = encode_filename(name) return self.dir.subdir(dirpath) def get_page(self, path): file = self._get_file(path) dir = self._get_dir(path) return FileStorePage(path, source=file, folder=dir, format=self.format) def get_pagelist(self, path): dir = self._get_dir(path) names = set() # collide files and dirs with same name # We skip files with a space in them, because we can not resolve # them uniquely. for file in dir.list(): if file.startswith('.') or file.startswith('_'): continue # no hidden files or directories elif file.endswith('.txt'): # TODO: do not hard code extension if ' ' in file: logger.warn('Ignoring file: "%s" invalid file name', file) else: names.add(decode_filename(file[:-4])) elif zim.fs.isdir( zim.fs.joinpath(dir.path, file) ): if ' ' in file: logger.warn('Ignoring file: "%s" invalid file name', file) else: names.add(decode_filename(file)) else: pass # unknown file type for name in names: # sets are sorted by default yield self.get_page(path + name) def store_page(self, page): # FIXME assert page is ours and page is FilePage page._store() def store_page_async(self, page, lock, callback, data): page._store_async(lock, callback, data) def revert_page(self, page): # FIXME assert page is ours and page is FilePage newpage = self.get_page(page) page.source = newpage.source page.set_parsetree(newpage.get_parsetree()) # use set_parsetree because it triggers ui_object page.modified = False def move_page(self, path, newpath): file = self._get_file(path) dir = self._get_dir(path) if not (file.exists() or dir.exists()): raise LookupError, 'No such page: %s' % path.name newfile = self._get_file(newpath) newdir = self._get_dir(newpath) if file.path.lower() == newfile.path.lower(): if (newfile.exists() and newfile.isequal(file)) \ or (newdir.exists() and newdir.isequal(dir)): # renaming on case-insensitive filesystem pass elif newfile.exists() or newdir.exists(): raise PageExistsError, 'Page already exists: %s' % newpath.name elif newfile.exists() or newdir.exists(): raise PageExistsError, 'Page already exists: %s' % newpath.name if file.exists(): file.rename(newfile) if dir.exists(): if newdir.ischild(dir): # special case where we want to move a page down # into it's own namespace parent = dir.dir tmpdir = parent.new_subdir(dir.basename) dir.rename(tmpdir) tmpdir.rename(newdir) # check if we also moved the file inadvertently if newfile.ischild(dir): movedfile = newdir.file(newfile.basename) movedfile.rename(newfile) else: dir.rename(newdir) def delete_page(self, path): file = self._get_file(path) dir = self._get_dir(path) if not (file.exists() or dir.exists()): return False else: assert file.path.startswith(self.dir.path) assert dir.path.startswith(self.dir.path) file.cleanup() dir.remove_children() dir.cleanup() if isinstance(path, Page): path.haschildren = False # hascontent is determined based on file existence return True def trash_page(self, path): file = self._get_file(path) dir = self._get_dir(path) re = False if file.exists(): if not file.trash(): return False re = True if dir.exists(): re = dir.trash() or re dir.cleanup() if isinstance(path, Page): path.haschildren = False return re # It could be argued that we should use e.g. MD5 checksums to verify # integrity of the page content instead of mtime. It is true the mtime # can be unreliable, for example when files are read from a remote # network filesystem. However calculating the MD5 and refreshing the # index both require an operation on the actual file contents, so it is # more efficient to just re-index whenever the timestamps are out of # sync instead of calculating the MD5 for each page to be checked. def get_pagelist_indexkey(self, path): dir = self._get_dir(path) if dir.exists(): return dir.mtime() else: return None def get_page_indexkey(self, path): file = self._get_file(path) if file.exists(): try: return file.mtime() except OSError: # This should never happen - but it did, see lp:809086 logger.exception('BUG:') return None else: return None def get_attachments_dir(self, path): dir = StoreClass.get_attachments_dir(self, path) if not dir is None: dir = FilteredDir(dir) dir.ignore('*.txt') # FIXME hardcoded extension return dir class FileStorePage(Page): '''Implementation of L{Page} that has a file as source The source is expected to consist of an header section (which have the same format as email headers) and a body that is some dialect of wiki text. Parsing the source file is delayed till the first call to L{get_parsetree()} so creating an object instance does not have the overhead of file system access. @ivar source: the L{File} object for this page @ivar format: the L{zim.formats} sub-module used for parsing the file ''' def __init__(self, path, source=None, folder=None, format=None): assert source and format Page.__init__(self, path, haschildren=folder.exists()) self.source = source self.folder = folder self.format = format self.readonly = not self.source.iswritable() self.properties = None def isequal(self, other): print "IS EQUAL", self, other if not isinstance(other, FileStorePage): return False if self == other: # If object equal by definition they are the equal return True # If we have an existing source check it # If we have an existing folder check it # If either fails we are not equal # If both do not exist we are also not equal ok = False if self.source and self.source.exists(): ok = ( other.source and self.source.isequal(other.source) ) if not ok: return False if self.folder and self.folder.exists(): ok = ( other.folder and self.folder.isequal(other.folder) ) return ok def _source_hascontent(self): return self.source.exists() def _fetch_parsetree(self, lines=None): '''Fetch a parsetree from source or returns None''' #~ print '!! fetch tree', self ## Enable these lines to test error handling in the UI #~ import random #~ if random.random() > 0.5: #~ raise Exception, 'This is a test error' ### try: lines = lines or self.source.readlines() self.properties = HeadersDict() self.properties.read(lines) # TODO: detect other formats by the header as well if 'Wiki-Format' in self.properties: version = self.properties['Wiki-Format'] else: version = 'Unknown' parser = self.format.Parser(version) return parser.parse(lines) except FileNotFoundError: return None def _store(self): lines = self._dump() self._store_lines(lines) self.modified = False def _store_async(self, lock, callback, data): # Get lines before forking a new thread, otherwise the parsetree # could change in a non-atomic way in the GUI in the mean time try: lines = self._dump() except Exception, error: if callback: exc_info = sys.exc_info() callback(False, error, exc_info, data) return else: self.modified = False #~ print '!! STORE PAGE ASYNC in files' operation = AsyncOperation( self._store_lines, (lines,), lock=lock, callback=callback, data=data) operation.start() def _store_lines(self, lines): ## Enable these lines to test error handling in the UI #~ import random #~ if random.random() > 0.5: #~ raise IOError, 'This is a test error' ### if lines: self.source.writelines(lines) else: # Remove the file - this is not the same as remove_page() self.source.cleanup() return True # Need to return True for async callback def _dump(self): '''Returns the page source''' tree = self.get_parsetree() if tree is None: raise AssertionError, 'BUG: Can not store a page without content' #~ print 'STORE', tree.tostring() if tree.hascontent: new = False if self.properties is None: self.properties = HeadersDict() new = True self.properties['Content-Type'] = 'text/x-zim-wiki' self.properties['Wiki-Format'] = WIKI_FORMAT_VERSION if new: now = datetime.now() self.properties['Creation-Date'] = now.isoformat() # Note: No "Modification-Date" here because it causes conflicts # when merging branches with version control, use mtime from filesystem # If we see this header, remove it because it will not be updated. try: del self.properties['Modification-Date'] except: pass lines = self.properties.dump() lines.append('\n') lines.extend(self.format.Dumper().dump(tree)) return lines else: return [] zim-0.60/zim/stores/xml.py0000644000175000017500000000577111622405211015402 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''This module reads an XML file defining zim pages. For now the only XML tags which are supported are 'section' and 'page'. The 'section' tag serves as a container for multiple pages. The 'page' tag serves as a container for the page content plus any sub-pages. Each page should have an attribute 'name' giving it's basename, so the file can look like this::
Some text in page Foo This is text in page 'Foo:Bar'
We read the whole file to memory, which puts certain limits on scalability. ''' # FUTURE: This module does not support attachments in the xml data import zim.stores.memory # importing class from this module makes get_store() fail from zim.formats import get_format, ElementTreeModule from zim.notebook import Path from zim.parsing import TextBuffer class XMLStore(zim.stores.memory.MemoryStore): properties = { 'read-only': True } def __init__(self, notebook, path, file=None): zim.stores.memory.MemoryStore.__init__(self, notebook, path) self.file = file if not self.store_has_file(): raise AssertionError, 'XMl store needs file' # not using assert here because it could be optimized away self.format = get_format('wiki') # FIXME store format in XML header if self.file.exists(): self.parse(self.file.read()) def store_page(self, page): memory.Store.store_page(self, page) self.file.writelines(self.dump()) def parse(self, content): if isinstance(content, list): content = ''.join(content) target = MemoryStoreTreeBuilder(self) builder = ElementTreeModule.XMLTreeBuilder(target=target) builder.feed(content) builder.close() def dump(self): text = TextBuffer([ u'\n', u'
\n' ]) for node in self._nodetree: text += self._dump_node(node) text.append(u'
\n') return text.get_lines() def _dump_node(self, node): text = [u'\n' % node.basename] if node.text: text.append(node.text) for n in node.children: text += self._dump_node(n) # recurs text.append('\n') return text class MemoryStoreTreeBuilder(object): def __init__(self, store): self.store = store self.path = Path(':') self.stack = [] def start(self, tag, attrib): if tag == 'section': pass elif tag == 'page': assert 'name' in attrib self.path = self.path + attrib['name'] node = self.store.get_node(self.path, vivificate=True) self.stack.append(node) else: assert False, 'Unknown tag' def data(self, data): if self.stack: node = self.stack[-1] if node.text: node.text += data else: node.text = data def end(self, tag): if tag == 'section': pass else: assert self.stack self.path = self.path.parent node = self.stack.pop() if node.text and node.text.isspace(): node.text = '' elif node.text: node.text = unicode(node.text.strip('\n') + '\n') def close(self): pass zim-0.60/zim/fs.py0000664000175000017500000017104312132472704013701 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Module with basic filesystem objects. This module must be used by all other zim modules for filesystem interaction. It takes care of proper encoding file paths (system dependent) and file contents (UTF-8) and implements a number of sanity checks. The main classes are L{File} and L{Dir} which implement file and folder objects. There is also a singleton object to represent the whole filesystem, whichprovides signals when a file or folder is created, moved or deleted. This is stored in L{zim.fs.FS}. ''' # From the python doc: If you're starting with a Python file object f, first # do f.flush(), and then do os.fsync(f.fileno()), to ensure that all internal # buffers associated with f are written to disk. Availability: Unix, and # Windows starting in 2.2.3. # # (Remember the ext4 issue with truncated files in case of failure within # 60s after write. This way of working should prevent that kind of issue.) # ---- # Unicode notes from: http://kofoto.rosdahl.net/wiki/UnicodeInPython # no guarantees that this is correct, but most detailed info I could find. # # On Unix, the file system encoding is taken from the locale settings. # On Windows, the encoding is always mbcs, which indicates that the # "wide" versions of API calls should be used. # # Note: File system operations raise a UnicodeEncodeError if given a # path that can't be encoded in the encoding returned by # sys.getfilesystemencoding(). # # os.listdir(u"path") returns Unicode strings for names that # can be decoded with sys.getfilesystemencoding() but silently returns # byte strings for names that can't be decoded. That is, the return # value of os.listdir(u"path") is potentially a mixed list of Unicode # and byte strings. # # os.readlink chokes on Unicode strings that aren't coercible to the # default encoding. The argument must therefore be a byte string. # (Not applicable to Windows.) # # glob.glob(u"pattern") does not return Unicode strings. # # On Unix, os.path.abspath throws UnicodeDecodeError when given a # Unicode string with a relative path and os.getcwd() returns a # non-ASCII binary string (or rather: a # non-sys.getdefaultencoding()-encoded binary string). Therefore, the # argument must be a byte string. On Windows, however, the argument # must be a Unicode string so that the "wide" API calls are used. # # os.path.realpath behaves the same way as os.path.abspath. # # os.path.expanduser (on both UNIX and Windows) doesn't handle Unicode # when ~ expands to a non-ASCII path. Therefore, a byte string must be # passed in and the result decoded. # # Environment variables in the os.environ dictionary are byte strings # (both names and values). # So we need to encode paths before handing them over to these # filesystem functions and catch any UnicodeEncodeError errors. # Also we use this encoding for decoding filesystem paths. However if # we get some unexpected encoding from the filesystem we are in serious # trouble, as it will be difficult to resolve. So we refuse to handle # files with inconsistent encoding. # # Fortunately the only place where we (should) get arbitrary unicode # paths are page names, so we should apply url encoding when mapping # page names to file names. Seems previous versions of zim simply # failed in this case when the page name contained characters outside # of the set supported by the encoding supported. # # Seems zim was broken before for non-utf-8 filesystems as soon as you # use characters in page names that did not fit in the filesystem # encoding scheme. So no need for compatibility function, just try to # do the right thing. # # As a special case we map ascii to utf-8 because LANG=C will set encoding # to ascii and this is usually not what the user intended. Also utf-8 # is the most common filesystem encoding on modern operating systems. # Note that we do this logic for the filesystem encoding - however the # file contents remain utf-8. # TODO could try fallback to locale if decoding utf-8 fails for file contents # From other sources: # about os.path.supports_unicode_filenames: # The only two platforms that currently support unicode filenames properly # are Windows NT/XP and MacOSX, and for one of them # os.path.supports_unicode_filenames returns False :( # see http://python.org/sf/767645 # So don't rely on it. # ---- # It could be considered to use a weakref dictionary to ensure the same # identity for objects representing the same physical file. (Like we do # for page objects in zim.notebook.) However this is not done for a good # reason: each part of the code that uses a specific file must do it's # own checks to detect if the file was changed outside it's control. # So it is e.g. possible to have multiple instances of File() which # represent the same file but independently manage the mtime and md5 # checksums to ensure the file is what they think it should be. # # TODO - we could support weakref for directories to allow locking via # the dir object from __future__ import with_statement import gobject import os import re import sys import shutil import errno import codecs import logging from zim.errors import Error, TrashNotSupportedError, TrashCancelledError from zim.parsing import url_encode, url_decode from zim.async import AsyncOperation, AsyncLock from zim.signals import SignalEmitter logger = logging.getLogger('zim.fs') #: 'gio' library is imported for optional features, like trash gio = None try: import gio if not gio.File.trash: gio = None except ImportError: pass if not gio: logger.info("Trashing of files not supported, could not import 'gio'") logger.info('No file monitor support - changes will go undetected') xdgmime = None mimetypes = None try: import xdg.Mime as xdgmime except ImportError: if os.name != 'nt': logger.warn("Can not import 'xdg.Mime' - falling back to 'mimetypes'") else: pass # Ignore this error on Windows; doesn't come with xdg.Mime import mimetypes #: Extensions to determine image mimetypes - used in L{File.isimage()} IMAGE_EXTENSIONS = ( # Gleaned from gtk.gdk.get_formats() 'bmp', # image/bmp 'gif', # image/gif 'icns', # image/x-icns 'ico', # image/x-icon 'cur', # image/x-icon 'jp2', # image/jp2 'jpc', # image/jp2 'jpx', # image/jp2 'j2k', # image/jp2 'jpf', # image/jp2 'jpeg', # image/jpeg 'jpe', # image/jpeg 'jpg', # image/jpeg 'pcx', # image/x-pcx 'png', # image/png 'pnm', # image/x-portable-anymap 'pbm', # image/x-portable-anymap 'pgm', # image/x-portable-anymap 'ppm', # image/x-portable-anymap 'ras', # image/x-cmu-raster 'tga', # image/x-tga 'targa', # image/x-tga 'tiff', # image/tiff 'tif', # image/tiff 'wbmp', # image/vnd.wap.wbmp 'xbm', # image/x-xbitmap 'xpm', # image/x-xpixmap 'wmf', # image/x-wmf 'apm', # image/x-wmf 'svg', # image/svg+xml 'svgz', # image/svg+xml 'svg.gz', # image/svg+xml ) ENCODING = sys.getfilesystemencoding() #: file system encoding for paths if ENCODING.upper() in ( 'ASCII', 'US-ASCII', 'ANSI_X3.4-1968', 'ISO646-US', # some aliases for ascii 'LATIN1', 'ISO-8859-1', 'ISO_8859-1', 'ISO_8859-1:1987', # aliases for latin1 ): logger.warn('Filesystem encoding is set to ASCII or Latin1, using UTF-8 instead') ENCODING = 'utf-8' if ENCODING == 'mbcs': # Encoding 'mbcs' means we run on windows and filesystem can handle utf-8 natively # so here we just convert everything to unicode strings def encode(path): if isinstance(path, unicode): return path else: return unicode(path) def decode(path): if isinstance(path, unicode): return path else: return unicode(path) else: # Here we encode files to filesystem encoding. Fails if encoding is not possible. def encode(path): if isinstance(path, unicode): try: return path.encode(ENCODING) except UnicodeEncodeError: raise Error, 'BUG: invalid filename %s' % path else: return path # assume encoding is correct def decode(path): if isinstance(path, unicode): return path # assume encoding is correct else: try: return path.decode(ENCODING) except UnicodeDecodeError: raise Error, 'BUG: invalid filename %s' % path def isabs(path): '''Wrapper for C{os.path.isabs}. @param path: a file system path as string @returns: C{True} when the path is absolute instead of a relative path ''' return path.startswith('file:/') \ or path.startswith('~') \ or os.path.isabs(path) def isdir(path): '''Wrapper for C{os.path.isdir()}, fixes encoding. @param path: a file system path as string @returns: C{True} when the path is an existing dir ''' return os.path.isdir(encode(path)) def isfile(path): '''Wrapper for C{os.path.isfile()}, fixes encoding. @param path: a file system path as string @returns: C{True} when the path is an existing file ''' return os.path.isfile(encode(path)) def joinpath(*parts): '''Wrapper for C{os.path.join()} @param parts: path elements @returns: the same paths joined with the proper path separator ''' return os.path.join(*parts) def expanduser(path): '''Wrapper for C{os.path.expanduser()} to get encoding right''' if ENCODING == 'mbcs': # This method is an exception in that it does not handle unicode # directly. This will cause and error when user name contains # non-ascii characters. See bug report lp:988041. # But also mbcs encoding does not handle all characters, # so only encode home part parts = path.replace('\\', '/').strip('/').split('/') # parts[0] now is "~" or "~user" if isinstance(path, unicode): part = parts[0].encode('mbcs') part = os.path.expanduser(part) parts[0] = part.decode('mbcs') else: # assume it is compatible parts[0] = os.path.expanduser(parts[0]) return '/'.join(parts) else: # Let encode() handle the unicode encoding return decode(os.path.expanduser(encode(path))) def get_tmpdir(): '''Get a folder in the system temp dir for usage by zim. This zim specific temp folder has permission set to be readable only by the current users, and is touched if it didn't exist yet. Used as base folder by L{TmpFile}. @returns: a L{Dir} object for the zim specific tmp folder ''' import tempfile from zim.config import get_environ root = tempfile.gettempdir() dir = Dir((root, 'zim-%s' % get_environ('USER'))) dir.touch(mode=0700) # Limit to single user os.chmod(dir.path, 0700) # Limit to single user when dir already existed return dir def normalize_file_uris(path): '''Function to deal with invalid or non-local file URIs. Translates C{file:/} to the proper C{file:///} form and replaces URIs of the form C{file://host/share} to C{smb://host/share}. @param path: a filesystem path or URL @returns: the proper URI or the original input path ''' if path.startswith('file:///') \ or path.startswith('file://localhost/'): return path elif path.startswith('file://'): return 'smb://' + path[7:] elif path.startswith('file:/'): return 'file:///' + path[6:] else: return path def normalize_win32_share(path): '''Translates paths for windows shares in the platform specific form. So on windows it translates C{smb://} URLs to C{\\host\share} form, and vice versa on all other platforms. Just returns the original path if it was already in the right form, or when it is not a path for a share drive. @param path: a filesystem path or URL @returns: the platform specific path or the original input path ''' if os.name == 'nt': if path.startswith('smb://'): # smb://host/share/.. -> \\host\share\.. path = path[4:].replace('/', '\\') path = url_decode(path) else: if path.startswith('\\\\'): # \\host\share\.. -> smb://host/share/.. path = 'smb:' + url_encode(path.replace('\\', '/')) return path def lrmdir(path): '''Wrapper for C{os.rmdir} that also knows how to unlink symlinks. Fails when the folder is not a link and is not empty. @param path: a file system path as string ''' try: os.rmdir(path) except OSError: if os.path.islink(path) and os.path.isdir(path): os.unlink(path) else: raise def cleanup_filename(name): '''Removes all characters in 'name' that are not allowed as part of a file name. This function is intended for e.g. config files etc. B{not} for page files in a store. For file system filenames we can not use: '\\', '/', ':', '*', '?', '"', '<', '>', '|' And we also exclude "\\t" and "\\n". @param name: the filename as string @returns: the name with invalid characters removed ''' for char in ("/", "\\", ":", "*", "?", '"', "<", ">", "|", "\t", "\n"): name = name.replace(char, '') return name def format_file_size(bytes): '''Returns a human readable label for a file size E.g. C{1230} becomes C{"1.23kb"}, idem for "Mb" and "Gb" @param bytes: file size in bytes as integer @returns: size as string ''' for unit, label in ( (1000000000, 'Gb'), (1000000, 'Mb'), (1000, 'kb'), ): if bytes >= unit: size = float(bytes) / unit if size < 10: return "%.2f%s" % (size, label) elif size < 100: return "%.1f%s" % (size, label) else: return "%.0f%s" % (size, label) else: return str(bytes) + 'b' def _md5(content): import hashlib m = hashlib.md5() if isinstance(content, basestring): m.update(content) else: for l in content: m.update(l) return m.digest() class PathLookupError(Error): '''Error raised when there is an error finding the specified path''' pass # TODO description class FileWriteError(Error): '''Error raised when we can not write a file. Either due to file permissions or e.g. because it is detected the file changed on disk. ''' pass # TODO description class FileNotFoundError(PathLookupError): '''Error raised when a file does not exist that is expected to exist. @todo: reconcile this class with the NoSuchFileError in zim.gui ''' def __init__(self, file): self.file = file self.msg = _('No such file: %s') % file.path # T: message for FileNotFoundError class FileUnicodeError(Error): '''Error raised when there is an issue decoding the file contents. Typically due to different encoding where UTF-8 is expected. ''' def __init__(self, file, error): self.file = file self.error = error self.msg = _('Could not read: %s') % file.path # T: message for FileUnicodeError (%s is the file name) self.description = _('This usually means the file contains invalid characters') # T: message for FileUnicodeError self.description += '\n\n' + _('Details') + ':\n' + unicode(error) # T: label for detailed error # TODO actually hook the signal for deleting files and folders class FSSingletonClass(gobject.GObject): '''Class used for the singleton 'zim.fs.FS' instance @signal: C{path-created (L{FilePath})}: Emitted when a new file or folder has been created @signal: C{path-moved (L{FilePath}, L{FilePath})}: Emitted when a file or folder has been moved @signal: C{path-deleted (L{FilePath})}: Emitted when a file or folder has been deleted @todo: fix the FS signals for folders as well ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'path-created': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'path-moved': (gobject.SIGNAL_RUN_LAST, None, (object, object)), 'path-deleted': (gobject.SIGNAL_RUN_LAST, None, (object,)), } def __init__(self): gobject.GObject.__init__(self) self._lock = AsyncLock() def get_async_lock(self, path): '''Get an L{AsyncLock} for filesytem operations on a path @param path: a L{FilePath} object @returns: an L{AsyncLock} object ''' # FUTURE: we may actually use path to allow parallel async # operations for files & folders that do not belong to the # same tree. Problem there is that we do not acquire the lock # in this method. So we need a new kind of lock type that can # track dependency on other locks. # Make sure to allow for the fact that other objects can keep # the lock that are returned here indefinitely for re-use. # But for now we keep things simple. assert isinstance(path, FilePath) return self._lock # Need to register classes defining gobject signals gobject.type_register(FSSingletonClass) #: Singleton object for the system filesystem - see L{FSSingletonClass} FS = FSSingletonClass() class UnixPath(SignalEmitter): '''Base class for Dir and File objects, represents a file path @ivar path: the absolute file path as string @ivar encodedpath: the absolute file path as string in local file system encoding (should only be used by low-level functions) @ivar user_path: the absolute file path relative to the user's C{HOME} folder or C{None} @ivar uri: the C{file://} URI for this path @ivar basename: the basename of the path @ivar dirname: the dirname of the path @ivar dir: L{Dir} object for the parent folder @signal: C{changed (file, other_file, event_type)}: emitted when file changed - availability based on C{gio} support for file monitors on this platform ''' # TODO __signals__ def __init__(self, path): '''Constructor @param path: an absolute file path, file URL, L{FilePath} object or a list of path elements. When a list is given, the first element is allowed to be an absolute path, URL or L{FilePath} object as well. ''' self._serialized = None if isinstance(path, FilePath): self.path = path.path self.encodedpath = path.encodedpath return try: if isinstance(path, (list, tuple)): path = map(unicode, path) # Flatten objects - strings should be unicode or ascii already path = os.path.sep.join(path) # os.path.join is too intelligent for it's own good # just join with the path separator. else: path = unicode(path) # make sure we can decode except UnicodeDecodeError: raise Error, 'BUG: invalid input, file names should be in ascii, or given as unicode' if path.startswith('file:/'): path = self._parse_uri(path) elif path.startswith('~'): path = expanduser(path) if path.startswith('~'): raise AssertionError, 'Could not expand path "%s" this could mean $HOME is not set' % path self._set_path(path) # overloaded in WindowsPath def serialize_zim_config(self): '''Returns the file path as string for serializing the object''' if self._serialized is None: self._serialized = self.user_path or self.path return self._serialized @classmethod def new_from_zim_config(klass, string): '''Returns a new object based on the string representation for that path ''' return klass(string) @staticmethod def _parse_uri(uri): # Spec is file:/// or file://host/ # But file:/ is sometimes used by non-compliant apps # Windows uses file:///C:/ which is compliant if uri.startswith('file:///'): uri = uri[7:] elif uri.startswith('file://localhost/'): uri = uri[16:] elif uri.startswith('file://'): assert False, 'Can not handle non-local file uris' elif uri.startswith('file:/'): uri = uri[5:] else: assert False, 'Not a file uri: %s' % uri return url_decode(uri) def _set_path(self, path): # For Unix we need to use proper encoding self.encodedpath = os.path.abspath(encode(path)) self.path = decode(self.encodedpath) def __iter__(self): parts = self.split() for i in range(1, len(parts)): path = os.path.join(*parts[0:i]) yield Dir(path) #~ if self.isdir(): yield Dir(self.path) #~ else: #~ yield self def __str__(self): return self.path def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.path) def __add__(self, other): '''Concatenates paths, only creates objects of the same class. See L{Dir.file()} and L{Dir.subdir()} instead to create other objects. ''' return self.__class__((self, other)) def __eq__(self, other): return self.path == other.path def __ne__(self, other): return not self.__eq__(other) @property def basename(self): '''Basename property''' return os.path.basename(self.path) # encoding safe @property def dirname(self): '''Dirname property''' return os.path.dirname(self.path) # encoding safe @property def user_path(self): '''User_path property''' dir = Dir('~') # FIXME: Should we cache this folder somewhere ? if self.ischild(dir): return '~/' + self.relpath(dir) else: return None @property def uri(self): '''File uri property''' return 'file://' + url_encode(self.path) @property def dir(self): '''Returns a L{Dir} object for the parent dir''' path = os.path.dirname(self.path) # encoding safe return Dir(path) def _setup_signal(self, signal): if signal != 'changed' \ or not gio: return try: self._teardown_signal(signal) # just to be sure file = gio.File(uri=self.uri) self._gio_file_monitor = file.monitor() self._gio_file_monitor.connect('changed', self._do_changed) except: logger.exception('Error while setting up file monitor') def _teardown_signal(self, signal): if signal != 'changed' \ or not hasattr(self, '_gio_file_monitor') \ or not self._gio_file_monitor: return try: self._gio_file_monitor.cancel() self._gio_file_monitor = None except: logger.exception('Error while tearing down file monitor') def _do_changed(self, filemonitor, file, other_file, event_type): self.emit('changed', None, None) # TODO translate otherfile and eventtype def exists(self): '''Check if a file or folder exists. @returns: C{True} if the file or folder exists @implementation: must be implemented by sub classes ''' raise NotImplementedError def iswritable(self): '''Check if a file or folder is writable. Uses permissions of parent folder if the file or folder does not (yet) exist. @returns: C{True} if the file or folder is writable ''' if self.exists(): return os.access(self.encodedpath, os.W_OK) else: return self.dir.iswritable() # recurs def _stat(self): return os.stat(self.encodedpath) def mtime(self): '''Get the modification time of the file path. @returns: the mtime timestamp ''' return self._stat().st_mtime def size(self): '''Get file size in bytes See L{format_file_size()} to get a human readable label @returns: file size in bytes ''' return self._stat().st_size def isequal(self, other): '''Check file paths are equal based on stat results (inode number etc.). Intended to detect when two files or dirs are the same on case-insensitive filesystems. Does not explicitly check the content is the same. If you just want to know if two files have the same content, see L{File.compare()} @param other: an other L{FilePath} object @returns: C{True} when the two paths are one and the same file ''' # Do NOT assume paths are the same - could be hard link # or it could be a case-insensitive filesystem try: stat_result = os.stat(self.encodedpath) other_stat_result = os.stat(other.encodedpath) except OSError: return False else: return stat_result == other_stat_result def split(self): '''Split the parts of the path on the path separator. If the OS uses the concept of a drive the first part will include the drive. (So using split() to count the number of path elements will not be robust for the path "/".) @returns: a list of path elements ''' drive, path = os.path.splitdrive(self.path) parts = path.replace('\\', '/').strip('/').split('/') parts[0] = drive + os.path.sep + parts[0] return parts def relpath(self, reference, allowupward=False): '''Get a relative path for this file path with respect to another path. This method always returns paths using "/" as separator, even on windows. @param reference: a reference L{FilePath} @param allowupward: if C{True} the relative path is allowed to start with 'C{../}', if C{False} the reference should be a parent folder of this path. @returns: a relative file path @raises AssertionError: when C{allowupward} is C{False} and C{reference} is not a parent folder ''' sep = os.path.sep # '/' or '\' refdir = reference.path + sep if allowupward and not self.path.startswith(refdir): parent = self.commonparent(reference) if parent is None: return None # maybe on different drive under win32 i = len(parent.path) j = refdir[i:].strip(sep).count(sep) + 1 reference = parent path = '../' * j else: if not self.path.startswith(refdir): raise AssertionError, 'Not a parent folder' path = '' i = len(reference.path) path += self.path[i:].lstrip(sep).replace(sep, '/') return path def commonparent(self, other): '''Find a comon parent folder between two file paths. @param other: another L{FilePath} @returns: a L{Dir} object for the common parent folder, or C{None} when there is no common parent ''' path = os.path.commonprefix((self.path, other.path)) # encoding safe i = path.rfind(os.path.sep) # win32 save... if i >= 0: return Dir(path[:i+1]) else: # different drive ? return None def ischild(self, parent): '''Check if this path is a child path of a folder @returns: C{True} if this path is a child path of C{parent} ''' return self.path.startswith(parent.path + os.path.sep) def isdir(self): '''Check if this path is a folder or not. Used to detect if e.g. a L{File} object should have really been a L{Dir} object. @returns: C{True} when this path is a folder ''' return os.path.isdir(self.encodedpath) def rename(self, newpath): '''Rename (move) the content this file or folder to another location. This will B{not} change the current file path, so the object keeps pointing to the old location. @param newpath: the destination C{FilePath} which can either be a file or a folder. @emits: path-moved ''' # Using shutil.move instead of os.rename because move can cross # file system boundaries, while rename can not logger.info('Rename %s to %s', self, newpath) if self.path == newpath.path: raise AssertionError, 'Renaming %s to itself !?' % self.path with FS.get_async_lock(self): # Do we also need a lock for newpath (could be the same as lock for self) ? if newpath.isdir(): if self.isequal(newpath): # We checked name above, so must be case insensitive file system # but we still want to be able to rename to other case, so need to # do some moving around tmpdir = self.dir.new_subdir(self.basename) shutil.move(self.encodedpath, tmpdir.encodedpath) shutil.move(tmpdir.encodedpath, newpath.encodedpath) else: # Needed because shutil.move() has different behavior for this case raise AssertionError, 'Folder already exists: %s' % newpath.path else: # normal case newpath.dir.touch() shutil.move(self.encodedpath, newpath.encodedpath) FS.emit('path-moved', self, newpath) self.dir.cleanup() def trash(self): '''Trash a file or folder by moving it to the system trashcan if supported. Depends on the C{gio} library. @returns: C{True} when succesful @raises TrashNotSupportedError: if trashing is not supported or failed. @raises TrashCancelledError: if trashing was cancelled by the user ''' if not gio: raise TrashNotSupportedError, 'gio not imported' if self.exists(): logger.info('Move %s to trash' % self) f = gio.File(uri=self.uri) try: ok = f.trash() except gobject.GError, error: if error.code == gio.ERROR_CANCELLED \ or (os.name == 'nt' and error.code == 0): # code 0 observed on windows for cancel logger.info('Trash operation cancelled') raise TrashCancelledError, 'Trashing cancelled' elif error.code == gio.ERROR_NOT_SUPPORTED: raise TrashNotSupportedError, 'Trashing failed' else: raise error else: if not ok: raise TrashNotSupportedError, 'Trashing failed' return True else: return False class WindowsPath(UnixPath): '''Base class for Dir and File objects, represents a file path on windows. ''' def _set_path(self, path): # For windows unicode is supported natively, # but may need to strip leading / for absolute paths if re.match(r'^[/\\]+[A-Za-z]:[/\\]', path): path = path.lstrip('/').lstrip('\\') self.path = os.path.abspath(path) self.encodedpath = self.path # so encodedpath in unicode @property def uri(self): '''File uri property with win32 logic''' # win32 paths do not start with '/', so add another one # and avoid url encoding the second ":" in "file:///C:/..." path = self.path.replace('\\', '/') if re.match('[A-Za-z]:/', path): return 'file:///' + path[:2] + url_encode(path[2:]) else: return 'file:///' + url_encode(path) # Determine which base class to use for classes below if os.name == 'posix': FilePath = UnixPath elif os.name == 'nt': FilePath = WindowsPath else: logger.critical('os name "%s" unknown, falling back to posix', os.name) FilePath = UnixPath class Dir(FilePath): '''Class representing a single file system folder''' def __eq__(self, other): if isinstance(other, Dir): return self.path == other.path else: return False def exists(self): return os.path.isdir(self.encodedpath) def list(self, glob=None, includehidden=False, includetmp=False, raw=False): '''List the file contents @param glob: a file name glob to filter the listed files, e.g C{"*.png"} @param includehidden: if C{True} include hidden files (e.g. names starting with "."), ignore otherwise @param includetmp: if C{True} include temporary files (e.g. names ending in "~"), ignore otherwise @param raw: for filtered folders (C{FilteredDir} instances) setting C{raw} to C{True} will disable filtering @returns: a sorted list of names for files and subdirectories. Will not return names that could not be decoded properly and will throw warnings if those are encountered. Hidden files are silently ignored. ''' files = [] if ENCODING == 'mbcs': # We are running on windows and os.listdir will handle unicode natively assert isinstance(self.encodedpath, unicode) for file in self._list(includehidden, includetmp): if isinstance(file, unicode): files.append(file) else: logger.warn('Ignoring file: "%s" invalid file name', file) else: # If filesystem does not handle unicode natively and path for # os.listdir(path) is _not_ a unicode object, the result will # be a list of byte strings. We can decode them ourselves. assert not isinstance(self.encodedpath, unicode) for file in self._list(includehidden, includetmp): try: files.append(file.decode(ENCODING)) except UnicodeDecodeError: logger.warn('Ignoring file: "%s" invalid file name', file) if glob: expr = _glob_to_regex(glob) files = filter(expr.match, files) files.sort() return files def _list(self, includehidden, includetmp): if self.exists(): files = [] for file in os.listdir(self.encodedpath): if file.startswith('.') and not includehidden: continue # skip hidden files elif (file.endswith('~') or file.startswith('~')) and not includetmp: continue # skip temporary files else: files.append(file) return files else: return [] def walk(self, raw=True): '''Generator that yields all files and folders below this dir as objects. @param raw: see L{list()} @returns: yields L{File} and L{Dir} objects, depth first ''' for name in self.list(raw=raw): path = self.path + os.path.sep + name if os.path.isdir(path): dir = self.subdir(name) yield dir for child in dir.walk(raw=raw): yield child else: yield self.file(name) def get_file_tree_as_text(self, raw=True): '''Returns an overview of files and folders below this dir as text. Used in tests. @param raw: see L{list()} @returns: file listing as string ''' text = '' for child in self.walk(raw=raw): path = child.relpath(self) if isinstance(child, Dir): path += '/' text += path + '\n' return text def touch(self, mode=None): '''Create this folder and any parent folders that do not yet exist. @param mode: creation mode (e.g. 0700) ''' if self.exists(): # Additional check needed because makedirs can not handle # a path like "E:\" on windows (while "E:\foo" works fine) return try: if mode is not None: os.makedirs(self.encodedpath, mode=mode) else: os.makedirs(self.encodedpath) except OSError, e: if e.errno != errno.EEXIST: raise def remove(self): '''Remove this folder, fails if it is not empty.''' logger.info('Remove dir: %s', self) lrmdir(self.encodedpath) def cleanup(self): '''Remove this foldder and any empty parent folders. If the folder does not exist, still check for empty parent folders. Fails silently if the folder is not empty. @returns: C{True} when succesful (so C{False} means it still exists). ''' if not self.exists(): return True try: os.removedirs(self.encodedpath) except OSError: return False # probably dir not empty else: return True def remove_children(self): '''Recursively remove everything below this folder . B{WARNING:} This is quite powerful and can do a lot of damage when executed for the wrong folder, so pleae make sure to double check the dir is actually what you think it is before calling this. ''' assert self.path and self.path != '/' logger.info('Remove file tree: %s', self) for root, dirs, files in os.walk(self.encodedpath, topdown=False): # walk should not decent into symlinked folders by default # remove() and rmdir() both should remove a symlink rather # than the target of the link for name in files: os.remove(os.path.join(root, name)) for name in dirs: lrmdir(os.path.join(root, name)) def copyto(self, dest): '''Recursively copy the contents of this folder. When the destination folder already exists the contents will be merged, so you need to check existence of the destination first if you want a clean new copy. @param dest: a L{Dir} object ''' # We do not use shutil.copytree() because it requires that # the target dir does not exist assert isinstance(dest, Dir) assert not dest == self, 'BUG: trying to copy a dir to itself' logger.info('Copy dir %s to %s', self, dest) def copy_dir(source, target): target.touch() for item in source.list(): child = FilePath((source, item)) if child.isdir(): copy_dir(Dir(child), target.subdir(item)) # recur else: child = File(child) child.copyto(target) copy_dir(self, dest) # TODO - not hooked with FS signals def file(self, path): '''Get a L{File} object for a path below this folder @param path: a (relative) file path as string, tuple or L{FilePath} object. When C{path} is a L{File} object already this method still enforces it is below this folder. So this method can be used as check as well. @returns: a L{File} object @raises PathLookupError: if the path is not below this folder ''' file = self.resolve_file(path) if not file.path.startswith(self.path): raise PathLookupError, '%s is not below %s' % (file, self) return file def resolve_file(self, path): '''Get a L{File} object for a path relative to this folder Like L{file()} but allows the path to start with "../" as well, so can handle any relative path. @param path: a (relative) file path as string, tuple or L{FilePath} object. @returns: a L{File} object ''' assert isinstance(path, (FilePath, basestring, list, tuple)) if isinstance(path, basestring): return File((self.path, path)) elif isinstance(path, (list, tuple)): return File((self.path,) + tuple(path)) elif isinstance(path, File): return path elif isinstance(path, FilePath): return File(path.path) def new_file(self, path): '''Get a L{File} object for a new file below this folder. Like L{file()} but guarantees the file does not yet exist by adding sequential numbers if needed. So the resulting file may have a modified name. @param path: a (relative) file path as string, tuple or L{FilePath} object. @returns: a L{File} object @raises PathLookupError: if the path is not below this folder ''' file = self.file(path) basename = file.basename if '.' in basename: basename, ext = basename.split('.', 1) else: ext = '' dir = file.dir i = 0 while file.exists(): logger.debug('File exists "%s" trying increment', file) i += 1 newname = basename + '%03i' % i if ext: newname += '.' + ext file = dir.file(newname) return file def subdir(self, path): '''Get a L{Dir} object for a path below this folder @param path: a (relative) file path as string, tuple or L{FilePath} object. When C{path} is a L{Dir} object already this method still enforces it is below this folder. So this method can be used as check as well. @returns: a L{Dir} object @raises PathLookupError: if the path is not below this folder ''' dir = self.resolve_dir(path) if not dir.path.startswith(self.path): raise PathLookupError, '%s is not below %s' % (dir, self) return dir def resolve_dir(self, path): '''Get a L{Dir} object for a path relative to this folder Like L{subdir()} but allows the path to start with "../" as well, so can handle any relative path. @param path: a (relative) file path as string, tuple or L{FilePath} object. @returns: a L{Dir} object ''' assert isinstance(path, (FilePath, basestring, list, tuple)) if isinstance(path, basestring): return Dir((self.path, path)) elif isinstance(path, (list, tuple)): return Dir((self.path,) + tuple(path)) elif isinstance(path, Dir): return path elif isinstance(path, FilePath): return Dir(path.path) def new_subdir(self, path): '''Get a L{Dir} object for a new sub-folder below this folder. Like L{subdir()} but guarantees the folder does not yet exist by adding sequential numbers if needed. So the resulting folder may have a modified name. @param path: a (relative) file path as string, tuple or L{FilePath} object. @returns: a L{Dir} object @raises PathLookupError: if the path is not below this folder ''' subdir = self.subdir(path) basename = subdir.basename i = 0 while subdir.exists(): logger.debug('Dir exists "%s" trying increment', subdir) i += 1 newname = basename + '%03i' % i subdir = self.subdir(newname) return subdir def _glob_to_regex(glob): glob = glob.replace('.', '\\.') glob = glob.replace('*', '.*') glob = glob.replace('?', '.?') return re.compile(glob) class FilteredDir(Dir): '''Class implementing a folder with a filtered listing. Can be used to e.g. filter all objects that are also ignored by version control. ''' def __init__(self, path): '''Constructor @param path: an absolute file path, file URL, L{FilePath} object or a list of path elements. When a list is given, the first element is allowed to be an absolute path, URL or L{FilePath} object as well. ''' Dir.__init__(self, path) self._ignore = [] def ignore(self, glob): '''Add a file pattern to ignore @param glob: a file path pattern (e.g. "*.txt") ''' regex = _glob_to_regex(glob) self._ignore.append(regex) def filter(self, name): for regex in self._ignore: if regex.match(name): return False else: return True def list(self, includehidden=False, includetmp=False, raw=False): files = Dir.list(self, includehidden, includetmp) if not raw: files = filter(self.filter, files) return files class UnixFile(FilePath): '''Class representing a single file. This class implements much more complex logic than the default python file objects. E.g. on writing we first write to a temporary files, then flush and sync and finally replace the file we intended to write with the temporary file. This makes it much more difficult to loose file contents when something goes wrong during the writing. Also it implements logic to check the modification time before writing to prevent overwriting a file that was changed on disk in between read and write operations. If this mtime check fails MD5 sums are used to verify before raising an exception (because some share drives do not maintain mtime very precisely). However this check only works when using L{read()}, L{readlines()}, L{write()} or L{writelines()}, but not when calling L{open()} directly. Also this logic is not atomic, so your mileage may vary. The C{*_async()} functions can be used to read or write files in a separate thread. See L{zim.async} for details. An L{AsyncLock} is used to ensure reading and writing is done sequentially between several threads. However, this does not work when using L{open()} directly. ''' # For atomic write we first write a tmp file which has the extension # .zim-new~ when is was written successfully we replace the actual file # with the tmp file. Because rename is atomic on POSIX platforms and # replaces the existing file this either succeeds or not, it can never # truncate the existing file but fail to write the new file. So if writing # fails we should always at least have the old file still present. # If we encounter a left over .zim-new~ we ignore it since it may be # corrupted. # # For Window the behavior is more complicated, see the WindowsFile class # below. # # Note that the mechanism to avoid overwriting files that changed on disks # does not prevent conflicts when two processes try to write to the same # file at the same time. This is a hard problem that is currently not # addressed in this implementation. def __init__(self, path, checkoverwrite=False, endofline=None): '''Constructor @param path: an absolute file path, file URL, L{FilePath} object or a list of path elements. When a list is given, the first element is allowed to be an absolute path, URL or L{FilePath} object as well. @param checkoverwrite: when C{True} this object checks the modification time before writing to prevent overwriting a file that was changed on disk in between read and write operations. @param endofline: the line end style used when writing, can be one of "unix" ('\\n') or "dos" ('\\r\\n'). Whan C{None} the local default is used. ''' FilePath.__init__(self, path) self.checkoverwrite = checkoverwrite self.endofline = endofline self._mtime = None self._lock = FS.get_async_lock(self) def __getstate__(self): # Copy the object's state from self.__dict__ # But remove the unpicklable entries. state = self.__dict__.copy() del state['_lock'] return state def __setstate__(self, state): # Restore instance attributes self.__dict__.update(state) self._lock = FS.get_async_lock(self) def __eq__(self, other): if isinstance(other, File): return self.path == other.path else: return False def exists(self): return os.path.isfile(self.encodedpath) def isimage(self): '''Check if this is an image file. Convenience method that works even when no real mime-type suport is available. If this method returns C{True} it is no guarantee this image type is actually supported by gtk. @returns: C{True} when this is an image file ''' # Quick shortcut to be able to load images in the gui even if # we have no proper mimetype support if '.' in self.basename: _, ext = self.basename.rsplit('.', 1) if ext in IMAGE_EXTENSIONS: return True return self.get_mimetype().startswith('image/') def get_mimetype(self): '''Get the mime-type for this file. Will use the XDG mimetype system if available, otherwise fallsback to the standard library C{mimetypes}. @returns: the mimetype as a string, e.g. "text/plain" ''' if xdgmime: mimetype = xdgmime.get_type(self.path, name_pri=80) return str(mimetype) else: mimetype, encoding = mimetypes.guess_type(self.path, strict=False) if encoding == 'gzip': return 'application/x-gzip' elif encoding == 'bzip': return 'application/x-bzip' elif encoding == 'compress': return 'application/x-compress' else: return mimetype or 'application/octet-stream' def get_endofline(self): '''Get the end-of-line character(s) used for writing this file. @returns: the end-of-line character(s) ''' if self.endofline is None: if isinstance(self, WindowsPath): return '\r\n' else: return '\n' else: assert self.endofline in ('unix', 'dos') if self.endofline == 'dos': return '\r\n' else: return '\n' def open(self, mode='r'): '''Open an IO object for reading or writing. The stream will automatically by encoded or decoded for UTF-8. Opening a non-existing file for writing will cause the whole path to this file to be created on the fly. @param mode: the open mode, either 'r' or 'w' (other modes are not supported) @returns: a file object ''' # When we open for writing, we actually open the tmp file # and return a FileHandle object that will call _on_write() # when it is closed. This handler will take care of replacing # the actual file with the newly written tmp file. assert mode in ('r', 'w') if mode == 'w': if not self.iswritable(): raise FileWriteError, _('File is not writable: %s') % self.path # T: Error message elif not self.exists(): self.dir.touch() else: pass # exists and writable mode += 'b' if mode == 'wb': tmp = self.encodedpath + '.zim-new~' fh = FileHandle(tmp, mode=mode, on_close=self._on_write) else: fh = open(self.encodedpath, mode=mode) # code copied from codecs.open() to wrap our FileHandle objects info = codecs.lookup('utf-8') srw = codecs.StreamReaderWriter( fh, info.streamreader, info.streamwriter, 'strict') srw.encoding = 'utf-8' return srw def _on_write(self): # Handler executed after successful writing the .zim-new~ tmp file # to replace the actual file with the tmp file. # Note that flush() and sync() are already done before close() # # On Unix, for rename() if dest already exists it is replaced in an # atomic operation. And other processes reading our file will not # block moving it :) tmp = self.encodedpath + '.zim-new~' if not os.path.isfile(tmp): raise AssertionError, 'BUG: File should exist: %s' % tmp os.rename(tmp, self.encodedpath) logger.debug('Wrote %s', self) def raw(self): '''Get the raw content without UTF-8 decoding, newline logic, etc. Used to read binary data, e.g. when serving files over www. Note that this function also does not integrates with checking mtime, so intended for read only usage. @returns: file content as string ''' with self._lock: try: fh = open(self.encodedpath, mode='rb') content = fh.read() fh.close() return content except IOError: raise FileNotFoundError(self) def read(self): '''Get the file contents as a string. Takes case of decoding UTF-8 and fixes line endings. @returns: the content as (unicode) string. @raises FileNotFoundError: when the file does not exist. ''' with self._lock: text = self._read() return text def read_async(self, callback=None, data=None): '''Get the file contents asynchronously Like L{read()} but as asynchronous operation. The result will be stored in the async operation as C{operation.result}. @param callback: a callback function for the async operation @param data: data argument for the callback @returns: an L{AsyncOperation} object ''' if not self.exists(): raise FileNotFoundError(self) operation = AsyncOperation( self._read, lock=self._lock, callback=callback, data=data) operation.start() return operation def _read(self): try: file = self.open('r') content = file.read() self._checkoverwrite(content) return content.lstrip(u'\ufeff').replace('\r', '').replace('\x00', '') # Strip unicode byte order mark # Internally we use Unix line ends - so strip out \r # And remove any NULL byte since they screw up parsing except IOError: raise FileNotFoundError(self) except UnicodeDecodeError, error: raise FileUnicodeError(self, error) def readlines(self): '''Get the file contents as a list of lines. Takes case of decoding UTF-8 and fixes line endings. @returns: the content as a list of lines. @raises FileNotFoundError: when the file does not exist. ''' with self._lock: lines = self._readlines() return lines def readlines_async(self, callback=None, data=None): '''Get the file contents asynchronously Like L{readlines()} but as asynchronous operation. The result will be stored in the async operation as C{operation.result}. @param callback: a callback function for the async operation @param data: data argument for the callback @returns: an L{AsyncOperation} object ''' if not self.exists(): raise FileNotFoundError(self) operation = AsyncOperation( self._readlines, lock=self._lock, callback=callback, data=data) operation.start() return operation def _readlines(self): try: file = self.open('r') lines = file.readlines() self._checkoverwrite(lines) return [line.lstrip(u'\ufeff').replace('\r', '').replace('\x00', '') for line in lines] # Strip unicode byte order mark # Internally we use Unix line ends - so strip out \r # And remove any NULL byte since they screw up parsing except IOError: raise FileNotFoundError(self) except UnicodeDecodeError, error: raise FileUnicodeError(self, error) def write(self, text): '''Write file contents from string. This overwrites the current content. Will automatically create all parent folders. If writing fails the file will either have the new content or the old content, but it should not be possible to have the content truncated. @param text: new content as (unicode) string @emits: path-created if the file did not yet exist ''' with self._lock: self._write(text) self._check_isnew() def write_async(self, text, callback=None, data=None): '''Write file content from string asynchronously. Like L{write()} but returns immediately without waiting for the action to be completed. @param text: new content as (unicode) string @param callback: a callback function for the async operation @param data: data argument for the callback @returns: an L{AsyncOperation} object @emits: path-created if the file did not yet exist, after the action is completed ''' #~ print '!! ASYNC WRITE' def mycallback(result, error, *args): if error is None: self._check_isnew() if callback: callback(result, error, *args) operation = AsyncOperation( self._write, (text,), lock=self._lock, callback=mycallback, data=data) operation.start() return operation def _write(self, text): self._assertoverwrite() self._isnew = not os.path.isfile(self.encodedpath) # Put this check here because here we are sure to have a lock endofline = self.get_endofline() if endofline != '\n': text = text.replace('\n', endofline) file = self.open('w') file.write(text) file.close() self._checkoverwrite(text) def _check_isnew(self): # Make sure the 'path-created' signal is emitted in the main # thread, so do not put this in _write(), but call from write() # or from async callback. # Also make sur this is called after lock is released to prevent # deadlock when event handler tries to access the file. if self._isnew: FS.emit('path-created', self) def writelines(self, lines): '''Write file contents from a list of lines. Like L{write()} but input is a list instead of a string. @param lines: new content as list of lines @emits: path-created if the file did not yet exist ''' with self._lock: self._writelines(lines) self._check_isnew() def writelines_async(self, lines, callback=None, data=None): '''Write file content from a list of lines asynchronously. Like L{writelines()} but returns immediately without waiting for the action to be completed. @param lines: new content as list of lines @param callback: a callback function for the async operation @param data: data argument for the callback @returns: an L{AsyncOperation} object @emits: path-created if the file did not yet exist, after the action is completed ''' #~ print '!! ASYNC WRITE' def mycallback(result, error, *args): if error is None: self._check_isnew() if callback: callback(result, error, *args) operation = AsyncOperation( self._writelines, (lines,), lock=self._lock, callback=mycallback, data=data) operation.start() return operation def _writelines(self, lines): self._assertoverwrite() self._isnew = not os.path.isfile(self.encodedpath) # Put this check here because here we are sure to have a lock endofline = self.get_endofline() if endofline != '\n': lines = [line.replace('\n', endofline) for line in lines] file = self.open('w') file.writelines(lines) file.close() self._checkoverwrite(lines) def _checkoverwrite(self, content): # Set properties needed by assertoverwrite for the in-memory object if self.checkoverwrite: self._mtime = self.mtime() self._content = content def _assertoverwrite(self): # When we read a file and than write it, this method asserts the file # did not change in between (e.g. by another process, or another async # function of our own process). We use properties of this object instance # We check the timestamp, if that does not match we check md5 to be sure. # (Sometimes e.g. network filesystems do not maintain timestamps as strict # as we would like.) # # This function should not prohibit writing without reading first. # Also we just write the file if it went missing in between if self._mtime: try: mtime = self.mtime() except OSError: if not os.path.isfile(self.encodedpath): logger.critical('File missing: %s', self.path) return else: raise if not self._mtime == mtime: logger.warn('mtime check failed for %s, trying md5', self.path) if _md5(self._content) != _md5(self.open('r').read()): raise FileWriteError, _('File changed on disk: %s') % self.path # T: error message # Why are we using MD5 here ?? could just compare content... def touch(self): '''Create this file and any parent folders if it does not yet exist. (Parent folders are also created when writing to a file, so you only need to call this method in special cases - e.g. when an external program requires the file to exist.) ''' if self.exists(): return else: with self._lock: io = self.open('w') io.write('') io.close() def remove(self): '''Remove (delete) this file and cleanup any related temporary files we created. This action can not be un-done. Ignores silently if the page did not exist in the first place. ''' logger.info('Remove file: %s', self) with self._lock: if os.path.isfile(self.encodedpath): os.remove(self.encodedpath) tmp = self.encodedpath + '.zim-new~' if os.path.isfile(tmp): os.remove(tmp) def cleanup(self): '''Remove this file and cleanup any empty parent folder. Convenience method calling L{File.remove()} and L{Dir.cleanup()}. ''' self.remove() self.dir.cleanup() def copyto(self, dest): '''Copy this file to another location. Preserves all file attributes (by using C{shutil.copy2()}) @param dest: a L{File} or L{Dir} object for the destination. If the destination is a folder, we will copy to a file below that folder of the same name ''' assert isinstance(dest, (File, Dir)) if isinstance(dest, Dir): assert not dest == self.dir, 'BUG: trying to copy a file to itself' else: assert not dest == self, 'BUG: trying to copy a file to itself' logger.info('Copy %s to %s', self, dest) if isinstance(dest, Dir): dest.touch() else: dest.dir.touch() shutil.copy2(self.encodedpath, dest.encodedpath) # TODO - not hooked with FS signals def compare(self, other): '''Check if file contents are the same. This differs from L{isequal()} because files can be different physical locations. @param other: another L{File} object @returns: C{True} when the files have the same content ''' # TODO: can be more efficient, e.g. by checking stat size first # also wonder if MD5 is needed here ... could just compare text return _md5(self.read()) == _md5(other.read()) class WindowsFile(UnixFile): '''Class representing a single file on windows. See L{UnixFile} for API documentation. ''' # For the "atomic" write on Windows we use .zim-new~ and .zim-orig~. # When writing a new file, the sequence is the same as on Unix: we # write a tmp file and move it into place. However on windows the # rename() function does not allow replacing an existing file, so # there is no atomic operation to move the tmp file into place. # What we do instead: # # 1. Write file.zim-new~ # 2. Move file to file.zim-orig~ # 3. Move file.zim-new~ to file # 4. Remove file.zim-orig~ # # But now we have to consider recovering the file if any of these # steps fails: # * If we have .zim-new~ and the actual file either step 1 or 2 # failed, in this case the .zim-new~ file can be corrupted, so # keep the file itself # * If we have .zim-new~ and .zim-orig~ but the actual file is # missing, step 3 failed. We use .zim-new~ because probably # step 1 succeeded. # * If we have the actual file and .zim-orig~ step 4 failed, we # can throw away the .zim-orig~ file. # * If we only have a .zim-orig~ file step 4 failed, was not # recovered and maybe the file was removed (remove cleans up the # .zim-new~). So we can not recover - file does not exist. # * If only have a .zim-new~ file maybe writing a new file failed, # the .zim-new~ file can be corrupted - so we can not recover # * If we have all 3 files some combination of actions happened, # keep using the actual file. # # So this results in two rules: # # 1. if the actual file exists, use it # 2. if the actual file does no exist but both .zim-new~ and .zim-orig~ # exist, use the .zim-new~ file. # # In any other cases we can not recover. What we can do is make a backup # of .zim-orig~ for future manual recovery. def __init__(self, path, checkoverwrite=False, endofline=None): UnixFile.__init__(self, path, checkoverwrite, endofline) self._recover() # just to be sure def exists(self): orig = self.encodedpath + '.zim-orig~' new = self.encodedpath + '.zim-new~' return os.path.isfile(self.encodedpath) or \ (os.path.isfile(new) and os.path.isfile(orig)) # if both new and orig exists, we can recover def open(self, mode='r'): self._recover() # just to be sure return UnixFile.open(self, mode) def _on_write(self): # Handler executed after successful writing the .zim-new~ tmp file # to replace the actual file with the tmp file. # Note that flush() and sync() are already done before close() # # On Windows, rename() does not allow atomic replace, so we need # more logic. Also we want to be robust for errors when file is # temporarily locked by e.g. a virus scanner. tmp = self.encodedpath + '.zim-new~' if not os.path.isfile(tmp): raise AssertionError, 'BUG: File should exist: %s' % tmp if os.path.isfile(self.encodedpath): orig = self.encodedpath + '.zim-orig~' if os.path.isfile(orig): os.remove(orig) self._rename(self.encodedpath, orig) # Step 2. self._rename(tmp, self.encodedpath) # Step 3. try: os.remove(orig) # Step 4. except OSError: pass # If it fails we try again on next write else: self._rename(tmp, self.encodedpath) logger.debug('Wrote %s', self) @staticmethod def _rename(src, dst): # Wrapper for os.rename which handles the timeout for errors when file # is locked. Tries 10 times after 1s then fails. i = 0 while True: try: os.rename(src, dst) except WindowsError, error: if error.errno == 13 and i < 10: # errno 13 means locked by other process i += 1 logger.warn('File locked by other process: %s\nRe-try %i', src, i) import time time.sleep(1) else: raise else: break def _recover(self): # Try and recover the file after errors in writing the file, # see comment in class header. if os.path.isfile(self.encodedpath): return # no recovery needed orig = self.encodedpath + '.zim-orig~' new = self.encodedpath + '.zim-new~' def backup_orig(orig): bak = self.encodedpath + '.bak~' i = 1 while os.path.isfile(bak): bak = self.encodedpath + '.bak%i~' % i i += 1 self._rename(orig, bak) logger.warn('Left over file found: %s\nBacked up to: %s', orig, bak) if os.path.isfile(new) and os.path.isfile(orig): self._rename(new, self.encodedpath) backup_orig(orig) elif os.path.isfile(orig): backup_orig(orig) # Determine which base class to use for files if os.name == 'nt': File = WindowsFile else: File = UnixFile class TmpFile(File): '''Class for temporary files. These are stored in the temp directory and by default they are deleted again when the object is destructed. ''' def __init__(self, basename, unique=True, persistent=False): '''Constructor @param basename: gives the name for this tmp file. @param unique: if C{True} the L{Dir.new_file()} method is used to make sure we have a new file. @param persistent: if C{False} the file will be removed when the object is destructed, if C{True} we leave it alone ''' dir = get_tmpdir() if unique: file = dir.new_file(basename) File.__init__(self, file.path) else: File.__init__(self, (dir, basename)) self.persistent = persistent def __del__(self): if not self.persistent: self.remove() class FileHandle(file): '''Subclass of builtin file type that uses flush and fsync on close and supports a callback. Used by L{File.open()}. ''' def __init__(self, path, on_close=None, **opts): file.__init__(self, path, **opts) self.on_close = on_close def close(self): self.flush() os.fsync(self.fileno()) file.close(self) if not self.on_close is None: self.on_close() zim-0.60/zim/index.py0000644000175000017500000020675712132472704014411 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg '''This module contains the L{Index} class which keeps an index of all pages, links and backlinks in a notebook. This index is stored as a SQLite database and allows efficient lookups of the notebook structure. The L{IndexPath} class is used to refer to page L{Path}s in this index. SQL Tables ========== I{Explanation of the database layout - skip this section if you just want to use the API of the L{Index} object} The main SQL table is "B{pages}", which has an entry for each page in the notebook. Rows in this table are linked hierarchicaly; each row only has the basename of the page and a link to it's parent, do to construct the whole page name multiple look ups are needed. Each entry in this table is referred to by it's primary key. There is a special L{IndexPath} class, which implements the L{Path} interface but also keeps the primary keys for the page and it's parents. Re-using these L{IndexPath} objects to lookup pages speeds up the look up of the exact entries in the table. Main properties indexed int the "pages" table are "hascontent" and "haschildren" which are boolean flags to signal if the page has actual text content and whether it has child pages or not. The table "B{links}" keeps track of links between pages. Each row in this table refers two ids in the "pages" table. This means that even when the linked page does not exist, it does need to exist in the "pages" table. Such link targets that do not exist will show up in the "pages" table with both "hascontent" and "haschildren" set to C{False}. Such entries in the index are also referred to as 'placeholders' (in the L{PageIndex} widget they will show up grey and italic). Since the "pages" table is hierarchical, any parent of a placeholder also needs to be created in the table. The tables "B{tags}" and "B{tagsources}" maintain a list of tags in each page. Here "tags" has a list of tags that are used in this notebook and "tagsources" links between tag ids and page ids for pages containing the tag. In the API tags are represented by L{IndexTag} objects. The database also stores the version number of the zim version that created it. After upgrading to a new version the database will automatically be flushed. Thus modifications to this module will be transparent as long as the zim version number is updated. This and other properties are stored in the "B{meta}" table, which is mapped by the C{index.properties} attribute. ( The remaining tables "B{pagetypes}" and "B{linktypes}" are reserved for future use to assign a "type" property to pages and links. ) For documentation of the database API, see the C{sqlite3} module in the standard Python library. Plugins ======= Plugins can add additional tables to the database. For example the "tasklist" plugin indexes the tasks found in each page and puts them in a separate table. It uses the the 'intialize-db', 'index-page' and 'page-deleted' signals to create and maintain it's own table. See the "tasklist" plugin for an example. @todo: Add page types and link types @todo: start caching ctime and mtime for all pages ''' # Note that it is important that this module fires signals and list # pages in a consistent order, if the order is not consistent or changes # without the appropriate signals the pageindex widget will get confused # and mess up. # This module has a number of methods that appear as a private version # doing all the work and a public one of the same name just wrapping # the private one with a db commit. This is done to minimize the number # of commits per action. SQLite is optimized for low number of commits # and doing many of them will hurt performance, especially on systems # with a slow harddisk (e.g. the flash drive in a maemo system). from __future__ import with_statement import sqlite3 import gobject import unicodedata import logging import zim from zim.utils import natural_sort_key, natural_sort from zim.notebook import Path, Link, PageNameError logger = logging.getLogger('zim.index') LINK_DIR_FORWARD = 1 #: Constant for forward links LINK_DIR_BACKWARD = 2 #: Constant for backward links LINK_DIR_BOTH = 3 #: Constant for links in any direction ROOT_ID = 1 #: Constant for the ID of the root namespace in "pages" # (Primary key starts count at 1 and first entry will be root) #: Definition of all the SQL tables used by the L{Index} object SQL_CREATE_TABLES = ''' create table if not exists meta ( key TEXT, value TEXT ); create table if not exists pages ( id INTEGER PRIMARY KEY, basename TEXT, sortkey TEXT, parent INTEGER DEFAULT '0', hascontent BOOLEAN, haschildren BOOLEAN, type INTEGER, ctime TIMESTAMP, mtime TIMESTAMP, contentkey FLOAT, childrenkey FLOAT ); create table if not exists pagetypes ( id INTEGER PRIMARY KEY, label TEXT ); create table if not exists links ( source INTEGER, href INTEGER, type INTEGER, CONSTRAINT uc_LinkOnce UNIQUE (source, href, type) ); create table if not exists linktypes ( id INTEGER PRIMARY KEY, label TEXT ); create table if not exists tags ( id INTEGER PRIMARY KEY, name TEXT, sortkey TEXT ); create table if not exists tagsources ( source INTEGER, tag INTEGER, CONSTRAINT uc_TagOnce UNIQUE (source, tag) ); ''' # TODO need a verify_path that works like lookup_path but adds checks when path # already has a indexpath attribute, e.g. check basename and parent id # Otherwise we might be re-using stale data. Also check copying of # _indexpath in notebook.Path # FIXME, the idea to have some index paths with and some without data # was a really bad idea. Need to clean up the code as this is / will be # a source of obscure bugs. Remove or replace lookup_data(). # Note on "ORDER BY": we use the sortkey property (which is set using # natural_sort_key()), but we also sort on the real name as 2nd column. # The reason is that the sort keys produced by natural_sort_key() are # not case sensitive, and we want stable behavior if two sort keys # are the same, while the actual names are not. class IndexPath(Path): '''Subclass of L{Path} but optimized for index lookups. Objects of this class can be used anywhere where a L{Path} is required in the API. However in the L{Index} API they are special because the IndexPath also contains information which is cached in the index. @ivar name: the full name of the path @ivar parts: all the parts of the name (split on ":") @ivar basename: the basename of the path (last part of the name) @ivar namespace: the name for the parent page or empty string @ivar isroot: C{True} when this Path represents the top level namespace @ivar parent: the L{Path} object for the parent page @ivar hascontent: page has text content @ivar haschildren: page has child pages @ivar type: page type (currently unused) @ivar ctime: creation time of the page (currently unused) @ivar mtime: modification time of the page (currently unused) @ivar contentkey: caching key as provided by the store on last index @ivar childrenkey: caching key as provided by the store on last index @ivar id: page id in the SQL table (primary key for this page) @ivar parentid: page id for the parent page @ivar hasdata: C{True} when this object has all data from the table (when C{False} only a limitted number of attributes is set) @todo: Remove need for "hasdata: attribute for IndexPath - either by adding an additional class with light version or by removing places where an IndexPath is constructed without a row ''' __slots__ = ('_indexpath', '_row') _attrib = ( 'basename', 'parent', 'hascontent', 'haschildren', 'type', 'ctime', 'mtime', 'contentkey', 'childrenkey', ) def __init__(self, name, indexpath, row=None): '''Constructor @param name: the full page name @param indexpath: a tuple of page ids for all the parents of this page and it's own page id (so linking all rows in the page hierarchy for this page) @param row: optional sqlite3.Row for row for this page in the "pages" table, specifies most other attributes for this object The property C{hasdata} is C{True} when the row is set. ''' Path.__init__(self, name) self._indexpath = tuple(indexpath) self._row = row @property def id(self): return self._indexpath[-1] @property def parentid(self): if self._indexpath and len(self._indexpath) > 1: return self._indexpath[-2] else: assert self.isroot, 'BUG: only root entry can have top level indexpath' return None @property def hasdata(self): return not self._row is None def __getattr__(self, attr): if not attr in self._attrib: raise AttributeError, '%s has no attribute %s' % (self.__repr__(), attr) elif self._row is None: raise AttributeError, 'This IndexPath does not contain row data' else: return self._row[attr] def exists(self): return self.haschildren or self.hascontent @property def parent(self): '''Returns IndexPath for parent path''' namespace = self.namespace if namespace: return IndexPath(namespace, self._indexpath[:-1]) elif self.isroot: return None else: return IndexPath(':', (ROOT_ID,)) def parents(self): '''Generator function for parent namespace IndexPaths including root''' # version optimized to include indexpaths if ':' in self.name: path = self.name.split(':') path.pop() while len(path) > 0: namespace = ':'.join(path) indexpath = self._indexpath[:len(path)+1] yield IndexPath(namespace, indexpath) path.pop() yield IndexPath(':', (ROOT_ID,)) class IndexTag(object): '''Object to represent a page tag in the L{Index} API These are tags that appear in pages with an "@", like "@foo". They are indexed by the L{Index} and represented with this class. @ivar name: the name of the tag, e.g. "foo" for an "@foo" in the page @ivar id: the id of this tag in the table (primary key) ''' __slots__ = ('name', 'id') def __init__(self, name, id): self.name = name.lstrip('@') self.id = id def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.name) def __hash__(self): return self.name.__hash__() def __eq__(self, other): if isinstance(other, IndexTag): return self.name == other.name else: return False def __ne__(self, other): return not self.__eq__(other) class DBCommitContext(object): '''Context manager to manage database commits. Used for the L{index.db_commit} attribute. Using this attribute allows syntax like:: with index.db_commit: cursor = index.db.cursor() cursor.execute(...) instead off:: try: cursor = index.db.cursor() cursor.execute(...) except: index.db.rollback() else: index.db.commit() ''' def __init__(self, db): self.db = db def __enter__(self): pass def __exit__(self, exc_type, exc_value, traceback): if exc_value: self.db.rollback() else: self.db.commit() return False # re-raise error class Index(gobject.GObject): '''This class defines an index of all pages, links, backlinks, tags etc. in a notebook. This index is stored as a SQLite database and allows efficient lookups of the notebook structure. See te module documentation for some notes on the SQL layout. @ivar dbfile: the L{File} object for the database file, or the string "C{:memory:}" when we run the database in memory @ivar db: the C{sqlite3.Connection} object for the database @ivar db_commit: a L{DBCommitContext} object @ivar notebook: the L{Notebook} which is indexed by this Index @ivar properties: a L{PropertiesDict} with properties for this index @ivar updating: C{True} when an update of the index is in progress @signal: C{start-update ()}: emitted when an index update starts @signal: C{end-update ()}: emitted when an index update ends @signal: C{initialize-db ()}: emitted when we (re-)initialize the database tables. When this signal is emitted either the database is new or all tables have been dropped. E.g. a plugin could add a handler to create it's custom tables on this signal. @signal: C{page-inserted (L{IndexPath})}: emitted when a page is newly added to the index (so a new row is inserted in the pages table) @signal: C{page-updated (L{IndexPath})}: page content has changed @signal: C{page-indexed (L{IndexPath}, L{Page})}: emitted after a page has been indexed by the index. This signal is intended for example for plugins that want to do some additional indexing. @signal: C{page-haschildren-toggled (L{IndexPath})}: the value of the C{haschildren} attribute changed for this page @signal: C{page-deleted (L{IndexPath})}: emitted after a page has been droppen from the index (note that it does no longer exist, so any lookups will fail -- use page-to-be-deleted) when you want to get a signal before the row is actually dropped @signal: C{page-to-be-deleted (L{IndexPath})}: like page-deleted but emitted before the data is actually dropped @signal: C{tag-created (L{IndexTag})}: emitted when a new tag has been created (so first time a cerain tag is encountered in the notebook) @signal: C{tag-inserted (L{IndexTag}, L{IndexPath}, firsttag)}: emitted when a reference between a tag and a page is inserted in the index. The 3rd argument is C{True} when this is the first tag for this page. @signal: C{tag-to-be-inserted (L{IndexTag}, L{IndexPath}, firsttag)}: like tag-inserted but emitted before adding the data in the database @signal: C{tag-removed (L{IndexTag}, L{IndexPath}, lasttag)}: emitted when a reference between a page and a tag is removed. The 3rd argument is C{True} when this was the last tag for this page @signal: C{tag-to-be-removed (L{IndexTag}, L{IndexPath}, lasttag)}: like tag-removed but emitted before dropping the data @signal: C{tag-deleted (L{IndexTag})}: emitted when a tag is no longer used in a notebook @signal: C{tag-to-be-deleted (L{IndexTag})}: like tag-deleted, but emitted before the data is dropped from the table @todo: rename page-deleted to page-dropped to have more consistent signal names @todo: check need for tag-to-be-inserted and tag-to-be-removed signals in the API (and check tag signal names in general) @todo: group API documentation in meaningfull groups, e.g. methods related to pages, links and tags ''' # Resolving links depends on the contents of the database and # links to non-existing pages can create new page nodes. This has # consequences for updating the database and makes things a bit # more complicated than expected at first sight. Page nodes for # non-existing page are referred to as 'placeholders' below. # # 1) When updating we first traverse the whole page tree creating # nodes for all existing pages before indexing contents and links # 2) When we do index the contents we need to go top down through # the tree, indexing parent nodes before we index children. This is # because resolving links goes bottom up and may see non-existing # pages created based on a link in a parent. # 3) We need to clean up trees of placeholders by checking if they # have pages linking to them or not. This needs to go bottom up as # there may be non-existing parent pages that also need to be # cleaned up. # # TODO TODO TODO - finish this thought and check correctness of this blob # Note that queues tend to become very large, so make sure to only # put Paths in the queue, not Pages # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'page-inserted': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'page-updated': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'page-indexed': (gobject.SIGNAL_RUN_LAST, None, (object, object)), 'page-haschildren-toggled': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'page-deleted': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'page-to-be-deleted': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'start-update': (gobject.SIGNAL_RUN_LAST, None, ()), 'end-update': (gobject.SIGNAL_RUN_LAST, None, ()), 'initialize-db': (gobject.SIGNAL_RUN_LAST, None, ()), 'tag-created': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'tag-inserted': (gobject.SIGNAL_RUN_LAST, None, (object, object, object)), 'tag-to-be-inserted': (gobject.SIGNAL_RUN_LAST, None, (object, object, object)), 'tag-removed': (gobject.SIGNAL_RUN_LAST, None, (object, object, object)), 'tag-to-be-removed': (gobject.SIGNAL_RUN_LAST, None, (object, object, object)), 'tag-deleted': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'tag-to-be-deleted': (gobject.SIGNAL_RUN_LAST, None, (object,)), } def __init__(self, notebook=None, dbfile=None): '''Constructor @param notebook: a L{Notebook} object @param dbfile: a L{File} object for the database file or the special string "C{:memory:}". When set to C{None} the index will fall back to the default database file for the notebook. ''' gobject.GObject.__init__(self) self.dbfile = dbfile self.db = None self.db_commit = None self.notebook = None self.properties = None self.updating = False self._idle_signal_id = None self._update_pagelist_queue = [] self._index_page_queue = [] if self.dbfile: self._connect() if notebook: self.set_notebook(notebook) def set_notebook(self, notebook): '''Set the notebook to index. Connects to various signals of the notebook to trigger indexing when pages change etc. @param notebook: a L{Notebook} object ''' self.notebook = notebook if not self.dbfile: if notebook.cache_dir is None: logger.debug('No cache dir found - loading index in memory') self.dbfile = ':memory:' else: notebook.cache_dir.touch() self.dbfile = notebook.cache_dir.file('index.db') logger.debug('Index database file: %s', self.dbfile) self._connect() def on_page_moved(o, oldpath, newpath, update_links): # When we are the primary index and the notebook is also # updating links, these calls are already done by the # notebook directly. #~ print '!! on_page_moved', oldpath, newpath, update_links self.delete(oldpath) self.update_async(newpath) def on_page_updated(o, page): indexpath = self.lookup_path(page) with self.db_commit: if not indexpath: indexpath = self._touch(page) links = self._get_placeholders(indexpath, recurs=False) self._index_page(indexpath, page) for link in links: self._cleanup(link) self.notebook.connect('stored-page', on_page_updated) self.notebook.connect('moved-page', on_page_moved) self.notebook.connect_object('deleted-page', self.__class__.delete, self) def _connect(self): self.db = sqlite3.connect( str(self.dbfile), detect_types=sqlite3.PARSE_DECLTYPES) self.db.row_factory = sqlite3.Row self.db_commit = DBCommitContext(self.db) self.properties = PropertiesDict(self.db) with self.db_commit: if self.properties['zim_version'] != zim.__version__: # flush content and init database layout self._flush() self.properties._set('zim_version', zim.__version__) def do_initialize_db(self): with self.db_commit: self.db.executescript(SQL_CREATE_TABLES) def flush(self): '''Flush all indexed data and clear the database This method drops all tables in the databse and then re-creates the tables used by the index. @note: This method does not emit proper signals for deleting content, so it is not safe to use while a L{PageTreeStore} is connected to the index unless the store is discarded after the flush. @emits: initialize-db ''' with self.db_commit: self._flush() def _flush(self): logger.info('Flushing index') # Drop queues self._update_pagelist_queue = [] self._index_page_queue = [] # Drop data cursor = self.db.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table'") for table in [row[0] for row in cursor.fetchall()]: cursor.execute('DROP TABLE "%s"' % table) self.emit('initialize-db') # Create root node cursor.execute('insert into pages(basename, sortkey, parent, hascontent, haschildren) values (?, ?, ?, ?, ?)', ('', '', 0, False, False)) assert cursor.lastrowid == 1, 'BUG: Primary key should start counting at 1' # Set meta properties self.properties._set('zim_version', zim.__version__) def _flush_queue(self, path): # Removes any pending updates for path and it's children name = path.name namespace = name + ':' keep = lambda p: not (p.name == name or p.name.startswith(namespace)) self._update_pagelist_queue = filter(keep, self._update_pagelist_queue) self._index_page_queue = filter(keep, self._index_page_queue) def update(self, path=None, callback=None): '''Update the index by scanning the notebook Typically an (async) update is run at least once after opening a notebook to detect any manual changes etc. to the notebook. Indexes are checked width first. This is important to make the visual behavior of treeviews displaying the index look more solid. The update is done by checking the X{indexkey} each path as provided by the notebook store to decide if an update is needed. If you want to ignore the X{indexkey} and just re-index every page you need to call L{flush()} before calling C{update()}. This will have the same result as initialzing a brand new index. @keyword path: optional L{Path} to start update for a subtree only, if C{None} the whole notebook is indexed @keyword callback: optional callback function to be called for each path that is updated. The callback gets the path just processed as an argument. If the callback returns False the update will not continue. (This allows updating a progress bar and have a way to cancel the update from the dialog.) ''' self._update(path, callback, False) def update_async(self, path=None, callback=None): '''Update the index by scanning the notebook asynchronous Like L{update()} but runs asynchronous @note: unlike most "C{*_async()}" methods we do not use threading here at the moment, instead the update is done on idle signals from the main loop. @keyword path: optional L{Path} to start update for a subtree only @keyword callback: optional callback function to be called for each path that is updated. ''' self._update(path, callback, True) def _update(self, path, callback, async): # Updating uses two queues, one for indexing the tree structure and a # second for pages where we need to index the content. Reason is that we # first need to have the full tree before we can reliably resolve links # and thus index content. # TODO replace queues by invalidating indexkeys in the table if path is None: path = Path(':') indexpath = self.lookup_path(path) if indexpath is None: indexpath = self.touch(path) indexpath._row['haschildren'] = True indexpath._row['childrenkey'] = None self._flush_queue(path) self._update_pagelist_queue.append(indexpath) if not indexpath.isroot: self._index_page_queue.append(indexpath) # FIXME check indexkey here if not self.updating: self.emit('start-update') if async: if not self.updating: # Start new queue logger.info('Starting async index update') self.updating = True self._idle_signal_id = \ gobject.idle_add(self._do_update, callback) # Else let running queue pick it up else: logger.info('Updating index') self._stop_background_signal() # just to be sure while self._do_update(callback): continue def ensure_update(self, callback=None): '''Wait for an ongoing asynchronous update. If an asynchronous update is running, this method will block untill it is finished and then return. If no update was ongoing it returns immediatly. @param callback: a callback function to call while updating, see L{update()} for details ''' if self.updating: logger.info('Ensure index updated') self._stop_background_signal() while self._do_update(callback): continue else: return def stop_updating(self): '''Force asynchronous indexing to stop''' if self._update_pagelist_queue or self._index_page_queue: logger.info('Index update is canceled') # else natural end of index update, or just checking self._stop_background_signal() self._update_pagelist_queue = [] # flush self._index_page_queue = [] # flush if self.updating: self.emit('end-update') self.updating = False def _stop_background_signal(self): if self._idle_signal_id: gobject.source_remove(self._idle_signal_id) self._idle_signal_id = None def _do_update(self, callback): # This returns boolean to continue or not because it can be called as an # idle event handler, if a callback is used, the callback should give # this boolean value. # TODO can we add a percentage to the callback ? # set it to None while building page listings, but set # percentage once max of pageindex list is known if self._update_pagelist_queue or self._index_page_queue: try: if self._update_pagelist_queue: path = self._update_pagelist_queue.pop(0) with self.db_commit: self._update_pagelist(path) elif self._index_page_queue: path = self._index_page_queue.pop(0) page = self.notebook.get_page(path) with self.db_commit: self._index_page(path, page) except KeyboardInterrupt: raise except: # Catch any errors while listing & parsing all pages logger.exception('Got an exception while indexing "%s":', path) #~ print "\"%s\" %i %i" % (path.name, len(self._update_pagelist_queue), len(self._index_page_queue)) if not callback is None: cont = callback(path) if not cont is True: self.stop_updating() return False return True else: try: self.cleanup_all() except KeyboardInterrupt: raise except: logger.exception('Got an exception while removing placeholders') logger.info('Index update done') self.stop_updating() return False def touch(self, path): '''Create an entry for a L{Path} in the index This method creates a path in the index along with all it's parents. The path is initally created as a palceholder which has neither content or children. @param path: a L{Path} object @returns: the L{IndexPath} object for C{path} ''' with self.db_commit: return self._touch(path) def _touch(self, path): cursor = self.db.cursor() names = path.parts parentid = ROOT_ID indexpath = [ROOT_ID] inserted = [] # newly inserted paths lastparent = None # last parent that already existed for i in range(len(names)): p = self.lookup_path(Path(names[:i+1])) if p is None: haschildren = i < (len(names) - 1) cursor.execute( 'insert into pages(basename, sortkey, parent, hascontent, haschildren) values (?, ?, ?, ?, ?)', (names[i], natural_sort_key(names[i]), parentid, False, haschildren)) parentid = cursor.lastrowid indexpath.append(parentid) inserted.append( IndexPath(':'.join(names[:i+1]), indexpath, {'hascontent': False, 'haschildren': haschildren})) else: lastparent = p parentid = p.id indexpath.append(parentid) if lastparent and not lastparent.haschildren: self.db.execute('update pages set haschildren = ? where id = ?', (True, lastparent.id)) else: lastparent = None if lastparent: self.emit('page-haschildren-toggled', lastparent) for path in inserted: self.emit('page-inserted', path) if inserted: return inserted[-1] else: return self.lookup_path(path) def _index_page(self, path, page): '''Indexes page contents for page. TODO: emit a signal for this for plugins to use ''' # Avoid emitting page-updated here when not needed because it # triggers re-draws of the pageindex #~ print '!! INDEX PAGE', path, path._indexpath assert isinstance(path, IndexPath) and not path.isroot seen_links = set() hadcontent = path.hascontent had_tags = set() has_tags = set() created_tags = [] # Initialize seen tags for tag in self.list_tags(path): had_tags.add(tag.id) self.db.execute('delete from links where source = ?', (path.id,)) if page.hascontent: for type, href, _ in page.get_links(): if type != 'page': continue try: link = self.notebook.resolve_path( href, source=page, index=self) # need to specify index=self here because we are # not necessary the default index for the notebook except PageNameError: continue if link != page and not link.name in seen_links: # Filter out self referring links and remove doubles seen_links.add(link.name) indexpath = self.lookup_path(link) if indexpath is None: indexpath = self._touch(link) self.db.execute( 'insert into links (source, href) values (?, ?)', (path.id, indexpath.id) ) for _, attrib in page.get_tags(): tag = attrib['name'].strip() indextag = self.lookup_tag(tag) if indextag is None: # Create tag cursor = self.db.cursor() cursor.execute( 'insert into tags(name, sortkey) values (?, ?)', (tag, natural_sort_key(tag)) ) indextag = IndexTag(tag, cursor.lastrowid) created_tags.append(indextag) has_tags.add(indextag.id) key = self.notebook.get_page_indexkey(page) self.db.execute( 'update pages set hascontent = ?, contentkey = ? where id = ?', (page.hascontent, key, path.id) ) # Insert tags for i, tag in enumerate(has_tags.difference(had_tags)): self.emit('tag-to-be-inserted', self.lookup_tagid(tag), path, (len(had_tags) == 0) and (i == 0)) try: self.db.execute( 'insert into tagsources (source, tag) values (?, ?)', (path.id, tag,)) except sqlite3.IntegrityError: # Catch already existing entries pass # Remove tags removed_tags = had_tags.difference(has_tags) for i, tag in enumerate(removed_tags): self.emit('tag-to-be-removed', self.lookup_tagid(tag), path, (len(has_tags) == 0) and (i == len(removed_tags)-1)) self.db.execute('delete from tagsources where source = ? and tag = ?', (path.id, tag)) path = self.lookup_data(path) # refresh if hadcontent != path.hascontent: self.emit('page-updated', path) for tag in created_tags: self.emit('tag-created', tag) for i, tag in enumerate(has_tags.difference(had_tags)): self.emit('tag-inserted', self.lookup_tagid(tag), path, (len(had_tags) == 0) and (i == 0)) for i, tag in enumerate(removed_tags): self.emit('tag-removed', tag, path, (len(has_tags) == 0) and (i == len(removed_tags)-1)) self._purge_tag_table() #~ print '!! PAGE-INDEXED', path self.emit('page-indexed', path, page) def _purge_tag_table(self): deleted_tags = [] cursor = self.db.cursor() cursor.execute('select id, name from tags where id not in (select tag from tagsources)') for row in cursor: deleted_tags.append(IndexTag(row['name'], row['id'])) self.emit('tag-to-be-deleted', deleted_tags[-1]) self.db.execute('delete from tags where id not in (select tag from tagsources)') for tag in deleted_tags: self.emit('tag-deleted', tag) def _update_pagelist(self, path): '''Checks and updates the pagelist for a path if needed and queue any child pages for updating. ''' #~ print '!! UPDATE LIST', path, path._indexpath assert isinstance(path, IndexPath) if not path.hasdata: path = self.lookup_data(path) hadchildren = path.haschildren hadcontent = path.hascontent if path.isroot: rawpath = Path(':') hascontent = False indexpath = (ROOT_ID,) else: rawpath = self.notebook.get_page(path) hascontent = rawpath.hascontent indexpath = path._indexpath # Check if listing is uptodate def check_and_queue(child, page): # Helper function to queue individual children if (page and page.haschildren) or child.haschildren: self._update_pagelist_queue.append(child) else: pagekey = self.notebook.get_page_indexkey(page or child) if not (pagekey and child.contentkey == pagekey): self._index_page_queue.append(child) listkey = self.notebook.get_pagelist_indexkey(rawpath) uptodate = listkey and path.childrenkey == listkey cursor = self.db.cursor() cursor.execute('select * from pages where parent = ?', (path.id,)) if uptodate: #~ print '!! ... is up to date' for row in cursor: p = IndexPath(path.name+':'+row['basename'], indexpath+(row['id'],), row) check_and_queue(p, None) else: #~ print '!! ... updating' children = {} for row in cursor: children[row['basename']] = row seen = set() changes = [] for page in self.notebook.get_pagelist(rawpath): #~ print '!! ... ... page:', page, page.haschildren seen.add(page.basename) if page.basename in children: row = children[page.basename] if page.hascontent == row['hascontent']: child = IndexPath(path.name+':'+row['basename'], indexpath+(row['id'],), row) check_and_queue(child, page) else: # Child aquired content - let's index it cursor = self.db.cursor() cursor.execute( 'update pages set hascontent = ?, contentkey = NULL where id = ?', (page.hascontent, row['id'],) ) child = IndexPath(path.name+':'+row['basename'], indexpath+(row['id'],), { 'hascontent': page.hascontent, 'haschildren': page.haschildren, 'childrenkey': row['childrenkey'], 'contentkey': None, } ) changes.append((child, 2)) if page.haschildren: self._update_pagelist_queue.append(child) if page.hascontent: self._index_page_queue.append(child) else: # We set haschildren to False until we have actually seen those # children. Failing to do so will cause trouble with the # gtk.TreeModel interface to the database, which can not handle # nodes that say they have children but fail to deliver when # asked. cursor = self.db.cursor() cursor.execute( 'insert into pages(basename, sortkey, parent, hascontent, haschildren) values (?, ?, ?, ?, ?)', (page.basename, natural_sort_key(page.basename), path.id, page.hascontent, False)) child = IndexPath(page.name, indexpath + (cursor.lastrowid,), { 'hascontent': page.hascontent, 'haschildren': False, 'childrenkey': None, 'contentkey': None, } ) changes.append((child, 1)) if page.haschildren: self._update_pagelist_queue.append(child) if page.hascontent: self._index_page_queue.append(child) # Figure out which pages to delete - but keep placeholders keep = set() delete = [] for basename in set(children.keys()).difference(seen): row = children[basename] child = IndexPath( path.name+':'+basename, indexpath+(row['id'],), row) if child.haschildren or self.n_list_links(child, direction=LINK_DIR_BACKWARD) > 0: keep.add(child) self.db.execute( 'update pages set hascontent = 0, contentkey = NULL where id = ?', (child.id,)) # If you're not in the pagelist, you don't have content changes.append((child, 2)) if child.haschildren: self._update_pagelist_queue.append(child) else: delete.append(child) # Update index key to reflect we did our updates haschildren = len(seen) + len(keep) > 0 self.db.execute( 'update pages set childrenkey = ?, haschildren = ?, hascontent = ? where id = ?', (listkey, haschildren, hascontent, path.id) ) path = self.lookup_data(path) # refresh if not path.isroot and (hadchildren != path.haschildren): self.emit('page-haschildren-toggled', path) if not path.isroot and (hadcontent != path.hascontent): self.emit('page-updated', path) # All these signals should come in proper order... natural_sort(changes, key=lambda c: c[0].basename) for child, action in changes: if action == 1: self.emit('page-inserted', child) else: # action == 2: self.emit('page-updated', child) # Clean up pages that disappeared for child in delete: self._delete(child) # ... we are followed by an cleanup_all() when indexing is done def delete(self, path): '''Delete a L{Path} from the index This will delete all data indexed from this page from the index. This means C{path} and all it's children will be flagged as having no content. However they may stay appear as placeholders in the index if they are linked by other pages. Removing a page can also trigger other page to be removed from the index. For example parents that have no children anymore will be cleaned up automatically, and placeholders that were kept alive because of links from this page as well. @param path: a L{Path} object ''' indexpath = self.lookup_path(path) if indexpath: links = self._get_placeholders(indexpath, recurs=True) with self.db_commit: self._delete(indexpath) self._cleanup(indexpath.parent) for link in links: self._cleanup(link) def _delete(self, path): # Tries to delete path and all of it's children, but keeps # pages that are placeholders and their parents self._flush_queue(path) root = self.lookup_path(path) paths = [root] paths.extend(list(self.walk(root))) # Clean up links and content for path in paths: self.db.execute('delete from links where source = ?', (path.id,)) self.db.execute('update pages set hascontent = 0, contentkey = NULL where id = ?', (path.id,)) # Clean up tags for path in paths: tags = list(self.list_tags(path)) for i, tag in enumerate(tags): self.emit('tag-to-be-removed', tag, path, i == len(tags) - 1) self.db.execute('delete from tagsources where source = ? and tag = ?', (path.id, tag.id)) for i, tag in enumerate(tags): self.emit('tag-removed', tag, path, i == len(tags) - 1) # Clean up any nodes that are not a link paths.reverse() # process children first delete = [] keep = [] for path in paths: if path.isroot or not path.hasdata: continue hadchildren = path.haschildren haschildren = self.n_list_pages(path) > 0 placeholder = haschildren or self.n_list_links(path, direction=LINK_DIR_BACKWARD) if placeholder: # Keep but check haschildren keep.append(path) self.db.execute( 'update pages set haschildren = ?, childrenkey = NULL where id = ?', (haschildren, path.id) ) else: # Delete self.emit('page-to-be-deleted', path) # HACK needed to signal the page index delete.append(path) self.db.execute('delete from pages where id=?', (path.id,)) self.lookup_data(path) # refresh if placeholder: self.emit('page-updated', path) if hadchildren != haschildren: self.emit('page-haschildren-toggled', path) else: self.emit('page-deleted', path) parent = root.parent if not parent.isroot and self.n_list_pages(parent) == 0: self.db.execute( 'update pages set haschildren = 0, childrenkey = NULL where id = ?', (parent.id,) ) parent = self.lookup_data(parent) self.emit('page-haschildren-toggled', parent) def cleanup(self, path): '''Check if a L{Path} can be removed from the index, and clean it up if so This method cleans up pages that have no content, no longer have any children and are no longer linked by other pages. This is intended to cleanup (old) placeholders. @param path: a L{Path} object ''' with self.db_commit: self._cleanup(path) def _cleanup(self, path): if path.isroot: return origpath = path path = self.lookup_path(path) if not path or not path.hasdata: # path does not exist in table - maybe it disappeared already self._cleanup(origpath.parent) # recurs return if not (path.hascontent or path.haschildren) \ and self.n_list_links(path, direction=LINK_DIR_BACKWARD) == 0: self._delete(path) self._cleanup(path.parent) # recurs def cleanup_all(self): ''' Check for any L{Path}s that can be removed from the index, and clean them up Like L{cleanup()} but checks the whole index ''' with self.db_commit: self._cleanup_all def _cleanup_all(self): cursor = self.db.cursor() cursor.execute( 'select id from pages where hascontent=0 and haschildren=0') for row in cursor: path = self.lookup_id(row['id']) self._cleanup(path) def _get_placeholders(self, path, recurs): '''Return candidates for cleanup when path is updated or deleted''' ids = [path.id] if recurs: ids.extend(p.id for p in self.walk(path)) placeholders = [] cursor = self.db.cursor() for id in ids: cursor.execute( 'select pages.id from pages inner join links on links.href=pages.id ' 'where links.source=? and pages.hascontent=0 and pages.haschildren=0', (id,)) placeholders.extend(self.lookup_id(row['id']) for row in cursor) return placeholders def walk(self, path=None): '''Generator function to yield all pages in the index, depth first @param path: a L{Path} object for the starting point, can be used to only iterate a sub-tree. When this is C{None} the whole notebook is iterated over @returns: yields L{IndexPath} objects ''' if path is None or path.isroot: return self._walk(IndexPath(':', (ROOT_ID,)), ()) else: indexpath = self.lookup_path(path) if indexpath is None: raise ValueError, 'no such path in the index %s' % path return self._walk(indexpath, indexpath._indexpath) def _walk(self, path, indexpath): # Here path always is an IndexPath cursor = self.db.cursor() cursor.execute('select * from pages where parent = ? order by sortkey, basename', (path.id,)) for row in cursor: name = path.name+':'+row['basename'] childpath = indexpath+(row['id'],) child = IndexPath(name, childpath, row) yield child if child.haschildren: for grandchild in self._walk(child, childpath): yield grandchild def lookup_path(self, path, parent=None): '''Lookup the L{IndexPath} for a L{Path}, adding all the information from the database about the path. If the C{path} is an L{IndexPath} already, it will passed to L{lookup_data()} and then returned. So as long as it is passed a sub-class of L{Path} this method will always result in a proper L{IndexPath} object. This method is mostly intended for internal use in the index module, but in some cases it is useful to convert explicitly to L{IndexPath} to optimize repeated index lookups. @param path: the L{Path} object @param parent: any known parent L{IndexPath}, this will speed up the lookup by reducing the number of queries needed to reconstruct the hierarchical nesting of the path. @returns: the L{IndexPath} for C{path} or C{None} when this path does not exist in the index. ''' # Constructs the indexpath downward if isinstance(path, IndexPath): if not path.hasdata: return self.lookup_data(path) else: return path elif path.isroot: cursor = self.db.cursor() cursor.execute('select * from pages where id = ?', (ROOT_ID,)) row = cursor.fetchone() return IndexPath(':', (ROOT_ID,), row) if parent: indexpath = list(parent._indexpath) else: indexpath = [ROOT_ID] names = path.name.split(':') names = names[len(indexpath)-1:] # shift X items parentid = indexpath[-1] cursor = self.db.cursor() if not names: # len(indexpath) was len(names) cursor.execute('select * from pages where id = ?', (indexpath[-1],)) row = cursor.fetchone() else: for name in names: cursor.execute( 'select * from pages where basename = ? and parent = ?', (name, parentid) ) row = cursor.fetchone() if row is None: return None # path is not indexed indexpath.append(row['id']) parentid = row['id'] return IndexPath(path.name, indexpath, row) def lookup_data(self, path): '''Returns a full IndexPath for a IndexPath that has 'hasdata' set to False. @todo: get rid of this method ''' cursor = self.db.cursor() cursor.execute('select * from pages where id = ?', (path.id,)) path._row = cursor.fetchone() #~ assert path._row, 'Path does not exist: %s' % path return path def lookup_id(self, id): '''Get the L{IndexPath} for a given page id Mainly intended for internal use, but can be used e.g by plugins that add their own tables refering to pages by id. @param id: the page id (primary key for this page) @returns: the L{IndexPath} for this row ''' # Constructs the indexpath upwards cursor = self.db.cursor() cursor.execute('select * from pages where id = ?', (id,)) row = cursor.fetchone() if row is None: return None # no such id !? indexpath = [row['id']] names = [row['basename']] parent = row['parent'] while parent != 0: indexpath.insert(0, parent) cursor.execute('select basename, parent from pages where id = ?', (parent,)) myrow = cursor.fetchone() names.insert(0, myrow['basename']) parent = myrow['parent'] return IndexPath(':'.join(names), indexpath, row) def lookup_tag(self, tag): '''Get the L{IndexTag} for a tag name @param tag: the tag name as string or an L{IndexTag} @returns: the L{IndexTag} for C{tag} or C{None} if the tag does not exist in the notebook ''' # Support 'None' as untagged assert not tag is None if isinstance(tag, IndexTag): return tag else: assert isinstance(tag, basestring) cursor = self.db.cursor() cursor.execute('select * from tags where name = ?', (tag,)) row = cursor.fetchone() if row is None: return None # no such name return IndexTag(row['name'], row['id']) def lookup_tagid(self, id): '''Get the L{IndexTag} for a tag id @param id: the tag id (primary key in the "tags" table) @returns: the L{IndexTag} object for this id ''' cursor = self.db.cursor() cursor.execute('select * from tags where id = ?', (id,)) row = cursor.fetchone() if row is None: return None # no such id !? return IndexTag(row['name'], row['id']) def resolve_case(self, name, namespace=None): '''Resolves path names case insensitive for existing pages This method checks the parts of C{name} (separated by ":") in the index. If for any part an entry exists with the same case, this will be used, otherwise it will check for entries with the same name both different case and use the first one found. If no entry is found with the same name at all, the lookup will stop. If at least the first part of C{name} could be matched there is a partial match, and parts that can not be resolved will be kept in the same case as the given input. The purpose of this method is to help converting e.g. user input to proper L{Path} objects. By matching the case to the index the chance of duplicate pages with different case is reduced. @param name: the full page name, or a page name relative to {namespace} @param namespace: optional parent namespace for which the case is already known @returns: a L{Path} if a partial match was found, an L{IndexPath} if a full match was found, or C{None} when no match was found at all ''' if namespace and not namespace.isroot: parent = self.lookup_path(namespace) if parent is None: return None # parent does not even exist else: parentid = parent.id indexpath = list(parent._indexpath) else: parent = Path(':') parentid = ROOT_ID indexpath = [ROOT_ID] names = name.split(':') found = [] cursor = self.db.cursor() for name in names: cursor.execute( 'select * from pages where sortkey = ? and parent = ?', (natural_sort_key(name), parentid) ) rows = {} for row in cursor.fetchall(): rows[row['basename']] = row if not rows: # path is not indexed if found: # but at least we found some match found.extend(names[len(found):]) # pad remaining names if not parent.isroot: found.insert(0, parent.name) return Path(':'.join(found)) # FIXME should we include an indexpath here ? else: return None elif name in rows: # exact match row = rows[name] elif unicodedata.normalize('NFC', name) in rows: name = unicodedata.normalize('NFC', name) row = rows[name] elif unicodedata.normalize('NFD', name) in rows: name = unicodedata.normalize('NFD', name) row = rows[name] else: # take first match based on sorting # case insensitive or unicode compatibility (NFKD / NFKC) n = rows.keys() n.sort() row = rows[n[0]] indexpath.append(row['id']) parentid = row['id'] found.append(row['basename']) if not parent.isroot: found.insert(0, parent.name) return IndexPath(':'.join(found), indexpath, row) def get_page_index(self, path): '''Get the index where this path would appear in the result of L{list_pages()} for C{path.parent}. Used by the L{PageTreeStore} interface to get the gtk TreePath for a path. @param path: a L{Path} object @returns: the relative index for C{path} in the parent namespace (integer) ''' if path.isroot: raise ValueError, 'Root path does not have an index number' path = self.lookup_path(path) if not path: raise ValueError, 'Could not find path in index' sortkey = natural_sort_key(path.basename) cursor = self.db.cursor() cursor.execute( 'select count(*) from pages where parent = ? ' 'and (sortkey < ? or (sortkey = ? and basename < ?))', (path.parent.id, sortkey, sortkey, path.basename) ) row = cursor.fetchone() return int(row[0]) def list_pages(self, path, offset=None, limit=None): '''Generator function listing all pages in a specific namespace The optional arguments C{offset} and C{limit} can be used to iterate only a slice of the list. Note that both C{offset} and C{limit} must always be defined together. When C{path} does not exist in the index an empty list is yielded. @param path: a L{Path} object giving the namespace or C{None} for the top level pages @keyword offset: offset in list to start (integer) @keyword limit: max pages to return (integer) @returns: yields L{IndexPath} objects ''' if path is None or path.isroot: parentid = ROOT_ID name = '' indexpath = (ROOT_ID,) else: path = self.lookup_path(path) if path: parentid = path.id name = path.name indexpath = path._indexpath else: parentid = None if parentid: cursor = self.db.cursor() query = 'select * from pages where parent = ? order by sortkey, basename' if offset is None and limit is None: cursor.execute(query, (parentid,)) else: cursor.execute(query + ' limit ? offset ?', (parentid, limit, offset)) for row in cursor: yield IndexPath( name+':'+row['basename'], indexpath+(row['id'],), row) def get_all_pages_index(self, path): '''Get the index where this path would appear in the result of L{list_all_pages()}. Used e.g. by the "tags" plugin to get the gtk TreePath for a path in the flat list. @param path: a L{Path} object @returns: the relative index for C{path} (integer) ''' if path.isroot: raise ValueError, 'Root path does not have an index number' path = self.lookup_path(path) if not path: raise ValueError, 'Could not find path in index' # Can't use count() here, like in get_page_index(), because # basenames are not unique in this lookup # FIXME do this anyway - use sorting on id instead cursor = self.db.cursor() cursor.execute('select id from pages where id != ? order by sortkey, basename, id', (ROOT_ID,)) # Added id to "order by" columns because basenames are not unique i = 0 for row in cursor: if row['id'] == path.id: return i i += 1 assert False, 'BUG: could not find path in index' def list_all_pages(self, offset=None, limit=None): '''Generator function listing all pages as a flat page list depth first The optional arguments C{offset} and C{limit} can be used to iterate only a slice of the list. Note that both C{offset} and C{limit} must always be defined together. @keyword offset: offset in list to start (integer) @keyword limit: max pages to return (integer) @returns: yields L{IndexPath} objects ''' cursor = self.db.cursor() query = 'select id from pages where id != ? order by sortkey, basename, id' # Added id to "order by" columns because basenames are not unique if offset is None and limit is None: cursor.execute(query, (ROOT_ID,)) else: cursor.execute(query + ' limit ? offset ?', (ROOT_ID, limit, offset)) for row in cursor: yield self.lookup_id(row['id']) def n_list_pages(self, path): '''Get the number of pages that will be returned by L{list_pages()} for C{path}. Used by the C{PageTreeStore} interface. @param path: a L{Path} object giving the namespace or C{None} for the top level pages @returns: the number of child pages below C{path} ''' if path is None or path.isroot: parentid = ROOT_ID else: path = self.lookup_path(path) if path is None: return 0 parentid = path.id cursor = self.db.cursor() cursor.execute('select count(*) from pages where parent = ?', (parentid,)) row = cursor.fetchone() return int(row[0]) def n_list_all_pages(self): '''Get the number of pages that will be returned by L{list_all_pages()} @returns: the number of pages in the notebook ''' cursor = self.db.cursor() cursor.execute('select count(*) from pages') row = cursor.fetchone() return int(row[0]) - 1 # subtract 1 for the ROOT_ID row def list_recent_pages(self, offset=None, limit=None): '''List pages in order of modification time, newest first''' # HACK using contentkey rather than actual mtime field ! query = 'select * from pages where hascontent = 1 order by contentkey desc' cursor = self.db.cursor() if offset is None and limit is None: cursor.execute(query) else: assert limit is not None and offset is not None cursor.execute(query + ' limit ? offset ?', (limit, offset)) for row in cursor: yield self.lookup_id(row['id']) def list_links(self, path, direction=LINK_DIR_FORWARD): '''Generator listing links between pages @param path: the L{Path} for which to list links @param direction: the link direction to be listed. This can be one of: - C{LINK_DIR_FORWARD}: for links from path - C{LINK_DIR_BACKWARD}: for links to path - C{LINK_DIR_FORWARD}: for links from and to path @returns: yields L{Link} objects or empty list if path does not exist or no links are found ''' path = self.lookup_path(path) if path: cursor = self.db.cursor() if direction == LINK_DIR_FORWARD: cursor.execute('select * from links where source = ?', (path.id,)) elif direction == LINK_DIR_BOTH: cursor.execute('select * from links where source = ? or href = ?', (path.id, path.id)) else: cursor.execute('select * from links where href = ?', (path.id,)) for link in cursor: if link['source'] == path.id: source = path href = self.lookup_id(link['href']) else: source = self.lookup_id(link['source']) href = path # TODO lookup type by id yield Link(source, href) def list_links_to_tree(self, path, direction=LINK_DIR_FORWARD): '''Generator listing links for all child pages Like list_links() but recursive for sub pages below path @param path: the L{Path} for which to list links @param direction: the link direction to be listed @returns: yields L{Link} objects or empty list if path does not exist or no links are found ''' path = self.lookup_path(path) if path: for link in self.list_links(path, direction): yield link for child in self.walk(path): for link in self.list_links(child, direction): yield link def n_list_links(self, path, direction=LINK_DIR_FORWARD): '''Get the number of links to be listed with L{list_links()} @param path: the L{Path} for which to list links @param direction: the link direction to be listed @returns: the number of links ''' path = self.lookup_path(path) if not path: return 0 cursor = self.db.cursor() if direction == LINK_DIR_FORWARD: cursor.execute('select count(*) from links where source = ?', (path.id,)) elif direction == LINK_DIR_BOTH: cursor.execute('select count(*) from links where source = ? or href = ?', (path.id, path.id)) else: cursor.execute('select count(*) from links where href = ?', (path.id,)) row = cursor.fetchone() return int(row[0]) def n_list_links_to_tree(self, path, direction=LINK_DIR_FORWARD): '''Get the number of links to be listed with L{list_links_to_tree()} @param path: the L{Path} for which to list links @param direction: the link direction to be listed @returns: the number of links ''' # TODO optimize this one n = self.n_list_links(path, direction) for child in self.walk(path): n += self.n_list_links(child, direction) return n def get_tag_index(self, tag): '''Get the index where this tag will appear in the result of L{list_all_tags()} @param tag: a tag name or an L{IndexTag} object @returns: the index of this tag in the list (integer) ''' tag = self.lookup_tag(tag) if not tag: raise ValueError, 'Could not find tag in index' sortkey = natural_sort_key(tag.name) cursor = self.db.cursor() cursor.execute( 'select count(*) from tags where ' '(sortkey < ? or (sortkey = ? and name < ?))', (sortkey, sortkey, tag.name) ) row = cursor.fetchone() return int(row[0]) def list_all_tags(self, offset=None, limit=None): '''Generator listing all tags that are used in this notebook The optional arguments C{offset} and C{limit} can be used to iterate only a slice of the list. Note that both C{offset} and C{limit} must always be defined together. @keyword offset: offset in list to start, an integer or None @keyword limit: max pages to return, an integer or None @returns: yields L{IndexTag} objects ''' cursor = self.db.cursor() query = 'select * from tags order by sortkey, name' if offset is None: cursor.execute(query) else: cursor.execute(query + ' limit ? offset ?', (limit, offset)) for row in cursor: yield IndexTag(row['name'], row['id']) def n_list_all_tags(self): '''Get the total number of tags used in this notebook @returns: the number of tags ''' cursor = self.db.cursor() cursor.execute('select count(*) from tags') row = cursor.fetchone() return int(row[0]) def list_all_tags_by_score(self): '''Generator listing all tags that are used in this notebook in order of occurence Like C{list_all_tags()} but sorted by the number of times they are used. @returns: yields L{IndexTag} objects ''' cursor = self.db.cursor() cursor.execute( 'SELECT id, name, count(*) hits' ' FROM tags t INNER JOIN tagsources s ON t.id = s.tag' ' GROUP BY s.tag' ' ORDER BY count(*) DESC' ) for row in cursor: yield IndexTag(row['name'], row['id']) def list_intersecting_tags(self, tags): '''List tags that have pages in common with a given set of tags Generator function that lists all tags that occur on pages that match the given tag set. This is used to narrow down possible tag sets that are not empty. (This method is used e.g. in the L{zim.plugins.tags.TagCloudWidget} widget to decide which tags to show once some tags are selected.) @param tags: an iterable of L{IndexTag} objects @returns: yields L{IndexTag} objects ''' tag_ids = '(' + ','.join(str(t.id) for t in tags) + ')' cursor = self.db.cursor() cursor.execute( # The sub-query filters on pages that match all of the given tags # The main query selects all tags occuring on those pages and sorts # them by number of matching pages 'SELECT id, name, count(*) hits' ' FROM tags t INNER JOIN tagsources s ON t.id = s.tag' ' WHERE s.source IN (' ' SELECT source FROM tagsources' ' WHERE tag IN %s' ' GROUP BY source' ' HAVING count(tag) = ?' ' )' ' GROUP BY s.tag' ' ORDER BY count(*) DESC' % tag_ids, (len(tags),) ) for row in cursor: yield IndexTag(row['name'], row['id']) def list_tags(self, path): '''Returns all tags for a given page @param path: a L{Path} object for the page @returns: yields L{IndexTag} objects ''' path = self.lookup_path(path) if path: cursor = self.db.cursor() cursor.execute('select * from tagsources where source = ?', (path.id,)) for row in cursor: yield self.lookup_tagid(row['tag']) def get_tagged_page_index(self, tag, path): '''Get the index where a path will appear in the result of L{list_tagged_pages()} for a given tag. @param tag: a tag name or L{IndexTag} object @param path: an {IndexPath} object @returns: the position of the path in the list (integer) ''' if path.isroot: raise ValueError, 'Root path does not have an index number' path = self.lookup_path(path) if not path: raise ValueError, 'Could not find path in index' tag = self.lookup_tag(tag) if not tag: raise ValueError, 'Could not find tag in index' # Can't use count() here, like in get_page_index(), because # basenames are not unique in this lookup # FIXME do this anyway - sort by id cursor = self.db.cursor() cursor.execute( 'select tagsources.source ' 'from tagsources join pages on tagsources.source=pages.id ' 'where tagsources.tag = ? ' 'order by pages.sortkey, pages.basename, pages.id', (tag.id,) ) # Added id to "order by" columns because basenames are not unique i = 0 for row in cursor: if row['source'] == path.id: return i i += 1 raise ValueError, 'Path does not have given tag' def list_tagged_pages(self, tag, offset=None, limit=None): '''List all pages tagged with a given tag. The optional arguments C{offset} and C{limit} can be used to iterate only a slice of the list. Note that both C{offset} and C{limit} must always be defined together. @param tag: an L{IndexTag} object @keyword offset: offset in list to start, an integer or None @keyword limit: max pages to return, an integer or None @returns: yields L{IndexPath} objects ''' tag = self.lookup_tag(tag) if not tag is None: cursor = self.db.cursor() query = 'select tagsources.source ' \ 'from tagsources join pages on tagsources.source=pages.id ' \ 'where tagsources.tag = ? ' \ 'order by pages.sortkey, pages.basename, pages.id' # Added id to "order by" columns because basenames are not unique if offset is None and limit is None: cursor.execute(query, (tag.id,)) else: cursor.execute(query + ' limit ? offset ?', (tag.id, limit, offset)) for row in cursor: yield self.lookup_id(row['source']) def get_untagged_root_page_index(self, path): '''Get the index where a path will appear in the result of L{list_untagged_root_pages()}. @param path: a L{Path} object @returns: the position of the path in the list ''' if path.isroot: raise ValueError, 'Root path does not have an index number' path = self.lookup_path(path) if not path: raise ValueError, 'Could not find path in index' cursor = self.db.cursor() cursor.execute('select count(*) from tagsources where source = ?', (path.id,)) row = cursor.fetchone() if int(row[0]) > 0: raise ValueError, 'Page has tags' sortkey = natural_sort_key(path.basename) cursor = self.db.cursor() cursor.execute( 'select count(*) from pages where parent = ? ' 'and id not in (select source from tagsources) ' 'and (sortkey < ? or (sortkey = ? and basename < ?))', (ROOT_ID, sortkey, sortkey, path.basename) ) row = cursor.fetchone() return int(row[0]) def list_untagged_root_pages(self, offset=None, limit=None): '''List pages without tags in the top level namespace The optional arguments C{offset} and C{limit} can be used to iterate only a slice of the list. Note that both C{offset} and C{limit} must always be defined together. @keyword offset: offset in list to start, an integer or None @keyword limit: max pages to return, an integer or None @returns: yields L{IndexPath} objects ''' cursor = self.db.cursor() query = 'select * from pages where parent = ? and id not in (select source from tagsources) order by sortkey, basename' if offset is None and limit is None: cursor.execute(query, (ROOT_ID,)) else: cursor.execute(query + ' limit ? offset ?', (ROOT_ID, limit, offset)) for row in cursor: yield IndexPath(row['basename'], (ROOT_ID, row['id'],), row) def n_list_tagged_pages(self, tag): '''Returns the number of pages tagged with a given tag @param tag: an L{IndexTag} object ''' tag = self.lookup_tag(tag) if tag: cursor = self.db.cursor() cursor.execute('select count(*) from tagsources where tag = ?', (tag.id,)) row = cursor.fetchone() return int(row[0]) else: return 0 def n_list_untagged_root_pages(self): '''Returns the number of untagged pages in the top level namespace''' cursor = self.db.cursor() cursor.execute('select count(*) from pages where parent = ? and id not in (select source from tagsources)', (ROOT_ID,)) row = cursor.fetchone() return int(row[0]) def get_previous(self, path, recurs=True): '''Get the previous path in the index This method allows moving through the index as if it were a flat list. @param path: a L{Path} object @param recurs: if C{False} only a previous page in the same namespace is returned, if C{True} previous page can be in a different namespace (walking depth first). @returns: an L{IndexPath} or C{None} if there was no previous page ''' path = self.lookup_path(path) if path is None or path.isroot: return None if not recurs: return self._get_prev(path) else: prev = self._get_prev(path) if prev is None: # climb one up to parent parent = path.parent if not parent.isroot: prev = parent else: # decent to deepest child of previous path while prev.haschildren: pages = list(self.list_pages(prev)) prev = pages[-1] return prev def _get_prev(self, path): # TODO: this one can be optimized using get_page_index() and # using offset and limit for list_pages() pagelist = list(self.list_pages(path.parent)) i = pagelist.index(path) if i > 0: return pagelist[i-1] else: return None def get_next(self, path, recurs=True): '''Get the next path in the index This method allows moving through the index as if it were a flat list. @param path: a L{Path} object @param recurs: if C{False} only a next page in the same namespace is returned, if C{True} next page can be in a different namespace (walking depth first). @returns: an L{IndexPath} or C{None} if there was no next page ''' path = self.lookup_path(path) if path is None or path.isroot: return None if not recurs: return self._get_next(path) elif path.haschildren: # descent to first child pages = list(self.list_pages(path)) return pages[0] else: next = self._get_next(path) if next is None: # climb up to the first parent that has a next path for parent in path.parents(): if parent.isroot: break next = self._get_next(parent) if next: break return next def _get_next(self, path): # TODO: this one can be optimized using get_page_index() and # using offset and limit for list_pages() pagelist = list(self.list_pages(path.parent)) i = pagelist.index(path) if i+1 < len(pagelist): return pagelist[i+1] else: return None def get_unique_path(self, suggestedpath): '''Find a new non-existing path. Will add a number to the path name if it already exists untill a non-existing path is found. @param suggestedpath: a L{Path} object @returns: a L{Path} object ''' path = self.lookup_path(suggestedpath) if path is None: return suggestedpath elif path.isroot: raise LookupError, 'Can not create new top level path' else: cursor = self.db.cursor() cursor.execute('select basename from pages where basename like ? and parent = ?', (path.basename+'%', path.parentid)) taken = cursor.fetchall() i = 1 name = path.basename + '_' while name + str(i) in taken: i += 1 return Path(path.namespace + ':' + name+str(i)) # Need to register classes defining gobject signals gobject.type_register(Index) class PropertiesDict(object): '''Dict that maps key value pairs in the "meta" table of the database. Used to store e.g. the zim version that created the index. Used for the L{index.properties} attribute. ''' def __init__(self, db): self.db = db self.db_commit = DBCommitContext(self.db) def __setitem__(self, k, v): with self.db_commit: self._set(k, v) def _set(self, k, v): # This method is directly by Index when we are already in an # db commit context. cursor = self.db.cursor() cursor.execute('delete from meta where key=?', (k,)) cursor.execute('insert into meta(key, value) values (?, ?)', (k, v)) def __getitem__(self, k): try: cursor = self.db.cursor() cursor.execute('select value from meta where key=?', (k,)) row = cursor.fetchone() if row: return row[0] else: return None except sqlite3.OperationalError: # no such table: meta return None zim-0.60/zim/plugins/0000775000175000017500000000000012140000463014356 5ustar jaapjaap00000000000000zim-0.60/zim/plugins/calendar.py0000664000175000017500000003367312132472704016531 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2013 Jaap Karssenberg import gobject import gtk import re import logging from zim.plugins import PluginClass import zim.datetimetz as datetime from zim.datetimetz import dates_for_week, weekcalendar from zim.gui.widgets import ui_environment, Dialog, Button, \ WindowSidePaneWidget, LEFT_PANE, TOP, WIDGET_POSITIONS from zim.notebook import Path from zim.templates import TemplateManager, TemplateFunction logger = logging.getLogger('zim.plugins.calendar') # FUTURE: Use calendar.HTMLCalendar from core libs to render this plugin in www ui_xml = ''' ''' ui_xml_show_dialog = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('go_page_today', None, _('To_day'), 'D', '', True), # T: menu item ('show_calendar', 'zim-calendar', _('Calen_dar'), '', 'Show calendar', True), # T: menu item ) KEYVALS_ENTER = map(gtk.gdk.keyval_from_name, ('Return', 'KP_Enter', 'ISO_Enter')) KEYVALS_SPACE = (gtk.gdk.unicode_to_keyval(ord(' ')),) date_path_re = re.compile(r'^(.*:)?\d{4}:\d{1,2}:\d{2}$') week_path_re = re.compile(r'^(.*:)?\d{4}:Week \d{2}$') month_path_re = re.compile(r'^(.*:)?\d{4}:\d{1,2}$') year_path_re = re.compile(r'^(.*:)?\d{4}$') def daterange_from_path(path): '''Determine the calendar dates mapped by a specific page @param path: a L{Path} object @returns: a 3-tuple of: - the page type (one of "C{day}", "C{week}", "C{month}", or "C{year}") - a C{datetime.date} object for the start date - a C{datetime.date} object for the end date or C{None} when the page does not map a date ''' if date_path_re.match(path.name): type = 'day' year, month, day = map(int, path.name.rsplit(':', 3)[-3:]) date = datetime.date(year, month, day) end_date = date elif week_path_re.match(path.name): type = 'week' year, week = path.name.rsplit(':', 2)[-2:] year, week = map(int, (year, week[5:])) # Assumes "Week XX" string date, end_date = dates_for_week(year, week) elif month_path_re.match(path.name): type = 'month' year, month = map(int, path.name.rsplit(':', 2)[-2:]) date = datetime.date(year, month, 1) if month == 12: end_date = datetime.date(year, 12, 31) else: end_date = datetime.date(year, month+1, 1) + datetime.timedelta(-1) elif year_path_re.match(path.name): type = 'year' year = int(path.name.rsplit(':', 1)[-1]) date = datetime.date(year, 1, 1) end_date = datetime.date(year, 12, 31) else: return None # Not a calendar path return type, date, end_date class CalendarPlugin(PluginClass): plugin_info = { 'name': _('Journal'), # T: plugin name 'description': _('''\ This plugin turns one namespace into a journal with a page per day, week or month. Also adds a calendar widget to access these pages. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Journal', } global DAY, WEEK, MONTH, YEAR # Hack - to make sure translation is loaded DAY = _('Day') # T: option value WEEK = _('Week') # T: option value MONTH = _('Month') # T: option value YEAR = _('Year') # T: option value plugin_preferences = ( # key, type, label, default ('embedded', 'bool', _('Show calendar in sidepane instead of as dialog'), False), # T: preferences option ('pane', 'choice', _('Position in the window'), (LEFT_PANE, TOP), WIDGET_POSITIONS), # T: preferences option ('granularity', 'choice', _('Use a page for each'), DAY, (DAY, WEEK, MONTH, YEAR)), # T: preferences option, values will be "Day", "Month", ... ('namespace', 'namespace', _('Namespace'), ':Journal'), # T: input label ) # TODO disable pane setting if not embedded def __init__(self, ui): PluginClass.__init__(self, ui) self.sidepane_widget = None # For the embedded version self.ui_id_show_dialog = None # For the 'show dialog' action self._set_template = None def initialize_ui(self, ui): if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.connectto(TemplateManager, 'process-page', self.on_process_page_template) self.connectto(self.ui, 'open-page') def finalize_notebook(self, notebook): self.do_preferences_changed() self.connectto(notebook, 'suggest_link', self.suggest_link) def destroy(self): if self._set_template: ns = self._set_template try: self.ui.notebook.namespace_properties[ns].remove('template') except KeyError: pass self.destroy_embedded_widget() PluginClass.destroy(self) def on_open_page(self, ui, page, path): if self.sidepane_widget: self.sidepane_widget.set_page(path) # else dialog takes care of itself def connect_embedded_widget(self): if not self.sidepane_widget: self.sidepane_widget = CalendarPluginWidget(self) else: self.ui.mainwindow.remove(self.sidepane_widget) self.ui.mainwindow.add_widget(self.sidepane_widget, self.preferences['pane']) self.sidepane_widget.show_all() def destroy_embedded_widget(self): if self.sidepane_widget: self.ui.mainwindow.remove(self.sidepane_widget) self.sidepane_widget.destroy() self.sidepane_widget = None def do_preferences_changed(self): '''Switch between calendar in the sidepane or as a dialog''' if self.ui.notebook: if self._set_template: ns = self._set_template try: self.ui.notebook.namespace_properties[ns].remove('template') except KeyError: pass if isinstance(self.preferences['namespace'], Path): ns = self.preferences['namespace'].name self.preferences['namespace'] = ns else: self.preferences.setdefault('namespace', ':Journal') ns = self.preferences['namespace'] ns = self.ui.notebook.resolve_path(ns) ns = ns.name self.preferences['namespace'] = ns self.ui.notebook.namespace_properties[ns]['template'] = 'Journal' self._set_template = ns if self.ui.ui_type == 'gtk': if self.preferences['embedded']: if self.ui_id_show_dialog: self.ui.remove_ui(self, self.ui_id_show_dialog) self.ui_id_show_dialog = None self.connect_embedded_widget() else: self.destroy_embedded_widget() if not self.ui_id_show_dialog: self.ui_id_show_dialog = \ self.ui.add_ui(ui_xml_show_dialog, self) def path_from_date(self, date): '''Returns the path for a calendar page for a specific date''' if self.preferences['granularity'] == DAY: path = date.strftime('%Y:%m:%d') elif self.preferences['granularity'] == WEEK: year, week, day = weekcalendar(date) path = '%i:Week %02i' % (year, week) elif self.preferences['granularity'] == MONTH: path = date.strftime('%Y:%m') elif self.preferences['granularity'] == YEAR: path = date.strftime('%Y') return Path( self.preferences['namespace'] + ':' + path ) def path_for_month_from_date(self, date): '''Returns the namespace path for a certain month''' return Path( self.preferences['namespace'] + ':' + date.strftime('%Y:%m') ) def date_from_path(self, path): '''Returns the date for a specific path or C{None}''' dates = daterange_from_path(path) if dates: return dates[1] else: return None def on_process_page_template(self, manager, template, page, dict): '''Callback called when parsing a template, e.g. when exposing a page or for the template used to create a new page. Will set parameters in the template dict to be used in the template. ''' daterange = daterange_from_path(page) if daterange: type, start, end = daterange dict['calendar_plugin'] = { 'page_type': type, 'date': start, 'start_date': start, 'end_date': end, 'days': DateRangeTemplateFunction(start, end), } def suggest_link(self, source, text): #~ if date_path_re.match(path.text): #~ return Path(text) if re.match(r'^\d{4}-\d{2}-\d{2}$', text): year, month, day = text.split('-') year, month, day = map(int, (year, month, day)) date = datetime.date(year, month, day) return self.path_from_date(date) # TODO other formats else: return None def go_page_today(self): today = datetime.date.today() path = self.path_from_date(today) self.ui.open_page(path) def show_calendar(self): dialog = CalendarDialog.unique(self, self) dialog.present() # TODO: hook to the pageview end-of-word signal and link dates # add a preference for this # TODO: Overload the "Insert date" dialog by adding a 'link' option class DateRangeTemplateFunction(TemplateFunction): '''Function to be used in templates to iterate a range of dates''' def __init__(self, start, end): self.start = start self.end = end def __call__(self, dict): oneday = datetime.timedelta(days=1) yield self.start next = self.start + oneday while next <= self.end: yield next next += oneday class Calendar(gtk.Calendar): '''Custom calendar widget class. Adds an 'activate' signal for when a date is selected explicitly by the user. ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'activate': (gobject.SIGNAL_RUN_LAST, None, ()), } def __init__(self): gtk.Calendar.__init__(self) self.selected = False def do_key_press_event(self, event): handled = gtk.Calendar.do_key_press_event(self, event) if handled and (event.keyval in KEYVALS_SPACE or event.keyval in KEYVALS_ENTER): self.emit('activate') return handled def do_button_press_event(self, event): handled = gtk.Calendar.do_button_press_event(self, event) if event.button == 1 and self.selected: self.selected = False self.emit('activate') return handled def do_day_selected(self): self.selected = True def select_date(self, date): '''Set selected date using a datetime oject''' self.select_month(date.month - 1, date.year) self.select_day(date.day) def get_date(self): '''Get the datetime object for the selected date''' year, month, day = gtk.Calendar.get_date(self) return datetime.date(year, month + 1, day) # Need to register classes defining gobject signals gobject.type_register(Calendar) class CalendarPluginWidget(gtk.VBox, WindowSidePaneWidget): def __init__(self, plugin): gtk.VBox.__init__(self) self.plugin = plugin self.label_box = gtk.HBox() self.pack_start(self.label_box, False) self.label = gtk.Label() self.label_box.add(self.label) self._refresh_label() self._timer_id = \ gobject.timeout_add(300000, self._refresh_label) # 5 minute = 300_000 ms # Ideally we only need 1 timer per day at 00:00, but not # callback for that self.connect('destroy', lambda o: gobject.source_remove(o._timer_id) ) # Clear reference, else we get a new timer for every dialog self.calendar = Calendar() self.calendar.display_options( gtk.CALENDAR_SHOW_HEADING | gtk.CALENDAR_SHOW_DAY_NAMES | gtk.CALENDAR_SHOW_WEEK_NUMBERS ) self.calendar.connect('activate', self.on_calendar_activate) self.calendar.connect('month-changed', self.on_month_changed) self.on_month_changed(self.calendar) self.pack_start(self.calendar, False) self._select_date_cb = None def embed_closebutton(self, button): if button: self.label_box.pack_end(button, False) else: for widget in self.label_box.get_children(): if not widget == self.label: self.label_box.remove(widget) return True def _refresh_label(self, *a): #print "UPDATE LABEL %s" % id(self) format = _('%A %d %B %Y').replace(' 0', ' ') # T: strftime format for current date label text = datetime.date.today().strftime(str(format)) # str() needed for python 2.5 compatibility strftime self.label.set_text(text) return True # else timer is stopped def set_select_date_callback(self, func): self._select_date_cb = func def on_calendar_activate(self, calendar): path = self.plugin.path_from_date( calendar.get_date() ) if path != self.plugin.ui.page: self.plugin.ui.open_page(path) if callable(self._select_date_cb): self._select_date_cb(calendar.get_date()) def on_month_changed(self, calendar): calendar.clear_marks() namespace = self.plugin.path_for_month_from_date( calendar.get_date() ) for path in self.plugin.ui.notebook.index.list_pages(namespace): if date_path_re.match(path.name): dates = daterange_from_path(path) if dates and dates[0] == 'day': calendar.mark_day(dates[1].day) def set_page(self, page): dates = daterange_from_path(page) if dates and dates[0] != 'year': # Calendar is per month, so do not switch view for year page self.calendar.select_month(dates[1].month-1, dates[1].year) def select_date(self, date): self.calendar.select_date(date) self.on_calendar_activate(self.calendar) class CalendarDialog(Dialog): def __init__(self, plugin): Dialog.__init__(self, plugin.ui, _('Calendar'), buttons=gtk.BUTTONS_CLOSE) # T: dialog title self.set_resizable(False) self.plugin = plugin self.calendar_widget = CalendarPluginWidget(plugin) self.calendar_widget.set_select_date_callback(self.on_select_date) self.vbox.add(self.calendar_widget) button = Button(_('_Today'), gtk.STOCK_JUMP_TO) # T: button label button.connect('clicked', self.do_today ) self.action_area.add(button) self.action_area.reorder_child(button, 0) self.dateshown = datetime.date.today() self.connectto(self.plugin.ui, 'open-page') def on_open_page(self, ui, page, path): self.calendar_widget.set_page(page) def on_select_date(self, date): if ui_environment['platform'] == 'maemo': # match the user usage pattern # close the dialog once a explicit selection is made # since it is modal and the mainwindow can't be reached if (date.month != self.dateshown.month) or (date.year != self.dateshown.year): self.dateshown = date else: self.emit('close') def do_today(self, event): self.calendar_widget.select_date(datetime.date.today()) zim-0.60/zim/plugins/screenshot.py0000644000175000017500000000703311572405060017120 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import gtk import time from zim.fs import TmpFile from zim.plugins import PluginClass from zim.gui.widgets import ui_environment, Dialog, ErrorDialog from zim.applications import Application ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_screenshot', None, _('_Screenshot...'), '', '', False), # T: menu item for insert screenshot plugin ) if ui_environment['platform'] == 'maemo': COMMAND = 'screenshot-tool' else: COMMAND = 'scrot' class InsertScreenshotPlugin(PluginClass): '''FIXME''' plugin_info = { 'name': _('Insert Screenshot'), # T: plugin name 'description': _('''\ This plugin allows taking a screenshot and directly insert it in a zim page. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Insert Screenshot', } def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) @classmethod def check_dependencies(klass): has_tool = Application((COMMAND,)).tryexec() return has_tool, [(COMMAND, has_tool, True)] def insert_screenshot(self): dialog = InsertScreenshotDialog.unique(self, self.ui) dialog.show_all() class InsertScreenshotDialog(Dialog): # TODO use uistate to save previous setting def __init__(self, ui): Dialog.__init__(self, ui, _('Insert Screenshot')) # T: dialog title if COMMAND == 'scrot': self.screen_radio = gtk.RadioButton(None, _('Capture whole screen')) # T: option in 'insert screenshot' dialog self.select_radio = gtk.RadioButton(self.screen_radio, _('Select window or region')) # T: option in 'insert screenshot' dialog self.vbox.add(self.screen_radio) self.vbox.add(self.select_radio) hbox = gtk.HBox() self.vbox.add(hbox) hbox.add(gtk.Label(_('Delay')+': ')) # T: input in 'insert screenshot' dialog self.time_spin = gtk.SpinButton() self.time_spin.set_range(0, 99) self.time_spin.set_increments(1, 5) hbox.add(self.time_spin) hbox.add(gtk.Label(' '+_('seconds'))) # T: label behind timer def do_response_ok(self): tmpfile = TmpFile('insert-screenshot.png') options = () if COMMAND == 'scrot': if self.select_radio.get_active(): options += ('--select', '--border') # Interactively select a window or rectangle with the mouse. # When selecting a window, grab wm border too else: options += ('--multidisp',) # For multiple heads, grab shot from each and join them together. delay = self.time_spin.get_value_as_int() if delay > 0: options += ('-d', str(delay)) # Wait NUM seconds before taking a shot. helper = Application((COMMAND,) + options) def callback(status, tmpfile): if status == helper.STATUS_OK: name = time.strftime('screenshot_%Y-%m-%d-%H%M%S.png') page = self.ui.page dir = self.ui.notebook.get_attachments_dir(page) file = dir.new_file(name) tmpfile.rename(file) self.ui.mainwindow.pageview.insert_image(file, interactive=False) else: ErrorDialog(self.ui, _('Some error occurred while running "%s"') % COMMAND).run() # T: Error message in "insert screenshot" dialog, %s will be replaced by application name tmpfile.dir.touch() helper.spawn((tmpfile,), callback, tmpfile) return True zim-0.60/zim/plugins/automount.py0000644000175000017500000000330412132472704016775 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Jaap Karssenberg '''Plugin to auto-mount notebooks when needed''' from zim.plugins import PluginClass from zim.fs import Dir from zim.config import get_config from zim.applications import Application class AutomountPlugin(PluginClass): plugin_info = { 'name': _('Automount'), # T: plugin name 'description': _('''\ This plugin can automatically "mount" notebooks when needed. It can e.g. be used to connect with remote drives or unlock an encrypted drive when zim is trying to open a specific notebook. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Automount', } # this plugin is profile independent is_profile_independent = True def __init__(self, ui): PluginClass.__init__(self, ui) self.connectto(ui, 'initialize-notebook') def get_config(self, uri): '''Return the automount config for a specific notebook uri or C{None} @param uri: a notebook uri @returns: a config dict ''' config = get_config('automount.conf') groups = [k for k in config.keys() if k.startswith('Path')] for group in groups: path = group[4:].strip() # len('Path') = 4 myuri = Dir(path).uri # Allow "~/Folder" syntax if uri.startswith(myuri): return config[group] else: return None def on_initialize_notebook(self, ui, uri): # check if the notebook exists if not uri.startswith('file:') \ or Dir(uri).file('notebook.zim').exists(): return # if it doesn't, see if we know how to mount it config = self.get_config(uri) if config and 'mount' in config: if 'passwd' in config: passwd = self.prompt Application(config['mount']).run() zim-0.60/zim/plugins/tasklist.py0000664000175000017500000011652312132472704016612 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import gobject import gtk import pango import logging import re import zim.datetimetz as datetime from zim.utils import natural_sorted from zim.parsing import parse_date from zim.plugins import PluginClass from zim.notebook import Path from zim.gui.widgets import ui_environment, \ Dialog, MessageDialog, \ InputEntry, Button, IconButton, MenuButton, \ BrowserTreeView, SingleClickTreeView, ScrolledWindow, HPaned, \ encode_markup_text, decode_markup_text from zim.gui.clipboard import Clipboard from zim.signals import DelayedCallback, SIGNAL_AFTER from zim.formats import get_format, UNCHECKED_BOX, CHECKED_BOX, XCHECKED_BOX from zim.config import check_class_allow_empty from zim.plugins.calendar import daterange_from_path logger = logging.getLogger('zim.plugins.tasklist') ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('show_task_list', 'zim-task-list', _('Task List'), '', _('Task List'), True), # T: menu item ) ui_xml = ''' ''' SQL_FORMAT_VERSION = (0, 6) SQL_CREATE_TABLES = ''' create table if not exists tasklist ( id INTEGER PRIMARY KEY, source INTEGER, parent INTEGER, haschildren BOOLEAN, open BOOLEAN, actionable BOOLEAN, prio INTEGER, due TEXT, tags TEXT, description TEXT ); ''' _tag_re = re.compile(r'(? use defer date for this use case class TaskListPlugin(PluginClass): # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'tasklist-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } plugin_info = { 'name': _('Task List'), # T: plugin name 'description': _('''\ This plugin adds a dialog showing all open tasks in this notebook. Open tasks can be either open checkboxes or items marked with tags like "TODO" or "FIXME". This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Task List' } plugin_preferences = ( # key, type, label, default ('all_checkboxes', 'bool', _('Consider all checkboxes as tasks'), True), # T: label for plugin preferences dialog ('tag_by_page', 'bool', _('Turn page name into tags for task items'), False), # T: label for plugin preferences dialog ('deadline_by_page', 'bool', _('Implicit due date for task items in calendar pages'), False), # T: label for plugin preferences dialog ('use_workweek', 'bool', _('Flag tasks due on Monday or Tuesday before the weekend'), True), # T: label for plugin preferences dialog ('labels', 'string', _('Labels marking tasks'), 'FIXME, TODO', check_class_allow_empty), # T: label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" ('next_label', 'string', _('Label for next task'), 'Next:', check_class_allow_empty), # T: label for plugin preferences dialog - label is by default "Next" ('nonactionable_tags', 'string', _('Tags for non-actionable tasks'), '', check_class_allow_empty), # T: label for plugin preferences dialog ('included_subtrees', 'string', _('Subtree(s) to index'), '', check_class_allow_empty), # T: subtree to search for tasks - default is the whole tree (empty string means everything) ('excluded_subtrees', 'string', _('Subtree(s) to ignore'), '', check_class_allow_empty), # T: subtrees of the included subtrees to *not* search for tasks - default is none ) _rebuild_on_preferences = ['all_checkboxes', 'labels', 'next_label', 'deadline_by_page', 'nonactionable_tags', 'included_subtrees', 'excluded_subtrees' ] # Rebuild database table if any of these preferences changed. # But leave it alone if others change. def __init__(self, ui): PluginClass.__init__(self, ui) self.task_labels = None self.task_label_re = None self.next_label = None self.next_label_re = None self.nonactionable_tags = [] self.included_re = None self.excluded_re = None self.db_initialized = False self._current_preferences = None def initialize_ui(self, ui): if ui.ui_type == 'gtk': ui.add_actions(ui_actions, self) ui.add_ui(ui_xml, self) def finalize_notebook(self, notebook): # This is done regardsless of the ui type of the application self.index = notebook.index self.connectto_all(self.index, ( ('initialize-db', self.initialize_db, None, SIGNAL_AFTER), ('page-indexed', self.index_page), ('page-deleted', self.remove_page), )) # We don't care about pages that are moved db_version = self.index.properties['plugin_tasklist_format'] if db_version == '%i.%i' % SQL_FORMAT_VERSION: self.db_initialized = True self._set_preferences() def initialize_db(self, index): with index.db_commit: index.db.executescript(SQL_CREATE_TABLES) self.index.properties['plugin_tasklist_format'] = '%i.%i' % SQL_FORMAT_VERSION self.db_initialized = True def do_preferences_changed(self): if self._current_preferences is None \ or not self.db_initialized: return new_preferences = self._serialize_rebuild_on_preferences() if new_preferences != self._current_preferences: self._drop_table() self._set_preferences() def _set_preferences(self): self._current_preferences = self._serialize_rebuild_on_preferences() string = self.preferences['labels'].strip(' ,') if string: self.task_labels = [s.strip() for s in self.preferences['labels'].split(',')] else: self.task_labels = [] if self.preferences['next_label']: self.next_label = self.preferences['next_label'] # Adding this avoid the need for things like "TODO: Next: do this next" self.next_label_re = re.compile(r'^' + re.escape(self.next_label) + r':?\s+' ) self.task_labels.append(self.next_label) else: self.next_label = None self.next_label_re = None if self.preferences['nonactionable_tags']: self.nonactionble_tags = [ t.strip().strip('@').lower() for t in self.preferences['nonactionable_tags'].split(',')] else: self.nonactionble_tags = [] regex = r'^(' + '|'.join(map(re.escape, self.task_labels)) + r')(?!\w)' self.task_label_re = re.compile(regex) if self.preferences['included_subtrees']: included = [i.strip().strip(':') for i in self.preferences['included_subtrees'].split(',')] included.sort(key=lambda s: len(s), reverse=True) # longest first included_re = '^(' + '|'.join(map(re.escape, included)) + ')(:.+)?$' #~ print '>>>>>', "included_re", repr(included_re) self.included_re = re.compile(included_re) else: self.included_re = None if self.preferences['excluded_subtrees']: excluded = [i.strip().strip(':') for i in self.preferences['excluded_subtrees'].split(',')] excluded.sort(key=lambda s: len(s), reverse=True) # longest first excluded_re = '^(' + '|'.join(map(re.escape, excluded)) + ')(:.+)?$' #~ print '>>>>>', "excluded_re", repr(excluded_re) self.excluded_re = re.compile(excluded_re) else: self.excluded_re = None def _serialize_rebuild_on_preferences(self): # string mapping settings that influence building the table string = '' for pref in self._rebuild_on_preferences: string += str(self.preferences[pref]) return string def destroy(self): self._drop_table() PluginClass.destroy(self) def _drop_table(self): self.index.properties['plugin_tasklist_format'] = 0 if self.db_initialized: try: self.index.db.execute('DROP TABLE "tasklist"') except: logger.exception('Could not drop table:') else: self.db_initialized = False else: try: self.index.db.execute('DROP TABLE "tasklist"') except: pass def _excluded(self, path): if self.included_re and self.excluded_re: # judge which match is more specific # this allows including subnamespace of excluded namespace # and vice versa inc_match = self.included_re.match(path.name) exc_match = self.excluded_re.match(path.name) if not exc_match: return not bool(inc_match) elif not inc_match: return bool(exc_match) else: return len(inc_match.group(1)) < len(exc_match.group(1)) elif self.included_re: return not bool(self.included_re.match(path.name)) elif self.excluded_re: return bool(self.excluded_re.match(path.name)) else: return False def index_page(self, index, path, page): if not self.db_initialized: return #~ print '>>>>>', path, page, page.hascontent tasksfound = self.remove_page(index, path, _emit=False) if self._excluded(path): if tasksfound: self.emit('tasklist-changed') return parsetree = page.get_parsetree() if not parsetree: return if page._ui_object: # FIXME - HACK - dump and parse as wiki first to work # around glitches in pageview parsetree dumper # make sure we get paragraphs and bullets are nested properly # Same hack in gui clipboard code dumper = get_format('wiki').Dumper() text = ''.join( dumper.dump(parsetree) ).encode('utf-8') parser = get_format('wiki').Parser() parsetree = parser.parse(text) #~ print '!! Checking for tasks in', path dates = daterange_from_path(path) if dates and self.preferences['deadline_by_page']: deadline = dates[2] else: deadline = None tasks = self._extract_tasks(parsetree, deadline) #~ print 'TASKS', tasks if tasks: # Do insert with a single commit with self.index.db_commit: self._insert(path, 0, tasks) if tasks or tasksfound: self.emit('tasklist-changed') def _insert(self, page, parentid, children): # Helper function to insert tasks in table c = self.index.db.cursor() for task, grandchildren in children: c.execute( 'insert into tasklist(source, parent, haschildren, open, actionable, prio, due, tags, description)' 'values (?, ?, ?, ?, ?, ?, ?, ?, ?)', (page.id, parentid, bool(grandchildren)) + tuple(task) ) if grandchildren: self._insert(page, c.lastrowid, grandchildren) # recurs def _extract_tasks(self, parsetree, defaultdate=None): '''Extract all tasks from a parsetree. @param parsetree: a L{zim.formats.ParseTree} object @param defaultdate: default due date for the whole page (e.g. for calendar pages) as string @returns: nested list of tasks, each task is given as a 2-tuple, 1st item is a tuple with following properties: C{(open, actionable, prio, due, tags, description)}, 2nd item is a list of child tasks (if any). ''' # Stack tuple indexes LEVEL = 0 TASK = 1 CHILDREN = 2 # Task tuple indexes OPEN = 0 ACT = 1 PRIO = 2 DATE = 3 TAGS = 4 tasks = [] for node in parsetree.findall('p'): lines = self._flatten_para(node) # Check first line for task list header istasklist = False globaltags = [] globalactionable = True globalprio = None globaldate = defaultdate if len(lines) >= 2 \ and isinstance(lines[0], basestring) \ and isinstance(lines[1], tuple) \ and self.task_labels and self.task_label_re.match(lines[0]): # Parse the task list header as if it was a task and use it's # attributes as defaults for the rest of the tasks in this block. defaults = self._parse_task(lines[0]) defaults[TAGS] = defaults[TAGS].split(',') globalactionable = defaults[ACT] globalprio = defaults[PRIO] globaltags.extend(defaults[TAGS]) globaldate = defaults[DATE] lines.pop(0) istasklist = True stack = [] # stack of 3-tuples, (LEVEL, TASK, CHILDREN) # Check line by line for item in lines: if isinstance(item, tuple): # checkbox or bullet bullet, list_level, text = item while stack and stack[-1][LEVEL] >= list_level: stack.pop() if ( bullet in (UNCHECKED_BOX, CHECKED_BOX, XCHECKED_BOX) and (istasklist or self.preferences['all_checkboxes']) ) or ( self.task_labels and self.task_label_re.match(text) ): # task item if stack: # Inherit date and prio if not set explicitly on children mydefaultdate = stack[-1][TASK][DATE] if mydefaultdate == _NO_DATE: mydefaultdate = defaultdate mydefaultprio = stack[-1][TASK][PRIO] mydefaultactionable = stack[-1][TASK][ACT] inherited_tags = stack[-1][TASK][TAGS].split(',') else: mydefaultdate = globaldate mydefaultprio = globalprio mydefaultactionable = globalactionable inherited_tags = globaltags open = (bullet not in (CHECKED_BOX, XCHECKED_BOX)) if stack: mytasks = stack[-1][CHILDREN] else: mytasks = tasks task = self._parse_task(text, open=open, tags=inherited_tags, actionable=mydefaultactionable, defaultdate=mydefaultdate, defaultprio=mydefaultprio, tasks=mytasks) children = [] if stack: stack[-1][CHILDREN].append((task, children)) if task[OPEN]: for parent in stack: # child is open, so parent should be as well parent[TASK][OPEN] = True else: tasks.append((task, children)) stack.append([list_level, task, children]) else: # not a task - we already popped stack, now ignore text pass else: # normal line, outside list stack = [] if self.task_labels and self.task_label_re.match(item): task = self._parse_task(item, tags=globaltags, defaultdate=defaultdate, tasks=tasks) tasks.append((task, [])) return tasks def _flatten_para(self, para): # Returns a list which is a mix of normal lines of text and # tuples for checkbox items. Checkbox item tuples consist of # the checkbox type, the indenting level and the text. items = [] text = para.text or '' for child in para.getchildren(): if child.tag == 'strike': # ignore content of child element text += child.tail or '' elif child.tag in ('ul', 'ol'): if text: items += text.splitlines() items += self._flatten_list(child) text = child.tail or '' else: text += self._flatten(child) text += child.tail or '' if text: items += text.splitlines() return items def _flatten_list(self, list, list_level=0): # Handle bullet lists items = [] for node in list.getchildren(): if node.tag == 'ul': items += self._flatten_list(node, list_level+1) # recurs elif node.tag == 'li': bullet = node.get('bullet') text = self._flatten(node) items.append((bullet, list_level, text)) else: pass # should not occur - ignore silently return items def _flatten(self, node): # Just flatten everything to text - but ignore strike out text = node.text or '' for child in node.getchildren(): if child.tag == 'strike': text += child.tail or '' else: text += self._flatten(child) # recurs text += child.tail or '' return text def _parse_task(self, text, open=True, tags=None, actionable=True, defaultdate=None, defaultprio=None, tasks=None): ## Note: do not modify text here, keep it as is, any cleanup is done by the widget prio = text.count('!') if defaultprio and prio == 0: prio = defaultprio if not tags: tags = [] else: # ensure we don't mutate the parent's tags list tags = list(tags) tags += _tag_re.findall(text) datematch = _date_re.search(text) # first match if datematch: mydate = parse_date(datematch.group(0)) if mydate: date = '%04i-%02i-%02i' % mydate # (y, m, d) else: date = _NO_DATE else: date = _NO_DATE if defaultdate and date == _NO_DATE: date = defaultdate if actionable: if any(t.lower().strip('@') in self.nonactionble_tags for t in tags): actionable = False elif self.next_label_re.match(text): if tasks and tasks[-1][0][0]: # previous task still open actionable = False # else parent was non-actionable already, so stay non-actionable tags = ','.join(t.strip('@') for t in tags) return [open, actionable, prio, date, tags, text] # (open, actionable, prio, due, tags, description) def remove_page(self, index, path, _emit=True): if not self.db_initialized: return tasksfound = False with index.db_commit: cursor = index.db.cursor() cursor.execute( 'delete from tasklist where source=?', (path.id,) ) tasksfound = cursor.rowcount > 0 if tasksfound and _emit: self.emit('tasklist-changed') return tasksfound def list_tasks(self, parent=None): '''List tasks @param parent: the parent task (as returned by this method) or C{None} to list all top level tasks @returns: a list of tasks at this level as sqlite Row objects ''' if parent: parentid = parent['id'] else: parentid = 0 if self.db_initialized: cursor = self.index.db.cursor() cursor.execute('select * from tasklist where parent=? order by prio, due, description', (parentid,)) # Want order by prio & due - add desc to keep sorting more or less stable for row in cursor: yield row def get_task(self, taskid): cursor = self.index.db.cursor() cursor.execute('select * from tasklist where id=?', (taskid,)) return cursor.fetchone() def get_path(self, task): '''Get the L{Path} for the source of a task @param task: the task (as returned by L{list_tasks()} @returns: an L{IndexPath} object ''' return self.index.lookup_id(task['source']) def show_task_list(self): if not self.db_initialized: MessageDialog(self.ui, ( _('Need to index the notebook'), # T: Short message text on first time use of task list plugin _('This is the first time the task list is opened.\n' 'Therefore the index needs to be rebuild.\n' 'Depending on the size of the notebook this can\n' 'take up to several minutes. Next time you use the\n' 'task list this will not be needed again.' ) # T: Long message text on first time use of task list plugin ) ).run() logger.info('Tasklist not initialized, need to rebuild index') finished = self.ui.reload_index(flush=True) # Flush + Reload will also initialize task list if not finished: self.db_initialized = False return dialog = TaskListDialog.unique(self, plugin=self) dialog.present() # Need to register classes defining gobject signals gobject.type_register(TaskListPlugin) class TaskListDialog(Dialog): def __init__(self, plugin): if ui_environment['platform'] == 'maemo': defaultsize = (800, 480) else: defaultsize = (550, 400) Dialog.__init__(self, plugin.ui, _('Task List'), # T: dialog title buttons=gtk.BUTTONS_CLOSE, help=':Plugins:Task List', defaultwindowsize=defaultsize ) self.plugin = plugin if ui_environment['platform'] == 'maemo': self.resize(800,480) # Force maximum dialog size under maemo, otherwise # we'll end with a too small dialog and no way to resize it hbox = gtk.HBox(spacing=5) self.vbox.pack_start(hbox, False) self.hpane = HPaned() self.uistate.setdefault('hpane_pos', 75) self.hpane.set_position(self.uistate['hpane_pos']) self.vbox.add(self.hpane) # Task list self.uistate.setdefault('only_show_act', False) self.task_list = TaskListTreeView(self.ui, plugin, filter_actionable=self.uistate['only_show_act']) self.task_list.set_headers_visible(True) # Fix for maemo self.hpane.add2(ScrolledWindow(self.task_list)) # Tag list self.tag_list = TagListTreeView(self.task_list) self.hpane.add1(ScrolledWindow(self.tag_list)) # Filter input hbox.pack_start(gtk.Label(_('Filter')+': '), False) # T: Input label filter_entry = InputEntry() filter_entry.set_icon_to_clear() hbox.pack_start(filter_entry, False) filter_cb = DelayedCallback(500, lambda o: self.task_list.set_filter(filter_entry.get_text())) filter_entry.connect('changed', filter_cb) # Dropdown with options - TODO #~ menu = gtk.Menu() #~ showtree = gtk.CheckMenuItem(_('Show _Tree')) # T: menu item in options menu #~ menu.append(showtree) #~ menu.append(gtk.SeparatorMenuItem()) #~ showall = gtk.RadioMenuItem(None, _('Show _All Items')) # T: menu item in options menu #~ showopen = gtk.RadioMenuItem(showall, _('Show _Open Items')) # T: menu item in options menu #~ menu.append(showall) #~ menu.append(showopen) #~ menubutton = MenuButton(_('_Options'), menu) # T: Button label #~ hbox.pack_start(menubutton, False) self.act_toggle = gtk.CheckButton(_('Only Show Actionable Tasks')) # T: Checkbox in task list self.act_toggle.set_active(self.uistate['only_show_act']) self.act_toggle.connect('toggled', lambda o: self.task_list.set_filter_actionable(o.get_active())) hbox.pack_start(self.act_toggle, False) # Statistics label self.statistics_label = gtk.Label() hbox.pack_end(self.statistics_label, False) def set_statistics(): total, stats = self.task_list.get_statistics() text = ngettext('%i open item', '%i open items', total) % total # T: Label for statistics in Task List, %i is the number of tasks text += ' (' + '/'.join(map(str, stats)) + ')' self.statistics_label.set_text(text) set_statistics() def on_tasklist_changed(o): self.task_list.refresh() self.tag_list.refresh(self.task_list) set_statistics() callback = DelayedCallback(10, on_tasklist_changed) # Don't really care about the delay, but want to # make it less blocking - should be async preferably # now it is at least on idle self.connectto(plugin, 'tasklist-changed', callback) # Async solution fall because sqlite not multi-threading # (see also todo item for async in DelayedSignal class) #~ def async_call(o): #~ from zim.async import AsyncOperation #~ op = AsyncOperation(on_tasklist_changed, args=(o,)) #~ op.start() #~ self.connectto(plugin, 'tasklist-changed', async_call) def do_response(self, response): self.uistate['hpane_pos'] = self.hpane.get_position() self.uistate['only_show_act'] = self.act_toggle.get_active() Dialog.do_response(self, response) class TagListTreeView(SingleClickTreeView): '''TreeView with a single column 'Tags' which shows all tags available in a TaskListTreeView. Selecting a tag will filter the task list to only show tasks with that tag. ''' _type_separator = 0 _type_label = 1 _type_tag = 2 _type_untagged = 3 def __init__(self, task_list): model = gtk.ListStore(str, int, int, int) # tag name, number of tasks, type, weight SingleClickTreeView.__init__(self, model) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.task_list = task_list column = gtk.TreeViewColumn(_('Tags')) # T: Column header for tag list in Task List dialog self.append_column(column) cr1 = gtk.CellRendererText() cr1.set_property('ellipsize', pango.ELLIPSIZE_END) column.pack_start(cr1, True) column.set_attributes(cr1, text=0, weight=3) # tag name, weight cr2 = self.get_cell_renderer_number_of_items() column.pack_start(cr2, False) column.set_attributes(cr2, text=1) # number of tasks self.set_row_separator_func(lambda m, i: m[i][2] == self._type_separator) self._block_selection_change = False self.get_selection().connect('changed', self.on_selection_changed) self.refresh(task_list) def get_tags(self): '''Returns current selected tags, or None for all tags''' tags = [] for row in self._get_selected(): if row[2] == self._type_tag: tags.append(row[0]) elif row[2] == self._type_untagged: tags.append(_NO_TAGS) return tags or None def get_labels(self): '''Returns current selected labels''' labels = [] for row in self._get_selected(): if row[2] == self._type_label: labels.append(row[0]) return labels or None def _get_selected(self): selection = self.get_selection() if selection: model, paths = selection.get_selected_rows() if not paths or (0,) in paths: return [] else: return [model[path] for path in paths] else: return [] def refresh(self, task_list): self._block_selection_change = True selected = [(row[0], row[2]) for row in self._get_selected()] # remember name and type # Rebuild model model = self.get_model() if model is None: return model.clear() n_all = self.task_list.get_n_tasks() model.append((_('All Tasks'), n_all, self._type_label, pango.WEIGHT_BOLD)) # T: "tag" for showing all tasks labels = self.task_list.get_labels() plugin = self.task_list.plugin for label in plugin.task_labels: # explicitly keep sorting from preferences if label in labels and label != plugin.next_label: model.append((label, labels[label], self._type_label, pango.WEIGHT_BOLD)) tags = self.task_list.get_tags() if _NO_TAGS in tags: n_untagged = tags.pop(_NO_TAGS) model.append((_('Untagged'), n_untagged, self._type_untagged, pango.WEIGHT_NORMAL)) # T: label in tasklist plugins for tasks without a tag model.append(('', 0, self._type_separator, 0)) # separator for tag in natural_sorted(tags): model.append((tag, tags[tag], self._type_tag, pango.WEIGHT_NORMAL)) # Restore selection def reselect(model, path, iter): row = model[path] name_type = (row[0], row[2]) if name_type in selected: self.get_selection().select_iter(iter) if selected: model.foreach(reselect) self._block_selection_change = False def on_selection_changed(self, selection): if not self._block_selection_change: tags = self.get_tags() labels = self.get_labels() self.task_list.set_tag_filter(tags, labels) HIGH_COLOR = '#EF5151' # red (derived from Tango style guide - #EF2929) MEDIUM_COLOR = '#FCB956' # orange ("idem" - #FCAF3E) ALERT_COLOR = '#FCEB65' # yellow ("idem" - #FCE94F) # FIXME: should these be configurable ? class TaskListTreeView(BrowserTreeView): VIS_COL = 0 # visible PRIO_COL = 1 TASK_COL = 2 DATE_COL = 3 PAGE_COL = 4 ACT_COL = 5 # actionable OPEN_COL = 6 # item not closed TASKID_COL = 7 TAGS_COL = 8 def __init__(self, ui, plugin, filter_actionable): self.real_model = gtk.TreeStore(bool, int, str, str, str, bool, bool, int, object) # VIS_COL, PRIO_COL, TASK_COL, DATE_COL, PAGE_COL, ACT_COL, OPEN_COL, TASKID_COL, TAGS_COL model = self.real_model.filter_new() model.set_visible_column(self.VIS_COL) model = gtk.TreeModelSort(model) model.set_sort_column_id(self.PRIO_COL, gtk.SORT_DESCENDING) BrowserTreeView.__init__(self, model) self.ui = ui self.plugin = plugin self.filter = None self.tag_filter = None self.label_filter = None self.filter_actionable = filter_actionable self._tags = {} self._labels = {} # Add some rendering for the Prio column def render_prio(col, cell, model, i): prio = model.get_value(i, self.PRIO_COL) cell.set_property('text', str(prio)) if prio >= 3: color = HIGH_COLOR elif prio == 2: color = MEDIUM_COLOR elif prio == 1: color = ALERT_COLOR else: color = None cell.set_property('cell-background', color) cell_renderer = gtk.CellRendererText() #~ column = gtk.TreeViewColumn(_('Prio'), cell_renderer) # T: Column header Task List dialog column = gtk.TreeViewColumn(' ! ', cell_renderer) column.set_cell_data_func(cell_renderer, render_prio) column.set_sort_column_id(self.PRIO_COL) self.append_column(column) # Rendering for task description column cell_renderer = gtk.CellRendererText() cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn(_('Task'), cell_renderer, markup=self.TASK_COL) # T: Column header Task List dialog column.set_resizable(True) column.set_sort_column_id(self.TASK_COL) column.set_expand(True) if ui_environment['platform'] == 'maemo': column.set_min_width(250) # don't let this column get too small else: column.set_min_width(300) # don't let this column get too small self.append_column(column) self.set_expander_column(column) if gtk.gtk_version >= (2, 12, 0): self.set_tooltip_column(self.TASK_COL) # Rendering of the Date column use_workweek = plugin.preferences['use_workweek'] day_of_week = datetime.date.today().isoweekday() if use_workweek and day_of_week == 4: # Today is Thursday - 2nd day ahead is after the weekend delta1, delta2 = 1, 3 elif use_workweek and day_of_week == 5: # Today is Friday - next day ahead is after the weekend delta1, delta2 = 3, 4 else: delta1, delta2 = 1, 2 today = str( datetime.date.today() ) tomorrow = str( datetime.date.today() + datetime.timedelta(days=delta1)) dayafter = str( datetime.date.today() + datetime.timedelta(days=delta2)) def render_date(col, cell, model, i): date = model.get_value(i, self.DATE_COL) if date == _NO_DATE: cell.set_property('text', '') else: cell.set_property('text', date) # TODO allow strftime here if date <= today: color = HIGH_COLOR elif date <= tomorrow: color = MEDIUM_COLOR elif date <= dayafter: color = ALERT_COLOR # "<=" because tomorrow and/or dayafter can be after the weekend else: color = None cell.set_property('cell-background', color) cell_renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Date'), cell_renderer) # T: Column header Task List dialog column.set_cell_data_func(cell_renderer, render_date) column.set_sort_column_id(self.DATE_COL) self.append_column(column) # Rendering for page name column cell_renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Page'), cell_renderer, text=self.PAGE_COL) # T: Column header Task List dialog column.set_sort_column_id(self.PAGE_COL) self.append_column(column) # Finalize self.refresh() # HACK because we can not register ourselves :S self.connect('row_activated', self.__class__.do_row_activated) def refresh(self): '''Refresh the model based on index data''' # Update data self._clear() self._append_tasks(None, None, {}) # Make tags case insensitive tags = sorted((t.lower(), t) for t in self._tags) # tuple sorting will sort ("foo", "Foo") before ("foo", "foo"), # but ("bar", ..) before ("foo", ..) prev = ('', '') for tag in tags: if tag[0] == prev[0]: self._tags[prev[1]] += self._tags[tag[1]] self._tags.pop(tag[1]) prev = tag # Set view self._eval_filter() # keep current selection self.expand_all() def _clear(self): self.real_model.clear() # flush self._tags = {} self._labels = {} def _append_tasks(self, task, iter, path_cache): for row in self.plugin.list_tasks(task): if not row['open']: continue # Only include open items for now if row['source'] not in path_cache: path = self.plugin.get_path(row) if path is None: # Be robust for glitches - filter these out continue else: path_cache[row['source']] = path path = path_cache[row['source']] # Update labels for label in self.plugin.task_label_re.findall(row['description']): self._labels[label] = self._labels.get(label, 0) + 1 # Update tag count tags = row['tags'].split(',') if self.plugin.preferences['tag_by_page']: tags = tags + path.parts if tags: for tag in tags: self._tags[tag] = self._tags.get(tag, 0) + 1 else: self._tags[_NO_TAGS] = self._tags.get(_NO_TAGS, 0) + 1 # Format description task = _date_re.sub('', row['description'], count=1) task = encode_markup_text(task) task = re.sub('\s*!+\s*', ' ', task) # get rid of exclamation marks task = self.plugin.next_label_re.sub('', task) # get rid of "next" label in description if row['actionable']: task = _tag_re.sub(r'@\1', task) # highlight tags - same color as used in pageview task = self.plugin.task_label_re.sub(r'\1', task) # highlight labels else: task = r'%s' % task # Insert all columns modelrow = [False, row['prio'], task, row['due'], path.name, row['actionable'], row['open'], row['id'], tags] # VIS_COL, PRIO_COL, TASK_COL, DATE_COL, PAGE_COL, ACT_COL, OPEN_COL, TASKID_COL, TAGS_COL modelrow[0] = self._filter_item(modelrow) myiter = self.real_model.append(iter, modelrow) if row['haschildren']: self._append_tasks(row, myiter, path_cache) # recurs def set_filter_actionable(self, filter): '''Set filter state for non-actionable items @param filter: if C{False} all items are shown, if C{True} only actionable items ''' self.filter_actionable = filter self._eval_filter() def set_filter(self, string): # TODO allow more complex queries here - same parse as for search if string: inverse = False if string.lower().startswith('not '): # Quick HACK to support e.g. "not @waiting" inverse = True string = string[4:] self.filter = (inverse, string.strip().lower()) else: self.filter = None self._eval_filter() def get_labels(self): '''Get all labels that are in use @returns: a dict with labels as keys and the number of tasks per label as value ''' return self._labels def get_tags(self): '''Get all tags that are in use @returns: a dict with tags as keys and the number of tasks per tag as value ''' return self._tags def get_n_tasks(self): '''Get the number of tasks in the list @returns: total number ''' counter = [0] def count(model, path, iter): if model[iter][self.OPEN_COL]: # only count open items counter[0] += 1 self.real_model.foreach(count) return counter[0] def get_statistics(self): statsbyprio = {} def count(model, path, iter): # only count open items row = model[iter] if row[self.OPEN_COL]: prio = row[self.PRIO_COL] statsbyprio.setdefault(prio, 0) statsbyprio[prio] += 1 self.real_model.foreach(count) if statsbyprio: total = reduce(int.__add__, statsbyprio.values()) highest = max([0] + statsbyprio.keys()) stats = [statsbyprio.get(k, 0) for k in range(highest+1)] stats.reverse() # highest first return total, stats else: return 0, [] def set_tag_filter(self, tags=None, labels=None): if tags: self.tag_filter = [tag.lower() for tag in tags] else: self.tag_filter = None if labels: self.label_filter = [label.lower() for label in labels] else: self.label_filter = None self._eval_filter() def _eval_filter(self): logger.debug('Filtering with labels: %s tags: %s, filter: %s', self.label_filter, self.tag_filter, self.filter) def filter(model, path, iter): visible = self._filter_item(model[iter]) model[iter][self.VIS_COL] = visible if visible: parent = model.iter_parent(iter) while parent: model[parent][self.VIS_COL] = visible parent = model.iter_parent(parent) self.real_model.foreach(filter) self.expand_all() def _filter_item(self, modelrow): # This method filters case insensitive because both filters and # text are first converted to lower case text. visible = True if not modelrow[self.OPEN_COL] \ or (not modelrow[self.ACT_COL] and self.filter_actionable): visible = False description = modelrow[self.TASK_COL].decode('utf-8').lower() pagename = modelrow[self.PAGE_COL].decode('utf-8').lower() tags = [t.lower() for t in modelrow[self.TAGS_COL]] if visible and self.label_filter: # Any labels need to be present for label in self.label_filter: if label in description: break else: visible = False # no label found if visible and self.tag_filter: # Any tag should match if (_NO_TAGS in self.tag_filter and not tags) \ or any(tag in tags for tag in self.tag_filter): visible = True else: visible = False if visible and self.filter: # And finally the filter string should match # FIXME: we are matching against markup text here - may fail for some cases inverse, string = self.filter match = string in description or string in pagename if (not inverse and not match) or (inverse and match): visible = False return visible def do_row_activated(self, path, column): model = self.get_model() page = Path( model[path][self.PAGE_COL] ) text = self._get_raw_text(model[path]) self.ui.open_page(page) self.ui.mainwindow.pageview.find(text) def _get_raw_text(self, task): id = task[self.TASKID_COL] row = self.plugin.get_task(id) return row['description'] def do_initialize_popup(self, menu): item = gtk.ImageMenuItem('gtk-copy') item.connect('activate', self.copy_to_clipboard) menu.append(item) self.populate_popup_expand_collapse(menu) def copy_to_clipboard(self, *a): '''Exports currently visible elements from the tasks list''' logger.debug('Exporting to clipboard current view of task list.') text = self.get_visible_data_as_csv() Clipboard.set_text(text) # TODO set as object that knows how to format as text / html / .. # unify with export hooks def get_visible_data_as_csv(self): text = "" for indent, prio, desc, date, page in self.get_visible_data(): prio = str(prio) desc = decode_markup_text(desc) desc = '"' + desc.replace('"', '""') + '"' text += ",".join((prio, desc, date, page)) + "\n" return text def get_visible_data_as_html(self): html = '''\ Task List - Zim

Task List - Zim

''' % (HIGH_COLOR, MEDIUM_COLOR, ALERT_COLOR) today = str( datetime.date.today() ) tomorrow = str( datetime.date.today() + datetime.timedelta(days=1)) dayafter = str( datetime.date.today() + datetime.timedelta(days=2)) for indent, prio, desc, date, page in self.get_visible_data(): if prio >= 3: prio = '' % prio elif prio == 2: prio = '' % prio elif prio == 1: prio = '' % prio else: prio = '' % prio if date and date <= today: date = '' % date elif date == tomorrow: date = '' % date elif date == dayafter: date = '' % date else: date = '' % date desc = '' % (' ' * (4 * indent), desc) page = '' % page html += '' + prio + desc + date + page + '\n' html += '''\
PrioTaskDatePage
%s%s%s%s%s%s%s%s%s%s%s
''' return html def get_visible_data(self): rows = [] def collect(model, path, iter): indent = len(path) - 1 # path is tuple with indexes row = model[iter] prio = row[self.PRIO_COL] desc = row[self.TASK_COL].decode('utf-8') date = row[self.DATE_COL] page = row[self.PAGE_COL].decode('utf-8') if date == _NO_DATE: date = '' rows.append((indent, prio, desc, date, page)) model = self.get_model() model.foreach(collect) return rows # Need to register classes defining gobject signals #~ gobject.type_register(TaskListTreeView) # NOTE: enabling this line causes this treeview to have wrong theming under default ubuntu them !??? zim-0.60/zim/plugins/quicknote.py0000664000175000017500000003243112132472704016751 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Jaap Karssenberg import gtk import re from datetime import date as dateclass from zim.plugins import PluginClass from zim.config import get_config, data_file from zim.notebook import resolve_notebook, get_notebook, Notebook, PageNameError from zim.ipc import start_server_if_not_running, ServerProxy from zim.gui.widgets import Dialog, ScrolledTextView, IconButton, \ InputForm, gtk_window_set_default_icon, QuestionDialog from zim.gui.clipboard import Clipboard, SelectionClipboard from zim.gui.notebookdialog import NotebookComboBox from zim.templates import GenericTemplate, StrftimeFunction import logging logger = logging.getLogger('zim.plugins.quicknote') usagehelp = '''\ usage: zim --plugin quicknote [OPTIONS] Options: notebook=URI Select the notebook in the dialog page=STRING Fill in full page name namespace=STRING Fill in the namespace in the dialog basename=STRING Fill in the page name in the dialog append=[true|false] Set whether to append or create new page text=TEXT Provide the text directly input=stdin Provide the text on stdin input=clipboard Take the text from the clipboard encoding=base64 Text is encoded in base64 encoding=url Text is url encoded (In both cases expects UTF-8 after decoding) attachments=FOLDER Import all files in FOLDER as attachments, wiki input can refer these files relatively option:url=STRING Set template parameter ''' def main(*args): options = {} template_options = {} for arg in args: if arg.startswith('option:'): arg = arg[7:] dict = template_options else: dict = options if '=' in arg: key, value = arg.split('=', 1) dict[key] = value else: dict[arg] = True #~ print 'OPTIONS:', options, template_options if 'help' in options: print usagehelp return if 'notebook' in options: notebook, page = resolve_notebook(options['notebook']) else: notebook = None if 'append' in options: if options['append'].lower() == 'true': options['append'] = True else: options['append'] = False if 'input' in options: if options['input'] == 'stdin': import sys text = sys.stdin.read() elif options['input'] == 'clipboard': text = \ SelectionClipboard.get_text() \ or Clipboard.get_text() else: text = options.get('text') if text and options.get('encoding'): if options['encoding'] == 'base64': import base64 text = base64.b64decode(text) elif options['encoding'] == 'url': from zim.parsing import url_decode, URL_ENCODE_DATA text = url_decode(text, mode=URL_ENCODE_DATA) else: raise AssertionError, 'Unknown encoding: %s' % options['encoding'] if text and not isinstance(text, unicode): text = text.decode('utf-8') icon = data_file('zim.png').path gtk_window_set_default_icon() dialog = QuickNoteDialog(None, notebook, options.get('namespace'), options.get('basename'), options.get('append'), text, template_options, options.get('attachments') ) dialog.run() ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('show_quick_note', 'gtk-new', _('Quick Note...'), '', '', False), # T: menu item ) ui_xml = ''' ''' class QuickNotePlugin(PluginClass): plugin_info = { 'name': _('Quick Note'), # T: plugin name 'description': _('''\ This plugin adds a dialog to quickly drop some text or clipboard content into a zim page. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Quick Note', } #~ plugin_preferences = ( # key, type, label, default #~ ) def initialize_ui(self, ui): if ui.ui_type == 'gtk': ui.add_actions(ui_actions, self) ui.add_ui(ui_xml, self) def show_quick_note(self): dialog = BoundQuickNoteDialog.unique(self, self.ui, {}) dialog.show() class BoundQuickNoteDialog(Dialog): '''Dialog bound to a specific notebook''' def __init__(self, ui, page=None, namespace=None, basename=None, append=None, text=None, template_options=None, attachments=None): Dialog.__init__(self, ui, _('Quick Note')) self._updating_title = False self._title_set_manually = not basename is None self.attachments = attachments self.uistate.setdefault('namespace', None, basestring) namespace = namespace or self.uistate['namespace'] self.form = InputForm(notebook=self.ui.notebook) self.vbox.pack_start(self.form, False) self._init_inputs(namespace, basename, append, text, template_options) def _init_inputs(self, namespace, basename, append, text, template_options, custom=None): if template_options is None: template_options = {} else: template_options = template_options.copy() if namespace is not None and basename is not None: page = namespace + ':' + basename else: page = namespace or basename self.form.add_inputs( ( ('page', 'page', _('Page')), ('namespace', 'namespace', _('Namespace')), # T: text entry field ('new_page', 'bool', _('Create a new page for each note')), # T: checkbox in Quick Note dialog ('basename', 'string', _('Title')) # T: text entry field ) ) self.form.update({ 'page': page, 'namespace': namespace, 'new_page': True, 'basename': basename, } ) self.uistate.setdefault('open_page', True) self.uistate.setdefault('new_page', True) if basename: self.uistate['new_page'] = True # Be consistent with input # Set up the inputs and set page/ namespace to switch on # toggling the checkbox self.form.widgets['page'].set_no_show_all(True) self.form.widgets['namespace'].set_no_show_all(True) if append is None: self.form['new_page'] = bool(self.uistate['new_page']) else: self.form['new_page'] = not append def switch_input(*a): if self.form['new_page']: self.form.widgets['page'].hide() self.form.widgets['namespace'].show() self.form.widgets['basename'].set_sensitive(True) else: self.form.widgets['page'].show() self.form.widgets['namespace'].hide() self.form.widgets['basename'].set_sensitive(False) switch_input() self.form.widgets['new_page'].connect('toggled', switch_input) self.open_page = gtk.CheckButton(_('Open _Page')) # T: Option in quicknote dialog # Don't use "O" as accelerator here to avoid conflict with "Ok" self.open_page.set_active(self.uistate['open_page']) self.action_area.pack_start(self.open_page, False) self.action_area.set_child_secondary(self.open_page, True) # Add the main textview and hook up the basename field to # sync with first line of the textview window, textview = ScrolledTextView() self.textview = textview self.textview.set_editable(True) self.vbox.add(window) self.form.widgets['basename'].connect('changed', self.on_title_changed) self.textview.get_buffer().connect('changed', self.on_text_changed) # Initialize text from template file = data_file('templates/plugins/quicknote.txt') template = GenericTemplate(file.readlines(), name=file) template_options.update({ 'text': text or '', 'strftime': StrftimeFunction(), } ) output = template.process(template_options) buffer = self.textview.get_buffer() buffer.set_text(''.join(output)) begin, end = buffer.get_bounds() buffer.place_cursor(begin) buffer.set_modified(False) self.connect('delete-event', self.do_delete_event) def do_response(self, id): if id == gtk.RESPONSE_DELETE_EVENT: if self.textview.get_buffer().get_modified(): ok = QuestionDialog(self, _('Discard note?')).run() # T: confirm closing quick note dialog if ok: Dialog.do_response(self, id) # else pass else: Dialog.do_response(self, id) else: Dialog.do_response(self, id) def do_delete_event(self, *a): # Block deletion if do_response did not yet destroy the dialog return True def run(self): self.textview.grab_focus() Dialog.run(self) def show(self): self.textview.grab_focus() Dialog.show(self) def save_uistate(self): self.uistate['new_page'] = self.form['new_page'] self.uistate['open_page'] = self.open_page.get_active() if self.uistate['new_page']: self.uistate['namespace'] = self.form['namespace'] else: self.uistate['namespace'] = self.form['page'] def on_title_changed(self, o): o.set_input_valid(True) if not self._updating_title: self._title_set_manually = True def on_text_changed(self, buffer): if not self._title_set_manually: # Automatically generate a (valid) page name self._updating_title = True bounds = buffer.get_bounds() title = buffer.get_text(*bounds).strip()[:50] # Cut off at 50 characters to prevent using a whole paragraph title = title.replace(':', '') if '\n' in title: title, _ = title.split('\n', 1) try: title = Notebook.cleanup_pathname(title, purge=True) self.form['basename'] = title except PageNameError: pass self._updating_title = False def do_response_ok(self, get_ui=None): # NOTE: Keep in mind that this method should also work using # a proxy object for the ui. This is why we have the get_ui() # argument to construct a proxy. buffer = self.textview.get_buffer() bounds = buffer.get_bounds() text = buffer.get_text(*bounds) if self.form['new_page']: if not self.form.widgets['namespace'].get_input_valid() \ or not self.form['basename']: if not self.form['basename']: entry = self.form.widgets['basename'] entry.set_input_valid(False, show_empty_invalid=True) return False if get_ui: ui = get_ui() else: ui = self.ui if ui is None: return False path = self.form['namespace'].name + ':' + self.form['basename'] ui.new_page_from_text(text, path, attachments=self.attachments, open_page=self.open_page.get_active() ) else: if not self.form.widgets['page'].get_input_valid() \ or not self.form['page']: return False if get_ui: ui = get_ui() else: ui = self.ui if ui is None: return False path = self.form['page'].name if self.attachments: ui.import_attachments(path, self.attachments) ui.append_text_to_page(path, '\n----\n'+text) if self.open_page.get_active(): ui.present(path) # also works with proxy return True class QuickNoteDialog(BoundQuickNoteDialog): '''Dialog which includes a notebook chooser''' def __init__(self, ui, notebook=None, namespace=None, basename=None, append=None, text=None, template_options=None, attachments=None): self.config = get_config('quicknote.conf') self.uistate = self.config['QuickNoteDialog'] Dialog.__init__(self, ui, _('Quick Note')) self._updating_title = False self._title_set_manually = not basename is None self.attachments = attachments if notebook and not isinstance(notebook, basestring): notebook = notebook.uri self.uistate.setdefault('lastnotebook', None, basestring) if self.uistate['lastnotebook']: notebook = notebook or self.uistate['lastnotebook'] self.config['Namespaces'].setdefault(notebook, None, basestring) namespace = namespace or self.config['Namespaces'][notebook] self.form = InputForm() self.vbox.pack_start(self.form, False) # TODO dropdown could use an option "Other..." label = gtk.Label(_('Notebook')+': ') label.set_alignment(0.0, 0.5) self.form.attach(label, 0,1, 0,1, xoptions=gtk.FILL) # T: Field to select Notebook from drop down list self.notebookcombobox = NotebookComboBox(current=notebook) self.notebookcombobox.connect('changed', self.on_notebook_changed) self.form.attach(self.notebookcombobox, 1,2, 0,1) self._init_inputs(namespace, basename, append, text, template_options) self.uistate['lastnotebook'] = notebook self._set_autocomplete(notebook) def save_uistate(self): notebook = self.notebookcombobox.get_notebook() self.uistate['lastnotebook'] = notebook self.uistate['new_page'] = self.form['new_page'] self.uistate['open_page'] = self.open_page.get_active() if notebook is not None: if self.uistate['new_page']: self.config['Namespaces'][notebook] = self.form['namespace'] else: self.config['Namespaces'][notebook] = self.form['page'] self.config.write() def on_notebook_changed(self, o): notebook = self.notebookcombobox.get_notebook() if not notebook or notebook == self.uistate['lastnotebook']: return self.uistate['lastnotebook'] = notebook self.config['Namespaces'].setdefault(notebook, None, basestring) namespace = self.config['Namespaces'][notebook] if namespace: self.form['namespace'] = namespace self._set_autocomplete(notebook) def _set_autocomplete(self, notebook): if notebook: obj = get_notebook(notebook) self.form.widgets['namespace'].notebook = obj self.form.widgets['page'].notebook = obj # Could still be None, e.g. if the notebook folder is not mounted logger.debug('Notebook for autocomplete: %s (%s)', obj, notebook) else: self.form.widgets['namespace'].notebook = None self.form.widgets['page'].notebook = None logger.debug('Notebook for autocomplete unset') def do_response_ok(self): def get_ui(): start_server_if_not_running() notebook = self.notebookcombobox.get_notebook() if notebook: return ServerProxy().get_notebook(notebook) else: return None return BoundQuickNoteDialog.do_response_ok(self, get_ui) zim-0.60/zim/plugins/zeitgeist-logger.py0000664000175000017500000000675112132472704020241 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Marcel Stimberg '''Push events to the Zeitgeist daemon''' import gio import logging import sys from zim.plugins import PluginClass, Extension, extends from zim.signals import SIGNAL_AFTER logger = logging.getLogger('zim.plugins.zeitgeist') try: from zeitgeist.client import ZeitgeistClient from zeitgeist.datamodel import Event, Subject, Interpretation, Manifestation except: ZeitgeistClient = None class ZeitgeistPlugin(PluginClass): plugin_info = { 'name': _('Log events with Zeitgeist'), # T: plugin name 'description': _('Pushes events to the Zeitgeist daemon.'), # T: plugin description 'author': 'Marcel Stimberg', 'help': 'Plugins:Log events with Zeitgeist', } @classmethod def check_dependencies(klass): has_zeitgeist = not ZeitgeistClient is None return has_zeitgeist, [('libzeitgeist', has_zeitgeist, False)] def __init__(self, ui): PluginClass.__init__(self, ui) try: self.zeitgeist_client = ZeitgeistClient() self.zeitgeist_client.register_data_source('application://zim.desktop', 'Zim', _('Zim Desktop Wiki'), []) # T: short description of zim except RuntimeError, e: logger.exception('Loading zeitgeist client failed, will not log events') self.zeitgeist_client = None def create_and_send_event(self, page, path, event_type): if not self.zeitgeist_client: return #FIXME: Assumes file store store = self.ui.notebook.get_store(page.name) if path is not None: fileobj = store._get_file(path) else: fileobj = store._get_file(page) uri = fileobj.uri origin = gio.File(uri).get_parent().get_uri() text = _('Wiki page: %s') % page.name # T: label for how zim pages show up in the recent files menu, %s is the page name subject = Subject.new_for_values(mimetype='text/x-zim-wiki', uri=uri, origin=origin, interpretation=Interpretation.TEXT_DOCUMENT, manifestation=Manifestation.FILE_DATA_OBJECT, text=text) event = Event.new_for_values(actor='application://zim.desktop', interpretation=event_type, manifestation=Manifestation.USER_ACTIVITY, subjects=[subject,]) self.zeitgeist_client.insert_event(event) @extends('PageView') class PageViewExtension(Extension): def __init__(self, plugin, pageview): self.plugin = plugin self.connectto_all(pageview.ui, # XXX - remove ui here, emit from pageview ('open-page', 'close-page'), order=SIGNAL_AFTER) def on_open_page(self, ui, page, path): logger.debug("Opened page: %s", page.name) self.plugin.create_and_send_event(page, path, Interpretation.ACCESS_EVENT) def on_close_page(self, ui, page, *a): logger.debug("Left page: %s", page.name) self.plugin.create_and_send_event(page, None, Interpretation.LEAVE_EVENT) @extends('Notebook') class NotebookExtension(Extension): def __init__(self, plugin, notebook): self.plugin = plugin self.connectto_all(notebook, ('deleted-page', 'stored-page'), order=SIGNAL_AFTER) def on_deleted_page(self, page, path): logger.debug("Deleted page: %s", page.name) self.plugin.create_and_send_event(page, path, Interpretation.DELETE_EVENT) def on_stored_page(self, page, path): logger.debug("Modified page: %s", page.name) self.plugin.create_and_send_event(page, path, Interpretation.MODIFY_EVENT) zim-0.60/zim/plugins/distractionfree.py0000664000175000017500000002007112132472704020131 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import gtk import logging from zim.plugins import PluginClass from zim.gui import PATHBAR_NONE, PATHBAR_RECENT logger = logging.getLogger('zim.plugins.distractionfree') _minsize = 300 # prevent pageview from disappearing altogether _minmargin = 5 # minimum margin to keep from other widgets class DistractionFreePlugin(PluginClass): plugin_info = { 'name': _('Distraction Free Editing'), # T: plugin name 'description': _( 'This plugin adds settings that help using zim\n' 'as a distraction free editor.\n' ), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Distraction Free Editing', } plugin_preferences = ( # key, type, label, default ('hide_menubar', 'bool', _('Hide menubar in fullscreen mode'), True), # T: plugin preference ('hide_toolbar', 'bool', _('Hide toolbar in fullscreen mode'), True), # T: plugin preference ('hide_pathbar', 'bool', _('Hide pathbar in fullscreen mode'), True), # T: plugin preference ('hide_statusbar', 'bool', _('Hide statusbar in fullscreen mode'), True), # T: plugin preference ('max_page_width', 'int', _('Maximum page width'), 850, (_minsize, 10000)), # T: plugin preference ('vmargin', 'int', _('Vertical margin'), 50, (0, 10000)), # T: plugin preference ('basecolor', 'color', _('Text background color'), '#babdb6'), # T: plugin preference ('textcolor', 'color', _('Text foreground color'), '#2e3436'), # T: plugin preference ('bgcolor', 'color', _('Screen background color'), '#2e3436'), # T: plugin preference #('fgcolor', 'color', _('Screen foreground color'), '#eeeeec'), ) def __init__(self, *a): self._normal_colors = None self._show_panes = True PluginClass.__init__(self, *a) def finalize_ui(self, ui): self.connectto(self.ui.mainwindow.pageview.view, 'size-allocate') self.connectto(self.ui.mainwindow, 'fullscreen-changed') self.do_preferences_changed() def do_preferences_changed(self): # Set show menubar & Update margins show_menubar = not self.preferences['hide_menubar'] show_toolbar = not self.preferences['hide_toolbar'] show_pathbar = not self.preferences['hide_pathbar'] show_statusbar = not self.preferences['hide_statusbar'] if self.ui.mainwindow.isfullscreen: self.ui.mainwindow.toggle_menubar(show_menubar) self.ui.mainwindow.toggle_toolbar(show_toolbar) self.ui.mainwindow.toggle_statusbar(show_statusbar) if show_pathbar \ and self.ui.uistate['MainWindow']['pathbar_type_fullscreen'] == PATHBAR_NONE: self.ui.mainwindow.set_pathbar(PATHBAR_RECENT) elif not show_pathbar: self.ui.mainwindow.set_pathbar(PATHBAR_NONE) textview = self.ui.mainwindow.pageview.view self.on_size_allocate(textview, textview.get_allocation()) else: self.ui.uistate['MainWindow']['show_menubar_fullscreen'] = show_menubar self.ui.uistate['MainWindow']['show_toolbar_fullscreen'] = show_toolbar self.ui.uistate['MainWindow']['show_statusbar_fullscreen'] = show_statusbar if show_pathbar \ and self.ui.uistate['MainWindow']['pathbar_type_fullscreen'] == PATHBAR_NONE: self.ui.uistate['MainWindow']['pathbar_type_fullscreen'] = PATHBAR_RECENT elif not show_pathbar: self.ui.uistate['MainWindow']['pathbar_type_fullscreen'] = PATHBAR_NONE # TODO - would be nice to be able to toggle hide/show for pathbar without need to set type # allow hiding container or seperate widget from "model" def on_fullscreen_changed(self, window): if window.isfullscreen: self._show_panes = bool(window.get_visible_panes()) self._save_colors() self._set_colors(self._custom_colors) window.toggle_panes(show=False) elif self._normal_colors: self._set_colors(self._normal_colors) window.toggle_panes(show=self._show_panes) window.pageview.grab_focus() else: pass # NOTE: would be nice to change color of _all_ widgets when switching # to fullscreen, but this is practically not possible because # we can not set just the few colors in RcStyle, would need to # switch the whole theme def _save_colors(self): style = self.ui.mainwindow.pageview.view.rc_get_style() self._normal_colors = [] for state in ( gtk.STATE_NORMAL, #gtk.STATE_ACTIVE, #gtk.STATE_PRELIGHT, #gtk.STATE_SELECTED, #gtk.STATE_INSENSITIVE ): self._normal_colors.append({ 'base': style.base[gtk.STATE_NORMAL], 'text': style.text[gtk.STATE_NORMAL], 'bg': style.bg[gtk.STATE_NORMAL], #'fg': style.fg[gtk.STATE_NORMAL], }) @property def _custom_colors(self): # array of NORMAL, ACTIVE, PRELIGHT, SELECTED, INSENSITIVE normal = { 'base': self.preferences['basecolor'], 'text': self.preferences['textcolor'], 'bg': self.preferences['bgcolor'], #'fg': self.preferences['fgcolor'], } #selected = { # like normal, but reverse text and base # 'base': self.preferences['textcolor'], # 'text': self.preferences['basecolor'], # 'bg': self.preferences['bgcolor'], # 'fg': self.preferences['fgcolor'], #} #return [normal, normal, normal, selected, normal] return (normal,) def _set_colors(self, colors): # See gtk.RcStyle docs for all values in RC file rc = 'style "zim-colors"\n{\n' for i, state in enumerate(( 'NORMAL', #'ACTIVE', #'PRELIGHT', #'SELECTED', #'INSENSITIVE', )): values = colors[i] values['state'] = state rc += '\tbase[%(state)s] = "%(base)s"\n' \ '\ttext[%(state)s] = "%(text)s"\n' \ '\tbg[%(state)s] = "%(bg)s"\n' % values #'\tfg[%(state)s] = "%(fg)s"\n' % values #rc += '}\nclass "GtkWidget" style "zim-colors"' rc += '}\nwidget "*.zim-pageview" style "zim-colors"\n' logger.debug('Parse RC: >>>\n%s<<<', rc) gtk.rc_parse_string(rc) gtk.rc_reset_styles(gtk.settings_get_default()) def on_size_allocate(self, textview, allocation): # Here we play with textview margin windows to position text # in center of screen with a maximum size if not self.ui.mainwindow.isfullscreen: self._set_margins(0, 0, 0, 0) return # Screen geometry screen = gtk.gdk.screen_get_default() root_window = screen.get_root_window() mouse_x, mouse_y, mouse_mods = root_window.get_pointer() current_monitor_number = screen.get_monitor_at_point(mouse_x, mouse_y) monitor_geometry = screen.get_monitor_geometry(current_monitor_number) screen_width = monitor_geometry.width screen_height = monitor_geometry.height # X max width based on user preference max_x = self.preferences['max_page_width'] xmargin = int((screen_width - max_x)/2) if allocation.width > max_x: if allocation.x > xmargin: # we are bumped to the right left = _minmargin right = allocation.width - max_x elif (allocation.x + allocation.width) < (screen_width - xmargin): # we are bumped to the left left = allocation.width - max_x right = _minmargin else: # room on both sides left = xmargin - allocation.x right = allocation.width - max_x - left else: left = _minmargin right = _minmargin # Y setting simply keeps a small margin vmargin = self.preferences['vmargin'] if vmargin > ((screen_height - _minsize) / 2): vmargin = ((screen_height - _minsize) / 2) if allocation.y < vmargin: top = vmargin - allocation.y else: top = _minmargin if (allocation.y + allocation.height) > (screen_height - vmargin): bottom = (allocation.y + allocation.height) - (screen_height - vmargin) else: bottom = _minmargin self._set_margins(left, right, top, bottom) def _set_margins(self, left, right, top, bottom): self.ui.mainwindow.pageview.view.set_border_window_size(gtk.TEXT_WINDOW_LEFT, left) self.ui.mainwindow.pageview.view.set_border_window_size(gtk.TEXT_WINDOW_RIGHT, right) self.ui.mainwindow.pageview.view.set_border_window_size(gtk.TEXT_WINDOW_TOP, top) self.ui.mainwindow.pageview.view.set_border_window_size(gtk.TEXT_WINDOW_BOTTOM, bottom) def destroy(self): # show at least menubar again, set margins to zero & restore colors self.ui.uistate['MainWindow']['show_menubar_fullscreen'] = True self._set_margins(0, 0, 0, 0) if self._normal_colors: self._set_colors(self._normal_colors) PluginClass.destroy(self) zim-0.60/zim/plugins/trayicon.py0000664000175000017500000002525312132472704016603 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import gobject import gtk import logging from zim.plugins import PluginClass from zim.config import data_file, get_config from zim.ipc import start_server_if_not_running, ServerProxy, RemoteObject from zim.notebook import get_notebook_list, NotebookInfo, NotebookInfoList from zim.gui.widgets import gtk_window_set_default_icon # Try if we are on Ubunutu with app-indicator support try: import appindicator except ImportError: appindicator = None def main(*args): start_server_if_not_running() preferences = get_config('preferences.conf')['TrayIconPlugin'] preferences.setdefault('classic', False) if appindicator and not preferences['classic']: obj = RemoteObject('zim.plugins.trayicon.AppIndicatorTrayIcon') else: obj = RemoteObject('zim.plugins.trayicon.DaemonTrayIcon') server = ServerProxy() if not server.has_object(obj): server.init_object(obj) class TrayIconPlugin(PluginClass): plugin_info = { 'name': _('Tray Icon'), # T: plugin name 'description': _('''\ This plugin adds a tray icon for quick access. This plugin depends on Gtk+ version 2.10 or newer. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Tray Icon', } plugin_preferences = ( # key, type, label, default ('classic', 'bool', _('Classic trayicon,\ndo not use new style status icon on Ubuntu'), False), # T: preferences option ('standalone', 'bool', _('Show a separate icon for each notebook'), False), # T: preferences option ) @classmethod def check_dependencies(klass): version_ok = (gtk.gtk_version >= (2, 10, 0)) return (version_ok, [('GTK >= 2.10', version_ok, True)]) def __init__(self, ui): PluginClass.__init__(self, ui) self._trayicon_class = None self.icon = None self.proxyobject = None def finalize_ui(self, ui): if self.ui.ui_type == 'gtk': self.connect_trayicon() self.ui.hideonclose = True def connect_trayicon(self): klass = self.get_trayicon_class() if issubclass(klass, DaemonTrayIconMixin): obj = RemoteObject('zim.plugins.trayicon.' + klass.__name__) server = ServerProxy() self.proxyobject = server.get_proxy(obj) # getting the object implicitly starts it, if it didn't exist yet else: self.icon = klass(self.ui) self._trayicon_class = klass def get_trayicon_class(self): import zim.ipc if zim.ipc.in_child_process() \ and not self.preferences['standalone']: if appindicator and not self.preferences['classic']: return AppIndicatorTrayIcon else: return DaemonTrayIcon else: return StandAloneTrayIcon def destroy(self): self.disconnect_trayicon() self.ui.hideonclose = False PluginClass.destroy(self) def disconnect_trayicon(self): if self.icon: self.icon.set_property('visible', False) self.icon = None if self.proxyobject: self.proxyobject.quit() def do_preferences_changed(self): if self.ui.ui_type == 'gtk': klass = self.get_trayicon_class() if not klass is self._trayicon_class: self.disconnect_trayicon() self.connect_trayicon() class TrayIconBase(object): '''Base class for the zim tray icon. Contains code to create the tray icon menus. ''' def get_trayicon_menu(self): '''Returns the main 'tray icon menu''' menu = gtk.Menu() item = gtk.MenuItem(_('_Quick Note...')) # T: menu item in tray icon menu item.connect_object('activate', self.__class__.do_quick_note, self) menu.append(item) menu.append(gtk.SeparatorMenuItem()) notebooks = self.list_all_notebooks() self.populate_menu_with_notebooks(menu, notebooks) item = gtk.MenuItem(' '+_('_Other...')) # Hack - using ' ' to indent visually # T: menu item in tray icon menu item.connect_object('activate', self.__class__.do_open_notebook, self) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('_Quit')) # T: menu item in tray icon menu item.connect_object('activate', self.__class__.do_quit, self) menu.append(item) return menu def list_open_notebooks(self): '''Returns a list of open notebook. This method is to be implemented in child classes. @returns: a list of L{NotebookInfo} objects ''' # should return (name, uri) pairs raise NotImplementedError def list_all_notebooks(self): '''Returns a list of all notebooks known in the current context This method mixes notebooks from L{list_open_notebooks()} with input from L{get_notebook_list()}. Open notebooks will have the C{active} attribute set. @returns: a list of L{NotebookInfo} objects ''' uris = set() notebooks = [info for info in get_notebook_list()] for info in self.list_open_notebooks(): if info in notebooks: # info from notebook list is updated already i = notebooks.index(info) notebooks[i].active = True else: info.update() info.active = True notebooks.append(info) for info in notebooks: if not info.active: info.active = False # None -> False return notebooks def populate_menu_with_notebooks(self, menu, notebooks): '''Populate a menu with a list of notebooks''' # TODO put checkbox behind open notebooks when we run in daemon mode item = gtk.MenuItem(_('Notebooks')) # T: menu item in tray icon menu item.set_sensitive(False) menu.append(item) if isinstance(notebooks, NotebookInfoList): notebooks = [info for info in notebooks] # copy notebooks.sort(key=lambda info: info.name) for info in notebooks: #~ print '>>>', info item = gtk.MenuItem(' ' + info.name) # Hack - using ' ' to indent visually if info.active: child = item.get_child() if isinstance(child, gtk.Label): # FIXME this doesn't seem to work in Ubuntu menu :( child.set_markup(' ' + info.name + '') # Hack - using ' ' to indent visually item.connect('activate', lambda o, u: self.do_activate_notebook(u), info.uri) menu.append(item) def do_activate_notebook(self, uri): '''Open a specific notebook. To be overloaded in child class. ''' raise NotImplementedError def do_quit(self): '''Quit zim. To be overloaded in child class. ''' raise NotImplementedError def do_open_notebook(self): '''Opens the notebook dialogs''' from zim.gui.notebookdialog import NotebookDialog NotebookDialog.unique(self, self, callback=self.do_activate_notebook).show() def do_quick_note(self): '''Show the dialog from the quicknote plugin''' from zim.plugins.quicknote import QuickNoteDialog dialog = QuickNoteDialog(None, {}) dialog.show() class StatusIconTrayIcon(TrayIconBase, gtk.StatusIcon): '''Base class for a tray icon based on gtk.StatusIcon''' def __init__(self): gtk.StatusIcon.__init__(self) icon_theme = gtk.icon_theme_get_default() if icon_theme.has_icon('zim-panel'): self.set_from_icon_name('zim-panel') else: icon = data_file('zim.png').path self.set_from_file(icon) self.set_tooltip(_('Zim Desktop Wiki')) # T: tooltip for tray icon self.connect('popup-menu', self.__class__.do_popup_menu) def do_activate(self): open_notebooks = list(self.list_open_notebooks()) if len(open_notebooks) == 0: # No open notebooks, open default or prompt full list notebooks = get_notebook_list() if notebooks.default: self.do_activate_notebook(notebooks.default) else: self.do_popup_menu_notebooks(notebooks) elif len(open_notebooks) == 1: # Only one open notebook - present it self.do_activate_notebook(open_notebooks[0].uri) else: # Let the user choose from the open notebooks self.do_popup_menu_notebooks(open_notebooks) def do_popup_menu_notebooks(self, list, button=1, activate_time=0): menu = gtk.Menu() self.populate_menu_with_notebooks(menu, list) menu.show_all() menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, self) def do_popup_menu(self, button=3, activate_time=0): #~ print '>>', button, activate_time menu = self.get_trayicon_menu() menu.show_all() menu.popup(None, None, gtk.status_icon_position_menu, button, activate_time, self) # Need to register classes overriding gobject signals gobject.type_register(StatusIconTrayIcon) class StandAloneTrayIcon(StatusIconTrayIcon): '''This class defines the tray icon used for a single stand-alone notebook. ''' def __init__(self, ui): StatusIconTrayIcon.__init__(self) self.ui = ui if self.ui.notebook: self.on_open_notebook(self.ui, self.ui.notebook) else: self.ui.connect('open-notebook', self.on_open_notebook) def on_open_notebook(self, ui, notebook): # TODO hook this to finalize_notebook in the plugin self.set_tooltip(notebook.name) if notebook.icon: self.set_from_file(notebook.icon) def list_open_notebooks(self): # No daemon, so we only know one open notebook notebook = self.ui.notebook info = NotebookInfo(notebook.uri, name=notebook.name) info.active = True return [ info ] def do_activate_notebook(self, uri): # Open a notebook using the ui object if uri == self.ui.notebook.uri: self.ui.toggle_present() else: self.ui.open_notebook(uri) # Can not toggle, so just open it def do_quit(self): self.ui.quit() class DaemonTrayIconMixin(object): '''Mixin class for using the tray icon in combination with the background process. Sub classes should run as a separate child process. ''' def __init__(self): self.server = ServerProxy() def main(self): # Set window icon in case we open the notebook dialog gtk_window_set_default_icon() gtk.main() def quit(self): gtk.main_quit() def list_open_notebooks(self): for uri in self.server.list_notebooks(): info = NotebookInfo(uri) info.active = True yield info def do_activate_notebook(self, uri): self.server.get_notebook(uri).toggle_present() def do_quit(self): self.server.quit() class DaemonTrayIcon(DaemonTrayIconMixin, StatusIconTrayIcon): '''Trayicon using the daemon and based on gtk.StatusIcon''' def __init__(self): StatusIconTrayIcon.__init__(self) DaemonTrayIconMixin.__init__(self) class AppIndicatorTrayIcon(DaemonTrayIconMixin, TrayIconBase): '''Trayicon using the daemon and based on appindicator''' def __init__(self): DaemonTrayIconMixin.__init__(self) # Note that even though we specify the icon "zim", the # ubuntu appindicator framework will first check for an icon # "zim-panel". This way it finds the mono color icons. self.appindicator = appindicator.Indicator( 'zim-desktop-wiki', 'zim', appindicator.CATEGORY_APPLICATION_STATUS) self.appindicator.set_status(appindicator.STATUS_ACTIVE) def main(self): ServerProxy().connect('notebook-list-changed', self) self.on_notebook_list_changed() DaemonTrayIconMixin.main(self) def on_notebook_list_changed(self): menu = self.get_trayicon_menu() menu.show_all() self.appindicator.set_menu(menu) zim-0.60/zim/plugins/tableofcontents.py0000664000175000017500000002472112132472704020144 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg from __future__ import with_statement import gobject import gtk import pango import re import datetime from zim.plugins import PluginClass from zim.notebook import Path from zim.gui.widgets import LEFT_PANE, PANE_POSITIONS, BrowserTreeView, populate_popup_add_separator from zim.gui.pageview import FIND_REGEX, SCROLL_TO_MARK_MARGIN, _is_heading_tag from zim.signals import ConnectorMixin # FIXME, these methods should be supported by pageview - need anchors - now it is a HACK _is_heading = lambda iter: bool(filter(_is_heading_tag, iter.get_tags())) def find_heading(buffer, heading): '''Find a heading @param buffer: the C{gtk.TextBuffer} @param heading: text of the heading @returns: a C{gtk.TextIter} for the new cursor position or C{None} ''' regex = "^%s$" % re.escape(heading) with buffer.tmp_cursor(): if buffer.finder.find(regex, FIND_REGEX): iter = buffer.get_insert_iter() start = iter.get_offset() else: return None while not _is_heading(iter): if buffer.finder.find_next(): iter = buffer.get_insert_iter() if iter.get_offset() == start: return None # break infinite loop else: return None if _is_heading(iter): return iter else: return None def select_heading(buffer, heading): iter = find_heading(buffer, heading) if iter: buffer.place_cursor(iter) buffer.select_line() return True else: return False class ToCPlugin(PluginClass): plugin_info = { 'name': _('Table of Contents'), # T: plugin name 'description': _('''\ This plugin adds an extra widget showing a table of contents for the current page. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Table Of Contents', } # TODO add controls for changing levels in ToC plugin_preferences = ( # key, type, label, default ('pane', 'choice', _('Position in the window'), LEFT_PANE, PANE_POSITIONS), # T: option for plugin preferences ('floating', 'bool', _('Show ToC as floating widget instead of in sidepane'), False), # T: option for plugin preferences ) # TODO disable pane setting if not embedded def __init__(self, ui): PluginClass.__init__(self, ui) self.floating_widget = None self.sidepane_widget = None def finalize_notebook(self, ui): self.do_preferences_changed() def destroy(self): self.disconnect_sidepane() self.disconnect_floating() PluginClass.destroy(self) def do_preferences_changed(self): if self.ui.ui_type != 'gtk': return if self.preferences['floating']: self.disconnect_sidepane() self.connect_floating() else: self.disconnect_floating() self.connect_sidepane() def connect_sidepane(self): if not self.sidepane_widget: self.sidepane_widget = ToCWidget(self.ui) else: self.ui.mainwindow.remove(self.sidepane_widget) self.ui.mainwindow.add_tab( _('ToC'), self.sidepane_widget, self.preferences['pane']) # T: widget label self.sidepane_widget.show_all() def disconnect_sidepane(self): if self.sidepane_widget: self.ui.mainwindow.remove(self.sidepane_widget) self.sidepane_widget.disconnect_all() self.sidepane_widget.destroy() self.sidepane_widget = None def connect_floating(self): if not self.floating_widget: textview = self.ui.mainwindow.pageview.view self.floating_widget = FloatingToC(self.ui) self.floating_widget.attach(textview) def disconnect_floating(self): if self.floating_widget: self.floating_widget.widget.disconnect_all() self.floating_widget.destroy() self.floating_widget = None TEXT_COL = 0 class FloatingToC(gtk.Frame): # TODO make dragble - see gtk tutorial # TODO connect to window resize and line-out at fixed distance from right edge def __init__(self, ui): gtk.Frame.__init__(self) self.set_shadow_type(gtk.SHADOW_OUT) self.set_size_request(250, -1) # Fixed width self.widget = ToCWidget(ui) exp = gtk.Expander(_('ToC')) # TODO add mnemonic self.add(exp) exp.add(self.widget) def attach(self, textview): # Need to wrap in event box to make widget visible - not sure why event_box = gtk.EventBox() #~ event_box.add_events(gtk.gdk.BUTTON_PRESS_MASK | #~ gtk.gdk.BUTTON_RELEASE_MASK | #~ gtk.gdk.POINTER_MOTION_MASK | #~ gtk.gdk.POINTER_MOTION_HINT_MASK) #~ color = TestText.colormap.alloc_color(0xffff, 0, 0) #~ event_box.modify_bg(gtk.STATE_NORMAL, color) event_box.add(self) event_box.show_all() textview.add_child_in_window(event_box, gtk.TEXT_WINDOW_WIDGET, 300, 10) class ToCWidget(ConnectorMixin, gtk.ScrolledWindow): def __init__(self, ui): gtk.ScrolledWindow.__init__(self) self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.set_shadow_type(gtk.SHADOW_IN) self.set_size_request(-1, 200) # Fixed Height self.ui = ui self.page = None self.treeview = ToCTreeView() self.add(self.treeview) self.treeview.connect('row-activated', self.on_heading_activated) self.treeview.connect('populate-popup', self.on_populate_popup) self.connectto(ui, 'open-page') self.connectto(ui.notebook, 'stored-page') if ui.page: self.on_open_page(ui, ui.page, Path(ui.page.name)) def on_open_page(self, ui, page, path): self.page = page self._load_page(page) def on_stored_page(self, notebook, page): if page == self.page: self._load_page(page) def _load_page(self, page): model = self.treeview.get_model() tree = page.get_parsetree() if tree is None: model.clear() else: model.populate(tree) self.treeview.expand_all() def on_heading_activated(self, treeview, path, column): self.select_heading(path) def select_heading(self, path): '''Returns a C{gtk.TextIter} for a C{gtk.TreePath} pointing to a heading or C{None}. ''' model = self.treeview.get_model() text = model[path][TEXT_COL].decode('utf-8') textview = self.ui.mainwindow.pageview.view # FIXME nicer interface for this buffer = textview.get_buffer() if select_heading(buffer, text): textview.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) return True else: return False def select_section(self, buffer, path): '''Select all text between two headings @param buffer: the C{gtk.TextBuffer} to select in @param path: the C{gtk.TreePath} for the heading of the section ''' model = self.treeview.get_model() starttext = model[path][TEXT_COL].decode('utf-8') nextpath = path[:-1] + (path[-1]+1,) if nextpath in model: endtext = model[nextpath][TEXT_COL].decode('utf-8') else: endtext = None textview = self.ui.mainwindow.pageview.view # FIXME nicer interface for this buffer = textview.get_buffer() start = find_heading(buffer, starttext) if endtext: end = find_heading(buffer, endtext) else: end = buffer.get_end_iter() if start and end: buffer.select_range(startiter, enditer) def on_populate_popup(self, treeview, menu): model, paths = treeview.get_selection().get_selected_rows() if not paths: can_promote = False can_demote = False else: can_promote = self.can_promote(paths) can_demote = self.can_demote(paths) populate_popup_add_separator(menu, prepend=True) for text, sensitive, handler in ( (_('Demote'), can_demote, self.on_demote), # T: action to lower level of heading in the text (_('Promote'), can_promote, self.on_promote), # T: action to raise level of heading in the text ): item = gtk.MenuItem(text) menu.prepend(item) if sensitive: item.connect('activate', handler) else: item.set_sensitive(False) def can_promote(self, paths): # All headings have level larger than 1 return paths and all(len(p) > 1 for p in paths) def on_promote(self, *a): # Promote selected paths and all their children model, paths = self.treeview.get_selection().get_selected_rows() if not self.can_promote(paths): return False seen = set() for path in paths: iter = model.get_iter(path) for i in self._walk(model, iter): p = model.get_path(i) if not p in seen: newlevel = len(p) - 1 self._format(p, newlevel) seen.add(p) self._load_page(self.page) return True def can_demote(self, paths): # All headings below max level and all have a potential parent # Potential parents should be on the same level above the selected # path, so as long as the path is not the first on it's level it # has one. # Or the current parent path also has to be in the list if not paths \ or any(len(p) >= 6 for p in paths): return False for p in paths: if p[-1] == 0 and not p[:-1] in paths: return False else: return True def on_demote(self, *a): # Demote selected paths and all their children # note can not demote below level 6 model, paths = self.treeview.get_selection().get_selected_rows() if not self.can_demote(paths): return False seen = set() for path in paths: # FIXME parent may have different real level if levels are # inconsistent - this should result in an offset being applied # But need to check actual heading tags being used to know for sure iter = model.get_iter(path) for i in self._walk(model, iter): p = model.get_path(i) if not p in seen: newlevel = len(p) + 1 self._format(p, newlevel) seen.add(p) self._load_page(self.page) return True def _walk(self, model, iter): # yield iter and all its (grand)children yield iter child = model.iter_children(iter) while child: for i in self._walk(model, child): yield i child = model.iter_next(iter) def _format(self, path, level): assert level > 0 and level < 7 if self.select_heading(path): self.ui.mainwindow.pageview.toggle_format('h' + str(level)) class ToCTreeView(BrowserTreeView): def __init__(self): BrowserTreeView.__init__(self, ToCTreeModel()) self.set_headers_visible(False) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) # Allow select multiple cell_renderer = gtk.CellRendererText() cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn('_heading_', cell_renderer, text=TEXT_COL) self.append_column(column) class ToCTreeModel(gtk.TreeStore): def __init__(self): gtk.TreeStore.__init__(self, str) # TEXT_COL def populate(self, parsetree): self.clear() headings = [] for el in parsetree.findall('h'): headings.append( (int(el.attrib['level']), el.text) ) stack = [(-1, None)] for level, text in headings: assert level > -1 # just to be sure while stack[-1][0] >= level: stack.pop() parent = stack[-1][1] iter = self.append(parent, (text,)) stack.append((level, iter)) zim-0.60/zim/plugins/equationeditor.py0000644000175000017500000001021412132472704017774 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import gtk import glob from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.templates import GenericTemplate from zim.applications import Application, ApplicationError from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences latexcmd = ('latex', '-no-shell-escape', '-halt-on-error') dvipngcmd = ('dvipng', '-q', '-bg', 'Transparent', '-T', 'tight', '-o') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_equation', None, _('E_quation...'), '', _('Insert equation'), False), # T: menu item for insert equation plugin ) class InsertEquationPlugin(PluginClass): plugin_info = { 'name': _('Insert Equation'), # T: plugin name 'description': _('''\ This plugin provides an equation editor for zim based on latex. This is a core plugin shipping with zim. '''), # T: plugin description 'help': 'Plugins:Equation Editor', 'author': 'Jaap Karssenberg', } @classmethod def check_dependencies(klass): has_latex = Application(latexcmd).tryexec() has_dvipng = Application(dvipngcmd).tryexec() return (has_latex and has_dvipng), \ [('latex', has_latex, True), ('dvipng', has_dvipng, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('equation') def insert_equation(self): dialog = InsertEquationDialog.unique(self, self.ui) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertEquationDialog(self.ui, image=image) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit Equation')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertEquationDialog(ImageGeneratorDialog): def __init__(self, ui, image=None): generator = EquationGenerator() ImageGeneratorDialog.__init__(self, ui, _('Insert Equation'), # T: dialog title generator, image, help=':Plugins:Equation Editor', syntax="latex" ) class EquationGenerator(ImageGeneratorClass): type = 'equation' scriptname = 'equation.tex' imagename = 'equation.png' def __init__(self): file = data_file('templates/plugins/equationeditor.tex') assert file, 'BUG: could not find templates/plugins/equationeditor.tex' self.template = GenericTemplate(file.readlines(), name=file) self.texfile = TmpFile(self.scriptname) def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) # Filter out empty lines, not allowed in latex equation blocks text = (line for line in text if line and not line.isspace()) text = ''.join(text) #~ print '>>>%s<<<' % text # Write to tmp file using the template for the header / footer texfile = self.texfile texfile.writelines( self.template.process({'equation': text}) ) #~ print '>>>%s<<<' % texfile.read() # Call latex logfile = File(texfile.path[:-4] + '.log') # len('.tex') == 4 try: latex = Application(latexcmd) latex.run((texfile.basename,), cwd=texfile.dir) except ApplicationError: # log should have details of failure return None, logfile # Call dvipng dvifile = File(texfile.path[:-4] + '.dvi') # len('.tex') == 4 pngfile = File(texfile.path[:-4] + '.png') # len('.tex') == 4 dvipng = Application(dvipngcmd) dvipng.run((pngfile, dvifile)) # output, input # No try .. except here - should never fail # TODO dvipng can start processing before latex finished - can we win speed there ? return pngfile, logfile def cleanup(self): path = self.texfile.path for path in glob.glob(path[:-4]+'.*'): File(path).remove() zim-0.60/zim/plugins/attachmentbrowser.py0000664000175000017500000010331212132472704020500 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # # Copyright 2010 Thorsten Hackbarth # 2011-2013 Jaap Karssenberg # License: same as zim (gpl) # # ChangeLog # 2013-03-03 Change to new plugin extension structure (Jaap) # 2013-02-25 Added zooming icon size, made icon rendering more robust (Jaap) # 2012-08-17 Added mimetype icons, statusbar toggle button, and gio monitor support (Jaap) # 2012-07-20 Updated code for pane uistate (Jaap) # 2012-04-17 Allow drag&drop when folder does not exist yet + fix drag&drop on windows (Jaap) # 2012-02-29 Further work on making iconview look nice and support drag&drop (Jaap) # 2012-02-27 Complete refactoring of thumbnail manager + test case (Jaap) # 2012-02-26 Rewrote direct filessystem calls in order to support non-utf8 file systems (Jaap) # 2011-01-25 Refactored widget and plugin code (Jaap) # tested on gtk < 2.12 (tooltip interface) # add pref for image magick (convert cmd exists on win32 but is not the same) # added buttons to side of widget # 2011-01-02 Fixed use of uistate and updated for new framework to add to the mainwindow (Jaap) # 2010-11-14 Fixed Bug 664551 # 2010-08-31 freedesktop.org thumbnail spec mostly implemented # 2010-06-29 1st working version # # TODO: # [ ] Action for deleting files in context menu # [ ] Copy / cut files in context menu # [ ] Button to clean up the folder - only show when the folder is empty # [x] GIO watcher to detect folder update - add API to zim.fs for watcher ? # [ ] Allow more than 1 thread for thumbnailing ? # [ ] Can we cache image to thumb mapping (or image MD5) to spead up ? # [ ] Dont thumb small images # [x] Mimetype specific icons # [ ] Restore ImageMagick thumbnailer # [ ] Use thumbnailers/settings from gnome or other DEs ? '''Zim plugin to display files in attachments folder.''' import os import re import hashlib # for thumbfilenames import datetime import logging import gobject import gtk import pango try: import gio except ImportError: gio = None import zim import zim.config # Asserts HOME is defined from zim.plugins import PluginClass, WindowExtension, extends from zim.actions import toggle_action from zim.fs import File, Dir, format_file_size from zim.errors import Error from zim.applications import Application from zim.async import AsyncOperation from zim.parsing import url_encode, URL_ENCODE_READABLE from zim.gui.widgets import Button, BOTTOM_PANE, PANE_POSITIONS, \ IconButton, ScrolledWindow, button_set_statusbar_style, \ WindowSidePaneWidget from zim.gui.applications import OpenWithMenu from zim.gui.clipboard import \ URI_TARGETS, URI_TARGET_NAMES, \ pack_urilist, unpack_urilist logger = logging.getLogger('zim.plugins.attachmentbrowser') # freedesktop.org spec LOCAL_THUMB_STORAGE = Dir('~/.thumbnails') LOCAL_THUMB_STORAGE_NORMAL = LOCAL_THUMB_STORAGE.subdir('normal') LOCAL_THUMB_STORAGE_LARGE = LOCAL_THUMB_STORAGE.subdir('large') LOCAL_THUMB_STORAGE_FAIL = LOCAL_THUMB_STORAGE.subdir('fail/zim-%s' % zim.__version__) THUMB_SIZE_NORMAL = 128 THUMB_SIZE_LARGE = 256 # For plugin MIN_ICON_SIZE = 16 DEFAULT_ICON_SIZE = 64 _last_warning_missing_icon = None # used to surpress redundant logging def get_mime_icon(file, size): # FIXME put this in some library ? if not gio: return None try: f = gio.File(uri=file.uri) info = f.query_info('standard::*') icon = info.get_icon() except: logger.exception('Failed to query info for file: %s', file) return None global _last_warning_missing_icon if isinstance(icon, gio.ThemedIcon): names = icon.get_names() icon_theme = gtk.icon_theme_get_default() try: icon_info = icon_theme.choose_icon(names, size, 0) if icon_info: return icon_info.load_icon() else: if _last_warning_missing_icon != names: logger.debug('Missing icons in icon theme: %s', names) _last_warning_missing_icon = names return None except gobject.GError: logger.exception('Could not load icon for file: %s', file) return None else: return None def get_mime_description(mimetype): # TODO move this to zim.fs or something # # Check XML file /usr/share/mime/MEDIA/SUBTYPE.xml # Find element "comment" with "xml:lang" attribute for the locale # Etree fills in the namespaces which obfuscates the names from zim.config import XDG_DATA_DIRS media, subtype = mimetype.split('/', 1) for dir in XDG_DATA_DIRS: file = dir.file(('mime', media, subtype + '.xml')) if file.exists(): return _read_comment_from(file) else: return None def _read_comment_from(file): import locale from zim.formats import ElementTreeModule as et mylang, enc = locale.getdefaultlocale() xmlns = "{http://www.w3.org/XML/1998/namespace}" xml = et.parse(file.path) fallback = [] #~ print "FIND COMMENT", file, mylang for elt in xml.getroot(): if elt.tag.endswith('comment'): lang = elt.attrib.get(xmlns+'lang', '') if lang == mylang: return elt.text elif not lang or mylang.startswith(lang+'_'): fallback.append((lang, elt.text)) else: pass else: #~ print "FALLBACK", fallback if fallback: fallback.sort() return fallback[-1][1] # longest match else: return None def render_file_icon(widget, size): # Sizes defined in gtk source, # gtkiconfactory.c for gtk+ 2.18.9 # # (gtk.ICON_SIZE_MENU, 16), # (gtk.ICON_SIZE_BUTTON, 20), # (gtk.ICON_SIZE_SMALL_TOOLBAR, 18), # (gtk.ICON_SIZE_LARGE_TOOLBAR, 24), # (gtk.ICON_SIZE_DND, 32), # (gtk.ICON_SIZE_DIALOG, 48), # # We expect sizes in list: 16, 32, 64, 128 # But only give back 16 or 32, bigger icons # do not look good assert size in (16, 32, 64, 128) if size == 16: pixbuf = widget.render_icon(gtk.STOCK_FILE, gtk.ICON_SIZE_MENU) else: pixbuf = widget.render_icon(gtk.STOCK_FILE, gtk.ICON_SIZE_DND) # Not sure how much sizes depend on theming, # so we scale down if needed, do not scale up if pixbuf.get_width() > size or pixbuf.get_height() > size: return pixbuf.scale_simple(size, size, gtk.gdk.INTERP_BILINEAR) else: return pixbuf def is_hidden_file(file): # FIXME put this in zim.fs if not os.name == 'nt': return False import ctypes INVALID_FILE_ATTRIBUTES = -1 FILE_ATTRIBUTE_HIDDEN = 2 try: attrs = ctypes.windll.kernel32.GetFileAttributesW(file.path) # note: GetFileAttributesW is unicode version of GetFileAttributes except AttributeError: return False else: if attrs == INVALID_FILE_ATTRIBUTES: return False else: return bool(attrs & FILE_ATTRIBUTE_HIDDEN) class AttachmentBrowserPlugin(PluginClass): plugin_info = { 'name': _('Attachment Browser'), # T: plugin name 'description': _('''\ This plugin shows the attachments folder of the current page as an icon view at bottom pane. This plugin is still under development. '''), # T: plugin description 'author': 'Thorsten Hackbarth \nJaap Karssenberg ', 'help': 'Plugins:Attachment Browser', } plugin_preferences = ( # key, type, label, default ('pane', 'choice', _('Position in the window'), BOTTOM_PANE, PANE_POSITIONS), # T: option for plugin preferences # ('preview_size', 'int', _('Tooltip preview size [px]'), (THUMB_SIZE_MIN,480,THUMB_SIZE_MAX)), # T: input label # ('thumb_quality', 'int', _('Preview jpeg Quality [0..100]'), (0,50,100)), # T: input label #~ ('use_imagemagick', 'bool', _('Use ImageMagick for thumbnailing'), False), # T: input label ) #~ @classmethod #~ def check_dependencies(klass): #~ return [("ImageMagick",Application(('convert',None)).tryexec())] @extends('MainWindow') class MainWindowExtension(WindowExtension): TAB_NAME = _('Attachments') # T: label for attachment browser pane uimanager_xml = ''' ''' def __init__(self, plugin, window): WindowExtension.__init__(self, plugin, window) self.preferences = plugin.preferences self.uistate = plugin.uistate self._monitor = None # Init statusbar button self.statusbar_frame = gtk.Frame() self.statusbar_frame.set_shadow_type(gtk.SHADOW_IN) self.window.statusbar.pack_end(self.statusbar_frame, False) self.statusbar_button = gtk.ToggleButton('') # translated below button_set_statusbar_style(self.statusbar_button) self.statusbar_button.set_use_underline(True) self.__class__.toggle_fileview.connect_actionable( self, self.statusbar_button) self.statusbar_frame.add(self.statusbar_button) self.statusbar_frame.show_all() # Init browser widget opener = self.window.get_resource_opener() self.widget = AttachmentBrowserPluginWidget(self, opener, self.preferences) # FIXME FIXME FIXME - get rid of ui object here self.connectto(plugin, 'preferences-changed') self.on_preferences_changed() # XXX if self.window.ui.page: self.on_open_page(self.window.ui, self.window.ui.page, self.window.ui.page) self.connectto(self.window.ui, 'open-page') self.connectto(self.window, 'pane-state-changed') def on_preferences_changed(self): try: self.window.remove(self.widget) except ValueError: pass self.window.add_tab(self.TAB_NAME, self.widget, self.preferences['pane']) self.widget.show_all() @toggle_action( _('Attachment Browser'), # T: Menu item gtk.STOCK_DIRECTORY, tooltip=_('Show Attachment Browser') # T: Toolbar item tooltip ) def toggle_fileview(self, active): # This toggle is called to focus on our widget # but also after the fact when we detect focus changed # so check state explicitly and don't do more than needed visible, size, tab = self.window.get_pane_state(self.preferences['pane']) if active: if not (visible and tab == self.TAB_NAME): self.window.set_pane_state( self.preferences['pane'], True, activetab=self.TAB_NAME, grab_focus=True) # else pass else: if visible and tab == self.TAB_NAME: self.window.set_pane_state( self.preferences['pane'], False) # else pass def on_pane_state_changed(self, window, pane, visible, active): if pane != self.preferences['pane']: return if visible and active == self.TAB_NAME: self.toggle_fileview(True) if not self.widget.get_active(): self.widget.set_active(True) # implies refresh else: self.toggle_fileview(False) self.widget.set_active(False) def on_open_page(self, ui, page, path): self._disconnect_monitor() self.widget.set_page(ui.notebook, page) # XXX self._refresh_statusbar(page) dir = self.window.ui.notebook.get_attachments_dir(page) # XXX -> page.get_attachemnts_dir() id = dir.connect('changed', self.on_dir_changed) self._monitor = (dir, id) def _disconnect_monitor(self): if self._monitor: dir, id = self._monitor dir.disconnect(id) self._monitor = None def on_dir_changed(self, *a): logger.debug('Dir change detected: %s', a) self._refresh_statusbar(self.window.ui.page) # XXX self.widget.refresh() def _refresh_statusbar(self, page): n = self.get_n_attachments(page) self.statusbar_button.set_label( ngettext('%i _Attachment', '%i _Attachments', n) % n) # T: Label for the statusbar, %i is the number of attachments for the current page def get_n_attachments(self, page): # Calculate independent from the widget # (e.g. widget is not refreshed when hidden) n = 0 dir = self.window.ui.notebook.get_attachments_dir(page) # XXX -> page.get_ from zim.fs import isdir for name in dir.list(): # If dir is an attachment folder, sub-pages maybe filtered out already # TODO need method in zim.fs to do this count efficiently # TODO ignore hidden files here as well if not isdir(dir.path + '/' + name): # Ignore subfolders -- FIXME ? n += 1 return n def destroy(self): self._disconnect_monitor() self.toggle_fileview(False) if self.statusbar_frame: self.window.statusbar.remove(self.statusbar_frame) WindowExtension.destroy(self) class uistate_property(object): # TODO add hook such that it will be initialized on init of owner obj def __init__(self, key, *default): self.key = key self.default = default self._initialized = False def __get__(self, obj, klass): if obj: if not self._initialized: obj.uistate.setdefault(self.key, *self.default) self._initialized = True return obj.uistate[self.key] def __set__(self, obj, value): obj.uistate[self.key] = value BASENAME_COL = 0 PIXBUF_COL = 1 class AttachmentBrowserPluginWidget(gtk.HBox, WindowSidePaneWidget): icon_size = uistate_property('icon_size', DEFAULT_ICON_SIZE) def __init__(self, extension, opener, preferences): gtk.HBox.__init__(self) self.page = None # XXX self.extension = extension # XXX self.opener = opener self.uistate = extension.uistate self.preferences = preferences self.dir = None self._active = True self.thumbman = ThumbnailManager(preferences) self.thumbman.connect('thumbnail-ready', self.on_thumbnail_ready) self.fileview = gtk.IconView() self.store = gtk.ListStore(str, gtk.gdk.Pixbuf) # BASENAME_COL, PIXBUF_COL self.fileview = gtk.IconView(self.store) self.fileview.set_text_column(BASENAME_COL) self.fileview.set_pixbuf_column(PIXBUF_COL) self.fileview.enable_model_drag_source( gtk.gdk.BUTTON1_MASK, URI_TARGETS, gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE ) self.fileview.enable_model_drag_dest( URI_TARGETS, gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE ) self.fileview.connect('drag-data-get', self.on_drag_data_get) self.fileview.connect('drag-data-received', self.on_drag_data_received) self.add(ScrolledWindow(self.fileview)) self.buttonbox = gtk.VBox() self.pack_end(self.buttonbox, False) open_folder_button = IconButton(gtk.STOCK_OPEN, relief=False) open_folder_button.connect('clicked', self.on_open_folder) self.buttonbox.pack_start(open_folder_button, False) refresh_button = IconButton(gtk.STOCK_REFRESH, relief=False) refresh_button.connect('clicked', lambda o: self.on_refresh_button()) self.buttonbox.pack_start(refresh_button, False) zoomin = IconButton(gtk.STOCK_ZOOM_IN, relief=False) zoomout = IconButton(gtk.STOCK_ZOOM_OUT, relief=False) zoomin.connect('clicked', lambda o: self.zoom_in()) zoomout.connect('clicked', lambda o: self.zoom_out()) self.buttonbox.pack_end(zoomout, False) self.buttonbox.pack_end(zoomin, False) self.fileview.connect('button-press-event', self.on_button_press_event) self.fileview.connect('item-activated', self.on_item_activated) self.zoomin_button = zoomin self.zoomout_button = zoomout if gtk.gtk_version >= (2, 12): # custom tooltip self.fileview.props.has_tooltip = True self.fileview.connect("query-tooltip", self.query_tooltip_icon_view_cb) # Store colors self._senstive_color = None self._insenstive_color = None def _init_base_color(*a): # This is handled on expose event, because style does not # yet reflect theming on construction if self._senstive_color is None: self._senstive_color = self.fileview.style.base[gtk.STATE_NORMAL] self._insenstive_color = self.fileview.style.base[gtk.STATE_INSENSITIVE] self._update_state() self.connect('expose-event', _init_base_color) def embed_closebutton(self, button): if button: self.buttonbox.pack_start(button, False) self.buttonbox.reorder_child(button, 0) else: for widget in self.buttonbox.get_children(): if hasattr(widget, 'window_close_button'): self.buttonbox.remove(widget) return True def set_page(self, notebook, page): self.page = page # XXX dir = notebook.get_attachments_dir(page) # XXX page.get_attachments_dir self.set_folder(dir) def set_folder(self, dir): #~ print "set_folder", dir if dir != self.dir: self.dir = dir self.refresh() def get_active(self): return self._active def set_active(self, active): self._active = active self.refresh() def on_open_folder(self, o): # Callback for the "open folder" button self.opener.open_dir(self.dir) self._update_state() def on_refresh_button(self): self.refresh() self.extension._refresh_statusbar(self.page) # XXX FIXME communicate to extension by signal def zoom_in(self): self.icon_size = min((self.icon_size * 2, THUMB_SIZE_LARGE)) # 16 > 32 > 64 > 128 > 256 self.refresh() def zoom_out(self): self.icon_size = max((self.icon_size/2, MIN_ICON_SIZE)) # 16 < 32 < 64 < 128 < 256 self.refresh() def refresh(self): if not self._active: return # avoid unnecessary work # Clear data self.store.clear() self.thumbman.clear_async_queue() self._update_state() # Update once, re-use below self._file_icon = render_file_icon(self, min((self.icon_size, THUMB_SIZE_NORMAL))) self._file_icon_tooltip = render_file_icon(self, THUMB_SIZE_NORMAL) # Add files for name in self.dir.list(): # If dir is an attachment folder, sub-pages maybe filtered out already file = self.dir.file(name) if file.isdir() or is_hidden_file(file): continue # Ignore subfolders -- FIXME ? else: self._add_file(file) # Update column size etc. if self.icon_size < 64: # Would like to switch to by-column layout here, but looks # like gtk.IconView does not support that self.fileview.set_orientation(gtk.ORIENTATION_HORIZONTAL) size = self._get_max_width() if size > 0: if self.icon_size > 16: size = int((size+1) / 2) # Wrap over 2 rows # Else no wrap size += self.icon_size self.fileview.set_item_width(size) self.fileview.set_row_spacing(0) self.fileview.set_column_spacing(0) else: self.fileview.set_orientation(gtk.ORIENTATION_VERTICAL) size = max((self.icon_size + 12, 96)) self.fileview.set_item_width(size) # Set item width to force wrapping text for long items # Set to icon size + some space for padding etc. self.fileview.set_row_spacing(3) self.fileview.set_column_spacing(3) def _get_max_width(self): import pango layout = self.fileview.create_pango_layout('') model = self.fileview.get_model() l = 0 for r in model: l = max((l, len(r[BASENAME_COL]))) #layout.set_text(r[BASENAME_COL]) #l = max((l, layout.get_pixel_size()[0])) return l * 10 # XXX Rough estimate with 10px per char... def _update_state(self): # Here we set color like senstive or insensitive widget without # really making the widget insensitive - reason is to allow # drag & drop for a non-existing folder; making the widget # insensitive also blocks drag & drop. if self.dir is None or not self.dir.exists(): self.fileview.modify_base( gtk.STATE_NORMAL, self._insenstive_color) self.zoomin_button.set_sensitive(False) self.zoomout_button.set_sensitive(False) else: self.fileview.modify_base( gtk.STATE_NORMAL, self._senstive_color) self.zoomin_button.set_sensitive(self.icon_size < THUMB_SIZE_LARGE) self.zoomout_button.set_sensitive(self.icon_size > MIN_ICON_SIZE) def _add_file(self, file): if self.icon_size >= DEFAULT_ICON_SIZE: # Only use thumbnails if icons sufficiently large to show them pixbuf = self.thumbman.get_thumbnail_async(file, self.icon_size) else: pixbuf = None if pixbuf is None: # Set generic icon first - maybe thumbnail follows later, maybe not # Icon size for mime icons is limitted, avoid huge icons pixbuf = get_mime_icon(file, min((self.icon_size, THUMB_SIZE_NORMAL))) \ or self._file_icon self.store.append((file.basename, pixbuf)) # BASENAME_COL, PIXBUF_COL def on_thumbnail_ready(self, o, file, size, pixbuf): #~ print "GOT THUMB:", file, size, pixbuf if size != self.icon_size or file.dir != self.dir: return basename = file.basename def update(model, path, iter): if model[iter][BASENAME_COL] == basename: model[iter][PIXBUF_COL] = pixbuf self.store.foreach(update) def on_item_activated(self, iconview, path): iter = self.store.get_iter(path) file = self.dir.file(self.store[iter][BASENAME_COL]) self.opener.open_file(file) def on_button_press_event(self, iconview, event): # print 'on_button_press_event' if event.button == 3: popup_menu=gtk.Menu() x = int(event.x) y = int(event.y) time = event.time pathinfo = self.fileview.get_path_at_pos(x, y) if pathinfo is not None: self.fileview.grab_focus() popup_menu.popup(None, None, None, event.button, time) self.do_populate_popup(popup_menu, pathinfo) # FIXME should use a signal here return True return False def do_populate_popup(self, menu, pathinfo): # print "do_populate_popup" iter = self.store.get_iter(pathinfo) file = self.dir.file(self.store[iter][BASENAME_COL]) item = gtk.MenuItem(_('Open With...')) # T: menu item menu.prepend(item) submenu = OpenWithMenu(self.extension.window, file) # XXX any widget should do to find window item.set_submenu(submenu) item = gtk.MenuItem(_('_Open')) # T: menu item to open file or folder item.connect('activate', lambda o: self.opener.open_file(file)) menu.prepend(item) menu.show_all() def query_tooltip_icon_view_cb(self, widget, x, y, keyboard_tip, tooltip): context = widget.get_tooltip_context(x, y, keyboard_tip) if not context: return False model, path, iter = context name = model[iter][BASENAME_COL] file = self.dir.file(name) mtime = file.mtime() if mtime: mdate = datetime.datetime.fromtimestamp(file.mtime()).strftime('%c') # TODO: fix datetime format else: mdate = _('Unknown') # T: unspecified value for file modification time size = format_file_size(file.size()) pixbuf = self.thumbman.get_thumbnail(file, THUMB_SIZE_LARGE) if not pixbuf: # No thumbnail, use icon, but use it at normal size pixbuf = get_mime_icon(file, THUMB_SIZE_NORMAL) \ or self._file_icon_tooltip mtype = file.get_mimetype() mtype_desc = get_mime_description(mtype) if mtype_desc: mtype_desc = mtype_desc + " (%s)" % mtype # E.g. "PDF document (application/pdf)" f_label = _('Name') # T: label for file name t_label = _('Type') # T: label for file type s_label = _('Size') # T: label for file size m_label = _('Modified') # T: label for file modification date tooltip.set_markup( "%s\n\n%s: %s\n%s: %s\n%s:\n%s" % ( name, t_label, mtype_desc or mtype, s_label, size, m_label, mdate, )) tooltip.set_icon(pixbuf) widget.set_tooltip_item(tooltip, path) return True def on_drag_data_get(self, iconview, dragcontext, selectiondata, info, time): assert selectiondata.target in URI_TARGET_NAMES paths = self.fileview.get_selected_items() if paths: model = self.fileview.get_model() path_to_uri = lambda p: self.dir.file(model[p][BASENAME_COL]).uri uris = map(path_to_uri, paths) data = pack_urilist(uris) selectiondata.set(URI_TARGET_NAMES[0], 8, data) def on_drag_data_received(self, iconview, dragcontext, x, y, selectiondata, info, time): assert selectiondata.target in URI_TARGET_NAMES names = unpack_urilist(selectiondata.data) files = [File(uri) for uri in names if uri.startswith('file://')] action = dragcontext.action logger.debug('Drag received %s, %s', action, files) if action == gtk.gdk.ACTION_MOVE: self._move_files(files) elif action == gtk.gdk.ACTION_ASK: menu = gtk.Menu() item = gtk.MenuItem(_('_Move Here')) # T: popup menu action on drag-drop of a file item.connect('activate', lambda o: self._move_files(files)) menu.append(item) item = gtk.MenuItem(_('_Copy Here')) # T: popup menu action on drag-drop of a file item.connect('activate', lambda o: self._copy_files(files)) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('Cancel')) # T: popup menu action on drag-drop of a file # cancel action needs no action menu.append(item) menu.show_all() menu.popup(None, None, None, 1, time) else: # Assume gtk.gdk.ACTION_COPY or gtk.gdk.ACTION_DEFAULT # on windows we get "0" which is not mapped to any action self._copy_files(files) def _move_files(self, files): for file in files: newfile = self.dir.new_file(file.basename) file.rename(newfile) self._add_file(newfile) # TODO sort self._update_state() def _copy_files(self, files): for file in files: newfile = self.dir.new_file(file.basename) file.copyto(newfile) self._add_file(newfile) # TODO sort class ThumbnailManager(gobject.GObject): ''' Thumbnail handling following freedesktop.org spec mostly @signal: C{thumbnail-ready (file, size, pixbuf)}: thumbnail ready ''' # TODO more doc here to explain what the function of the manager is # Spec retrieved 2012-02-26 from http://people.freedesktop.org/~vuntz/thumbnail-spec-cache/ # Notes on spec: # * storage # * ~/.thumbnails/normal <= 128 x 128 # * ~/.thumbnails/large <= 256 x 256 # * ~/.thumbnails/fail # * thumbnail file # * Name is md5 hex of full uri (where uri must be "file:///" NOT "file://localhost/") # * Must have PNG attributes for mtime and uri # * If mtime orig can not be determined, do not create a thumbnail # * Must write as tmp file in same dir and then rename atomic # * Permissions on files must be 0600 # * lookup / recreate # * Must equal orig mtime vs thumbnail mtime property (not thumbnail file mtime) # * Only store failures for permanent failures, to prevent re-doing them # * Failure is app specific, so subdir with app name and version # * Failure record is just empty png # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'thumbnail-ready': (gobject.SIGNAL_RUN_LAST, None, (object, int, gtk.gdk.Pixbuf)), } def __init__(self, preferences): gobject.GObject.__init__(self) self.preferences = preferences self.async_queue = [] for dir in ( LOCAL_THUMB_STORAGE_NORMAL, LOCAL_THUMB_STORAGE_LARGE, LOCAL_THUMB_STORAGE_FAIL ): try: dir.touch(mode=0700) except OSError: pass def clear_async_queue(self): self.async_queue = [] def get_thumbnail(self, file, size): '''Get a C{Pixbuf} with the thumbnail for a given file @param file: the original file to be thumbnailed @param size: thumbnail size in pixels (C{THUMB_SIZE_NORMAL}, C{THUMB_SIZE_LARGE}, or integer) @returns: a C{gtk.gdk.Pixbuf} object ''' thumbfile = self.get_thumbnail_file(file, size) pixbuf = self._existing_thumbnail(file, thumbfile, size) if pixbuf: return pixbuf else: return self._create_thumbnail(file, thumbfile, size) def _existing_thumbnail(self, file, thumbfile, size): if thumbfile.exists(): # Check the thumbnail is valid pixbuf = self._pixbuf(thumbfile, size) mtime = self._mtime_from_pixbuf(pixbuf) if mtime is not None: # Check mtime from PNG attribute if mtime == int(file.mtime()): return pixbuf else: return None else: # Fallback for thumbnails without proper attributes if thumbfile.mtime() > file.mtime(): return pixbuf else: return None def _pixbuf(self, file, size): # Read file at size and return pixbuf pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(file.path, size, size) return pixbuf def _mtime_from_pixbuf(self, pixbuf): # Get mtime and return as int, if any mtime = pixbuf.get_option('tEXt::Thumb::MTime') if mtime is not None: return int(mtime) else: return None def _create_thumbnail(self, file, thumbfile, size): assert file.exists() normsize = self._norm_size(size) thumbnailer = PixbufThumbnailer() try: thumbnailer.create_thumbnail(file, thumbfile, normsize) # TODO enforce tmp file, 0600 permissions, as specced pixbuf = self._pixbuf(thumbfile, size) self.emit('thumbnail-ready', file, size, pixbuf) return pixbuf except: # TODO Error class, logging, create failure file ? #~ logger.info('Failed to generate thumbnail for: %s', file) return None #~ if self.preferences['use_imagemagick']: #~ TODO TODO def get_thumbnail_async(self, file, size): '''Get a C{Pixbuf} with the thumbnail for a given file Like L{get_thumbnail()} but if thumbnail needs to be generated first it will be done asynchronously. When the thumbnail is ready the C{thumbnail-ready} signal will be emitted. @param file: the original file to be thumbnailed @param size: thumbnail size in pixels (C{THUMB_SIZE_NORMAL}, C{THUMB_SIZE_LARGE}, or integer) @returns: C{gtk.gdk.Pixbuf} is thumbnail exists already, C{None} otherwise ''' thumbfile = self.get_thumbnail_file(file, size) pixbuf = self._existing_thumbnail(file, thumbfile, size) if pixbuf: return pixbuf else: self.async_queue.append( (file, thumbfile, size) ) if len(self.async_queue) == 1: # was empty self._start_async_operation() # TODO - allow multiple async threads at once, but have max # use queue to deal with surplus requests ? def _start_async_operation(self): args = self.async_queue[0] operation = AsyncOperation( self._create_thumbnail, args=args, callback=self._async_callback, data=self.async_queue[0]) operation.start() def _async_callback(self, pixbuf, error, exc_info, data): # Callback is called from main tread, in idle event # so it is allowed to kick off new async operations if error: logger.error('Error while creating thumbnail', exc_info=exc_info) if self.async_queue: self.async_queue.pop(0) if self.async_queue: self._start_async_operation() def get_thumbnail_file(self, file, size): '''Get L{File} object for thumbnail Does not gurarntee that the thumbnail actually exists. Do not use this method to lookup the thumbnail, use L{get_thumbnail()} instead. @param file: the original file to be thumbnailed @param size: thumbnail size in pixels (C{THUMB_SIZE_NORMAL}, C{THUMB_SIZE_LARGE}, or integer) @returns: a L{File} object ''' basename = hashlib.md5(file.uri).hexdigest() + '.png' size = self._norm_size(size) if (size == THUMB_SIZE_NORMAL): return LOCAL_THUMB_STORAGE_NORMAL.file(basename) else: return LOCAL_THUMB_STORAGE_LARGE.file(basename) def _norm_size(self, size): # Convert custom size to normalized size for storage if size <= THUMB_SIZE_NORMAL: return THUMB_SIZE_NORMAL else: return THUMB_SIZE_LARGE def remove_thumbnails(self, file): '''Remove thumbnails for at all sizes To be used when thumbnails are outdated, e.g. when the original file is removed or updated. @param file: the original file ''' for size in (THUMB_SIZE_NORMAL, THUMB_SIZE_LARGE): thumbfile = self.get_thumbnail_file(file, size) if thumbfile.exists(): thumbfile.remove() # Need to register classes defining gobject signals gobject.type_register(ThumbnailManager) class Thumbnailer(object): def create_thumbnail(self, file, thumbfile, size): '''Create a thumbnail @param file: the file to be thumbnailed as L{File} object @param thumbfile: to be created thumbnail file as L{File} object @param size: pixel size for thumbnail as integer @implementation: must be implemented in subclasses ''' raise NotImplementedError class PixbufThumbnailer(Thumbnailer): def create_thumbnail(self, file, thumbfile, size): options = { 'tEXt::Thumb::URI': url_encode(file.uri, mode=URL_ENCODE_READABLE), # No UTF-8 here 'tEXt::Thumb::MTime': str( int( file.mtime() ) ), } pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(file.path, size, size) pixbuf.save(thumbfile.path, 'png', options) class ImageMagickThumbnailer(Thumbnailer): def create_thumbnail(self, file, thumbfile, size): pass #~ magickextensions=('SVG','PDF','PS','EPS','DVI','DJVU','RAW','DOT','HTML','HTM','TTF','XCF') #~ textextensions=('SH','BAT','TXT','C','C++','CPP','H','H++','HPP','PY','PL') #'AVI','MPG','M2V','M4V','MPEG' #~ # TODO use mimetypes here ?? "image/" and "text/" -- or isimage() and istext() #~ tmpfile.touch() #~ pixbuf = None #~ extension=infile.path.split(".")[-1].upper() #~ if extension in magickextensions: #~ fileinfo=self._file_to_image_magick(infile,tmpfile,w,h,None) #~ if (fileinfo): #~ pixbuf = self._file_to_image_pixbbuf(tmpfile,outfile,w,h,fileinfo) #~ elif extension in textextensions: #~ #convert -size 400x caption:@- caption_manual.gif #~ fileinfo=self._file_to_image_txt(infile,tmpfile,w,h,None) #~ if (fileinfo): #~ pixbuf=self._file_to_image_pixbbuf(tmpfile,outfile,w,h,fileinfo) #~ else: #~ logger.debug('Can\'t convert: %s', infile) #~ try: #~ tmpfile.remove() #~ except OSError: #~ logger.exception('Could not delete tmp file: %s', tmpfile) #~ return pixbuf #~ def _file_to_image_magick(self,infile,outfile,w,h,fileinfo=None): #~ ''' pdf to thumbnail ''' #~ try: #~ logger.debug(' trying Imagemagick') #~ infile_p1=infile.path +'[0]' # !???? #~ #print infile_p1 #~ size=str(w)+'x'+str(h) #~ cmd = ('convert','-size', size, '-trim','+repage','-resize',size+'>') #~ Application(cmd).run((infile_p1, outfile.path)) #~ return True #~ except: #~ logger.exception('Error running %s', cmd) #~ return False #~ def _file_to_image_txt(self,infile,outfile,w,h,fileinfo=None): #~ try: #~ textcont='caption:' #~ size=str(h/4*3)+'x'+str(h) #~ linecount=0; #~ # lines: 18 at 128px #~ # linewidth 35 at 128px #~ while linecount<(h/32+10): #~ line = file.readline() #~ if not line: #~ break #~ linecount+=1 #~ textcont+=line[0:w/24+12] #~ if (len(line)>(w/24+12) ): #~ textcont+='\n' #~ logger.debug('Trying TXT') #~ cmd = ('convert','-font','Courier','-size', size)# '-frame', '1' ) #~ Application(cmd).run((textcont,outfile.path)) #~ return True #~ except: #~ logger.debug(' Error converting TXT') #~ return False # class GnomeThumbnailer(Thumbnailer): # def _file_to_image_gnome(self,infile,outfile,w,h,fileinfo=None): # ''' gnome thumbnailer ''' # global gnome_thumbnailer # if (not gnome_thumbnailer) # return False # try: # logger.debug(' trying Gnome-Thumbnailer') # #print infile_p1 # size=str(w)+'x'+str(h) # cmd = ('/usr/bin/gnome-video-thumbnailer, size, '-trim','+repage','-resize',size+'>') # #print cmd # pdftopng = Application(cmd) # pdftopng.run((infile, outfile)) # return True # except: # logger.debug(' Error converting PDF') zim-0.60/zim/plugins/insertsymbol.py0000644000175000017500000001340312027375460017501 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Jaap Karssenberg import gtk import logging from zim.plugins import PluginClass from zim.gui.widgets import Dialog, Button, InputEntry, ScrolledWindow from zim.config import config_file logger = logging.getLogger('zim.plugins.insertsymbol') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('insert_symbol', None, _('Sy_mbol...'), None, '', False), # T: menu item ) VERBATIM = 'code' VERBATIM_BLOCK = 'pre' class InsertSymbolPlugin(PluginClass): plugin_info = { 'name': _('Insert Symbol'), # T: plugin name 'description': _('''\ This plugin adds the 'Insert Symbol' dialog and allows auto-formatting typographic characters. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Insert Symbol', } #~ plugin_preferences = ( # key, type, label, default #~ ) def initialize_ui(self, ui): if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) def finalize_ui(self, ui): if self.ui.ui_type == 'gtk': self.pageview = self.ui.mainwindow.pageview self.connectto(self.pageview.view, 'end-of-word') self.load_file() def load_file(self): self.symbols = {} self.symbol_order = [] file = config_file('symbols.list') for line in file.readlines(): line = line.strip() if not line or line.startswith('#'): continue try: if '#' in line: line, _ = line.split('#', 1) line = line.strip() shortcut, code = line.split() symbol = unichr(int(code)) if not shortcut in self.symbols: self.symbols[shortcut] = symbol self.symbol_order.append(shortcut) else: logger.exception('Shortcut defined twice: %s', shortcut) except: logger.exception('Could not parse symbol: %s', line) def get_symbols(self): for shortcut in self.symbol_order: symbol = self.symbols[shortcut] yield symbol, shortcut def insert_symbol(self): '''Run the InsertSymbolDialog''' InsertSymbolDialog(self.ui, self).run() def on_end_of_word(self, textview, start, end, word, char, editmode): '''Handler for the end-of-word signal from the textview''' # We check for non-space char because e.g. typing "-->" will # emit end-of-word with "--" as word and ">" as character. # This should be distinguished from the case when e.g. typing # "-- " emits end-of-word with "--" as word and " " (space) as # the char. if VERBATIM in editmode \ or VERBATIM_BLOCK in editmode \ or not (char.isspace() or char == ';'): return symbol = self.symbols.get(word) if not symbol and word.count('\\') == 1: # do this after testing the whole word, we have e.g. "=\=" # also avoid replacing end of e.g. "C:\foo\bar\left", # so match exactly one "\" prefix, key = word.split('\\', 1) symbol = self.symbols.get('\\' + key) if symbol: start.forward_chars(len(prefix)) if not symbol: return # replace word with symbol buffer = textview.get_buffer() mark = buffer.create_mark(None, end, left_gravity=False) if char == ';': end = end.copy() end.forward_char() # include the ';' in the delete buffer.delete(start, end) else: buffer.delete(start, end) iter = buffer.get_iter_at_mark(mark) buffer.insert(iter, symbol) buffer.delete_mark(mark) # block other handlers textview.stop_emission('end-of-word') class InsertSymbolDialog(Dialog): def __init__(self, ui, plugin): Dialog.__init__(self, ui, _('Insert Symbol'), # T: Dialog title button=(_('_Insert'), 'gtk-ok'), # T: Button label defaultwindowsize=(350, 400) ) self.plugin = plugin self.textentry = InputEntry() self.vbox.pack_start(self.textentry, False) # TODO make this iconview single-click model = gtk.ListStore(str, str) # text, shortcut self.iconview = gtk.IconView(model) self.iconview.set_text_column(0) self.iconview.set_column_spacing(0) self.iconview.set_row_spacing(0) if gtk.gtk_version >= (2, 12, 0): self.iconview.set_property('has-tooltip', True) self.iconview.connect('query-tooltip', self.on_query_tooltip) self.iconview.connect('item-activated', self.on_activated) self.vbox.add(ScrolledWindow(self.iconview)) button = gtk.Button(stock=gtk.STOCK_EDIT) button.connect('clicked', self.on_edit) self.action_area.add(button) self.action_area.reorder_child(button, 0) self.load_symbols() def load_symbols(self): model = self.iconview.get_model() model.clear() for symbol, shortcut in self.plugin.get_symbols(): model.append((symbol, shortcut)) def on_query_tooltip(self, iconview, x, y, keyboard, tooltip): if keyboard: return False x, y = iconview.convert_widget_to_bin_window_coords(x, y) path = iconview.get_path_at_pos(x, y) if path is None: return False model = iconview.get_model() iter = model.get_iter(path) text = model.get_value(iter, 1) if not text: return False tooltip.set_text(text) return True def on_activated(self, iconview, path): model = iconview.get_model() iter = model.get_iter(path) text = model.get_value(iter, 0) text = text.decode('utf-8') pos = self.textentry.get_position() self.textentry.insert_text(text, pos) self.textentry.set_position(pos + len(text)) def on_edit(self, button): file = config_file('symbols.list') if self.ui.edit_config_file(file): self.plugin.load_file() self.load_symbols() def run(self): self.iconview.grab_focus() Dialog.run(self) def do_response_ok(self): text = self.textentry.get_text() textview = self.plugin.pageview.view buffer = textview.get_buffer() buffer.insert_at_cursor(text) return True zim-0.60/zim/plugins/linesorter.py0000644000175000017500000000643412061675557017153 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 NorfCran # License: same as zim (gpl) from __future__ import with_statement import gtk from zim.plugins import PluginClass from zim.gui.widgets import ui_environment, MessageDialog #from zim.gui.clipboard import parsetree_from_selectiondata import logging logger = logging.getLogger('zim.plugins.linesorter') ui_xml = ''' ''' # in oder to provide dynamic key binding assignment the initiation is made in the plugin class ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('sort_selected_lines', 'gtk-sort-ascending', _('_Sort lines'), '', '', False), # T: menu item for insert clipboard plugin ) class LineSorterPlugin(PluginClass): '''FIXME''' plugin_info = { 'name': _('Line Sorter'), # T: plugin name 'description': _('''\ This plugin sorts selected lines in alphabetical order. If the list is already sorted the order will be reversed (A-Z to Z-A). '''), # T: plugin description 'author': 'NorfCran', 'help': 'Plugins:Line Sorter', } def __init__(self, ui): PluginClass.__init__(self, ui) def initialize_ui(self, ui): if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) def sort_selected_lines(self): buffer = self.ui.mainwindow.pageview.view.get_buffer() try: sel_start, sel_end = buffer.get_selection_bounds() except ValueError: MessageDialog(self.ui, _('Please select more than one line of text, first.')).run() # T: Error message in "" dialog, %s will be replaced by application name return first_lineno = sel_start.get_line() last_lineno = sel_end.get_line() with buffer.user_action: # Get iters for full selection iter_end_line = buffer.get_iter_at_line(last_lineno) iter_end_line.forward_line() # include \n at end of line if iter_end_line.is_end() and not iter_end_line.starts_line(): # no \n at end of buffer, insert it buffer.insert(iter_end_line, '\n') iter_end_line = buffer.get_end_iter() iter_begin_line = buffer.get_iter_at_line(first_lineno) # 1/ build a list of formatted lines with get_parsetree() # 2/ make a list of tuples, first element of each tuple is # text only (white space stripped etc.), second element # is parsetree per line from step 1 lines = [] for line_nr in range(first_lineno, last_lineno+1): start, end = buffer.get_line_bounds(line_nr) text = buffer.get_text(start, end).lower().strip() tree = buffer.get_parsetree(bounds=(start, end)) lines.append((text, tree)) #logger.debug("Content of selected lines (text, tree): %s", lines) # 3/ sort this list of tuples, sort will look at first element of the tuple sorted_lines = sorted(lines, key=lambda lines: lines[0]) # checks whether the list is sorted "a -> z", if so reverses its order if lines == sorted_lines: sorted_lines.reverse() # logger.debug("Sorted lines: %s", sorted_lines) # 4/ for the replacement insert the parsetrees of the lines one by one buffer.delete(iter_begin_line, iter_end_line) for line in sorted_lines: buffer.insert_parsetree_at_cursor(line[1]) zim-0.60/zim/plugins/gnu_r_ploteditor.py0000644000175000017500000000772412132472704020333 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # # ploteditor.py # # This is a plugin for Zim, which allows inserting GNU R scripts to # have Zim generate plots from them. # # Author: Lee Braiden # Date: 2010-03-13 # Copyright (c) 2010, released under the GNU GPL v2 or higher # # Heavily based on equationeditor.py plugin as of: # bzr revno 212, (2010-03-10), marked as # Copyright 2009 Jaap Karssenberg # import gtk import glob from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.templates import GenericTemplate from zim.applications import Application from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences gnu_r_cmd = ('R',) ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_gnu_r_plot', None, _('GNU _R Plot...'), '', '', False), # T: menu item for insert plot plugin ) class InsertGNURPlotPlugin(PluginClass): plugin_info = { 'name': _('Insert GNU R Plot'), # T: plugin name 'description': _('''\ This plugin provides a plot editor for zim based on GNU R. '''), # T: plugin description 'help': 'Plugins:GNU R Plot Editor', 'author': 'Lee Braiden', } @classmethod def check_dependencies(klass): has_gnur = Application(gnu_r_cmd).tryexec() return has_gnur, [('GNU R', has_gnur, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('gnu_r_plot') def insert_gnu_r_plot(self): dialog = InsertGNURPlotDialog.unique(self, self.ui) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertGNURPlotDialog(self.ui, image=image) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit GNU R Plot')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertGNURPlotDialog(ImageGeneratorDialog): def __init__(self, ui, image=None): generator = GNURPlotGenerator() ImageGeneratorDialog.__init__(self, ui, _('GNU R Plot'), # T: dialog title generator, image, help=':Plugins:GNU R Plot Editor' ) class GNURPlotGenerator(ImageGeneratorClass): uses_log_file = False type = 'gnu_r_plot' scriptname = 'gnu_r_plot.r' imagename = 'gnu_r_plot.png' def __init__(self): file = data_file('templates/plugins/gnu_r_editor.r') assert file, 'BUG: could not find templates/plugins/gnu_r_editor.r' self.template = GenericTemplate(file.readlines(), name=file) self.plotscriptfile = TmpFile(self.scriptname) def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) plotscriptfile = self.plotscriptfile pngfile = File(plotscriptfile.path[:-2] + '.png') plot_script = "".join(text) template_vars = { 'gnu_r_plot_script': plot_script, 'png_fname': pngfile.path.replace('\\', '/'), # Even on windows, GNU R expects unix path seperator } # Write to tmp file usign the template for the header / footer plotscriptfile.writelines( self.template.process(template_vars) ) #print '>>>%s<<<' % plotscriptfile.read() # Call GNU R try: gnu_r = Application(gnu_r_cmd) #~ gnu_r.run(args=('-f', plotscriptfile.basename, ), cwd=plotscriptfile.dir) gnu_r.run(args=('-f', plotscriptfile.basename, '--vanilla'), cwd=plotscriptfile.dir) except: return None, None # Sorry, no log else: return pngfile, None def cleanup(self): path = self.plotscriptfile.path for path in glob.glob(path[:-2]+'.*'): File(path).remove() zim-0.60/zim/plugins/__init__.py0000644000175000017500000005476712132472704016524 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2013 Jaap Karssenberg '''Base class and API for plugins Zim plugins are simply python modules that contain a sub-class of L{PluginClass}. They get a reference the the main application object running the interface and from there can link to various objects and widgets. The base class has convenience methods for common actions for plugins. Also see the HACKING notebook in the source distribution for some notes on writing new plugins. @note: sub-modules T should contain one and exactly one subclass of L{PluginClass}. This is because this class is detected automatically when loading the plugin. This means you can also not import classes of other plugins directly into the module. ''' import gobject import types import os import sys import weakref import logging import inspect import zim.fs from zim.fs import Dir from zim.config import ListDict, get_environ from zim.signals import ConnectorMixin, SIGNAL_AFTER from zim.actions import action, toggle_action, get_actiongroup logger = logging.getLogger('zim.plugins') def user_site_packages_directory(): '''Get the per user site-packages directory In Python 2.6 the "Per-user site-packages Directory" feature has been introduced, see U{http://docs.python.org/whatsnew/2.6.html#pep-370-per-user-site-packages-directory}. This function backports this feature to Python 2.5. @returns: the per user site-packages directory. This directoy is part of the search path for plugin modules, so users can install plugins in locally. ''' if os.name == 'nt': appdata = get_environ('APPDATA') if appdata: dir = Dir((appdata, 'Python/Python25/site-packages')) return dir.path else: return None else: dir = Dir('~/.local/lib/python2.5/site-packages') return dir.path # Add the per-user site-packages directory to the system path if sys.version_info[0:2] == (2, 5): userdir = user_site_packages_directory() if userdir and not userdir in sys.path: sys.path.insert(0, userdir) def set_plugin_search_path(): '''Initialize C{__path__} variable with the search path for plugins Sets C{__path__} for the C{zim.plugins} module. This determines what directories are searched when importing plugin packages in the zim.plugins namespace. This function looks at C{sys.path} and would need to be run again if C{sys.path} is modified after loading this module. ''' global __path__ __path__ = [] # flush completely # We don't even keep the directory of this source file because we # want order in __path__ match order in sys.path, so per-user # folder takes proper precedence for dir in sys.path: try: dir = dir.decode(zim.fs.ENCODING) except UnicodeDecodeError: logger.exception('Could not decode path "%s"', dir) continue if os.path.basename(dir) == 'zim.exe': # path is an executable, not a folder -- examine containing folder dir = os.path.dirname(dir) if dir == '': dir = '.' dir = os.path.sep.join((dir, 'zim', 'plugins')) #~ print '>> PLUGIN DIR', dir __path__.append(dir) # extend path for importing and searching plugins set_plugin_search_path() def get_module(name): '''Import a module @param name: the module name @returns: module object @raises ImportError: if the given name does not exist @note: don't actually use this method to get plugin modules, see L{get_plugin_module()} instead. ''' # __import__ has some quirks, see the reference manual mod = __import__(name) for part in name.split('.')[1:]: mod = getattr(mod, part) return mod def lookup_subclass(module, klass): '''Look for a subclass of klass in the module This function is used in several places in zim to get extension classes. Typically L{get_module()} is used first to get the module object, then this lookup function is used to locate a class that derives of a base class (e.g. PluginClass). @param module: module object @param klass: base class @note: don't actually use this method to get plugin classes, see L{get_plugin()} instead. ''' subclasses = lookup_subclasses(module, klass) if len(subclasses) > 1: raise AssertionError, 'BUG: Multiple subclasses found of type: %s' % klass elif subclasses: return subclasses[0] else: return None def lookup_subclasses(module, klass): '''Look for all subclasses of klass in the module @param module: module object @param klass: base class ''' subclasses = [] for name, obj in inspect.getmembers(module, inspect.isclass): if issubclass(obj, klass) \ and obj.__module__.startswith(module.__name__): subclasses.append(obj) return subclasses def get_plugin_module(name): '''Get the plugin module for a given name @param name: the plugin module name (e.g. "calendar") @returns: the plugin module object ''' return get_module('zim.plugins.' + name.lower()) def get_plugin(name): '''Get the plugin class for a given name @param name: the plugin module name (e.g. "calendar") @returns: the plugin class object ''' mod = get_plugin_module(name) obj = lookup_subclass(mod, PluginClass) obj.plugin_key = name return obj def list_plugins(): '''List available plugin module names @returns: a set of available plugin names that can be loaded using L{get_plugin()}. ''' # Only listing folders in __path__ because this parameter determines # what folders will considered when importing sub-modules of the # this package once this module is loaded. plugins = set() for dir in __path__: dir = Dir(dir) for candidate in dir.list(): # returns [] if dir does not exist if candidate.startswith('_'): continue elif candidate.endswith('.py'): #~ print '>> FOUND %s.py in %s' % (candidate, dir.path) plugins.add(candidate[:-3]) elif zim.fs.isdir(dir.path+'/'+candidate) \ and os.path.exists(dir.path+'/'+candidate+'/__init__.py'): #~ print '>> FOUND %s/__init__.py in %s' % (candidate, dir.path) plugins.add(candidate) else: pass return plugins class PluginClassMeta(gobject.GObjectMeta): '''Meta class for objects inheriting from PluginClass. It adds a wrapper to the constructor to call secondairy initialization methods. ''' def __init__(klass, name, bases, dictionary): originit = klass.__init__ #~ print 'DECORATE INIT', klass def decoratedinit(self, ui, *arg, **kwarg): # Calls initialize_ui and finalize_notebook *after* __init__ #~ print 'INIT', self originit(self, ui, *arg, **kwarg) if not self.__class__ is klass: return # Avoid wrapping both base class and sub classes if self.ui.notebook: self.initialize_ui(ui) self.finalize_notebook(self.ui.notebook) else: self.initialize_ui(ui) def after_open_notebook(*a): self._merge_uistate() self.finalize_notebook(self.ui.notebook) self.connectto(self.ui, 'open-notebook', after_open_notebook, order=SIGNAL_AFTER) # FIXME with new plugin API should not need this merging klass.__init__ = decoratedinit origfinalize = klass.finalize_ui def decoratedfinalize(self, ui, *arg, **kwarg): origfinalize(self, ui, *arg, **kwarg) if not self.__class__ is klass: return # Avoid wrapping both base class and sub classes #~ print 'FINALIZE UI', self for window in ui.windows: self.do_decorate_window(window) self.connectto(ui, 'new-window', lambda u,w: self.do_decorate_window(w)) klass.finalize_ui = decoratedfinalize class PluginClass(ConnectorMixin, gobject.GObject): '''Base class for plugins. Every module containing a plugin should have exactly one class derived from this base class. That class will be initialized when the plugin is loaded. Plugin classes should define two class attributes: L{plugin_info} and L{plugin_preferences}. Optionally, they can also define the class attribute L{is_profile_independent}. This class inherits from L{ConnectorMixin} and calls L{ConnectorMixin.disconnect_all()} when the plugin is destroyed. Therefore it is highly recommended to use the L{ConnectorMixin} methods in sub-classes. @cvar plugin_info: A dict with basic information about the plugin, it should contain at least the following keys: - C{name}: short name - C{description}: one paragraph description - C{author}: name of the author - C{help}: page name in the manual (optional) This info will be used e.g. in the plugin tab of the preferences dialog. @cvar plugin_preferences: A tuple or list defining the global preferences for this plugin. Each preference is defined by a 4-tuple containing the following items: 1. the key in the config file 2. an option type (see InputForm.add_inputs for more details) 3. a label to show in the dialog 4. a default value These preferences will be initialized to their default value if not configured by the user and the values can be found in the L{preferences} dict. The type and label will be used to render a default configure dialog when triggered from the preferences dialog. Changes to these preferences will be stored in a config file so they are persistent. @cvar is_profile_independent: A boolean indicating that the plugin configuration is global and not meant to change between notebooks. The default value (if undefined) is False. Plugins that set L{is_profile_independent} to True will be initialized before opening the notebook. All other plugins will only be loaded after the notebook is initialized. @ivar ui: the main application object, e.g. an instance of L{zim.gui.GtkInterface} or L{zim.www.WWWInterface} @ivar preferences: a C{ListDict()} with plugin preferences Preferences are the global configuration of the plugin, they are stored in the X{preferences.conf} config file. @ivar uistate: a C{ListDict()} with plugin ui state The "uistate" is the per notebook state of the interface, it is intended for stuff like the last folder opened by the user or the size of a dialog after resizing. It is stored in the X{state.conf} file in the notebook cache folder. @signal: C{preferences-changed ()}: emitted after the preferences were changed, triggers the L{do_preferences_changed} handler ''' __metaclass__ = PluginClassMeta # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'preferences-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } plugin_info = {} plugin_preferences = () is_profile_independent = False @classmethod def check_dependencies_ok(klass): '''Checks minimum dependencies are met @returns: C{True} if this plugin can be loaded ''' check, dependencies = klass.check_dependencies() return check @classmethod def check_dependencies(klass): '''Checks what dependencies are met and gives details @returns: a boolean telling overall dependencies are met, followed by a list with details. This list consists of 3-tuples consisting of a (short) description of the dependency, a boolean for dependency being met, and a boolean for this dependency being optional or not. @implementation: must be implemented in sub-classes that have one or more (external) dependencies. ''' return (True, []) def __init__(self, ui): '''Constructor @param ui: a L{NotebookInterface} object @implementation: sub-classes may override this constructor, but it is advised instead to do the work of initializing the plugin in the methods L{initialize_ui()}, L{initialize_notebook()}, L{finalize_ui()} and L{finalize_notebook()} where apropriate. ''' # NOTE: this method is decorated by the meta class gobject.GObject.__init__(self) self.ui = ui assert 'name' in self.plugin_info, 'Plugins should provide a name in the info dict' assert 'description' in self.plugin_info, 'Plugins should provide a description in the info dict' assert 'author' in self.plugin_info, 'Plugins should provide a author in the info dict' if self.plugin_preferences: assert isinstance(self.plugin_preferences[0], tuple), 'BUG: preferences should be defined as tuples' section = self.__class__.__name__ self.preferences = self.ui.preferences[section] for pref in self.plugin_preferences: if len(pref) == 4: key, type, label, default = pref self.preferences.setdefault(key, default) else: key, type, label, default, check = pref self.preferences.setdefault(key, default, check=check) self._is_image_generator_plugin = False if self.ui.notebook: section = self.__class__.__name__ self.uistate = self.ui.uistate[section] else: self.uistate = ListDict() # Find related extension classes in same module # any class with the "__extends__" field will be added # (Being subclass of Extension is optional) self.extension_classes = {} self._extensions = [] module = get_module(self.__class__.__module__) for name, klass in inspect.getmembers(module, inspect.isclass): if hasattr(klass, '__extends__') and klass.__extends__: assert klass.__extends__ not in self.extension_classes, \ 'Extension point %s used multiple times in %s' % (klass.__extends__, module.__name__) self.extension_classes[klass.__extends__] = klass def _merge_uistate(self): # As a convenience we provide a uistate dict directly after # initialization of the plugin. However, in reality this # config file is only available after the notebook is opened. # Therefore we need to link the actual file and merge back # any defaults that were set during plugin intialization etc. if self.ui.uistate: section = self.__class__.__name__ defaults = self.uistate self.uistate = self.ui.uistate[section] for key, value in defaults.items(): self.uistate.setdefault(key, value) def _extension_point(self, obj): # TODO also check parent classes name = obj.__class__.__name__ if name in self.extension_classes: ext = self.extension_classes[name](self, obj) ref = weakref.ref(obj, self._del_extension) self._extensions.append(ref) def _del_extension(self, ref): if ref in self._extensions: self._extensions.remove(ref) @property def extensions(self): extensions = [ref() for ref in self._extensions] return [e for e in extensions if e] # Filter out None values def initialize_ui(self, ui): '''Callback called during construction of the ui. Called after construction of the plugin when the application object is available. At this point the construction of the the interface itself does not yet need to be complete. Typically used to initialize any interface components of the plugin. @note: the plugin should check the C{ui_type} attribute of the application object to distinguish the Gtk from the WWW interface and only do something for the correct interface. @param ui: a L{NotebookInterface} object, e.g. L{zim.gui.GtkInterface} @implementation: optional, may be implemented by subclasses. ''' pass def initialize_notebook(self, notebookuri): '''Callback called before construction of the notebook This callback is called before constructing the notebook object. It is intended for a fairly specific type of plugins that may want to do some manipulation of the notebook location before actually loading the notebook, e.g. auto-mounting a filesystem. Not called when plugin is constructed while notebook already exists. @param notebookuri: the URI of the notebook location @implementation: optional, may be implemented by subclasses. ''' pass def finalize_notebook(self, notebook): '''Callback called once the notebook object is created This callback is called once the notebook object is constructed and loaded in the application object. This is a logical point to do any intialization that requires the notebook the be available. @param notebook: the L{Notebook} object @implementation: optional, may be implemented by subclasses. ''' self._extension_point(notebook) def finalize_ui(self, ui): '''Callback called just before entering the main loop Called after the interface is fully initialized and has a notebook object loaded. Typically used for any initialization that needs the full application to be ready. @note: the plugin should check the C{ui_type} attribute of the application object to distinguish the Gtk from the WWW interface and only do something for the correct interface. @param ui: a L{NotebookInterface} object, e.g. L{zim.gui.GtkInterface} @implementation: optional, may be implemented by subclasses. ''' # NOTE: this method is decorated by the meta class pass def do_decorate_window(self, window): '''Callback which is called for each window and dialog that opens in zim. May be overloaded by sub classes ''' self._extension_point(window) # HACK if hasattr(window, 'pageview'): self._extension_point(window.pageview) def do_preferences_changed(self): '''Handler called when preferences are changed by the user @implementation: optional, may be implemented by subclasses. to apply relevant changes. ''' pass def destroy(self): '''Destroy the plugin object and all extensions It is only called when a user actually disables the plugin, not when the application exits. Destroys all active extensions and disconnects all signals. This should revert any changes the plugin made to the application (although preferences etc. can be left in place). ''' ### TODO clean up this section when all plugins are ported if self.ui.ui_type == 'gtk': try: self.ui.remove_ui(self) self.ui.remove_actiongroup(self) except: logger.exception('Exception while disconnecting %s', self) if self._is_image_generator_plugin: try: self.ui.mainpage.pageview.unregister_image_generator_plugin(self) except: logger.exception('Exception while disconnecting %s', self) ### while self._extensions: ref = self._extensions.pop() obj = ref() if obj: obj.destroy() try: self.disconnect_all() except: logger.exception('Exception while disconnecting %s', self) def toggle_action(self, action, active=None): '''Trigger a toggle action. This is a convenience method to help defining toggle actions in the menu or toolbar. It helps to keep the menu item or toolbar item in sync with your internal state. A typical usage to define a handler for a toggle action called 'show_foo' would be:: def show_foo(self, show=None): self.toggle_action('show_foo', active=show) def do_show_foo(self, show=None): if show is None: show = self.actiongroup.get_action('show_foo').get_active() # ... the actual logic for toggling on / off 'foo' This way you have a public method C{show_foo()} that can be called by anybody and a handler C{do_show_foo()} that is called when the user clicks the menu item. The trick is that when C{show_foo()} is called, the menu item is also updates. @param action: the name of the action item @param active: when C{None} the item is toggled with respect to it's current state, when C{True} or C{False} forces a state ''' name = action action = self.actiongroup.get_action(name) if active is None or active != action.get_active(): action.activate() else: method = getattr(self, 'do_'+name) method(active) #~ def remember_decorated_window(self, window): #~ import weakref #~ if not hasattr(self, '_decorated_windows'): #~ self._decorated_windows = [] #~ ref = weakref.ref(window, self._clean_decorated_windows_list) #~ self._decorated_windows.append(ref) #~ def _clean_decorated_windows_list(self, *a): #~ self._decorated_windows = [ #~ ref for ref in self._decorated_windows #~ if not ref() is None ] #~ def get_decorated_windows(self): #~ if not hasattr(self, '_decorated_windows'): #~ return [] #~ else: #~ self._clean_decorated_windows_list() #~ return [ref() for ref in self._decorated_windows] def register_image_generator_plugin(self, type): '''Convenience method to register a plugin that adds a type of image objects @param type: the type of the objects (e.g. "equation") @todo: document image geneartor plugins ''' self.ui.mainwindow.pageview.register_image_generator_plugin(self, type) self._is_image_generator_pluging = True # Need to register classes defining gobject signals gobject.type_register(PluginClass) def extends(klass): '''Decorator for extension classes Use this decorator to add extensions to the plugin. Takes either a class or a class name for the class to be extended. When the plugin gets an object of this class a new extension object will be constructed. ''' if isinstance(klass, basestring): name = klass else: name = klass.__name__ def inner(myklass): myklass.__extends__ = name return myklass return inner class Extension(ConnectorMixin): # TODO, maybe add try .. except wrapper for destroy in meta class ? # have except always call super.destroy def __init__(self, plugin, obj): self.plugin = plugin self.obj = obj def destroy(self): try: self.disconnect_all() except: logger.exception('Exception while disconnecting %s', self) class WindowExtension(Extension): def __init__(self, plugin, window): self.plugin = plugin self.window = window if hasattr(self, 'uimanager_xml'): # TODO move uimanager to window actiongroup = get_actiongroup(self) self.window.ui.uimanager.insert_action_group(actiongroup, 0) self._uimanager_id = self.window.ui.uimanager.add_ui_from_string(self.uimanager_xml) window.connect_object('destroy', self.__class__.destroy, self) def destroy(self): try: # TODO move uimanager to window if hasattr(self, '_uimanager_id') \ and self._uimanager_id is not None: self.window.ui.uimanager.remove_ui(self._uimanager_id) self._uimanager_id = None if hasattr(self, 'actiongroup'): self.window.ui.uimanager.remove_action_group(self.actiongroup) except: logger.exception('Exception while removing UI %s', self) Extension.destroy(self) class DialogExtension(WindowExtension): def __init__(self, plugin, window): assert hasattr(window, 'action_area'), 'Not a dialog: %s' % window WindowExtension.__init__(self, plugin, window) self._dialog_buttons = [] def add_dialog_button(self, button): # This logic adds the button to the action area and places # it left of the left most primary button by reshuffling all # other buttons after adding the new one # # TODO: check if this works correctly in RTL configuration self.window.action_area.pack_end(button, False) # puts button in right most position self._dialog_buttons.append(button) buttons = [b for b in self.window.action_area.get_children() if not self.window.action_area.child_get_property(b, 'secondary')] for b in buttons: if b is not button: self.window.action_area.reorder_child(b, -1) # reshuffle to the right def destroy(self): try: for b in self._dialog_buttons: self.window.action_area.remove(b) except: logger.exception('Could not remove buttons') WindowExtension.destroy(self) zim-0.60/zim/plugins/versioncontrol/0000775000175000017500000000000012140000463017444 5ustar jaapjaap00000000000000zim-0.60/zim/plugins/versioncontrol/git.py0000664000175000017500000001346211734144655020633 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2012 Jaap Karssenberg # Copyright 2010,2011 John Drinkwater # Copyright 2012 Damien Accorsi from __future__ import with_statement import os import logging from zim.plugins.versioncontrol import VCSApplicationBase from zim.applications import Application logger = logging.getLogger('zim.vcs.git') class GITApplicationBackend(VCSApplicationBase): def __init__(self, root): VCSApplicationBase.__init__(self, root) @classmethod def build_bin_application_instance(cls): return Application(('git',)) def build_revision_arguments(self, versions, is_for_diff=False): """Build a list including required string/int for running an VCS command # Accepts: None, int, string, (int,), (int, int) # Always returns a list # versions content: - None: return an empty list - int ou string: return ['-r', int] - tuple or list: return ['-r', '%i..%i'] It's all based on the fact that defining revision with current VCS is: -r revision -r rev1..rev2 """ if is_for_diff==True: if len(versions) == 2: versions.reverse() return ['..'.join(versions)] elif len(versions) == 1: return [versions[0] + '^'] else: return [] else: if isinstance(versions, (tuple, list)): assert 1 <= len(versions) <= 2 if len(versions) == 2: return map(str, versions) else: versions = versions[0] if not versions is None: version = str(versions) return [version] else: return [] ######## # # NOW ARE ALL REVISION CONTROL SYSTEM SHORTCUTS def add(self, path=None): """ Runs: git add {{PATH}} """ if path is None: return self.run(['add', '.']) else: return self.run(['add', path]) def annotate(self, file, version): """FIXME Document return 0: line1 2: line1 ... """ revision_args = self.build_revision_arguments(version) return self.pipe(['blame', '-s', file] + revision_args) def cat(self, path, version): """ Runs: git cat {{PATH}} {{REV_ARGS}} """ revision_args = self.build_revision_arguments(version) return self.pipe(['show', ''.join( [ ''.join(revision_args), ':', path.relpath(self.root) ] )]) def commit(self, path, msg): """ Runs: git commit -a -m {{MSG}} {{PATH}} """ if self.is_modified(): params = ['commit', '-a'] if msg!='' and msg!=None: params.append('-m') params.append(msg) if path!='' and path!=None: params.append('--') params.append(path) return self.run(params) def diff(self, versions, path=None): """ Runs: git diff --no-ext-diff {{REVISION_ARGS}} or git diff --no-ext-diff {{REVISION_ARGS}} -- {{PATH}} """ revision_args = self.build_revision_arguments(versions) revision_args = self.build_revision_arguments(revision_args, is_for_diff=True) if path==None: return self.pipe(['diff', '--no-ext-diff'] + revision_args) else: return self.pipe(['diff', '--no-ext-diff'] + revision_args + ['--', path]) def ignore(self, file_to_ignore_regexp): """ Build a .gitignore file including the file_to_ignore_content """ #TODO: append the rule instead of overwrite the full content self.root.file( '.gitignore' ).write( file_to_ignore_regexp ) def init_repo(self): self.init() self.ignore(".zim/\n") self.add('.') # add all existing files def repo_exists(self): return self.root.subdir('.git').exists() def init(self): """ Runs: git init """ return self.run(['init']) def is_modified(self): """Returns true if the repo is not up-to-date, or False @returns: True if the repo is not up-to-date, or False """ # If status return an empty answer, this means the local repo is up-to-date return not (''.join( self.status() ).find( 'nothing to commit' ) > -1) def log(self, path=None): """ Runs: git log --date=iso --follow {{PATH}} or git log --date=iso """ if path: return self.pipe(['log', '--date=iso', '--follow', path]) else: return self.pipe(['log', '--date=iso']) def log_to_revision_list(self, log_op_output): versions = [] (rev, date, user, msg) = (None, None, None, None) seenmsg = False # seenmsg allow to get the complete commit message which is presented like this: # # [...] # description: # here is the # commit message # the end of it may be detected # because of the apparition of a line # starting by "changeset:" # # FIXME: there is a bug which will stop parsing if a blank line is included # in the commit message for line in log_op_output: if line.startswith('commit '): if not rev is None: versions.append((rev, date, user, msg)) (rev, date, user, msg) = (None, None, None, None) seenmsg = False rev = line[7:].strip() elif line.startswith('Author: '): user = line[7:].strip() elif line.startswith('Date: '): date = line[7:].strip() seenmsg = True msg = u'' elif seenmsg and line.startswith(' '): msg += line[4:] if not rev is None: versions.append((rev, date, user, msg)) versions.reverse() return versions def move(self, oldpath, newpath): """ Runs: git mv --after {{OLDPATH}} {{NEWPATH}} """ return self.run(['mv', '--after', oldpath, newpath]) def remove(self, path): """ Runs: git rm {{PATH}} """ return self.run(['rm', path]) def revert(self, path, version): """ Runs: hg revert {{PATH}} {{REV_ARGS}} is equivalent to git checkout {{REV_ARGS}} -- {{PATH}} or hg revert --no-backup --all {{REV_ARGS}} is equivalent to git reset --hard HEAD """ revision_params = self.build_revision_arguments(version) if path: self.run(['checkout'] + revision_params + ['--', path]) else: self.run(['reset', '--hard', 'HEAD']) def stage(self): self.run(['add', '-u']) self.run(['add', '-A']) def status(self): """ Runs: git status """ return self.pipe(['status']) zim-0.60/zim/plugins/versioncontrol/bzr.py0000644000175000017500000001260511731342561020632 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2012 Jaap Karssenberg # Copyright 2012 Damien Accorsi from __future__ import with_statement import os import logging from zim.plugins.versioncontrol import VCSApplicationBase from zim.applications import Application, ApplicationError logger = logging.getLogger('zim.vcs.bzr') class BZRApplicationBackend(VCSApplicationBase): def __init__(self, root): VCSApplicationBase.__init__(self, root) @classmethod def build_bin_application_instance(cls): return Application(('bzr',)) def build_revision_arguments(self, versions): """Build a list including required string/int for running an VCS command # Accepts: None, int, string, (int,), (int, int) # Always returns a list # versions content: - None: return an empty list - int ou string: return ['-r', int] - tuple or list: return ['-r', '%i..%i'] It's all based on the fact that defining revision with current VCS is: -r revision -r rev1..rev2 """ if isinstance(versions, (tuple, list)): assert 1 <= len(versions) <= 2 if len(versions) == 2: versions = map(int, versions) versions.sort() return ['-r', '%i..%i' % tuple(versions)] else: versions = versions[0] if not versions is None: version = int(versions) return ['-r', '%i' % version] else: return [] ######## # # NOW ARE ALL REVISION CONTROL SYSTEM SHORTCUTS def add(self, path=None): """ Runs: bzr add {{PATH}} """ if path is None: return self.run(['add']) else: return self.run(['add', path]) def annotate(self, file, version): """FIXME Document return 1 | line1 2 | line2 ... """ revision_args = self.build_revision_arguments(version) return self.pipe(['annotate', file] + revision_args) def cat(self, path, version): """ Runs: bzr cat {{PATH}} {{REV_ARGS}} """ revision_args = self.build_revision_arguments(version) return self.pipe(['cat', path] + revision_args) def commit(self, path, msg): """ Runs: bzr commit -m {{MSG}} {{PATH}} """ params = ['commit'] if msg!='' and msg!=None: params.append('-m') params.append(msg) if path!='' and path!=None: params.append(path) return self.run(params) def diff(self, versions, path=None): """ Runs: bzr diff {{REVISION_ARGS}} or bzr diff {{REVISION_ARGS}} {{PATH}} """ revision_args = self.build_revision_arguments(versions) if path==None: return self.pipe(['diff'] + revision_args) # Using --git option allow to show the renaming of files else: return self.pipe(['diff', path] + revision_args) def ignore(self, file_to_ignore_regexp): """ Build a .bzrignore file including the file_to_ignore_content """ return self.run(['ignore', file_to_ignore_regexp]) def init_repo(self): self.init() if not self.test_whoami(): self.whoami('zim') # set a dummy user "zim" self.ignore('**/.zim/') self.add('.') def repo_exists(self): return self.root.subdir('.bzr').exists() def init(self): """ Runs: bzr init """ return self.run(['init']) def log(self, path=None): """ Runs: bzr log --forward {{PATH}} the "--forward" option allows to reverse order """ if path: return self.pipe(['log', '--forward', path]) else: return self.pipe(['log', '--forward']) def log_to_revision_list(self, log_op_output): versions = [] (rev, date, user, msg) = (None, None, None, None) seenmsg = False # seenmsg allow to get the complete commit message which is presented like this: # # [...] # description: # here is the # commit message # the end of it may be detected # because of the apparition of a line # starting by "changeset:" # # FIXME: there is a bug which will stop parsing if a blank line is included # in the commit message for line in log_op_output: if line.startswith('----'): if not rev is None: versions.append((rev, date, user, msg)) (rev, date, user, msg) = (None, None, None, None) elif line.startswith('revno: '): value = line[7:].strip() if ' ' in value: # e.g. "revno: 48 [merge]\n" i = value.index(' ') value = value[:i] rev = value elif line.startswith('committer: '): user = line[11:].strip() elif line.startswith('timestamp: '): date = line[11:].strip() elif line.startswith('message:'): seenmsg = True msg = u'' elif seenmsg and line.startswith(' '): msg += line[2:] if not rev is None: versions.append((rev, date, user, msg)) return versions def move(self, oldpath, newpath): """ Runs: bzr mv --after {{OLDPATH}} {{NEWPATH}} """ self.run(['add', '--no-recurse', newpath.dir]) return self.run(['mv', oldpath, newpath]) def remove(self, path): """ Runs: bzr rm {{PATH}} """ return self.run(['rm', path]) def revert(self, path, version): """ Runs: bzr revert {{PATH}} {{REV_ARGS}} or bzr revert {{REV_ARGS}} """ revision_params = self.build_revision_arguments(version) if path: return self.run(['revert', path] + revision_params) else: return self.run(['revert'] + revision_params) def status(self): """ Runs: bzr status """ return self.pipe(['status']) def whoami(self, user): """ Runs: bzr whoami zim """ return self.pipe(['whoami', user]) def test_whoami(self): """return True if the user is is setup or non-zero """ try: self.run(['whoami']) except ApplicationError, e: return False else: return True zim-0.60/zim/plugins/versioncontrol/hg.py0000664000175000017500000001477411731334545020451 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2012 Jaap Karssenberg # Copyright 2012 Damien Accorsi from __future__ import with_statement import os import logging from zim.plugins.versioncontrol import VCSApplicationBase from zim.applications import Application logger = logging.getLogger('zim.vcs.hg') class HgApplication(Application): def run(self, args, pwd): args = ('--noninteractive',) + tuple(args) # force hg to run in non-interactive mode # which will force user name to be auto-setup Application.run(self, args, pwd) class HGApplicationBackend(VCSApplicationBase): def __init__(self, root): VCSApplicationBase.__init__(self, root) @classmethod def build_bin_application_instance(cls): return HgApplication(('hg',)) def get_mandatory_params(self): return ['--noninteractive'] # force hg to run in non-interactive mode # which will force user name to be auto-setup def build_revision_arguments(self, versions): """Build a list including required string/int for running an VCS command # Accepts: None, int, string, (int,), (int, int) # Always returns a list # versions content: - None: return an empty list - int ou string: return ['-r', int] - tuple or list: return ['-r', '%i..%i'] It's all based on the fact that defining revision with current VCS is: -r revision -r rev1..rev2 """ if isinstance(versions, (tuple, list)): assert 1 <= len(versions) <= 2 if len(versions) == 2: versions = map(int, versions) versions.sort() return ['-r', '%i..%i' % tuple(versions)] else: versions = versions[0] if not versions is None: version = int(versions) return ['-r', '%i' % version] else: return [] ######## # # NOW ARE ALL REVISION CONTROL SYSTEM SHORTCUTS def add(self, path=None): """ Runs: hg add {{PATH}} """ if path is None: return self.run(['add']) else: return self.run(['add', path]) def annotate(self, file, version): """FIXME Document return 0: line1 2: line1 ... """ revision_args = self.build_revision_arguments(version) return self.pipe(['annotate', file] + revision_args) def cat(self, path, version): """ Runs: hg cat {{PATH}} {{REV_ARGS}} """ revision_args = self.build_revision_arguments(version) return self.pipe(['cat', path] + revision_args) def commit(self, path, msg): """ Runs: hg commit -m {{MSG}} {{PATH}} """ params = ['commit'] if msg!='' and msg!=None: params.append('-m') params.append(msg) if path!='' and path!=None: params.append(path) return self.run(params) def diff(self, versions, path=None): """ Runs: hg diff --git {{REVISION_ARGS}} or hg diff --git {{REVISION_ARGS}} {{PATH}} """ revision_args = self.build_revision_arguments(versions) if path==None: return self.pipe(['diff', '--git'] + revision_args) # Using --git option allow to show the renaming of files else: return self.pipe(['diff', '--git', path] + revision_args) def ignore(self, file_to_ignore_regexp): """ Build a .hgignore file including the file_to_ignore_content @param file_to_ignore_regexp: str representing the .hgignore file content. this must be a list of regexp defining the file / path to ignore, separated by a\n char @returns: nothing """ #TODO: append the rule instead of overwrite the full content self.root.file( '.hgignore' ).write( file_to_ignore_regexp ) def init_repo(self): """Initialize a new repo The init operation consists in: - running the VCS init command - defining files to ignore - adding all other existing files @returns: nothing """ self.init() self.ignore('\.zim*$\n') self.add('.') # add all existing files def repo_exists(self): """Returns True if a repository is already setup, or False @returns: a boolean True if a repo is already setup, or False """ return self.root.subdir('.hg').exists() def init(self): """ Runs: hg init """ return self.run(['init']) def is_modified(self): """Returns true if the repo is not up-to-date, or False @returns: True if the repo is not up-to-date, or False """ # If status return an empty answer, this means the local repo is up-to-date return ''.join( self.status() ).strip() != '' def log(self, path=None): """ Runs: hg log -r : --verbose {{PATH}} the "-r :" option allows to reverse order --verbose allows to get the entire commit message """ if path: return self.pipe(['log', '-r', ':', '--verbose', path]) else: return self.pipe(['log', '-r', ':', '--verbose']) def log_to_revision_list(self, log_op_output): versions = [] (rev, date, user, msg) = (None, None, None, None) seenmsg = False # seenmsg allow to get the complete commit message which is presented like this: # # [...] # description: # here is the # commit message # the end of it may be detected # because of the apparition of a line # starting by "changeset:" # # FIXME: there is a bug which will stop parsing if a blank line is included # in the commit message for line in log_op_output: if len(line.strip())==0: if not rev is None: versions.append((rev, date, user, msg)) (rev, date, user, msg) = (None, None, None, None) seenmsg = False elif line.startswith('changeset: '): value = line[13:].strip() # In case of mercurial, the revision number line # is something like this: # changeset: 6:1d4a428e22d9 # # instead of (for bzr) like that: # e.g. "revno: 48 [merge]\n" rev = value.split(":")[0] elif line.startswith('user: '): user = line[13:].strip() elif line.startswith('date: '): date = line[13:].strip() elif line.startswith('description:'): seenmsg = True msg = u'' elif seenmsg: msg += line if not rev is None: versions.append((rev, date, user, msg)) return versions def move(self, oldpath, newpath): """ Runs: hg mv --after {{OLDPATH}} {{NEWPATH}} """ return self.run(['mv', '--after', oldpath, newpath]) def remove(self, path): """ Runs: hg rm {{PATH}} """ return self.run(['rm', path]) def revert(self, path, version): """ Runs: hg revert --no-backup {{PATH}} {{REV_ARGS}} or hg revert --no-backup --all {{REV_ARGS}} """ revision_params = self.build_revision_arguments(version) if path: return self.run(['revert', '--no-backup', path] + revision_params) else: return self.run(['revert', '--no-backup', '--all'] + revision_params) def status(self): """ Runs: hg status """ return self.pipe(['status']) zim-0.60/zim/plugins/versioncontrol/__init__.py0000644000175000017500000010711312100717176021572 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009-2012 Jaap Karssenberg # Copyright 2012 Damien Accorsi from __future__ import with_statement import gtk import os import logging from zim.fs import FS, File from zim.plugins import PluginClass from zim.errors import Error from zim.applications import Application from zim.async import AsyncOperation from zim.config import value_is_coord from zim.gui.widgets import ErrorDialog, QuestionDialog, Dialog, \ PageEntry, IconButton, SingleClickTreeView, \ ScrolledWindow, ScrolledTextView, VPaned from zim.utils import natural_sort_key if os.environ.get('ZIM_TEST_RUNNING'): TEST_MODE = True else: TEST_MODE = False # FUTURE allow vcs modules like bzr to have their own UI classes # these can add additional menu items e.g. Tools->Bazaar-> ... # or use their own graphical interfaces, like bzr gdiff # FUTURE add option to also pull & push versions automatically # FUTURE add versions... menu item to note right-click logger = logging.getLogger('zim.plugins.versioncontrol') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('save_version', 'gtk-save-as', _('S_ave Version...'), 'S', '', False), # T: menu item ('show_versions', None, _('_Versions...'), '', '', True), # T: menu item ) def async_commit_with_error(ui, vcs, msg, skip_no_changes=False): '''Convenience method to wrap vcs.commit_async''' def callback(ok, error, exc_info, data): if error: if isinstance(error, NoChangesError) and skip_no_changes: logger.debug('No autosave version needed - no changes') else: logger.error('Error during async commit', exc_info=exc_info) ErrorDialog(ui, error, exc_info).run() vcs.commit_async(msg, callback=callback) class NoChangesError(Error): description = _('There are no changes in this notebook since the last version that was saved') # T: verbose error description def __init__(self, root): self.msg = _('No changes since last version') # T: Short error descriotion class VCS(object): """ This class is the main entry for all Version Control System Stuff. It is a factory, a dependencies checker, the enumeration of supported VCS. @implementation: If you add a VCS backend, then you have to: \ - add a file named .py - create there a class inheriting from VCSApplicationBase \ - add here the stuff to manage it """ ## TODO merge with VCSBackend class ? # Enumeration of all available backends BZR = _('Bazaar') # T: option value HG = _('Mercurial') # T: option value GIT = _('Git') # T: option value @classmethod def detect_in_folder(klass, dir): """Detect if a version control system has already been setup in the folder. It also create the instance by calling the VCS.create() method @param dir: a L{File} instance representing the notebook root folder @returns: a L{VCSBackend} instance which will manage the versioning or C{None} """ name, root = klass._detect_in_folder(dir) if name == 'bzr': vcs = VCS.create(VCS.BZR, root) elif name == 'hg': vcs = VCS.create(VCS.HG, root) elif name == 'git': vcs = VCS.create(VCS.GIT, root) else: # else maybe detected something, but no backend available vcs = None if vcs: logger.info('VCS detected: %s - %s', name, root) return vcs else: logger.info('No VCS detected') return None @classmethod def _detect_in_folder(klass, dir): # split off because it is easier to test this way # # Included unsupported systems as well, to make sure we stop # looking for parents if these are detected. for path in reversed(list(dir)): if path.subdir('.bzr').exists(): return 'bzr', path elif path.subdir('.hg').exists(): return 'hg', path elif path.subdir('.git').exists(): return 'git', path elif path.subdir('.svn').exists(): return 'svn', path ## Commented CVS out since it potentially ## conflicts with like-named pages # elif path.subdir('CVS').exists(): # return 'cvs', path ## else: continue else: return None, None @classmethod def get_backend(klass, vcs): """Return the class of backend to instantiate according to vcs given as parameter. @param vcs: the wanted vcs backend (VCS.BZR, VCS.GIT, VCS.HG, ...) @returns: the related backend class. The returned class is a VCSApplicationBase child class """ vcs_klass = None if vcs == VCS.BZR: from zim.plugins.versioncontrol.bzr import BZRApplicationBackend vcs_klass = BZRApplicationBackend elif vcs == VCS.HG: from zim.plugins.versioncontrol.hg import HGApplicationBackend vcs_klass = HGApplicationBackend elif vcs == VCS.GIT: from zim.plugins.versioncontrol.git import GITApplicationBackend vcs_klass = GITApplicationBackend else: assert False, 'Unkown VCS: %s' % vcs return vcs_klass @classmethod def create(klass, vcs, dir): """Build the required instance of a Version Control System @param vcs: Version Control System to build (choose between VCS.BZR, VCS.HG, VCS.GIT) @param dir: a L{File} instance representing the notebook root folder @returns: a C{VCSBackend} instance setup with the required backend """ new_vcs = None vcs_backend_klass = VCS.get_backend(vcs) new_vcs = VCSBackend(dir, vcs_backend_klass(dir)) return new_vcs @classmethod def check_dependencies(klass, vcs): """Check if the dependencies for the requested vcs are ok @param vcs: the requested vcs: VCS.BZR, VCS.GIT or VCS.HG @returns: C{True} if dependencies are checked ok. """ return VCS.get_backend(vcs).tryexec() class VCSBackend(object): """Parent class for all VCS backend implementations. It implements the required API. """ ## TODO merge with VCS class ? def __init__(self, dir, vcs_specific_app): """Initialize the instance in normal or test mode - in case of TEST_MODE off, it checks the file system for creation, move or delete of files - in case of TEST_MODE on, it does not check anything in order to avoid to interfer with dev environment @param dir: a L{Dir} object representing the repository working directory path @param vcs_specific_app: a backend object """ self._root = dir self._lock = FS.get_async_lock(self._root) self._app = vcs_specific_app if not TEST_MODE: # Avoid touching the bazaar repository with zim sources # when we write to tests/tmp etc. FS.connect('path-created', self.on_path_created) FS.connect('path-moved', self.on_path_moved) FS.connect('path-deleted', self.on_path_deleted) # TODO: disconnect method - callbacks keep object alive even when plugin is disabled ! @property def vcs(self): return self._app @property def root(self): return self._root @property def lock(self): return self._lock def _ignored(self, path): """Return True if we should ignore this path TODO add specific ignore patterns in the _ignored_vcs_specific method for now we just hardcode zim specific logic @param path: a L{UnixFile} object representing the file path to check @returns: True if the path should be ignored or False """ return '.zim' in path.split() or self.vcs._ignored(path) def init(self): """Initialize a Bazaar repository in the self.root directory. If the directory does not exist, then create it @returns: nothing """ if self.vcs.repo_exists(): return if not self.root.exists(): self.root.touch() #~ with self.lock: # FIXME - conflicts with "git init" !??? self.vcs.init_repo() def on_path_created(self, fs, path): """Callback to add a new file or folder when added to the wiki Note: the VCS operation is asynchronous @param fs: the L{FSSingletonClass} instance representing the file system @param path: the L{UnixFile} object representing the newly created file or folder @returns: nothing """ if path.ischild(self.root) and not self._ignored(path): def wrapper(): self.vcs.add(path) AsyncOperation(wrapper, lock=self.lock).start() def on_path_moved(self, fs, oldpath, newpath): """Callback to move the file in Bazaar when moved in the wiki Note: the VCS operation is asynchronous @param fs: the L{FSSingletonClass} instance representing the file system @param oldpath: the L{UnixFile} object representing the old path of the file or folder @param newpath: the L{UnixFile} object representing the new path of the file or folder @returns: nothing """ if newpath.ischild(self.root) and not self._ignored(newpath): def wrapper(): if oldpath.ischild(self.root): # Parent of newpath needs to be versioned in order to make mv succeed self.vcs.move(oldpath, newpath) else: self.vcs.add(newpath) AsyncOperation(wrapper, lock=self.lock).start() elif oldpath.ischild(self.root) and not self._ignored(oldpath): self.on_path_deleted(self, fs, oldpath) def on_path_deleted(self, path): """Callback to remove a file from Bazaar when deleted from the wiki Note: the VCS operation is asynchronous @param path: the L{UnixFile} object representing the path of the file or folder to delete @returns: nothing """ def wrapper(): self.vcs.remove(path) AsyncOperation(wrapper, lock=self.lock).start() @property def modified(self): """return True if changes are detected, or False""" return ''.join( self.get_status() ).strip() != '' with self.lock: return self.vcs.is_modified() def get_status(self): """Returns repo status as a list of text lines @returns: list of text lines (like a shell command result) """ status = list() with self.lock: status = self.vcs.status() return status def get_diff(self, versions=None, file=None): """Returns the diff operation result of a repo or file @param versions: couple of version numbers (integer) @param file: L{UnixFile} object of the file to check, or None @returns: the diff result """ with self.lock: nc = ['=== No Changes\n'] diff = self.vcs.diff(versions, file) or nc return diff def get_annotated(self, file, version=None): """Returns the annotated version of a file @param file: L{UnixFile} object of the file to check, or None @param version: required version number (integer) or None @returns: the annotated version of the file result """ with self.lock: annotated = self.vcs.annotate(file, version) return annotated def commit(self, msg): """Run a commit operation. @param msg: commit message (str) @returns: nothing """ with self.lock: self._commit(msg) def _commit(self, msg): stat = ''.join(self.vcs.status()).strip() if not stat: raise NoChangesError(self.root) else: self.vcs.add() self.vcs.commit(None, msg) def commit_async(self, msg, callback=None, data=None): # TODO in generic baseclass have this default to using # commit() + the wrapper call the callback #~ print '!! ASYNC COMMIT' operation = AsyncOperation(self._commit, (msg,), lock=self._lock, callback=callback, data=data) operation.start() def revert(self, version=None, file=None): with self.lock: self.vcs.revert(file, version) def list_versions(self, file=None): """Returns a list of all versions, for a file or for the entire repo @param file: a L{UnixFile} object representing the path to the file, or None @returns: a list of tuples (revision (int), date, user (str), msg (str)) """ # TODO see if we can get this directly from bzrlib as well with self.lock: lines = self.vcs.log(file) versions = self.vcs.log_to_revision_list(lines) return versions def get_version(self, file, version): """FIXME Document""" with self.lock: version = self.vcs.cat(file, version) return version def update_staging(self): with self.lock: self.vcs.stage() class VCSApplicationBase(object): """This class is the base class for the classes representing the specific version control applications. This class is abstract and must be inherited. Subclasses of this class can be used by L{VCSBackend} to apply version control to a folder. """ def __init__(self, root): """Constructor. @param root: a L{Dir} instance representing the notebook root folder """ self._app = self.build_bin_application_instance() self.root = root @classmethod def build_bin_application_instance(cls): """Builds an L{Application} object for the backend command @returns: an L{Application} object @implementation: must be implemented in child classes. """ raise NotImplementedError @classmethod def tryexec(cls): """Check if the command associated with the backend is available. @returns: C{True} if the command is available """ return cls.build_bin_application_instance().tryexec() def run(self, params): """Execute a command with the associated binary with 'params' parameters. Note: the working directory is the root associated to the repository @param params: a list of parameters to be added to the command line @returns: nothing @implementation: should not be overriden by child classes """ self._app.run(params, self.root) def pipe(self, params): """Execute a command with the associated binary with 'params' parameters and return the command line output. @param params: a list of parameters to be added to the command line @returns: a list of str() representing each line of the output @implementation: should not be overriden by child classes """ return self._app.pipe(params, self.root) def _ignored(self, file): """return True if the file should be ignored by the version control system @param file: a L{File} representing the file that we want to know if it should be ignored @returns: C{True} if the file should be ignored by the VCS. @implementation: may be overridden if some files are to be ignored \ specifically for the backend """ return False ######## # # NOW ARE ALL REVISION CONTROL SYSTEM SHORTCUTS def add(self, file=None): """Add a file to the repository. If None, then the add must be for the \ entire repository @param file: a L{File} instance representing the file to add. @returns: C{True} if the command was successfull Exemple: for Mercurial, the implementation will run "hg add " or "hg add" if file=None (meaning the entire repository @implementation: must be implemented in child classes """ raise NotImplementedError def annotate(self, file, version): """return the annotated version of a file. This is commonly related to the VCS command annotate @param file: a L{File} instance representing the file @param version: a None/int/str representing the revision of the file @returns: a list of lines representing the command result output Eg. for mercurial, it will return something like: 0: line1 2: line1 ... @implementation: must be implemented in child classes """ raise NotImplementedError def cat(self, file, version): """Return the context of a file at a specific version @param file: a L{File} object in this repository @param version: a version id @returns: a list of lines """ raise NotImplementedError def commit(self, file, msg): """Execute a commit for the file or for the entire repository @param file: a L{File} instance representing the file or None for the entire repository @param msg: a str() representing the commit message @returns: C{True} if the command was successfull Example for Mercurial. It will run: - hg commit -m (file not None and message not empty - hg commit -m (file=None and message not empty) - hg commit (file not None and message empty) - hg commit (file=None and message empty) @implementation: must be implemented in child class """ raise NotImplementedError def diff(self, versions, file=None): """Returns the result of a diff between two revisions as a list of str() representing the diff operation output. @param versions: int, str, couple or tuple representing the versions to compare @param file: a L{File} instance representing the file, or None @returns: a list of str() representing the output of the diff operation Example for Mercurial. It could run: - hg diff --git - hg diff --git - ... Note: the --git option allow to show the result a better way @implementation: must be implemented in child class """ raise NotImplementedError def ignore(self, file_to_ignore_regexp): """initialize the .XXignore file used by the VCS. @param file_to_ignore_regexp: a str() representing the content of the \ .XXignore file. It's commonly a set of regular expressions separated by a line end. Note: the behavior is to overwrite the entire file content, so you must first concatenate the regexp if you need several. @returns: nothing @implementation: must be implemented in child class. The ignore file may be easyly created by running simply the following line of code: self.root.file('nameoftheignorefile').write(file_to_ignore_regexp) Example: for Mercurial, the content of the method is: self.root.file('.hgignore').write(file_to_ignore_regexp) """ #TODO: append the rule instead of overwrite the full content raise NotImplementedError def init_repo(self): """initialize a repository in the associated folder. Runs L{init()}, adds existing files etc. @returns: nothing. @implementation: must be implemented in the child class. """ raise NotImplementedError def repo_exists(self): """Returns True if a repository is already setup @returns: C{True} if a repository is already setup in the root directory @implementation: must be implemented in child classes. """ raise NotImplementedError def init(self): """ runs the VCS init command @returns: C{True} if the command was successfull @implementation: must be implemented in child class Example: for mercurial or bazaar it runs "hg init" (or "bzr init") """ raise NotImplementedError def is_modified(self): """Returns True if the repo is not up-to-date, or False @returns: C{True} if the repo is not up-to-date, or False @implementation: must be implemented in the child class. """ raise NotImplementedError def log(self, file=None): """Returns the history related to a file. @param file: a L{File} instance representing the file or None (for the entire repository) @returns: a list of str() representing the output of the command. (not parsed) @implementation: must be implemented in child class. It must return the \ output for a file or for the entire repository, and the \ order must be from the oldest to the newest commits """ raise NotImplementedError def log_to_revision_list(self, log_op_output): """Converts the result of a log() call into a list of tuples representing \ the commits. @param log_op_output: a list of str() representing the log operation output before being parsed. @returns: a list of tuple (revision-id, date, user, commit-message) \ representing the entire life. @implementation: must be implemented in the child class. \ Actually, this method is a "log" operation parser which will convert str lines into list of 4-str tuples : (revision-id, date, user, commit-message) """ raise NotImplementedError def move(self, oldfile, newfile): """Must implement the VCS operation required after a file has been moved into the repository. Note: this is only for files being move from somewhere in the repository to somewhere in the repository @param oldfile: a L{File} representing the old location of the file @param newfile: a L{File} representing the new location of the file @returns : C{True} if the VCS operation representing this move was successfull @implementation: must be implemented in child class. \ CAUTION: this must not implement a move operation but \ a "a file has moved on the filesystem" operation, \ ordering the VCS to take into account the new state. Example: with mercurial, it is implemented by running: hg mv --after """ raise NotImplementedError def remove(self, file): """Remove a file from the repository. @param file: a L{File} instance representing the file that have been deleted from the FS @returns: C{True} if the command was successfull @implementation: must be implemented in child class. \ CAUTION: this must implement the VCS operation required \ after a versionned file has been deleted from the file system. \ \ Example: in mercurial it has been implemented with: hg rm """ raise NotImplementedError def revert(self, file, version): """Reverts a file to an older version @param file: a L{File} instance representing the file or None for the entire repo @param version: a str() or int() representing the expected version @returns: C{True} if the command was successfull @implementation: must be implemented in child class Example: in mercurial it will run: - hg revert --no-backup if file is not None - hg revert --no-backup --all if file=None """ raise NotImplementedError def stage(self): """Fixme - to be documented Usefull for git, runs: git add -u git add -A @implementation: optional to be implemented in child class """ pass def status(self): """Returns the status of the repository @returns: a list of str() representing the output of a "status" command related to the repository @implementation: must be implemented in child classes """ raise NotImplementedError class VersionControlPlugin(PluginClass): plugin_info = { 'name': _('Version Control'), # T: plugin name 'description': _('''\ This plugin adds version control for notebooks. This plugin supports the Bazaar, Git and Mercurial version control systems. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg & John Drinkwater & Damien Accorsi', 'help': 'Plugins:Version Control', } plugin_preferences = ( ('autosave', 'bool', _('Autosave version on regular intervals'), False), # T: Label for plugin preference ) def __init__(self, ui): PluginClass.__init__(self, ui) self.vcs = None if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.actiongroup.get_action('show_versions').set_sensitive(False) if self.ui.notebook: self.detect_vcs() else: self.ui.connect_after('open-notebook', lambda o, n: self.detect_vcs() ) def on_quit(o): if self.preferences['autosave']: self.autosave() self.ui.connect('quit', on_quit) @classmethod def check_dependencies(klass): has_bzr = VCS.check_dependencies(VCS.BZR) has_git = VCS.check_dependencies(VCS.GIT) has_hg = VCS.check_dependencies(VCS.HG) #TODO parameterize the return, so that a new backend will be automatically available return has_bzr|has_hg|has_git, [('bzr', has_bzr, False), ('hg', has_hg, False), ('git', has_git, False)] def detect_vcs(self): dir = self._get_notebook_dir() self.vcs = VCS.detect_in_folder(dir) if self.vcs: # HACK - FIXME use proper FS signals here # git requires changes to be added to staging, bzr does not # so add a hook for when page is written, to update staging. # # For a more generic behavior, the update_staging is implemented # for all version control systems. If not required - eg. bzr, hg, # then nothing is done self.ui.notebook.connect_after('stored-page', lambda o, n: self.vcs.update_staging() ) self.actiongroup.get_action('show_versions').set_sensitive(True) if self.preferences['autosave']: self.autosave() def _get_notebook_dir(self): notebook = self.ui.notebook if notebook.dir: return notebook.dir elif notebook.file: return notebook.file.dir else: assert 'Notebook is not based on a file or folder' def autosave(self): if not self.vcs: return if self.ui.page and self.ui.page.modified: self.ui.save_page() logger.info('Automatically saving version') with self.ui.notebook.lock: async_commit_with_error(self.ui, self.vcs, _('Automatically saved version from zim'), skip_no_changes=True ) # T: default version comment for auto-saved versions def save_version(self): if not self.vcs: vcs = VersionControlInitDialog().run() if vcs is None: return # Cancelled self.init_vcs(vcs) if self.ui.page.modified: self.ui.save_page() with self.ui.notebook.lock: SaveVersionDialog(self.ui, self.vcs).run() def init_vcs(self, vcs): dir = self._get_notebook_dir() self.vcs = VCS.create(vcs, dir) if self.vcs: with self.ui.notebook.lock: self.vcs.init() self.actiongroup.get_action('show_versions').set_sensitive(True) def show_versions(self): dialog = VersionsDialog.unique(self, self.ui, self.vcs) dialog.present() class VersionControlInitDialog(QuestionDialog): def __init__(self): QuestionDialog.__init__(self, _("Enable Version Control?"), # T: Question dialog _("Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" ) # T: Detailed question ) self.combobox = gtk.combo_box_new_text() for option in (VCS.BZR, VCS.GIT, VCS.HG): if VCS.check_dependencies(option): self.combobox.append_text(option) self.combobox.set_active(0) hbox = gtk.HBox(spacing=5) hbox.pack_end(self.combobox, False) hbox.pack_end(gtk.Label(_('Backend') + ':'), False) # T: option to chose versioncontrol backend self.vbox.pack_start(hbox, False) hbox.show_all() def run(self): if QuestionDialog.run(self): return self.combobox.get_active_text() else: return None class SaveVersionDialog(Dialog): def __init__(self, ui, vcs): Dialog.__init__(self, ui, _('Save Version'), # T: dialog title button=(None, 'gtk-save'), help='Plugins:Version Control') self.vcs = vcs self.vbox.pack_start( gtk.Label(_("Please enter a comment for this version")), False) # T: Dialog text vpaned = VPaned() self.vbox.add(vpaned) window, self.textview = ScrolledTextView(_('Saved version from zim')) # T: default version comment in the "save version" dialog self.textview.set_editable(True) vpaned.add1(window) vbox = gtk.VBox() vpaned.add2(vbox) label = gtk.Label(''+_('Details')+'') # T: section for version details in "save version" dialog label.set_use_markup(True) label.set_alignment(0, 0.5) vbox.pack_start(label, False) status = self.vcs.get_status() window, textview = ScrolledTextView(text=''.join(status), monospace=True) vbox.add(window) def do_response_ok(self): # notebook.lock already set by plugin.save_version() buffer = self.textview.get_buffer() start, end = buffer.get_bounds() msg = buffer.get_text(start, end, False).strip() if msg: async_commit_with_error(self.ui, self.vcs, msg) return True else: return False class VersionsDialog(Dialog): # TODO put state in uistate .. def __init__(self, ui, vcs): Dialog.__init__(self, ui, _('Versions'), # T: dialog title buttons=gtk.BUTTONS_CLOSE, help='Plugins:Version Control') self.vcs = vcs self.uistate.setdefault('windowsize', (600, 500), check=value_is_coord) self.uistate.setdefault('vpanepos', 300) self.vpaned = VPaned() self.vpaned.set_position(self.uistate['vpanepos']) self.vbox.add(self.vpaned) vbox = gtk.VBox(spacing=5) self.vpaned.pack1(vbox, resize=True) # Choice between whole notebook or page label = gtk.Label(''+_('Versions')+':') # section label label.set_use_markup(True) label.set_alignment(0, 0.5) vbox.pack_start(label, False) self.notebook_radio = gtk.RadioButton(None, _('Complete _notebook')) # T: Option in versions dialog to show version for complete notebook self.page_radio = gtk.RadioButton(self.notebook_radio, _('_Page')+':') # T: Option in versions dialog to show version for single page #~ recursive_box = gtk.CheckButton('Recursive') vbox.pack_start(self.notebook_radio, False) # Page entry hbox = gtk.HBox(spacing=5) vbox.pack_start(hbox, False) hbox.pack_start(self.page_radio, False) self.page_entry = PageEntry(self.ui.notebook) self.page_entry.set_path(ui.page) hbox.pack_start(self.page_entry, False) # View annotated button ann_button = gtk.Button(_('View _Annotated')) # T: Button label ann_button.connect('clicked', lambda o: self.show_annotated()) hbox.pack_start(ann_button, False) # Help text label = gtk.Label('\n'+_( '''\ Select a version to see changes between that version and the current state. Or select multiple versions to see changes between those versions. ''' ).strip()+'') # T: Help text in versions dialog label.set_use_markup(True) #~ label.set_alignment(0, 0.5) vbox.pack_start(label, False) # Version list self.versionlist = VersionsTreeView() self.versionlist.load_versions(vcs.list_versions()) scrolled = ScrolledWindow(self.versionlist) vbox.add(scrolled) # ----- vbox = gtk.VBox(spacing=5) self.vpaned.pack2(vbox, resize=False) label = gtk.Label(''+_('Comment')+'') # T: version details label.set_use_markup(True) label.set_alignment(0.0, 0.5) vbox.pack_start(label, False) # Comment text window, textview = ScrolledTextView() self.comment_textview = textview vbox.add(window) buttonbox = gtk.HButtonBox() buttonbox.set_layout(gtk.BUTTONBOX_END) vbox.pack_start(buttonbox, False) # Restore version button revert_button = gtk.Button(_('_Restore Version')) # T: Button label revert_button.connect('clicked', lambda o: self.restore_version()) buttonbox.add(revert_button) # Notebook Changes button diff_button = gtk.Button(_('Show _Changes')) # T: button in versions dialog for diff diff_button.connect('clicked', lambda o: self.show_changes()) buttonbox.add(diff_button) # Compare page button comp_button = gtk.Button(_('_Side by Side')) # T: button in versions dialog for side by side comparison comp_button.connect('clicked', lambda o: self.show_side_by_side()) buttonbox.add(comp_button) # UI interaction between selections and buttons def on_row_activated(o, iter, path): model = self.versionlist.get_model() comment = model[iter][VersionsTreeView.MSG_COL] buffer = textview.get_buffer() buffer.set_text(comment) self.versionlist.connect('row-activated', on_row_activated) def on_ui_change(o): usepage = self.page_radio.get_active() self.page_entry.set_sensitive(usepage) ann_button.set_sensitive(usepage) # side by side comparison can only be done for one page # revert can only be done to one version, not multiple selection = self.versionlist.get_selection() model, rows = selection.get_selected_rows() if not rows: revert_button.set_sensitive(False) diff_button.set_sensitive(False) comp_button.set_sensitive(False) elif len(rows) == 1: revert_button.set_sensitive(usepage) diff_button.set_sensitive(True) comp_button.set_sensitive(usepage) else: revert_button.set_sensitive(False) diff_button.set_sensitive(True) comp_button.set_sensitive(usepage) def on_page_change(o): pagesource = self._get_file() if pagesource: self.versionlist.load_versions(vcs.list_versions(self._get_file())) def on_book_change(o): self.versionlist.load_versions(vcs.list_versions()) self.page_radio.connect('toggled', on_ui_change) self.notebook_radio.connect('toggled', on_book_change) self.page_radio.connect('toggled', on_page_change) self.page_entry.connect('changed', on_page_change) selection = self.versionlist.get_selection() selection.connect('changed', on_ui_change) # select last version self.versionlist.get_selection().select_path((0,)) col = self.versionlist.get_column(0) self.versionlist.row_activated(0, col) def save_uistate(self): self.uistate['vpanepos'] = self.vpaned.get_position() def _get_file(self): if self.notebook_radio.get_active(): if self.ui.page.modified: self.ui.save_page() return None else: path = self.page_entry.get_path() if path: page = self.ui.notebook.get_page(path) if page == self.ui.page and page.modified: self.ui.save_page() else: return None # TODO error message valid page name? if page \ and hasattr(page, 'source') \ and isinstance(page.source, File) \ and page.source.ischild(self.vcs.root): return page.source else: return None # TODO error message ? def show_annotated(self): # TODO check for gannotated file = self._get_file() assert not file is None annotated = self.vcs.get_annotated(file) TextDialog(self, _('Annotated Page Source'), annotated).run() # T: dialog title def restore_version(self): file = self._get_file() path = self.page_entry.get_path() version = self.versionlist.get_versions()[0] assert not file is None if QuestionDialog(self, ( _('Restore page to saved version?'), # T: Confirmation question _('Do you want to restore page: %(page)s\n' 'to saved version: %(version)s ?\n\n' 'All changes since the last saved version will be lost !') % {'page': path.name, 'version': str(version)} # T: Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id ) ).run(): self.vcs.revert(file=file, version=version) self.ui.reload_page() # TODO trigger vcs autosave here? def show_changes(self): # TODO check for gdiff file = self._get_file() versions = self.versionlist.get_versions() diff = self.vcs.get_diff(file=file, versions=versions) TextDialog(self, _('Changes'), diff).run() # T: dialog title def show_side_by_side(self): print 'TODO - need config for an application like meld' class TextDialog(Dialog): def __init__(self, ui, title, lines): Dialog.__init__(self, ui, title, buttons=gtk.BUTTONS_CLOSE) self.set_default_size(600, 300) window, textview = ScrolledTextView(''.join(lines), monospace=True) self.vbox.add(window) class VersionsTreeView(SingleClickTreeView): # We are on purpose _not_ a subclass of the BrowserTreeView widget # because we utilize multiple selection to select versions for diffs REV_SORT_COL = 0 REV_COL = 1 DATE_COL = 2 USER_COL = 3 MSG_COL = 4 def __init__(self): model = gtk.ListStore(str, str, str, str, str) # REV_SORT_COL, REV_COL, DATE_COL, USER_COL, MSG_COL gtk.TreeView.__init__(self, model) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.set_rubber_banding(True) cell_renderer = gtk.CellRendererText() for name, i in ( (_('Rev'), self.REV_COL), # T: Column header versions dialog (_('Date'), self.DATE_COL), # T: Column header versions dialog (_('Author'), self.USER_COL), # T: Column header versions dialog ): column = gtk.TreeViewColumn(name, cell_renderer, text=i) if i == self.REV_COL: column.set_sort_column_id(self.REV_SORT_COL) else: column.set_sort_column_id(i) if i == self.DATE_COL: column.set_expand(True) self.append_column(column) model.set_sort_column_id(self.REV_SORT_COL, gtk.SORT_DESCENDING) # By default sort by rev def load_versions(self, versions): model = self.get_model() model.clear() # Empty for when we update model.set_sort_column_id(self.REV_SORT_COL, gtk.SORT_DESCENDING) # By default sort by rev for version in versions: #~ print version key = natural_sort_key(version[0]) # key for REV_SORT_COL model.append((key,) + tuple(version)) def get_versions(self): model, rows = self.get_selection().get_selected_rows() if len(rows) == 1: rev = model[rows[0]][self.REV_COL] return (rev,) else: revs = [model[path][self.REV_COL] for path in rows] return (revs[0], revs[-1]) zim-0.60/zim/plugins/spell.py0000644000175000017500000000671312001620477016065 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Spell check plugin based on gtkspell''' import os import gobject from zim.config import get_environ from zim.plugins import PluginClass from zim.gui.widgets import ErrorDialog from zim.signals import SIGNAL_AFTER try: import gtkspell except: gtkspell = None ui_xml = ''' ''' ui_toggle_actions = ( # name, stock id, label, accelerator, tooltip, initial state, readonly ('toggle_spellcheck', 'gtk-spell-check', _('Check _spelling'), 'F7', 'Spell check', False, True), # T: menu item ) class SpellPlugin(PluginClass): plugin_info = { 'name': _('Spell Checker'), # T: plugin name 'description': _('''\ Adds spell checking support using gtkspell. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Spell Checker', } plugin_preferences = ( ('language', 'string', 'Default Language', ''), ) def __init__(self, ui): PluginClass.__init__(self, ui) self.spell = None self.uistate.setdefault('active', False) if self.ui.ui_type == 'gtk': self.ui.add_toggle_actions(ui_toggle_actions, self) self.ui.add_ui(ui_xml, self) self.connectto(self.ui, 'open-page', order=SIGNAL_AFTER) @classmethod def check_dependencies(klass): return (not gtkspell is None), [('gtkspell', not gtkspell is None, True)] def toggle_spellcheck(self, enable=None): action = self.actiongroup.get_action('toggle_spellcheck') if enable is None or enable != action.get_active(): action.activate() else: self.do_toggle_spellcheck(enable=enable) def do_toggle_spellcheck(self, enable=None): #~ print 'do_toggle_spellcheck', enable if enable is None: action = self.actiongroup.get_action('toggle_spellcheck') enable = action.get_active() textview = self.ui.mainwindow.pageview.view if enable: if self.spell is None: lang = self.preferences['language'] or None try: self.spell = gtkspell.Spell(textview, lang) except: lang = lang or get_environ('LANG') or get_environ('LANGUAGE') ErrorDialog(self.ui, ( _('Could not load spell checking for language: "%s"') % lang, # T: error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" _('This could mean you don\'t have the proper\ndictionaries installed') # T: error message explanation ) ).run() return else: textview.gtkspell = self.spell # HACK used by hardcoded hook in pageview else: pass else: if self.spell is None: pass else: if textview.gtkspell \ and textview.gtkspell == self.spell: textview.gtkspell.detach() textview.gtkspell = None self.spell = None self.uistate['active'] = enable return False # we can be called from idle event def on_open_page(self, ui, page, record): # Assume the old object is detached by hard coded # hook in TextView, just attach a new one. # Use idle timer to avoid lag in page loading. # This hook also synchronizes the state of the toggle with # the uistate when loading the first page self.spell = None if self.uistate['active']: gobject.idle_add(self.toggle_spellcheck, True) zim-0.60/zim/plugins/backlinkpane.py0000664000175000017500000001036512132472704017373 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg from __future__ import with_statement import gobject import gtk import pango from zim.plugins import PluginClass, extends, WindowExtension from zim.notebook import Path from zim.gui.widgets import RIGHT_PANE, PANE_POSITIONS, BrowserTreeView, populate_popup_add_separator from zim.index import LINK_DIR_BACKWARD class BackLinksPanePlugin(PluginClass): plugin_info = { 'name': _('BackLinks Pane'), # T: plugin name 'description': _('''\ This plugin adds an extra widget showing a list of pages linking to the current page. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:BackLinks Pane', } plugin_preferences = ( # key, type, label, default ('pane', 'choice', _('Position in the window'), RIGHT_PANE, PANE_POSITIONS), # T: option for plugin preferences ) @extends('MainWindow') class MainWindowExtension(WindowExtension): def __init__(self, plugin, window): WindowExtension.__init__(self, plugin, window) self.sidepane_widget = None self.on_preferences_changed(plugin) self.connectto(plugin, 'preferences-changed') def on_preferences_changed(self, plugin): if not self.sidepane_widget: opener = self.window.get_resource_opener() self.sidepane_widget = BackLinksWidget(opener) if self.window.ui.page: # XXX self.sidepane_widget.set_page( self.window.ui.notebook, self.window.ui.page) # XXX self.connectto(self.window.ui, 'open-page') # XXX else: self.window.remove(self.sidepane_widget) self.window.add_tab( _('BackLinks'), self.sidepane_widget, self.plugin.preferences['pane']) # T: widget label self.sidepane_widget.show_all() def on_open_page(self, ui, page, path): self.sidepane_widget.set_page(self.window.ui.notebook, page) # XXX def destroy(self): if self.sidepane_widget: self.window.remove(self.sidepane_widget) self.sidepane_widget.destroy() self.sidepane_widget = None WindowExtension.destroy(self) PAGE_COL = 0 TEXT_COL = 1 class BackLinksWidget(gtk.ScrolledWindow): def __init__(self, opener): gtk.ScrolledWindow.__init__(self) self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self.set_shadow_type(gtk.SHADOW_IN) self.opener = opener self.treeview = LinksTreeView() self.add(self.treeview) self.treeview.connect('row-activated', self.on_link_activated) self.treeview.connect('populate-popup', self.on_populate_popup) def set_page(self, notebook, page): model = self.treeview.get_model() model.clear() backlinks = notebook.index.list_links(page, LINK_DIR_BACKWARD) # XXX allow access through page object for link in backlinks: href = notebook.relative_link(link.href, link.source) # XXX # relative link from href *back* to source href = href.lstrip(':') #~ model.append(None, (link.source, href)) model.append((link.source, href)) ## TODO make hierarchy by link type ? ## use link.type attribute #self.treeview.expand_all() def on_link_activated(self, treeview, path, column): model = treeview.get_model() path = model[path][PAGE_COL] self.opener.open_page(path) def on_populate_popup(self, treeview, menu): populate_popup_add_separator(menu) item = gtk.MenuItem(_('Open in New _Window')) item.connect('activate', self.on_open_new_window, treeview) menu.append(item) # Other per page menu items do not really apply here... def on_open_new_window(self, o, treeview): model, iter = treeview.get_selection().get_selected() if model and iter: path = model[iter][PAGE_COL] self.opener.open_page(path, new_window=True) class LinksTreeView(BrowserTreeView): def __init__(self): BrowserTreeView.__init__(self, LinksTreeModel()) self.set_headers_visible(False) cell_renderer = gtk.CellRendererText() cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn('_page_', cell_renderer, text=TEXT_COL) self.append_column(column) if gtk.gtk_version >= (2, 12, 0): self.set_tooltip_column(TEXT_COL) #~ class LinksTreeModel(gtk.TreeStore): class LinksTreeModel(gtk.ListStore): def __init__(self): #~ gtk.TreeStore.__init__(self, object, str) # PAGE_COL, TEXT_COL gtk.ListStore.__init__(self, object, str) # PAGE_COL, TEXT_COL zim-0.60/zim/plugins/printtobrowser.py0000644000175000017500000000574212132472704020055 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2013 Jaap Karssenberg '''Plugin to serve as work-around for the lack of printing support''' import gtk from zim.fs import TmpFile from zim.plugins import PluginClass, WindowExtension, DialogExtension, extends from zim.actions import action import zim.templates from zim.exporter import StaticLinker class PrintToBrowserPlugin(PluginClass): plugin_info = { 'name': _('Print to Browser'), # T: plugin name 'description': _('''\ This plugin provides a workaround for the lack of printing support in zim. It exports the current page to html and opens a browser. Assuming the browser does have printing support this will get your data to the printer in two steps. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Print to Browser' } def print_to_file(self, page): # FIXME - HACK - dump and parse as wiki first to work # around glitches in pageview parsetree dumper # main visibility when copy pasting bullet lists # Same hack in gui clipboard code from zim.notebook import Path, Page from zim.formats import get_format parsetree = page.get_parsetree() dumper = get_format('wiki').Dumper() text = ''.join( dumper.dump(parsetree) ).encode('utf-8') parser = get_format('wiki').Parser() parsetree = parser.parse(text) page = Page(Path(page.name), parsetree=parsetree) #-- file = TmpFile('print-to-browser.html', persistent=True, unique=False) template = zim.templates.get_template('html', 'Print') template.set_linker(StaticLinker('html', self.ui.notebook, page)) html = template.process(self.ui.notebook, page) file.writelines(html) return file @extends('MainWindow') class MainWindowExtension(WindowExtension): uimanager_xml = ''' ''' @action(_('_Print to Browser'), 'gtk-print', 'P') # T: menu item def print_to_browser(self, page=None): if page is None: page = self.window.ui.page # XXX file = self.plugin.print_to_file(page) self.window.ui.open_url('file://%s' % file) # XXX # Try to force web browser here - otherwise it goes to the # file browser which can have unexpected results @extends('TaskListDialog') class TaskListDialogExtension(DialogExtension): def __init__(self, plugin, window): DialogExtension.__init__(self, plugin, window) button = gtk.Button(stock='gtk-print') button.connect('clicked', self.on_print_tasklist) self.add_dialog_button(button) def on_print_tasklist(self, o): html = self.window.task_list.get_visible_data_as_html() file = TmpFile('print-to-browser.html', persistent=True, unique=False) file.write(html) self.window.ui.open_url('file://%s' % file) # XXX # Try to force web browser here - otherwise it goes to the # file browser which can have unexpected results zim-0.60/zim/plugins/scoreeditor.py0000664000175000017500000001362612132472704017276 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # # scoreeditor.py # # This is a plugin for Zim, which allows to insert music score in zim using # GNU Lilypond. # # # Author: Shoban Preeth # Date: 2012-07-05 # Copyright (c) 2012, released under the GNU GPL v2 or higher # # import gtk import glob from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.templates import GenericTemplate from zim.applications import Application, ApplicationError from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences lilypond_cmd = ('lilypond', '-ddelete-intermediate-files', # '-dsafe', # Can't include files in safe mode '-dbackend=eps', '--png', '--header=texidoc') convertly_cmd = ('convert-ly', '--current-version', '--edit') lilypondver_cmd = ('lilypond', '--version') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_score', None, _('S_core...'), '', _('Insert score'), False), # T: menu item for insert score plugin ) def _get_lilypond_version(): try: lilypond = Application(lilypondver_cmd) output = lilypond.pipe() return output[0].split()[2] except ApplicationError: return '2.14.2' class InsertScorePlugin(PluginClass): plugin_info = { 'name': _('Insert Score'), # T: plugin name 'description': _('''\ This plugin provides an score editor for zim based on GNU Lilypond. This is a core plugin shipping with zim. '''), # T: plugin description 'help': 'Plugins:Score Editor', 'author': 'Shoban Preeth', } plugin_preferences = [ # key, type, label, default ('include_header', 'string', _('Common include header'), '\include "predefined-guitar-fretboards.ly"'), # T: plugin preference ('include_footer', 'string', _('Common include footer'), ''), # T: plugin preference ] @classmethod def check_dependencies(klass): has_lilypond = Application(lilypond_cmd).tryexec() return has_lilypond, [('GNU Lilypond', has_lilypond, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('score') def insert_score(self): dialog = InsertScoreDialog.unique(self, self.ui, preferences=self.preferences) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertScoreDialog(self.ui, image=image, preferences=self.preferences) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit Score')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertScoreDialog(ImageGeneratorDialog): def __init__(self, ui, preferences={}, image=None): generator = ScoreGenerator(preferences=preferences) ImageGeneratorDialog.__init__(self, ui, _('Insert Score'), # T: dialog title generator, image, help=':Plugins:Score Editor', syntax="lilypond" ) class ScoreGenerator(ImageGeneratorClass): type = 'score' scriptname = 'score.ly' imagename = 'score.png' cur_lilypond_version = None include_header = '' include_footer = '' def __init__(self, preferences={}): file = data_file('templates/plugins/scoreeditor.ly') assert file, 'BUG: could not find templates/plugins/scoreeditor.ly' self.template = GenericTemplate(file.readlines(), name=file) self.scorefile = TmpFile(self.scriptname) self.cur_lilypond_version = _get_lilypond_version() if preferences.has_key('include_header'): self.include_header = preferences['include_header'] if preferences.has_key('include_footer'): self.include_footer = preferences['include_footer'] def process_input(self, text): '''Prepend version string to user input. It is also stored in the script file. ''' version_present = False for l in text.splitlines(True): if l.strip().startswith('\\version'): version_present = True if not version_present: text = '\\version "{0}"\n\n'.format(self.cur_lilypond_version) + text return text def extract_version(self, text): outtext = [] version = None for l in text: if l.strip().startswith('\\version'): version = l.strip() else: outtext.append(l) return (version, outtext) def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) (version, text) = self.extract_version(text) text = ''.join(text) #~ print '>>>%s<<<' % text # Write to tmp file using the template for the header / footer scorefile = self.scorefile scorefile.writelines( self.template.process({'score': text, 'version': version, 'include_header': self.include_header, 'include_footer': self.include_footer}) ) #~ print '>>>%s<<<' % scorefile.read() # Call convert-ly to convert document of current version of # Lilypond. clogfile = File(scorefile.path[:-3] + '-convertly.log') # len('.ly) == 3 try: convertly = Application(convertly_cmd) convertly.run((scorefile.basename,), cwd=scorefile.dir) except ApplicationError: clogfile.write('convert-ly failed.\n') return None, clogfile # Call lilypond to generate image. logfile = File(scorefile.path[:-3] + '.log') # len('.ly') == 3 try: lilypond = Application(lilypond_cmd) lilypond.run(('-dlog-file=' + logfile.basename[:-4], scorefile.basename,), cwd=scorefile.dir) except ApplicationError: # log should have details of failure return None, logfile pngfile = File(scorefile.path[:-3] + '.png') # len('.ly') == 3 return pngfile, logfile def cleanup(self): path = self.scorefile.path for path in glob.glob(path[:-3]+'*'): File(path).remove() zim-0.60/zim/plugins/arithmetic.py0000644000175000017500000000226012132472704017073 0ustar jaapjaap00000000000000# Copyright 2011 Patricio Paez # # Plugin to use arithmetic in Zim wiki from zim.inc.arithmetic import ParserGTK from zim.plugins import PluginClass, WindowExtension, extends from zim.actions import action class ArithmeticPlugin(PluginClass): plugin_info = { 'name': _('Arithmetic'), # T: plugin name 'description': _('''\ This plugin allows you to embed arithmetic calculations in zim. It is based on the arithmetic module from http://pp.com.mx/python/arithmetic. '''), # T: plugin description 'author': 'Patricio Paez', 'help': 'Plugins:Arithmetic', } #~ plugin_preferences = ( # key, type, label, default #~ ) @extends('MainWindow') class MainWindowExtension(WindowExtension): uimanager_xml = ''' ''' @action(_('_Arithmetic'), accelerator='F5') # T: menu item def calculate(self): """Perform arithmetic operations""" # get the buffer buf = self.window.pageview.view.get_buffer() # XXX # parse and return modified text parser = ParserGTK() parser.parse( buf ) zim-0.60/zim/plugins/tags.py0000644000175000017500000007162112137725763015722 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Fabian Moser # Copyright 2011, 2012 Jaap Karssenberg import gobject import gtk import pango import logging from zim.plugins import PluginClass from zim.gui.pageindex import PageTreeStore, PageTreeIter, PageTreeView, \ NAME_COL, PATH_COL, EMPTY_COL, STYLE_COL, FGCOLOR_COL, WEIGHT_COL, N_CHILD_COL from zim.notebook import Path from zim.index import IndexPath, IndexTag from zim.gui.widgets import LEFT_PANE, PANE_POSITIONS, populate_popup_add_separator, ScrolledWindow from zim.gui.clipboard import pack_urilist, INTERNAL_PAGELIST_TARGET_NAME from zim.signals import ConnectorMixin logger = logging.getLogger('zim.plugins.tags') class PageTreeTagIter(object): '''Simple wrapper for IndexTag objects used as tree iters This class is used mixed with PageTreeIter but does not derive from it. Any method that assumes PageTreeIter will fail if it suddenly encounters a PageTreeTagIter, this is intentional. ''' __slots__ = ('indextag', 'treepath', 'n_children') def __init__(self, treepath, indextag): self.treepath = treepath self.indextag = indextag self.n_children = None # None means unknown def __repr__(self): return '' % (self.treepath, self.indextag.name) class DuplicatePageTreeStore(PageTreeStore): '''Sub-class of PageTreeStore that allows for the same page appearing multiple times in the tree. ''' def select_page(self, path): oldpath = self.selected_page self.selected_page = path for mypath in (oldpath, path): if mypath: for treepath in self.get_treepaths(mypath): if treepath: treeiter = self.get_iter(treepath) self.emit('row-changed', treepath, treeiter) def get_treepath(self, path): # Just returns the first treepath matching notebook path treepaths = self.get_treepaths(path) if treepaths: return treepaths[0] else: return None def get_treepaths(self, path): '''Return all treepaths matching notebook path 'path' Default implementation assumes we are a non-duplicate treeview after all and uses L{PageTreeStore.get_treepath()}. @implementation: must be overloaded by subclasses that are real duplicate stores ''' return [PageTreeStore.get_treepath(self, path)] class TagsPageTreeStore(DuplicatePageTreeStore): '''Subclass of the PageTreeStore that shows tags as the top level for sub-sets of the page tree. A special top level item 'untagged' is created with all the untagged (top level) pages. ''' filter_depth = 2 # tag filter applies to top two levels def __init__(self, index): self._reverse_cache = {} self.untagged = IndexTag(_('untagged'), -1) # T: label for untagged pages in side pane PageTreeStore.__init__(self, index) def _connect(self): def on_page_changed(o, path, signal): #~ print '!!', signal, path self._flush() treepaths = self.get_treepaths(path) for treepath in treepaths: #~ print '!!', signal, path, treepath try: treeiter = self.get_iter(treepath) except: logger.exception('BUG: Invalid treepath: %s %s %s', signal, path, treepath) else: self.emit(signal, treepath, treeiter) def on_page_deleted(o, path): #~ print '!! page delete', path treepaths = self.get_treepaths(path) for treepath in treepaths: self.emit('row-deleted', treepath) self._flush() def on_tag_created(o, tag): self._flush() treepath = (self.index.get_tag_index(tag) + 1,) treeiter = self.get_iter(treepath) #~ print '!! tag created', tag, treepath self.row_inserted(treepath, treeiter) def on_tag_to_be_inserted(o, tag, path, first): if first and not path.namespace: # Remove from untagged branch treepath = (0, self.index.get_untagged_root_page_index(path)) #~ print '!! removed from untagged', treepath self.row_deleted(treepath) self._flush() def on_tag_inserted(o, tag, path, first): if first and not path.namespace: # Finish update of untagged branch if not self.index.n_list_untagged_root_pages(): treeiter = self.get_iter((0,)) self.row_has_child_toggled((0,), treeiter) # Add to tag branch self._flush() tagindex = self.index.get_tag_index(tag) pageindex = self.index.get_tagged_page_index(tag, path) treepath = (tagindex + 1, pageindex) treeiter = self.get_iter(treepath) #~ print '!! tag inserted', tag, treepath self.row_inserted(treepath, treeiter) if not path.hasdata: path = self.index.lookup_data(path) if path.haschildren: self.row_has_child_toggled(treepath, treeiter) def on_tag_to_be_removed(o, tag, path, last): # Remove from tag branch tagindex = self.index.get_tag_index(tag) pageindex = self.index.get_tagged_page_index(tag, path) treepath = (tagindex + 1, pageindex) #~ print '!! tag removed', tag, treepath self.row_deleted(treepath) self._flush() def on_tag_removed(o, tag, path, last): if last and not path.namespace: # Add to untagged pageindex = self.index.get_untagged_root_page_index(path) treepath = (0, pageindex) treeiter = self.get_iter(treepath) #~ print '!! new untagged', treepath if self.index.n_list_untagged_root_pages() == 1: treeiter = self.get_iter((0,)) self.row_has_child_toggled((0,), treeiter) self.row_inserted(treepath, treeiter) def on_tag_to_be_deleted(o, tag): treepath = (self.index.get_tag_index(tag) + 1,) #~ print '!! tag deleted', tag, treepath self.row_deleted(treepath) self._flush() self.connectto_all(self.index, ( ('page-inserted', on_page_changed, 'row-inserted'), ('page-updated', on_page_changed, 'row-changed'), ('page-haschildren-toggled', on_page_changed, 'row-has-child-toggled'), ('page-to-be-deleted', on_page_deleted), # TODO: Treat tag-inserted and new tag differently ('tag-created', on_tag_created), ('tag-to-be-inserted', on_tag_to_be_inserted), ('tag-inserted', on_tag_inserted), ('tag-to-be-removed', on_tag_to_be_removed), ('tag-removed', on_tag_removed), ('tag-to-be-deleted', on_tag_to_be_deleted), )) # The page-to-be-deleted signal is a hack so we have time to ensure we know the # treepath of this indexpath - once we get page-deleted it is to late to get this def _get_iter(self, treepath): '''Convert the tree hierarchy to a PageTreeIter''' # Take care of caching and make sure we keep ref to paths long # enough while they are used in an iter. Also schedule a flush # to be execute as soon as the loop is idle again. # The cache is a dict which takes treepath tuples as keys and # has pagetreeiter objects as values, it is filled on demand. # No TreePath gtk object, treepaths are just tuples of ints # Path (0,) is the first item in the root namespace # Path (2, 4) is the 5th child of the 3rd item #~ print '>>> Lookup path', treepath if not treepath in self._cache: parent = None for i in range(1, len(treepath)+1): mytreepath = treepath[:i] if not mytreepath in self._cache: parenttreepath = treepath[:i-1] offset = mytreepath[-1] if parent is None: # The first tree level are tags #~ print '>>>> Load taglist' if offset == 0: iter = PageTreeTagIter((0,), self.untagged) self._cache.setdefault((0,), iter) else: tags = self.index.list_all_tags(offset-1, limit=20) # offset -1 because we use 0 for untagged for j, path in enumerate(tags): childtreepath = parenttreepath + (offset + j,) iter = PageTreeTagIter(childtreepath, path) self._cache.setdefault(childtreepath, iter) else: #~ print '>>>> Load pagelist for', parent, 'offset', offset if isinstance(parent, IndexTag): if parent == self.untagged: pages = self.index.list_untagged_root_pages(offset, limit=20) else: pages = self.index.list_tagged_pages(parent, offset, limit=20) else: pages = self.index.list_pages(parent, offset, limit=20) for j, path in enumerate(pages): childtreepath = parenttreepath + (offset + j,) iter = PageTreeIter(childtreepath, path) self._cache.setdefault(childtreepath, iter) try: iter = self._cache[mytreepath] except KeyError: return None else: if isinstance(iter, PageTreeTagIter): parent = iter.indextag else: parent = iter.indexpath #~ print '>>> Return', self._cache.get(treepath, None) self._schedule_flush() return self._cache.get(treepath, None) def _flush(self): self._reverse_cache = {} return PageTreeStore._flush(self) def get_treepath(self, path): if isinstance(path, IndexTag): if path == self.untagged: return (0,) else: return (self.index.get_tag_index(path) + 1,) else: return DuplicatePageTreeStore.get_treepath(self, path) def get_treepaths(self, path): '''Convert a Zim path to tree hierarchy, in general results in multiple matches ''' if isinstance(path, IndexTag): treepath = self.get_treepath(path) #~ print ">>> Found", path, '->', treepath if treepath: return (treepath,) else: return () else: assert isinstance(path, Path) if path.isroot: raise ValueError path = self.index.lookup_path(path) if path is None or not path.hasdata: return () # See if it is in cache already if path in self._reverse_cache: #~ print '>>> Return from cache', path, "->", self._reverse_cache[path] return self._reverse_cache[path] # Try getting it while populating cache paths = list(path.parents()) paths.pop() # get rid of root namespace as parent paths.insert(0, path) child = None childpath = () # partial treepath for child part treepaths = [] for p in paths: # iter from child to parents if child: pageindex = self.index.get_page_index(child) childpath = (pageindex,) + childpath # Get tags of this path tags = list(self.index.list_tags(p)) for t in tags: tagindex = self.index.get_tag_index(t) + 1 # +1 due to untagged pageindex = self.index.get_tagged_page_index(t, p) treepaths.append((tagindex, pageindex) + childpath) child = p root_page = paths[-1] try: pageindex = self.index.get_untagged_root_page_index(root_page) except ValueError: pass else: treepaths.append((0, pageindex) + childpath) treepaths.sort() #~ print ">>> Found", path, "->", treepaths self._reverse_cache[path] = treepaths self._schedule_flush() return treepaths def get_indexpath(self, treeiter): '''Returns an IndexPath for a TreeIter or None''' # Note that iter is TreeIter here, not PageTreeIter iter = self.get_user_data(treeiter) if isinstance(iter, PageTreeIter): return iter.indexpath else: return None def get_indextag(self, treeiter): '''Returns an IndexTag for a TreeIter or None''' # Note that iter is TreeIter here, not PageTreeIter iter = self.get_user_data(treeiter) if isinstance(iter, PageTreeTagIter): return iter.indextag else: return None def on_iter_has_child(self, iter): '''Returns True if the iter has children''' if isinstance(iter, PageTreeTagIter): if iter.indextag == self.untagged: return self.index.n_list_untagged_root_pages() > 0 else: return self.index.n_list_tagged_pages(iter.indextag) > 0 else: return PageTreeStore.on_iter_has_child(self, iter) def on_iter_n_children(self, iter): '''Returns the number of children in a namespace. As a special case, when iter is None the number of tags is given. ''' if iter is None: return self.index.n_list_all_tags() + 1 # +1 to include untagged elif isinstance(iter, PageTreeTagIter): if iter.indextag == self.untagged: return self.index.n_list_untagged_root_pages() else: return self.index.n_list_tagged_pages(iter.indextag) else: return PageTreeStore.on_iter_n_children(self, iter) def on_get_value(self, iter, column): '''Returns the data for a specific column''' if isinstance(iter, PageTreeTagIter): tag = iter.indextag if column == NAME_COL: return tag.name elif column == PATH_COL: return tag elif column == EMPTY_COL: return tag == self.untagged elif column == STYLE_COL: if tag == self.untagged: return pango.STYLE_ITALIC else: return pango.STYLE_NORMAL elif column == FGCOLOR_COL: if tag == self.untagged: return self.EMPTY_COLOR else: return self.NORMAL_COLOR elif column == WEIGHT_COL: return pango.WEIGHT_NORMAL # TODO: use this property to show tags in current page? elif column == N_CHILD_COL: return '' ## Due to multiple tag filtering this result is no good.. #~ if tag == self.untagged: #~ return str(self.index.n_list_untagged_root_pages()) #~ else: #~ return str(self.index.n_list_tagged_pages(tag)) else: return PageTreeStore.on_get_value(self, iter, column) class TaggedPageTreeStore(DuplicatePageTreeStore): ''' A TreeModel that lists all Zim pages in a flat list filtered by tags. Pages with associated sub-pages still show them as sub-nodes. ''' filter_depth = 1 # tag filter only applies to top level def __init__(self, index): PageTreeStore.__init__(self, index) self._reverse_cache = {} def _connect(self): def on_page_changed(o, path, signal): self._flush() treepaths = self.get_treepaths(path) for treepath in treepaths: treeiter = self.get_iter(treepath) self.emit(signal, treepath, treeiter) def on_page_deleted(o, path): treepaths = self.get_treepaths(path) for treepath in treepaths: self.emit('row-deleted', treepath) self._flush() self.connectto_all(self.index, ( ('page-inserted', on_page_changed, 'row-inserted'), ('page-updated', on_page_changed, 'row-changed'), ('page-haschildren-toggled', on_page_changed, 'row-has-child-toggled'), ('page-to-be-deleted', on_page_deleted), )) def _get_iter(self, treepath): ''' Cached conversion of the tree hierarchy to a PageTreeIter. @param treepath: A tuple of int e.g. (0,) is the first item in the root namespace. @returns: A PageTreeIter instance corresponding to the given path ''' if not treepath in self._cache: parent = None for i in xrange(1, len(treepath) + 1): leveltreepath = treepath[:i] if not leveltreepath in self._cache: parenttreepath = leveltreepath[:-1] offset = leveltreepath[-1] if parent is None: pages = self.index.list_all_pages(offset, limit = 20) else: pages = self.index.list_pages(parent, offset, limit=20) for j, path in enumerate(pages): childtreepath = parenttreepath + (offset + j,) iter = PageTreeIter(childtreepath, path) self._cache.setdefault(childtreepath, iter) if leveltreepath in self._cache: parent = self._cache[leveltreepath].indexpath else: return None self._schedule_flush() # Clear the cache when idle return self._cache.get(treepath, None) def _flush(self): self._reverse_cache = {} return PageTreeStore._flush(self) def get_treepaths(self, path): ''' Cached conversion of a Zim path to a node in the tree hierarchy, i.e. the inverse operation of _get_iter. @param path: Usually an IndexPath instance @returns: A list of tuples of ints (one page can be represented many times) ''' assert isinstance(path, Path) if path.isroot: raise ValueError # There can be no tree node for the tree root path = self.index.lookup_path(path) if path is None or not path.hasdata: return () # See if it is in cache already if path in self._reverse_cache: return self._reverse_cache[path] paths = [path] + list(path.parents())[:-1] # Zim paths for the path and all parents (except root) child = None childpath = () treepaths = [] for p in paths: if child: pageindex = self.index.get_page_index(child) childpath = (pageindex,) + childpath pageindex = self.index.get_all_pages_index(p) treepaths.append((pageindex,) + childpath) child = p treepaths.sort() self._reverse_cache[path] = treepaths self._schedule_flush() return treepaths def on_iter_n_children(self, iter): '''Returns the number of children in a namespace. As a special case, when iter is None the number of pages in the root namespace is given. ''' if iter is None: return self.index.n_list_all_pages() else: return PageTreeStore.on_iter_n_children(self, iter) class TagsPageTreeView(PageTreeView): def __init__(self, ui, model=None): PageTreeView.__init__(self, ui) self.set_name('zim-tags-pagelist') self._tag_filter = None if model: self.set_model(model) def set_model(self, model, filter=None): '''Set the model to be used''' # disconnect previous model oldmodel = self.get_model() if oldmodel: childmodel = oldmodel.get_model() childmodel.disconnect_index() # Filter is also provided here, just to make it more efficient to # set model and filter in one go without need for refilter self._set_tag_filter(filter) # set new model def func(model, iter): index = self.ui.notebook.index if self._tag_filter is None: return True # no filtering else: iter = model.get_user_data(iter) if len(iter.treepath) > model.filter_depth: return True # deeper levels are not filtered at all else: if isinstance(iter, PageTreeTagIter): # -> tag return iter.indextag in self._tag_filter[1] # show filtered tags else: # PageTreeIter -> page tags = frozenset(index.list_tags(iter.indexpath)) return tags >= self._tag_filter[0] # match all selected tags filtermodel = model.filter_new(root = None) filtermodel.set_visible_func(func) # HACK add some methods and attributes # (can not subclass gtk.TreeModelFilter because it lacks a constructor) def get_indexpath(treeiter): childiter = filtermodel.convert_iter_to_child_iter(treeiter) if childiter: return model.get_indexpath(childiter) else: return None def get_treepath(path): for treepath in model.get_treepaths(path): filtered = filtermodel.convert_child_path_to_path(treepath) if not filtered is None: return filtered else: return None def get_treepaths(path): treepaths = model.get_treepaths(path) if treepaths: treepaths = map(filtermodel.convert_child_path_to_path, treepaths) return tuple(t for t in treepaths if not t is None) else: return () filtermodel.get_indexpath = get_indexpath filtermodel.get_treepath = get_treepath filtermodel.get_treepaths = get_treepaths filtermodel.index = model.index filtermodel.select_page = model.select_page PageTreeView.set_model(self, filtermodel) def set_tag_filter(self, filter): '''Sets the tags to filter on. The filter should be a tuple of two lists of tags, or None to not do any filtering. First list of tags are the tags that we filter on, so only pages matching all these tags should be selected. Second set is a superset of the first set and includes all tags that appear in one of the selected pages. So selecting one of these tags on top of the current selection should result in a subset of the current page selection. ''' self._set_tag_filter(filter) model = self.get_model() if model: model.refilter() def _set_tag_filter(self, filter): if not filter: self._tag_filter = None else: self._tag_filter = (frozenset(filter[0]), frozenset(filter[1])) def do_drag_data_get(self, dragcontext, selectiondata, info, time): assert selectiondata.target == INTERNAL_PAGELIST_TARGET_NAME model, iter = self.get_selection().get_selected() path = model.get_indexpath(iter) if isinstance(path, IndexTag): link = '@' + path.name else: link = path.name logger.debug('Drag data requested, we have internal tag/path "%s"', link) data = pack_urilist((link,)) selectiondata.set(INTERNAL_PAGELIST_TARGET_NAME, 8, data) # Need to register classes defining gobject signals gobject.type_register(TagsPageTreeView) class TagCloudItem(gtk.ToggleButton): '''Button item used on the tag cloud widget''' def __init__(self, indextag): gtk.ToggleButton.__init__(self, indextag.name, use_underline=False) self.set_relief(gtk.RELIEF_NONE) self.indextag = indextag def update_label(self): # Make button text bold when active label = self.get_child() if self.get_active(): label.set_markup(''+label.get_text()+'') else: label.set_text(label.get_text()) # get_text() gives string without markup self.connect_after('toggled', update_label) class TagCloudWidget(ConnectorMixin, gtk.TextView): '''Text-view based list of tags, where each tag is represented by a button inserted as a child in the textview. @signal: C{selection-changed ()}: emitted when tag selection changes @signal: C{sorting-changed ()}: emitted when tag sorting changes ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'selection-changed': (gobject.SIGNAL_RUN_LAST, None, ()), 'sorting-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), } def __init__(self, index=None, sorting='score'): gtk.TextView.__init__(self, None) # Create TextBuffer implicitly self.set_name('zim-tags-tagcloud') self.index = None self.set_editable(False) self.set_cursor_visible(False) self.set_wrap_mode(gtk.WRAP_CHAR) self.set_sorting(sorting) if index: self.set_index(index) def set_index(self, index): '''Connect to an Index object''' self.disconnect_index() # just to be sure self.index = index self.connectto_all(self.index, ( ('tag-created', self._update), ('tag-deleted', self._update), )) self._update() def set_sorting(self, sorting): self._alphabetically = (sorting == 'alpha') def disconnect_index(self): '''Stop the model from listening to the index. Used to unhook the model before reloading the index. ''' self.disconnect_from(self.index) self._clear() self.index = None def get_tag_filter(self): '''Returns a tuple with two lists of tags; the first gives all tags that are selected, the second gives all tags shown in the cloud. By definition the first list is a subset of the second. If no tags are selected returns None instead. ''' selected = [] filtered = [] for button in self.get_children(): filtered.append(button.indextag) if button.get_active(): selected.append(button.indextag) if selected: return (selected, filtered) else: return None def _clear(self): '''Clears the cloud''' self.foreach(lambda b: self.remove(b)) buffer = self.get_buffer() buffer.delete(*buffer.get_bounds()) def _update(self, *a): '''Update the cloud to show only tags that share a set of pages with the selected tags.''' selected = [b.indextag for b in self.get_children() if b.get_active()] self._clear() buffer = self.get_buffer() if selected: tags = self.index.list_intersecting_tags(selected) else: tags = [] if not tags: tags = self.index.list_all_tags_by_score() # Can be we have a "selected", but the selected tags have # disappeared and thus list_intersecting returns empty if self._alphabetically: tags = sorted(tags, key=lambda t: t.name) # else leave sorted by score for tag in tags: iter = buffer.get_end_iter() anchor = buffer.create_child_anchor(iter) button = TagCloudItem(tag) button.set_active(tag in selected) button.connect("toggled", lambda b: self._update()) self.add_child_at_anchor(button, anchor) self.show_all() self.emit('selection-changed') def do_populate_popup(self, menu): populate_popup_add_separator(menu, prepend=True) item = gtk.CheckMenuItem(_('Sort alphabetically')) # T: Context menu item for tag cloud item.set_active(self._alphabetically) item.connect('toggled', self._switch_sorting) item.show_all() menu.prepend(item) def _switch_sorting(self, widget, *a): self._alphabetically = widget.get_active() self._update() if self._alphabetically: self.emit('sorting-changed', 'alpha') else: self.emit('sorting-changed', 'score') # Need to register classes defining gobject signals gobject.type_register(TagCloudWidget) class TagsPluginWidget(ConnectorMixin, gtk.VPaned): '''Widget combining a tag cloud and a tag based page treeview''' def __init__(self, plugin): gtk.VPaned.__init__(self) self.plugin = plugin self.plugin.uistate.setdefault('vpane_pos', 150) self.plugin.uistate.setdefault('treeview', 'tagged', set(['tagged', 'tags'])) self.plugin.uistate.setdefault('tagcloud_sorting', 'score', set(['alpha', 'score'])) self.tagcloud = TagCloudWidget(sorting=self.plugin.uistate['tagcloud_sorting']) self.pack1(ScrolledWindow(self.tagcloud), shrink=False) self.treeview = TagsPageTreeView(self.plugin.ui) self._treeview_mode = (None, None) self.pack2(ScrolledWindow(self.treeview), shrink=False) self.treeview.connect('populate-popup', self.on_populate_popup) self.tagcloud.connect('selection-changed', self.on_cloud_selection_changed) self.tagcloud.connect('sorting-changed', self.on_cloud_sortin_changed) self.connectto_all(self.plugin.ui, ( 'open-page', ('start-index-update', lambda o: self.disconnect_model()), ('end-index-update', lambda o: self.reload_model()), )) def finalize_notebook(self, notebook): self.tagcloud.set_sorting(self.plugin.uistate['tagcloud_sorting']) self.set_position(self.plugin.uistate['vpane_pos']) def update_uistate(*a): self.plugin.uistate['vpane_pos'] = self.get_position() self.connect('notify::position', update_uistate) self.reload_model() def on_open_page(self, ui, page, path): self.treeview.select_page(path) def toggle_treeview(self): '''Toggle the treeview type in the widget''' if self.plugin.uistate['treeview'] == 'tagged': self.plugin.uistate['treeview'] = 'tags' else: self.plugin.uistate['treeview'] = 'tagged' self.reload_model() def on_populate_popup(self, treeview, menu): # Add a popup menu item to switch the treeview mode populate_popup_add_separator(menu, prepend=True) item = gtk.CheckMenuItem(_('Sort pages by tags')) # T: menu option item.set_active(self.plugin.uistate['treeview'] == 'tags') item.connect_object('toggled', self.__class__.toggle_treeview, self) menu.prepend(item) menu.show_all() def on_cloud_selection_changed(self, cloud): filter = cloud.get_tag_filter() type, was_filtered = self._treeview_mode is_filtered = (filter is not None) if type == 'tagged' and was_filtered != is_filtered: # Switch between tag view and normal index or vice versa self._reload_model(type, filter) else: self.treeview.set_tag_filter(filter) def on_cloud_sortin_changed(self, cloud, sorting): self.plugin.uistate['tagcloud_sorting'] = sorting def disconnect_model(self): '''Stop the model from listening to the index. Used to unhook the model before reloading the index. Typically should be followed by reload_model(). ''' self.treeview.disconnect_index() self.tagcloud.disconnect_index() def reload_model(self): '''Re-initialize the treeview model. This is called when reloading the index to get rid of out-of-sync model errors without need to close the app first. ''' assert self.plugin.uistate['treeview'] in ('tagged', 'tags') if self.tagcloud.index is None: self.tagcloud.set_index(self.plugin.ui.notebook.index) type = self.plugin.uistate['treeview'] filter = self.tagcloud.get_tag_filter() self._reload_model(type, filter) def _reload_model(self, type, filter): index = self.plugin.ui.notebook.index # FIXME clean up law of D if type == 'tagged': if filter is None: model = DuplicatePageTreeStore(index) # show the normal index in this case else: model = TaggedPageTreeStore(index) elif type == 'tags': model = TagsPageTreeStore(index) else: assert False is_filtered = (filter is not None) self._treeview_mode = (type, is_filtered) self.treeview.set_model(model, filter) if self.plugin.ui.page: model.select_page(self.plugin.ui.page) class TagsPlugin(PluginClass): plugin_info = { 'name': _('Tags'), # T: plugin name 'description': _('''\ This plugin provides a page index filtered by means of selecting tags in a cloud. '''), # T: plugin description 'author': 'Fabian Moser', 'help': 'Plugins:Tags', } plugin_preferences = ( # key, type, label, default ('pane', 'choice', _('Position in the window'), LEFT_PANE, PANE_POSITIONS), # T: option for plugin preferences ) def __init__(self, ui): PluginClass.__init__(self, ui) self.sidepane_widget = None def initialize_ui(self, ui): if self.ui.ui_type == 'gtk': self.connect_embedded_widget() def finalize_notebook(self, notebook): if self.ui.ui_type == 'gtk' and self.sidepane_widget: self.sidepane_widget.finalize_notebook(notebook) def destroy(self): self.disconnect_embedded_widget() PluginClass.destroy(self) def do_preferences_changed(self): if self.ui.ui_type == 'gtk': self.connect_embedded_widget() # refresh pane position def connect_embedded_widget(self): if self.sidepane_widget is None: self.sidepane_widget = TagsPluginWidget(self) else: self.ui.mainwindow.remove(self.sidepane_widget) self.ui.mainwindow.add_tab(_('Tags'), self.sidepane_widget, self.preferences['pane']) self.sidepane_widget.show_all() def disconnect_embedded_widget(self): if not self.sidepane_widget is None: self.ui.mainwindow.remove(self.sidepane_widget) self.sidepane_widget.disconnect_all() self.sidepane_widget = None zim-0.60/zim/plugins/linkmap/0000775000175000017500000000000012140000463016011 5ustar jaapjaap00000000000000zim-0.60/zim/plugins/linkmap/__init__.py0000644000175000017500000000566112132472704020144 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Plugin showing a map of links between pages based on GraphViz''' from zim.plugins import PluginClass from zim.index import LINK_DIR_BOTH from zim.applications import Application from zim.fs import Dir class LinkMapPlugin(PluginClass): plugin_info = { 'name': _('Link Map'), # T: plugin name 'description': _('''\ This plugin provides a dialog with a graphical representation of the linking structure of the notebook. It can be used as a kind of "mind map" showing how pages relate. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Link Map', } def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': import gui self.gui = gui.GtkLinkMap(self.ui) else: self.gui = False @classmethod def check_dependencies(klass): has_graphviz = Application(('fdp',)).tryexec() return has_graphviz, [('GraphViz', has_graphviz, True)] class LinkMap(object): def __init__(self, notebook, path, depth=2): self.notebook = notebook self.path = path self.depth = depth def _all_links(self): for page in self.notebook.index.walk(): for link in self.notebook.index.list_links(page): yield link def _links(self, path, depth, seen=None): if seen is None: seen = set() for link in self.notebook.index.list_links(path, direction=LINK_DIR_BOTH): key = (link.source.name, link.href.name) if not key in seen: yield link seen.add(key) if link.source == path: other = link.href else: other = link.source if depth > 0: for link in self._links(other, depth-1, seen): yield link def get_linkmap(self, format=None): dotcode = self.get_dotcode() # TODO pass format to dot -Tformat def get_dotcode(self): dotcode = [ 'digraph LINKS {', ' size="6,6";', #~ ' node [shape=box, style="rounded,filled", color="#204a87", fillcolor="#729fcf"];', ' node [shape=note, style="filled", color="#204a87", fillcolor="#729fcf"];', ' "%s" [color="#4e9a06", fillcolor="#8ae234", URL="%s"]' % (self.path.name, self.path.name), # special node ] seen = set() seen.add(self.path.name) for link in self._links(self.path, self.depth): for name in (link.source.name, link.href.name): if not name in seen: dotcode.append(' "%s" [URL="%s"];' % (name, name)) seen.add(name) dotcode.append( ' "%s" -> "%s";' % (link.source.name, link.href.name)) dotcode.append('}') #~ print '\n'.join(dotcode)+'\n' return '\n'.join(dotcode)+'\n' # And a bit of debug code... if __name__ == '__main__': import sys import zim import zim.notebook import gui notebook = zim.notebook.get_notebook(Dir(sys.argv[1])) path = notebook.resolve_path(sys.argv[2]) ui = zim.NotebookInterface(notebook) linkmap = LinkMap(notebook, path) dialog = gui.LinkMapDialog(ui, linkmap) dialog.show_all() dialog.run() zim-0.60/zim/plugins/linkmap/gui.py0000644000175000017500000000414711755377020017174 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import gtk from zim.inc import xdot from zim.notebook import Path from zim.gui.widgets import ui_environment, Dialog, IconButton from zim.plugins.linkmap import LinkMap ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('show_linkmap', 'zim-linkmap', _('Show Link Map'), None, _('Show Link Map'), True), # T: Menu item ) class GtkLinkMap(): def __init__(self, ui): self.ui = ui self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) def show_linkmap(self): linkmap = LinkMap(self.ui.notebook, self.ui.page) dialog = LinkMapDialog(self.ui, linkmap) dialog.show_all() class LinkMapDialog(Dialog): def __init__(self, ui, linkmap): if ui_environment['platform'] == 'maemo': defaultsize = (800, 480) # The dialog hides the main window, so use all available screen anyway # setting defaultsize doesn't work because maemo makes the dialog # window as small as possible to fit the window's internal widgets else: defaultsize = (400, 400) Dialog.__init__(self, ui, 'LinkMap', defaultwindowsize=defaultsize, buttons=gtk.BUTTONS_CLOSE) self.linkmap = linkmap hbox = gtk.HBox(spacing=5) self.vbox.add(hbox) self.xdotview = xdot.DotWidget() self.xdotview.set_filter('fdp') self.xdotview.set_dotcode(linkmap.get_dotcode()) self.xdotview.connect('clicked', self.on_node_clicked) hbox.add(self.xdotview) vbox = gtk.VBox() hbox.pack_start(vbox, False) for stock, method in ( (gtk.STOCK_ZOOM_IN, self.xdotview.on_zoom_in ), (gtk.STOCK_ZOOM_OUT, self.xdotview.on_zoom_out), (gtk.STOCK_ZOOM_FIT, self.xdotview.on_zoom_fit), (gtk.STOCK_ZOOM_100, self.xdotview.on_zoom_100), ): button = IconButton(stock) button.connect('clicked', method) vbox.pack_start(button, False) def on_node_clicked(self, widget, name, event): self.ui.open_page(Path(name)) zim-0.60/zim/plugins/diagrameditor.py0000644000175000017500000000575512132472704017571 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import gtk from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.applications import Application, ApplicationError from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences dotcmd = ('dot', '-Tpng', '-o') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_diagram', None, _('Dia_gram...'), '', _('Insert diagram'), False), # T: menu item for insert diagram plugin ) class InsertDiagramPlugin(PluginClass): plugin_info = { 'name': _('Insert Diagram'), # T: plugin name 'description': _('''\ This plugin provides a diagram editor for zim based on GraphViz. This is a core plugin shipping with zim. '''), # T: plugin description 'help': 'Plugins:Diagram Editor', 'author': 'Jaap Karssenberg', } @classmethod def check_dependencies(klass): has_dotcmd = Application(dotcmd).tryexec() return has_dotcmd, [("GraphViz", has_dotcmd, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('diagram') def insert_diagram(self): dialog = InsertDiagramDialog.unique(self, self.ui) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertDiagramDialog(self.ui, image=image) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit Diagram')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertDiagramDialog(ImageGeneratorDialog): def __init__(self, ui, image=None): generator = DiagramGenerator() ImageGeneratorDialog.__init__(self, ui, _('Insert Diagram'), # T: dialog title generator, image, help=':Plugins:Diagram Editor' ) class DiagramGenerator(ImageGeneratorClass): uses_log_file = False type = 'diagram' scriptname = 'diagram.dot' imagename = 'diagram.png' def __init__(self): self.dotfile = TmpFile(self.scriptname) self.dotfile.touch() self.pngfile = File(self.dotfile.path[:-4] + '.png') # len('.dot') == 4 def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) # Write to tmp file self.dotfile.writelines(text) # Call GraphViz try: dot = Application(dotcmd) dot.run((self.pngfile, self.dotfile)) except ApplicationError: return None, None # Sorry, no log else: return self.pngfile, None def cleanup(self): self.dotfile.remove() self.pngfile.remove() zim-0.60/zim/plugins/gnuplot_ploteditor.py0000644000175000017500000001003112132472704020672 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # # gnuplot_ploteditor.py # # This is a plugin for Zim, which allows inserting Gnuplot scripts to # have Zim generate plots from them. # # Author: Alessandro Magni # Date: 2010-10-12 # Copyright (c) 2010, released under the GNU GPL v2 or higher # # import gtk import glob from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.templates import GenericTemplate from zim.applications import Application, ApplicationError from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences gnuplot_cmd = ('gnuplot',) ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_gnuplot', None, _('Gnuplot...'), '', '', False), # T: menu item for insert plot plugin ) class InsertGnuplotPlugin(PluginClass): plugin_info = { 'name': _('Insert Gnuplot'), # T: plugin name 'description': _('''\ This plugin provides a plot editor for zim based on Gnuplot. '''), # T: plugin description 'help': 'Plugins:Gnuplot Editor', 'author': 'Alessandro Magni', } @classmethod def check_dependencies(klass): has_gnuplot = Application(gnuplot_cmd).tryexec() return has_gnuplot, [('Gnuplot', has_gnuplot, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('gnuplot') def insert_gnuplot(self): dialog = InsertGnuplotDialog.unique(self, self.ui) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertGnuplotDialog(self.ui, image=image) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit Gnuplot')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertGnuplotDialog(ImageGeneratorDialog): def __init__(self, ui, image=None): attachment_folder = ui.notebook.get_attachments_dir(ui.page) generator = GnuplotGenerator(attachment_folder=attachment_folder) ImageGeneratorDialog.__init__(self, ui, _('Gnuplot'), # T: dialog title generator, image, help=':Plugins:Gnuplot Editor' ) class GnuplotGenerator(ImageGeneratorClass): uses_log_file = False type = 'gnuplot' scriptname = 'gnuplot.gnu' imagename = 'gnuplot.png' def __init__(self, attachment_folder=None): file = data_file('templates/plugins/gnuploteditor.gnu') assert file, 'BUG: could not find templates/plugins/gnuploteditor.gnu' self.template = GenericTemplate(file.readlines(), name=file) self.attachment_folder = attachment_folder self.plotscriptfile = TmpFile(self.scriptname) def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) plotscriptfile = self.plotscriptfile pngfile = File(plotscriptfile.path[:-4] + '.png') plot_script = "".join(text) template_vars = { # they go in the template 'gnuplot_script': plot_script, 'png_fname': pngfile.path, } if self.attachment_folder and self.attachment_folder.exists(): template_vars['attachment_folder'] = self.attachment_folder.path # Write to tmp file using the template for the header / footer plotscriptfile.writelines( self.template.process(template_vars) ) #print '>>>%s<<<' % plotscriptfile.read() # Call Gnuplot try: gnu_gp = Application(gnuplot_cmd) gnu_gp.run(args=( plotscriptfile.basename, ), cwd=plotscriptfile.dir) # you call it as % gnuplot output.plt except ApplicationError: return None, None # Sorry - no log else: return pngfile, None def cleanup(self): path = self.plotscriptfile.path for path in glob.glob(path[:-4]+'.*'): File(path).remove() zim-0.60/zim/plugins/inlinecalculator.py0000644000175000017500000002060612032036373020273 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Jaap Karssenberg # # Inspired by and partially based on code from clac.py, # Which is copyright 2009 Mark Borgerding and licensed under the GPL version 3 from __future__ import with_statement from __future__ import division # We are doing math in this module ... import logging import re import math import cmath from zim.plugins import PluginClass from zim.errors import Error logger = logging.getLogger('zim.plugins.insertsymbol') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('eval_math', None, _('Evaluate _Math'), '', '', False), # T: menu item ) # helper functions def dip(x): 'demote, if possible, a complex to scalar' if type(x) == complex and x.imag == 0: return x.real else: return x def which_call(x, mathfunc, cmathfunc, allowNegative=True): x=dip(x) if type(x) == complex or (allowNegative == False and x<0): return cmathfunc(x) else: return mathfunc(x) # math functions defined here def degrees(x): return x*180/math.pi def radians(x): return x*math.pi/180 def log(x,b=math.e): 'log(x[, base]) -> the logarithm of x to the given base.\nIf the base not specified, returns the natural logarithm (base e) of x.' if type(x) == complex or x<0: return dip( cmath.log(x) / cmath.log(b) ) else: return math.log(x)/math.log(b) def real(x): 'return just the real portion' if type(x) == complex: return x.real else: return x def imag(x): 'return just the imaginary portion' if type(x) == complex: return x.imag else: return 0 def sign(x): 'returns -1,0,1 for negative,zero,positive numbers' if x == 0: return 0 elif x > 0: return 1 else: return -1 def log2(x): 'logarithm base 2' return log(x,2) def gcd(x,y): 'greatest common denominator' while x>0: (x,y) = (y%x,x) # Guido showed me this one on the geek cruise return y def lcm(x,y): 'least common multiple' return x*y/gcd(x,y) def phase(z): 'phase of a complex in radians' z=cpx(z) return math.atan2( z.imag , z.real ) def cpx(x): 'convert a number or tuple to a complex' if type(x) == tuple: return complex( x[0] , x[1] ) else: return complex(x) def conj( x ): 'complex conjugate' x = cpx( x ) return complex( x.real , -x.imag ) def complexify(x,func ): 'call func on the real and imaginary portions, creating a complex from the respective results' if type(x) == complex and x.imag != 0: return dip( complex( func(x.real) , func(x.imag) ) ) else: return func(x) # overwrite the built-in math functions that don't handle complex def round(x): 'nearest integer' if type(x) == complex: return complexify( x , round ) else: return math.floor(x+.5) def floor(x): 'round towards negative infinity' return complexify( x , math.floor ) def ceil(x): 'round towards positive infinity' return complexify( x , math.ceil ) # functions and constants available within the safe eval construct GLOBALS = { '__builtins__': None, # Don't allow open() etc. # builtins we want to keep 'abs': abs, 'ord': ord, 'chr': unichr, 'hex': hex, 'oct': oct, # direct imports 'e': math.e, 'pi': math.pi, 'atan2': math.atan2, 'fmod': math.fmod, 'frexp': math.frexp, 'hypot': math.hypot, 'ldexp': math.ldexp, 'modf': math.modf, # other nice-to-have constants 'j': cmath.sqrt(-1), # marshall between the math and cmath functions automatically 'acos': lambda x: which_call(x,math.acos,cmath.acos), 'asin': lambda x: which_call(x,math.asin,cmath.asin), 'atan': lambda x: which_call(x,math.atan,cmath.atan), 'cos': lambda x: which_call(x,math.cos,cmath.cos), 'cosh': lambda x: which_call(x,math.cosh,cmath.cosh), 'sin': lambda x: which_call(x,math.sin,cmath.sin), 'sinh': lambda x: which_call(x,math.sinh,cmath.sinh), 'tan': lambda x: which_call(x,math.tan,cmath.tan), 'tanh': lambda x: which_call(x,math.tanh,cmath.tanh), 'exp': lambda x: which_call(x,math.exp,cmath.exp), 'log10': lambda x: which_call(x,math.log10,cmath.log10,False), 'sqrt': lambda x: which_call(x,math.sqrt,cmath.sqrt,False), # functions defined here 'degrees': degrees, 'radians': radians, 'log': log, 'real': real, 'imag': imag, 'sign': sign, 'log2': log2, 'gcd': gcd, 'lcm': lcm, 'phase': phase, 'conj': conj, 'round': round, 'floor': floor, 'ceil': ceil, # synonyms 'mag': abs, 'angle': phase, } class ExpressionError(Error): description = _( 'The inline calculator plugin was not able\n' 'to evaluate the expression at the cursor.' ) # T: error description class InlineCalculatorPlugin(PluginClass): plugin_info = { 'name': _('Inline Calculator'), # T: plugin name 'description': _('''\ This plugin allows you to quickly evaluate simple mathematical expressions in zim. This is a core plugin shipping with zim. '''), # T: plugin description 'author': 'Jaap Karssenberg', 'help': 'Plugins:Inline Calculator', } #~ plugin_preferences = ( # key, type, label, default #~ ) _multiline_re = re.compile('--+\s+[+-]') # for multiline summation with "--- +" and similar def initialize_ui(self, ui): if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) def eval_math(self): '''Action called by the menu item or key binding, will look at the cursor for an expression to evaluate. ''' buffer = self.ui.mainwindow.pageview.view.get_buffer() # FIXME - way to long chain of objects here # FIXME: what do we do for selections ? cursor = buffer.get_iter_at_mark(buffer.get_insert()) start, end = buffer.get_line_bounds(cursor.get_line()) line = buffer.get_text(start, end) if not line or line.isspace(): # Empty line, look at previous line if cursor.get_line() > 1: start, end = buffer.get_line_bounds(cursor.get_line() - 1) cursor = end.copy() cursor.backward_char() line = buffer.get_text(start, end) else: return # silent fail if self._multiline_re.match(line): # Search for start of block - iterate back to empty line lineno = cursor.get_line() while lineno > 1: mystart, myend = buffer.get_line_bounds(lineno) myline = buffer.get_text(mystart, myend) if not myline or myline.isspace(): break else: start = mystart lineno -= 1 else: # One line expression, just pass it on # FIXME skip forward past next word if any if last char is '=' end = cursor orig = buffer.get_text(start, end) new = self.process_text(orig) with buffer.user_action: buffer.delete(start, end) buffer.insert_at_cursor(new) def process_text(self, text): '''Takes a piece of text and parses it for expressions to evaluate. Returns the text with result inserted or replaced. Will raise an exception on errors. ''' # This method is separated from eval_math() for easy testing if '\n' in text: return self._process_multiline(text) else: return self._process_line(text) def _process_line(self, line): # Check for non-math prefix prefix = '' if ':' in line: i = line.rindex(':') + 1 prefix = line[:i] line = line[i:] # Allow for chaining like "1 + 2 = 3 + 0.5 = 3.5" etc. if line.count('=') > 1: parts = line.split('=') prefix += '='.join(parts[:-2]) + '=' line = '='.join(parts[-2:]) # Check for whitespace postfix after previous answer postfix = '' stripped = line.rstrip() if '=' in line \ and stripped != line and not stripped.endswith('='): i = len(line) - len(stripped) postfix = line[-i:] line = stripped # Strip previous answer and '=' if '=' in line: i = line.index('=') line = line[:i] result = self.safe_eval(line) return prefix + line + '= ' + str(result) + postfix def _process_multiline(self, text): lines = text.splitlines() for i, line in enumerate(lines): if self._multiline_re.match(line): operator = line.strip()[-1] break else: raise ExpressionError, _('Could not parse expression') # T: error message sep = ' %s ' % operator expression = sep.join('(%s)' % l for l in lines[:i]) result = self.safe_eval(expression) lines = lines[:i+1] + [str(result)] return '\n'.join(lines) + '\n' def safe_eval(self, expression): '''Safe evaluation of a python expression''' try: return eval(expression, GLOBALS, {}) except Exception, error: msg = '%s: %s' % (error.__class__.__name__, error) raise ExpressionError, msg zim-0.60/zim/plugins/ditaaeditor.py0000664000175000017500000000616512132472704017245 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # # ditaaeditor.py # # This is a plugin for Zim, which allows coverting ASCII art into proper bitmap # graphics. # # # Author: Yao-Po Wang # Date: 2012-03-11 # Copyright (c) 2012, released under the GNU GPL v2 or higher # # import gtk from zim.fs import File, TmpFile from zim.plugins import PluginClass from zim.config import data_file from zim.applications import Application, ApplicationError from zim.gui.imagegeneratordialog import ImageGeneratorClass, ImageGeneratorDialog from zim.gui.widgets import populate_popup_add_separator # TODO put these commands in preferences dotcmd = ('ditaa') ui_xml = ''' ''' ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('insert_ditaa', None, _('Ditaa...'), '', _('Insert ditaa'), False), # T: menu item for insert diagram plugin ) class InsertDitaaPlugin(PluginClass): plugin_info = { 'name': _('Insert Ditaa'), # T: plugin name 'description': _('''\ This plugin provides a diagram editor for zim based on Ditaa. This is a core plugin shipping with zim. '''), # T: plugin description 'help': 'Plugins:Ditaa Editor', 'author': 'Yao-Po Wang', } @classmethod def check_dependencies(klass): has_dotcmd = Application(dotcmd).tryexec() return has_dotcmd, [("Ditaa", has_dotcmd, True)] def __init__(self, ui): PluginClass.__init__(self, ui) if self.ui.ui_type == 'gtk': self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml, self) self.register_image_generator_plugin('ditaa') def insert_ditaa(self): dialog = InsertDitaaDialog.unique(self, self.ui) dialog.run() def edit_object(self, buffer, iter, image): dialog = InsertDitaaDialog(self.ui, image=image) dialog.run() def do_populate_popup(self, menu, buffer, iter, image): populate_popup_add_separator(menu, prepend=True) item = gtk.MenuItem(_('_Edit Ditaa')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(buffer, iter, image)) menu.prepend(item) class InsertDitaaDialog(ImageGeneratorDialog): def __init__(self, ui, image=None): generator = DitaaGenerator() ImageGeneratorDialog.__init__(self, ui, _('Insert Ditaa'), # T: dialog title generator, image, help=':Plugins:Ditaa Editor' ) class DitaaGenerator(ImageGeneratorClass): uses_log_file = False type = 'ditaa' scriptname = 'ditaa.dia' imagename = 'ditaa.png' def __init__(self): self.dotfile = TmpFile(self.scriptname) self.dotfile.touch() self.pngfile = File(self.dotfile.path[:-4] + '.png') # len('.dot') == 4 def generate_image(self, text): if isinstance(text, basestring): text = text.splitlines(True) # Write to tmp file self.dotfile.writelines(text) # Call GraphViz try: dot = Application(dotcmd) dot.run((self.dotfile, '-o', self.pngfile)) except ApplicationError: return None, None # Sorry, no log else: return self.pngfile, None def cleanup(self): self.dotfile.remove() self.pngfile.remove() zim-0.60/zim/search.py0000664000175000017500000004163012134043547014535 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg ''' This module contains the logic for searching in a notebook. Supported operators: - "NOT", "not" and "-" - "AND", "and", "+" and "&&" - "OR", "or" and "||" Order of precedence: AND, OR, NOT so "foo AND NOT bar OR baz" means AND(foo, OR(NOT(bar), baz)) Supported keywords: - C{Content} - C{Name} - C{Namespace}: alias for Name XXX or Name: XXX:* - C{Links}: forward - alias for linksfrom - C{LinksFrom}: forward - C{LinksTo}: backward - C{ContentOrName}: the default, like Name: *X* or Content: X - C{Tag}: look for a single tag For the Content field we need to request the actual page contents, all other fields we get from the index and are more efficient to query. For link keywords only a '*' at the right side is allowed For the name keyword a '*' is allowed on both sides For content '*' can occur on both sides, but does not match whitespace ''' # TODO keyword for deadlinks, keyword for pages with no content # Queries are parsed into trees of groups of search terms # Terms have a keyword and a string to look for # When we start searching we walks through this tree and assemble the # results. In theory we fully support nested groups, but the current # query syntax doesn't allow them. So for now trees will only consist # of a toplevel AND group possibly with nested OR groups one level # below it. import re import logging from zim.parsing import split_quoted_strings, unescape_quoted_string, Re from zim.notebook import Path, PageNameError from zim.index import LINK_DIR_BACKWARD, LINK_DIR_FORWARD logger = logging.getLogger('zim.search') OPERATOR_OR = 1 OPERATOR_AND = 2 OPERATOR_NOT = 3 operators = { 'or': OPERATOR_OR, '||': OPERATOR_OR, 'and': OPERATOR_AND, '&&': OPERATOR_AND, '+': OPERATOR_AND, '-': OPERATOR_NOT, 'not': OPERATOR_NOT, } KEYWORDS = ( 'content', 'name', 'namespace', 'contentorname', 'links', 'linksfrom', 'linksto', 'tag' ) keyword_re = Re('('+'|'.join(KEYWORDS)+'):(.*)', re.I) operators_re = Re(r'^(\|\||\&\&|\+|\-)') tag_re = Re(r'^\@(\w+)$', re.U) class QueryTerm(object): '''Wrapper for a single term in a query. Consists of a keyword, a string and a flag for inverse (NOT operator). ''' def __init__(self, keyword, string, inverse=False): self.keyword = keyword self.string = string self.inverse = inverse def __eq__(self, other): if isinstance(other, QueryTerm): return self.keyword == other.keyword \ and self.string == other.string \ and self.inverse == other.inverse else: return False def __repr__(self): if self.inverse: return '' % (self.keyword, self.string) else: return '<%s: "%s">' % (self.keyword, self.string) class QueryGroup(list): '''Wrapper for a sub group of a query. Just a list of QueryTerms with an associated operator (either AND or OR). ''' def __init__(self, operator, terms=None): assert operator in (OPERATOR_AND, OPERATOR_OR) self.operator = operator if terms: self[:] = terms class Query(object): '''This class wraps a query as typed by the user. It parses the query into a tree of QueryGroup and QueryTerm objects. The 'root' attribute contains the top of the tree, while the 'string' attribute contains the original query. ''' def __init__(self, string): self.string = string self.root = self._parse_query(string) def _parse_query(self, string): # First do a raw tokenizer words = split_quoted_strings(string, unescape=False, strict=False) tokens = [] while words: if operators_re.match(words[0]): w = operators_re[0] words[0] = words[0][len(w):] else: w = words.pop(0) if w.lower() in operators: tokens.append(operators[w.lower()]) elif keyword_re.match(w): keyword = keyword_re[1].lower() string = keyword_re[2] or words.pop(0) string = unescape_quoted_string(string) if keyword == 'links': keyword = 'linksfrom' tokens.append(QueryTerm(keyword, string)) else: w = unescape_quoted_string(w) if tag_re.match(w): tokens.append(QueryTerm('tag', w[1:])) else: tokens.append(QueryTerm('contentorname', w)) # default keyword #~ print tokens # Then parse NOT operator out tokens, mytokens = [], tokens while mytokens: token = mytokens.pop(0) if token == OPERATOR_NOT: if mytokens and isinstance(mytokens[0], QueryTerm): token = mytokens.pop(0) token.inverse = True tokens.append(token) else: pass # ignore else: tokens.append(token) #~ print tokens # Finally group in AND and OR groups root = QueryGroup(OPERATOR_AND) while tokens: token = tokens.pop(0) if isinstance(token, QueryTerm): if tokens and tokens[0] == OPERATOR_OR: # collect terms joined by OR assert isinstance(token, QueryTerm) group = QueryGroup(OPERATOR_OR) group.append(token) while len(tokens) >= 2 and tokens[0] == OPERATOR_OR \ and isinstance(tokens[1], QueryTerm): tokens.pop(0) group.append(tokens.pop(0)) root.append(group) else: # simple term in AND group root.append(token) else: assert token in (OPERATOR_AND, OPERATOR_OR) pass # AND is the default, OR should not appear here, ignore silently #~ print root return root @property def simple_match(self): '''Used to determine a simple matching string to be used in the find method in the pageview. Used by L{SearchDialog} to set the L{PageView} find string to highligh matches in the page. ''' # TODO make this return a list with positive terms for content # if find supports an OR operator, highlight them all if len(self.root) == 1 and isinstance(self.root[0], QueryTerm) \ and self.root[0].keyword in ('content', 'contentorname'): return self.root[0].string else: return None class PageSelection(set): '''This class is just a container of path objects''' pass class SearchSelection(PageSelection): '''This class wraps a set of Page or ResultPath objects which result from processing a search query. The attribute 'scores' gives a dict with an arbitrary integer for each path in this set to rank how well they match the query. ''' def __init__(self, notebook): self.notebook = notebook self.cancelled = False self.query = None self.scores = {} def search(self, query, selection=None, callback=None): '''Populate this SearchSelection with results for a query. This method flushes any previous results in this set. @param query: a L{Query} object @param selection: a prior selection to search within, will result in a sub-set @param callback: a function to call in between steps in the search. It is called as:: callback(selection, path) Where: - C{selection} is a L{SearchSelection} with partial results (if any) - C{path} is the C{Path} for the last searched path or C{None} If the callback returns C{False} the search is cancelled. ''' # Clear state self.cancelled = False self.query = query self.clear() self.scores = {} # Actual search self.update(self._process_group(query.root, selection, callback)) # Clean up results scored = set(self.scores.keys()) for path in scored - self: self.scores.pop(path) def _process_group(self, group, scope=None, callback=None): # This method processes all search terms in a QueryGroup # it is recursive for nested QueryGroup objects and calls # _process_from_index and _process_content to handle # QueryTerms in the group. It takes care of combining the # results from various terms and calling the callback # function when possible # Special case to optimize for simple OR query to give callback results if len(group) == 1 and isinstance(group[0], QueryGroup): group = group[0] # For optimization we sort the terms in the group based on how # easy we can get them. Anything that needs content is last. indexterms = [] subgroups = [] contentterms = [] for term in group: if isinstance(term, QueryGroup): subgroups.append(term) else: assert isinstance(term, QueryTerm) if term.keyword in ('content', 'contentorname'): contentterms.append(term) else: indexterms.append(term) # Decide what operator to use if group.operator == OPERATOR_AND: op_func = self._and_operator else: op_func = self._or_operator # First process index terms - no callback in between - this is fast results = None for term in indexterms: results, scope = op_func(results, scope, self._process_from_index(term, scope) ) if callback: if group.operator == OPERATOR_AND: cont = callback(None, None) # do not transmit results yet else: cont = callback(results, None) if not cont: self.cancelled = True return results or set() # Next we process subgroups - recursing - callback after each group def callbackwrapper(results, path): # Don't update results from subgroup match, but do allow cancel if callback: return callback(None, path) else: return True for term in subgroups: results, scope = op_func(results, scope, self._process_group(term, scope, callbackwrapper) ) if callback: if group.operator == OPERATOR_AND: cont = callback(None, None) # do not transmit results yet else: cont = callback(results, None) if not cont: self.cancelled = True return results or set() # Optimization of the contentorname items to quickly show results for name for term in contentterms: if scope and id(scope) == id(results): scope = scope.copy() myscope = scope # local copy here, need to pass full scope to _process_content if term.keyword == 'contentorname': results, myscope = op_func(results, myscope, self._process_from_index(term, myscope, scoring=10) ) if callback and ( group.operator == OPERATOR_OR or all(term.keyword == 'contentorname' for term in contentterms) ): cont = callback(results, None) if not cont: self.cancelled = True return results or set() # Now do the content terms all at once per page - slow or very slow if contentterms: results = self._process_content( contentterms, results, scope, group.operator, callback) # And return our results as summed by the operator return results or set() @staticmethod def _and_operator(results, scope, newresults): # Returns new results and new scope # For AND, the scope is always latest results if results is None: results = newresults else: results &= newresults return results, results @staticmethod def _or_operator(results, scope, newresults): # Returns new results and new scope # For OR we always keep the original scope if results is None: results = newresults else: results |= newresults return results, scope def _count_score(self, path, score): self.scores[path] = self.scores.get(path, 0) + score def _process_from_index(self, term, scope, scoring=1): # Process keywords we can get from the index, just one term at # a time - leave it up to _process_group to combine them myresults = SearchSelection(None) myresults.scores = self.scores # HACK for callback function index = self.notebook.index scoped = False if term.keyword in ('name', 'namespace', 'contentorname'): scoped = True # for these keywords we use scope immediatly if scope: generator = iter(scope) else: generator = index.walk() if term.keyword == 'namespace': regex = self._namespace_regex(term.string) elif term.keyword == 'contentorname': # More lax matching for default case regex = self._name_regex('*'+term.string.strip('*')+'*') term.name_regex = regex # needed in _process_content else: regex = self._name_regex(term.string) #~ print '!! REGEX: ' + regex.pattern for path in generator: if regex.match(path.name): myresults.add(path) elif term.keyword in ('linksfrom', 'linksto'): if term.keyword == 'linksfrom': dir = LINK_DIR_FORWARD else: dir = LINK_DIR_BACKWARD if term.string.endswith('*'): recurs = True string = term.string.rstrip('*') else: recurs = False string = term.string try: path = self.notebook.resolve_path(string) except PageNameError: return myresults if recurs: links = index.list_links_to_tree(path, dir) else: links = index.list_links(path, dir) if dir == LINK_DIR_FORWARD: for link in links: myresults.add(link.href) else: for link in links: myresults.add(link.source) elif term.keyword == 'tag': tag = index.lookup_tag(term.string) if tag: for path in index.list_tagged_pages(tag): myresults.add(path) else: assert False, 'BUG: unknown keyword: %s' % term.keyword # apply scope: if scope and not scoped: myresults &= scope # only keep results that in scope # Inverse selection if term.inverse: if not scope: # initialize scope with whole notebook :S scope = set() for p in index.walk(): scope.add(p) inverse = scope - myresults myresults.clear() myresults.update(inverse) for path in myresults: self._count_score(path, scoring) return myresults def _process_content(self, terms, results, scope, operator, callback=None): # Process terms for content, process many at once in order to # only open the page once and allow for a linear behavior of the # callback function. (We could also have relied on page objects # caching the parsetree, but then there is no way to support a # useful callback method.) # Note that this rationale is for flat searches, once sub-groups # are involved things get less optimized. # # For AND 'scope' will be the results of previous steps, we make a subset # of this. In 'results' will only be any final results already obtained from # contentorname optimization # For OR 'results' is whatever was found so far while 'scope' can be larger # we extend the results with any matches from scope for term in terms: term.content_regex = self._content_regex(term.string) # term.name_regex already defined in _process_from_index if scope: def page_generator(): for path in scope: yield self.notebook.get_page(path) generator = page_generator() else: generator = self.notebook.walk() if results is None: results = SearchSelection(None) for page in generator: #~ print '!! Search content', page try: tree = page.get_parsetree() except: logger.exception('Exception while reading: %s', page) continue if tree is None: continue # Assume need to have content even for negative query path = Path(page.name) if operator == OPERATOR_AND: score = 0 for term in terms: #~ print '!! Count AND %s' % term myscore = tree.countre(term.content_regex) if term.keyword == 'contentorname' \ and term.name_regex.match(path.name): myscore += 1 # effective score going to 11 if bool(myscore) != term.inverse: # implicit XOR score += myscore or 1 else: score = 0 break if score: results.add(path) self._count_score(path, score) else: # OPERATOR_OR for term in terms: #~ print '!! Count OR %s' % term score = tree.countre(term.content_regex) if term.keyword == 'contentorname' \ and term.name_regex.match(path.name): score += 1 # effective score going to 11 if bool(score) != term.inverse: # implicit XOR results.add(path) self._count_score(path, score or 1) if callback: # Since we are always last in the processing of the # (top-level) group, we can call the callback with all results cont = callback(results, path) if not cont: self.cancelled = True break return results def _name_regex(self, string, case=False): # Build a regex for matching a glob against a page name # Don't use word delimiters here, since page names could be in # camelcase. User should include ":" if they want to match # whole namespace. if string.startswith('*'): prefix = r'.*' string = string.lstrip('*') else: prefix = r'^' string = string.lstrip(':') if string.endswith('*'): postfix = r'' string = string.rstrip('*') else: postfix = r'$' regex = prefix + re.escape(string) + postfix if case: return re.compile(regex) else: return re.compile(regex, re.I) def _namespace_regex(self, string, case=False): # like _name_regex but adds recursive descent below the page namespace = re.escape( string.strip('*:') ) regex = r'^(' + namespace + '$|' + namespace + ':)' if case: return re.compile(regex) else: return re.compile(regex, re.I) def _content_regex(self, string, case=False): # Build a regex for a content search term, expands wildcards # and sets case sensitivity. Tries to guess if we look for # whole word or not. # Build regex - first expand wildcards parts = string.split('*') regex = r'\S*'.join(map(re.escape, parts)) # Next add word delimiters if re.search(r'^[\*\w]', string, re.U): regex = r'\b' + regex if re.search(r'[\*\w]$', string, re.U): regex = regex + r'\b' #~ print 'SEARCH REGEX: >>%s<<' % regex if case: return re.compile(regex, re.U) else: return re.compile(regex, re.U | re.I) zim-0.60/zim/base.py0000664000175000017500000000046712132472704014204 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg from .signals import ConnectorMixin, SignalEmitter class Object(ConnectorMixin, SignalEmitter): '''Base class for zim classes that want to use signals''' pass # TODO add some logic for properties, preferences, state zim-0.60/zim/gui/0000775000175000017500000000000012140000463013461 5ustar jaapjaap00000000000000zim-0.60/zim/gui/imagegeneratordialog.py0000644000175000017500000002157512032024636020224 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg '''This module contains the base classes used by all plugins that create an image from text based input. Like the equation editor, the diagram editor etc. There is a class for the edit dialog that is used for images that are inserted with an object type, and there is a base class for the generators that implement specific translations from text to an image. ''' import gtk import logging from zim.fs import File, Dir from zim.gui.widgets import ui_environment, \ Dialog, ImageView, Button, QuestionDialog, \ ScrolledTextView, ScrolledSourceView, VPaned logger = logging.getLogger('zim.gui') class ImageGeneratorClass(object): '''Base class for image generators which can be used by the L{ImageGeneratorDialog} ''' uses_log_file = True #: set to C{False} for subclasses that do not generate a log type = None #: generator type, e.g. "equation" scriptname = None #: basename of the source files, e.g. "equation.tex" imagename = None #: basename of the resulting image files, e.g. "equation.png" def generate_image(self, text): '''Generate an image for a user input This is the method that does the actual work to generate an image out of input text. Typically it will write the text to a temporary file using a template and then call an external program (e.g. latex) to create an image out of that source file. The result should be an image file and optionally a log file. When the external program failed preferably this method should still return a log file, so the user can check the details of why the creation failed. @param text: the source text as string - raw user input @returns: a 2-tuple of the image file and the log file as L{File} objects. If no image file was created the first element should be C{None}, if no log file is created second element should be C{None}. @implementation: must be implemented by subclasses ''' raise NotImplemented def process_input(self, text): '''Process user input before generating image This method is used to post-process user input before generating image and writing the user input into the script file. @param text: the source text as string - raw user input @returns: string used for generate_image, also the string written to script file. @implementation: Not mandatory to be implemented by subclass. It defaults to user input. ''' return text def filter_input(self, text): '''Filter contents of script file before displaying in textarea This method is used to pre-process contents of script file before displaying in textarea. @param text: the contents of script file @returns: string used to display for user input. @implementation: Not mandatory to be implemented by subclass. It defaults to script file contents. ''' return text def cleanup(self): '''Cleanup any temporary files that were created by this generator. Including log files and image files. @implementation: should be implemented by subclasses ''' pass class ImageGeneratorDialog(Dialog): '''Base class for use by plugins that generate and insert an image based on textual user input. This is used e.g. by the equation editor and similar plugins. The dialog provides text input and an image view for showing previews. ''' # TODO: use uistate to remember pane position def __init__(self, ui, title, generator, image=None, syntax=None, **opt): '''Constructor @param ui: L{GtkInterface} object or parent window @param title: the dialog title @param generator: an L{ImageGeneratorClass} object @param image: image data for an image in the L{TextBuffer} @param syntax: optional syntax name (as understood by gtksourceview) @param opt: any other arguments to pass to the L{Dialog} constructor ''' if ui_environment['platform'] == 'maemo': defaultsize = (450,480) # Use maximum available vertical space because decorations take # too much real state else: defaultsize = (450,300) Dialog.__init__(self, ui, title, defaultwindowsize=defaultsize, **opt) if ui_environment['platform'] == 'maemo': self.resize(450,480) # Force maximum dialog size under maemo, otherwise # we'll end with a too small dialog and no way to resize it self.generator = generator self.imagefile = None self.logfile = None self.vpane = VPaned() self.vpane.set_position(150) self.vbox.add(self.vpane) self.imageview = ImageView(bgcolor='#FFF', checkerboard=False) self.vpane.pack1(self.imageview, resize=True) # TODO scrolled window and option to zoom in / real size window, textview = ScrolledSourceView(syntax=syntax) self.textview = textview self.textview.set_editable(True) self.vpane.pack2(window, resize=False) hbox = gtk.HBox(spacing=5) self.vbox.pack_start(hbox, False) self.previewbutton = Button(_('_Preview'), stock='gtk-refresh') # T: button in e.g. equation editor dialog self.previewbutton.set_sensitive(False) self.previewbutton.connect_object( 'clicked', self.__class__.preview, self) hbox.pack_start(self.previewbutton, False) self.textview.get_buffer().connect('modified-changed', lambda b: self.previewbutton.set_sensitive(b.get_modified())) self.logbutton = Button(_('View _Log'), stock='gtk-file') # T: button in e.g. equation editor dialog self.logbutton.set_sensitive(False) self.logbutton.connect_object( 'clicked', self.__class__.show_log, self) if generator.uses_log_file: hbox.pack_start(self.logbutton, False) # else keep hidden self._existing_file = None if image: file = image['_src_file'] # FIXME ? textfile = self._stitch_fileextension(file, self.generator.scriptname) self._existing_file = textfile self.imageview.set_file(file) self.set_text(self.generator.filter_input(textfile.read())) self.textview.grab_focus() def _stitch_fileextension(self, file, basename): '''Stitches the file extension from 'basename' to the path of 'file' and returns a File object. ''' i = basename.rfind('.') j = file.path.rfind('.') return File(file.path[:j] + basename[i:]) def set_text(self, text): '''Set text in the buffer''' buffer = self.textview.get_buffer() buffer.set_text(text) buffer.set_modified(False) def get_text(self): '''Get the text from the buffer @returns: text as string ''' buffer = self.textview.get_buffer() bounds = buffer.get_bounds() return buffer.get_text(*bounds) def generate_image(self): '''Update the image based on the text in the text buffer''' self.imagefile = None self.logfile = None text = self.get_text() text = self.generator.process_input(text) try: imagefile, logfile = self.generator.generate_image(text) except: logger.exception('Could not generate image') # TODO set "error" image instead of "broken" image # TODO set exception text as log message else: self.imagefile = imagefile self.logfile = logfile self.textview.get_buffer().set_modified(False) def preview(self): '''Action for the "Preview" button''' self.generate_image() self.imageview.set_file(self.imagefile) # if None sets broken image self.logbutton.set_sensitive(not self.logfile is None) def show_log(self): '''Action for the "View Log" button''' assert self.logfile, 'BUG: no logfile set (yet)' LogFileDialog(self, self.logfile).run() def do_response_ok(self): if not self.imagefile \ or self.textview.get_buffer().get_modified(): self.generate_image() if not (self.imagefile and self.imagefile.exists()): dialog = QuestionDialog(self, _('An error occurred while generating the image.\nDo you want to save the source text anyway?')) # T: Question prompt when e.g. equation editor encountered an error generating the image to insert if not dialog.run(): return False if self._existing_file: textfile = self._existing_file else: page = self.ui.page dir = self.ui.notebook.get_attachments_dir(page) textfile = dir.new_file(self.generator.scriptname) textfile.write( self.generator.process_input(self.get_text()) ) imgfile = self._stitch_fileextension(textfile, self.generator.imagename) if self.imagefile and self.imagefile.exists(): self.imagefile.rename(imgfile) elif imgfile.exists(): imgfile.remove() if self._existing_file: self.ui.reload_page() else: pageview = self.ui.mainwindow.pageview pageview.insert_image(imgfile, type=self.generator.type, interactive=False, force=True) if self.logfile and self.logfile.exists(): self.logfile.remove() return True def destroy(self): self.generator.cleanup() Dialog.destroy(self) class LogFileDialog(Dialog): '''Simple dialog to show the log file''' def __init__(self, ui, file): Dialog.__init__(self, ui, _('Log file'), buttons=gtk.BUTTONS_CLOSE) # T: dialog title for log view dialog - e.g. for Equation Editor self.set_default_size(600, 300) window, textview = ScrolledTextView(file.read(), monospace=True) self.vbox.add(window) zim-0.60/zim/gui/templateeditordialog.py0000664000175000017500000001237712132472704020263 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import gtk from zim.fs import TrashNotSupportedError from zim.config import XDG_DATA_HOME, data_file from zim.templates import list_template_categories, list_templates from zim.gui.widgets import Dialog, BrowserTreeView, Button, ScrolledWindow class TemplateEditorDialog(Dialog): '''Dialog with a tree of available templates for export and new pages. Allows edit, delete, and create new templates. Uses external editor. ''' def __init__(self, ui): Dialog.__init__(self, ui, _('Templates'), help='Help:Templates', buttons=gtk.BUTTONS_CLOSE, defaultwindowsize=(400, 450)) # T: Dialog title label = gtk.Label() label.set_markup(''+_('Templates')+'') # T: Section in dialog label.set_alignment(0.0, 0.5) self.vbox.pack_start(label, False) hbox = gtk.HBox() self.vbox.add(hbox) self.view = TemplateListView() self.view.connect('row-activated', self.on_selection_changed) hbox.add(ScrolledWindow(self.view)) vbbox = gtk.VButtonBox() vbbox.set_layout(gtk.BUTTONBOX_START) hbox.pack_start(vbbox, False) view_button = Button(stock='gtk-file', label=_('_View')) # T: button label view_button.connect('clicked', self.on_view) copy_button = Button(stock='gtk-copy') copy_button.connect('clicked', self.on_copy) edit_button = Button(stock='gtk-edit') edit_button.connect('clicked', self.on_edit) delete_button = gtk.Button(stock='gtk-remove') delete_button.connect('clicked', self.on_delete) for b in (view_button, copy_button, edit_button, delete_button): b.set_alignment(0.0, 0.5) vbbox.add(b) browse_button = Button(_('Browse')) # T: button label browse_button.connect('clicked', self.on_browse) self.add_extra_button(browse_button) self._buttonbox = vbbox self._delete_button = delete_button self.on_selection_changed() def on_selection_changed(self, *a): # Set sensitivity of the buttons # All insensitive if category (folder) is selected # Delete insensitive if only a default custom, default = self.view.get_selected() for button in self._buttonbox.get_children(): button.set_sensitive(custom is not None) if custom is None: return if not custom.exists(): self._delete_button.set_sensitive(False) def on_view(self, *a): # Open the file, witout waiting for editor to return custom, default = self.view.get_selected() if custom is None: return # Should not have been sensitive if custom.exists(): self.ui.open_file(custom) else: assert default and default.exists() self.ui.open_file(default) def on_copy(self, *a): # Create a new template in this category custom, default = self.view.get_selected() if custom is None: return # Should not have been sensitive if custom.exists(): source = custom else: assert default and default.exists() source = default name = PromptNameDialog(self).run() _, ext = custom.basename.rsplit('.', 1) basename = name + '.' + ext newfile = custom.dir.file(basename) source.copyto(newfile) self.view.refresh() def on_edit(self, *a): custom, default = self.view.get_selected() if custom is None: return # Should not have been sensitive if not custom.exists(): # Copy default default.copyto(custom) self.ui.edit_file(custom, istextfile=True, dialog=self) self.view.refresh() def on_delete(self, *a): # Only delete custom, may result in reset to default custom, default = self.view.get_selected() if custom is None or not custom.exists(): return # Should not have been sensitive try: custom.trash() except TrashNotSupportedError: # TODO warnings custom.remove() self.view.refresh() def on_browse(self, *a): dir = XDG_DATA_HOME.subdir(('zim', 'templates')) self.ui.open_dir(dir) class PromptNameDialog(Dialog): def __init__(self, ui): Dialog.__init__(self, ui, _('Copy Template')) # T: Dialog title self.add_form([ ('name', 'string', _('Name')), # T: Input label for the new name when copying a template ]) def do_response_ok(self): self.result = self.form['name'] if self.result: return True class TemplateListView(BrowserTreeView): BASENAME_COL = 0 FILE_COL = 1 DEFAULT_COL = 2 def __init__(self): BrowserTreeView.__init__(self) model = gtk.TreeStore(str, object, object) # BASENAME_COL, FILE_COL, DEFAULT_COL self.set_model(model) self.set_headers_visible(False) cell_renderer = gtk.CellRendererText() column = gtk.TreeViewColumn('_template_', cell_renderer, text=self.BASENAME_COL) self.append_column(column) self.refresh() def get_selected(self): # Returns (base, default file) or (None, None) model, iter = self.get_selection().get_selected() if model is None or iter is None: return None, None else: return model[iter][self.FILE_COL], model[iter][self.DEFAULT_COL] def refresh(self): model = self.get_model() model.clear() for category in list_template_categories(): parent = model.append(None, (category, None, None)) for name, basename in list_templates(category): base = XDG_DATA_HOME.file(('zim', 'templates', category, basename)) default = data_file(('templates', category, basename)) # None if not existing #~ print '>>>', name, base, default model.append(parent, (name, base, default)) self.expand_all() zim-0.60/zim/gui/server.py0000664000175000017500000001476412133562261015370 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008,2013 Jaap Karssenberg '''This module stands apart from the rest of the gui modules as it is not part from the main Gtk interface. It defines a Gtk interface that can be used to start/stop the WWW server. ''' # TODO: allow setting a password for public access to private server.. # TODO: expander or button to open the server log # TODO: have url button show public hostname # commented out because while testing I got stuff like # "localhost6.localdomain6" which could not be resolved # by the browser :( import gtk import glib import webbrowser import sys import logging from zim.www import make_server from zim.config import data_file from zim.gui.widgets import IconButton, gtk_window_set_default_icon, ErrorDialog, input_table_factory from zim.gui.notebookdialog import NotebookComboBox, NotebookDialog logger = logging.getLogger('zim.gui.server') class ServerWindow(gtk.Window): def __init__(self, notebook=None, port=8080, public=True, **opts): '''Constructor @param notebook: the notebook location @param port: the http port to serve on @param public: allow connections to the server from other computers - if C{False} can only connect from localhost @param opts: options for L{WWWInterface.__init__()} ''' gtk.Window.__init__(self) self.set_title('Zim - ' + _('Web Server')) # T: Window title self.set_border_width(10) self.connect('destroy', lambda a: gtk.main_quit()) self.interface_opts = opts self.httpd = None self._source_id = None # Widgets self.status_label = gtk.Label() self.status_label.set_markup(''+_('Server not started')+'') # T: Status in web server gui self.start_button = IconButton('gtk-media-play') self.start_button.connect('clicked', lambda o: self.start()) self.stop_button = IconButton('gtk-media-stop') self.stop_button.connect('clicked', lambda o: self.stop()) self.stop_button.set_sensitive(False) if gtk.gtk_version >= (2, 10): self.link_button = gtk.LinkButton('') self.link_button.set_sensitive(False) gtk.link_button_set_uri_hook(lambda o, url: webbrowser.open(url)) else: self.link_button = None self.notebookcombobox = NotebookComboBox(current=notebook) self.open_button = IconButton('gtk-index') self.open_button.connect('clicked', lambda *a: NotebookDialog(self).run()) self.portentry = gtk.SpinButton() self.portentry.set_numeric(True) self.portentry.set_range(80, 10000) self.portentry.set_increments(1, 80) self.portentry.set_value(port) self.public_checkbox = gtk.CheckButton(label=_('Allow public access')) # T: Checkbox in web server gui self.public_checkbox.set_active(public) # Build the interface vbox = gtk.VBox() self.add(vbox) hbox = gtk.HBox(spacing=12) hbox.pack_start(self.start_button, False) hbox.pack_start(self.stop_button, False) hbox.pack_start(self.status_label, False) vbox.add(hbox) table = input_table_factory(( (_('Notebook'), self.notebookcombobox, self.open_button), # T: Field in web server gui (_('Port'), self.portentry), # T: Field in web server gui for HTTP port (e.g. port 80) self.public_checkbox )) vbox.add(table) if self.link_button: hbox = gtk.HBox() hbox.pack_end(self.link_button, False) vbox.add(hbox) def open_notebook(self, notebook): '''Sets the notebook in the combobox This method is called by the NotebookDialog when a notebook is opened. ''' self.notebookcombobox.set_notebook(notebook) def start(self): # Start server try: notebook = self.notebookcombobox.get_notebook() if not notebook: return port = int(self.portentry.get_value()) public = self.public_checkbox.get_active() self.httpd = make_server(notebook, port, public, **self.interface_opts) if sys.platform == 'win32': # glib io watch conflicts with socket use on windows.. # idle handler uses a bit to much CPU for my taste, # timeout every 0.5 sec is better self.httpd.timeout = 0.1 # 100 ms self._source_id = glib.timeout_add(500, self.do_serve_on_poll) else: self.httpd.timeout = 3 # if no response after 3 sec, drop it self._source_id = glib.io_add_watch( self.httpd.fileno(), glib.IO_IN | glib.IO_OUT | glib.IO_ERR | glib.IO_HUP | glib.IO_PRI, # any event.. self.do_serve_on_io ) logger.info("Serving HTTP on %s port %i...", self.httpd.server_name, self.httpd.server_port) except Exception, error: ErrorDialog(self, error).run() return # Update UI self.notebookcombobox.set_sensitive(False) self.portentry.set_sensitive(False) self.public_checkbox.set_sensitive(False) self.open_button.set_sensitive(False) self.start_button.set_sensitive(False) self.stop_button.set_sensitive(True) self.status_label.set_markup(''+_('Server started')+'') # T: Status in web server gui #if self.public_checkbox.get_active(): # url = 'http://%s:%i' % (self.httpd.server_name, self.httpd.server_port) #else: # url = 'http://localhost:%i' % self.httpd.server_port url = 'http://localhost:%i' % self.httpd.server_port if self.link_button: self.link_button.set_uri(url) self.link_button.set_label(url) self.link_button.set_sensitive(True) def do_serve_on_io(self, fd, event): try: if event & glib.IO_HUP: self.stop() raise Exception, 'Socket disconnected' else: self.httpd.handle_request() except: logger.exception('Exception while handling IO request:') return True # keep event running def do_serve_on_poll(self): self.httpd.handle_request() return True # keep event running def stop(self): # Stop server logger.debug('Stop server') if self._source_id is not None: glib.source_remove(self._source_id) self._source_id = None if self.httpd: self.httpd.socket.close() # There is also a httpd.server_close(), but undocumented (!?) self.httpd = None # Update UI self.status_label.set_markup(''+_('Server stopped')+'') # T: Status in web server gui if self.link_button: self.link_button.set_sensitive(False) self.notebookcombobox.set_sensitive(True) self.portentry.set_sensitive(True) self.public_checkbox.set_sensitive(True) self.open_button.set_sensitive(True) self.stop_button.set_sensitive(False) self.start_button.set_sensitive(True) def main(notebook=None, port=8080, public=True, **opts): import zim.notebook if notebook: notebook, path = zim.notebook.resolve_notebook(notebook) gtk_window_set_default_icon() window = ServerWindow(notebook, port, public, **opts) window.show_all() gtk.main() zim-0.60/zim/gui/recentchangesdialog.py0000664000175000017500000000514312132472704020043 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2013 Jaap Karssenberg import gtk import gobject import logging import zim.datetimetz as datetime from zim.notebook import Path from zim.gui.widgets import Dialog, BrowserTreeView, ScrolledWindow logger = logging.getLogger('zim.gui.dialogs') class RecentChangesDialog(Dialog): def __init__(self, ui): Dialog.__init__(self, ui, _('Recent Changes'), # T: Dialog title buttons=gtk.BUTTONS_CLOSE, defaultwindowsize=(400, 300) ) self.treeview = RecentChangesTreeView(ui) self.vbox.add(ScrolledWindow(self.treeview)) self.update() self.ui.notebook.connect_after('stored-page', lambda *a: self.update()) def update(self): model = self.treeview.get_model() model.clear() list = self.ui.notebook.index.list_recent_pages(offset=0, limit=50) for indexpath in list: model.append((indexpath.name, indexpath.contentkey)) # HACK ! class RecentChangesTreeView(BrowserTreeView): NAME_COL = 0 MODIFIED_COL = 1 def __init__(self, ui): model = gtk.ListStore(str, str) # NAME_COL, MODIFIED_COL BrowserTreeView.__init__(self, model) self.ui = ui cell_renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(_('Page'), cell_renderer, text=self.NAME_COL) # T: Column header column.set_sort_column_id(self.NAME_COL) column.set_expand(True) self.append_column(column) today = datetime.date.today() yesterday = today - datetime.timedelta(days=1) def render_date(col, cell, model, i): utime = model.get_value(i, self.MODIFIED_COL) if utime: utime = float(utime) dt = datetime.datetime.fromtimestamp(utime) date = dt.date() if date == today: text = _('Today') + dt.strftime(' %H:%M') # T: label for modified time elif date == yesterday: text = _('Yesterday') + dt.strftime(' %H:%M') # T: label for modified time elif date.year == today.year: text = dt.strftime('%a %d %b %H:%M') # TODO allow config for format ? else: text = dt.strftime('%a %d %b, %Y %H:%M') # TODO allow config for format ? else: text = '' cell.set_property('text', text) cell_renderer = gtk.CellRendererText() #cell_renderer.set_property('font', 'mono') column = gtk.TreeViewColumn(_('Last Modified'), cell_renderer, text=self.MODIFIED_COL) # T: Column header column.set_cell_data_func(cell_renderer, render_date) column.set_sort_column_id(self.MODIFIED_COL) self.append_column(column) self.connect('row-activated', self._do_open_page) def _do_open_page(self, view, path, col): page = Path( self.get_model()[path][self.NAME_COL].decode('utf-8') ) self.ui.open_page(page) zim-0.60/zim/gui/cleannotebookdialog.py0000644000175000017500000001627412012764113020055 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Stefan Muthers # License: same as zim (gpl) import gtk import pango import logging from zim.parsing import link_type from zim.fs import File from zim.gui.widgets import Dialog, MessageDialog, ScrolledWindow logger = logging.getLogger('zim.gui') SEL_COL = 0 # File selected or not PAGE_COL = 1 # Page the file belongs to SNAME_COL = 2 # Basename of the file NAME_COL = 3 # Full file name ui_actions = ( # name, stock id, label, accelerator, tooltip, read only ('open_file', 'zim-clean-notebook', _('Open File'), '', _('Open File'), True), # T: menu item ('open_folder', 'zim-clean-notebook', _('Open Folder'), '', _('Open Folder'), True), # T: menu item ('delete_file', 'zim-clean-notebook', _('Delete File'), '', _('Delete'), True), # T: menu item ) ui_xml=''' ''' def extract_links(element): '''Returns any file links for a parsetree element''' links = [] if element.tag == 'img': return [element.attrib['src']] elif element.tag == 'link' and link_type(element.text) == 'file': return [element.attrib['href']] else: for child in element.getchildren(): if child.tag in ('p','ul','li', 'img', 'link'): l = extract_links(child) if l: links = links + l return links def get_orphaned_files(notebook): '''Returns a dict with orphaned attachments per pages''' files = {} linked = set() for page in notebook.walk(): # collect attached files dir = notebook.get_attachments_dir(page) if dir.exists(): files[page.name] = set() for name in dir.list(): file = dir.file(name) if not file.isdir(): files[page.name].add(file.path) # extract links from pages if page.hascontent: tree = page.get_parsetree() for link in extract_links(tree.getroot()): try: file = notebook.resolve_file(link, page) except AssertionError: pass else: linked.add(file.path) # compare attached files with existing links for file_set in files.values(): file_set -= linked return files class OrphanedFilesTreeModel(gtk.ListStore): ''' A gtk.ListStore for the orphaned files''' def __init__(self, filelist): gtk.ListStore.__init__(self, bool, str, str, str) # SEL_COL, PAGE_COL, SNAME_COL, NAME_COL self._loading = True self.clear() #~ w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) for page in filelist: for file in filelist[page]: basename = File(file).basename self.append((False, page, basename, file)) self._loading = False def get_selected(self): selection = [] for row in self: if row[SEL_COL]: selection.append(row[NAME_COL]) return selection class OrphanedFilesTreeView(gtk.TreeView): def __init__(self, ui): self.orphaned_files = get_orphaned_files(ui.notebook) self.model = OrphanedFilesTreeModel(self.orphaned_files) self.ui = ui gtk.TreeView.__init__(self, self.model) self.get_selection().set_mode(gtk.SELECTION_BROWSE) self.set_rules_hint(True) self.set_reorderable(True) cell_renderer = gtk.CellRendererToggle() cell_renderer.set_property('activatable', True) cell_renderer.connect( 'toggled', self.toggled_selection) column = gtk.TreeViewColumn(_("Selection"), cell_renderer) ## T: Column heading in 'Orphaned Files' dialog column.add_attribute( cell_renderer, "active", SEL_COL) self.append_column(column) cell_renderer = gtk.CellRendererText() cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn(_('Filename'), cell_renderer, text=SNAME_COL) # T: Column heading in 'Oprhaned Files' dialog column.set_sort_column_id(NAME_COL) column.set_resizable(True) column.set_expand(True) self.append_column(column) cell_renderer = gtk.CellRendererText() #~ cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn(_('Page'), cell_renderer, text=PAGE_COL) # T: Column heading in 'Oprhaned Files' dialog column.set_sort_column_id(PAGE_COL) column.set_resizable(True) self.append_column(column) def toggled_selection(self, cell, path): self.model[path][SEL_COL] = not self.model[path][SEL_COL] logger.debug("Toggle '%s' to: %s" % (self.model[path][SNAME_COL], self.model[path][0],)) return class CleanNotebookDialog(Dialog): def __init__(self, ui): Dialog.__init__(self, ui, _('Cleanup Attachments'), buttons=None) # T: dialog title self.set_default_size(600, 400) #self.set_help(':Help:Clean_Notebook') #TODO self.ui = ui self.ui.add_actions(ui_actions, self) self.ui.add_ui(ui_xml,self) # Buttons # [cancel] [delete] self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) self.add_button('Delete', gtk.RESPONSE_OK) self._no_ok_action = False button = gtk.Button(_('Invert Selection')) # T: Button in "Clean Notebook" dialog button.connect('clicked', self.do_response_toggle) self.action_area.add(button) self.action_area.set_child_secondary(button, True) self.add_help_text(_( 'The files below were found in the attachment directory of zim but are no longer \n' 'linked in the notebook. ' ) ) # T: help text in "Clean Notebook" dialog self.treeview = OrphanedFilesTreeView(ui) self.treeview.connect_object( 'button-press-event', self.__class__.on_treeview_click, self) hbox = gtk.HBox(spacing=5) self.vbox.add(hbox) swindow = ScrolledWindow(self.treeview) hbox.add(swindow) def run(self): if len(self.treeview.model) == 0: logger.info("No orphaned files found.") MessageDialog(self.ui, _('No orphaned files found.')).run() # T: Message dialog in "Clean Attachments" self.destroy() return True else: return super(CleanNotebookDialog, self).run() def on_treeview_click(self, event): if event.button == 3: x = int(event.x) y = int(event.y) path = self.treeview.get_path_at_pos(x, y) if path: self.path = path iter = self.treeview.model.get_iter(path[0]) self.iter = iter self.selected_file = self.treeview.model.get(iter, NAME_COL) self.selected_file = File(self.selected_file[0]) menu = self.ui.uimanager.get_widget('/clean_notebook_popup') menu.popup(None, None, None, event.button, event.time) return True def open_file(self, file=None): if not file: file = self.selected_file logger.debug('Try to open %s' % file) try: self.ui.open_file(file) except Exception, error: logger.warn('Opening %s failed: %s' % (file, error)) def open_folder(self): file = self.selected_file self.open_file(file.dir) def delete_file(self, file=None, refresh=False): '''Deletes a file and refreshes the treeview if refresh == True''' if not file: file = self.selected_file refresh = True logger.debug('Deleting %s' % file) file = File(file) if file.exists(): file.cleanup() if refresh: self.treeview.model.remove(self.iter) def do_response_toggle(self, button): for path in self.treeview.model: path[SEL_COL] = not path[SEL_COL] def do_response_ok(self): model = self.treeview.model selected_files = model.get_selected() if selected_files: for file in selected_files: self.delete_file(file) self.destroy() zim-0.60/zim/gui/notebookdialog.py0000644000175000017500000003537612132503276017062 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''This module contains the notebook dialog which is used for the "open another notebook" action and which is shown if you start zim without argument. The dialog directly modifies the notebook list obtained from zim.notebook.get_notebook_list(). A special dropdown allows settign the special entry for the default notebook which will be openend directly the next time zim is started without arguments. @newfield column: Column, Columns ''' import os import gtk import pango import logging from zim.fs import File, Dir from zim.notebook import get_notebook_list, get_notebook_info, init_notebook, NotebookInfo from zim.config import data_file from zim.gui.widgets import ui_environment, Dialog, IconButton, encode_markup_text, ScrolledWindow logger = logging.getLogger('zim.gui.notebookdialog') OPEN_COL = 0 # column with boolean if notebook is open already NAME_COL = 1 # column with notebook name TEXT_COL = 2 # column with a formatted containing name and path PIXBUF_COL = 3 # column containing the notebook icon INFO_COL = 4 # column with the NotebookInfo object def prompt_notebook(): '''Prompts the NotebookDialog and returns the result or None. As a special case for first time usage it immediately prompts for the notebook location without showing the notebook list. ''' list = get_notebook_list() if len(list) == 0: logger.debug('First time usage - prompt for notebook folder') fields = AddNotebookDialog(ui=None).run() if fields: dir = Dir(fields['folder']) init_notebook(dir, name=fields['name']) list.append(NotebookInfo(dir.uri, name=fields['name'])) list.write() return dir.uri else: return None # User canceled the dialog ? else: # Multiple notebooks defined and no default return NotebookDialog(ui=None).run() class NotebookTreeModel(gtk.ListStore): '''TreeModel that wraps a notebook list @column: C{OPEN_COL}: boolean, True if the notebook is opened already @column: C{NAME_COL}: string, name of the notebook @column: C{TEXT_COL}: string, formatted string containg the name and path @column: C{PIXBUF_COL}: gtk.gdk.Pixbuf, the icon of the notebook (if any) @column: C{INFO_COL}: L{NotebookInfo} object @note: To refer to the notebook in an unambiguous way, use the uri stored in the L{NotebookInfo} object. ''' def __init__(self, notebooklist=None): '''Constructor. If "notebooklist" is None, the default list as provided by zim.notebook.get_notebook_list() is used. @param notebooklist: a list of L{NotebookInfo} objects ''' gtk.ListStore.__init__(self, bool, str, str, gtk.gdk.Pixbuf, object) # OPEN_COL, NAME_COL, TEXT_COL PIXBUF_COL INFO_COL if notebooklist is None: self.notebooklist = get_notebook_list() else: self.notebooklist = notebooklist self._loading = True for info in self.notebooklist: self._append(info) self._loading = False def get_iter_for_notebook(self, uri): '''Returns the TreeIter for a notebook path or None''' assert uri.startswith('file://') for row in self: if row[INFO_COL].uri == uri: return row.iter else: return None def append_notebook(self, uri, name=None): '''Append a notebook to the list. If the name is not specified it will be looked up by reading the config file of the notebook. Returns an iter for this notebook in the list. ''' assert uri.startswith('file://') info = NotebookInfo(uri, name=name) info.update() self._append(info) self.write() return len(self) - 1 # iter def _append(self, info): path = File(info.uri).path text = '%s\n%s' % \ (encode_markup_text(info.name), encode_markup_text(path)) # T: Path label in 'open notebook' dialog if info.icon and File(info.icon).exists(): w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_BUTTON) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(File(info.icon).path, w, h) else: pixbuf = None self.append((False, info.name, text, pixbuf, info)) # OPEN_COL NAME_COL TEXT_COL PIXBUF_COL INFO_COL def get_iter_for_default(self): '''Returns a TreeIter for the default notebook or None''' if self.notebooklist.default: return self.get_iter_for_notebook(self.notebooklist.default.uri) else: return None def set_default_from_iter(self, iter): '''Set the default notebook using a TreeIter, set to None to reset the default. ''' if iter is None: self.notebooklist.default = None else: self.notebooklist.default = self[iter][INFO_COL] self.write() def write(self): '''Save the notebook list.''' if self._loading: return # ignore signals while first populating the list list = [row[INFO_COL] for row in self] self.notebooklist[:] = list self.notebooklist.write() class NotebookTreeView(gtk.TreeView): def __init__(self, model=None): # TODO: add logic to flag open notebook italic - needs daemon if model is None: model = NotebookTreeModel() gtk.TreeView.__init__(self, model) self.get_selection().set_mode(gtk.SELECTION_BROWSE) self.set_rules_hint(True) self.set_reorderable(True) cell_renderer = gtk.CellRendererPixbuf() column = gtk.TreeViewColumn(None, cell_renderer, pixbuf=PIXBUF_COL) column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) column.set_fixed_width(w*2) self.append_column(column) cell_renderer = gtk.CellRendererText() cell_renderer.set_property('ellipsize', pango.ELLIPSIZE_END) cell_renderer.set_fixed_height_from_font(2) column = gtk.TreeViewColumn(_('Notebook'), cell_renderer, markup=TEXT_COL) # T: Column heading in 'open notebook' dialog column.set_sort_column_id(NAME_COL) self.append_column(column) class NotebookComboBox(gtk.ComboBox): '''Combobox showing the a list of notebooks''' def __init__(self, model=None, current=None): '''Constructor, @param model: either a L{NotebookTreeModel} or C{None} to use the default list. @param current: uri, C{Dir}, C{NotebookInfo}, or C{Notebook} object for the current notebook. If C{None} the default notebook will be shown (if any). ''' if model is None: model = NotebookTreeModel() gtk.ComboBox.__init__(self, model) cell_renderer = gtk.CellRendererText() self.pack_start(cell_renderer, False) self.set_attributes(cell_renderer, text=NAME_COL) if current: self.set_notebook(current, append=True) else: self.set_default_active() def set_default_active(self): '''Select the default notebook in the combobox or clear the combobox if no default notebook was defined. ''' model = self.get_model() iter = model.get_iter_for_default() if iter is None: self.set_active(-1) else: self.set_active_iter(iter) def set_notebook(self, uri, append=False): '''Select a specific notebook in the combobox. @param uri: uri, C{Dir}, C{NotebookInfo}, or C{Notebook} object for a notebook (string or any object with an C{uri} property) @param append: if C{True} the notebook will appended to the list if it was not listed yet. ''' if isinstance(uri, basestring): assert uri.startswith('file://') else: assert hasattr(uri, 'uri') uri = uri.uri model = self.get_model() iter = model.get_iter_for_notebook(uri) if iter is None: if append: iter = model.append_notebook(uri) self.set_active_iter(iter) else: self.set_active(-1) else: self.set_active_iter(iter) def get_notebook(self): '''Returns the uri for the current selected notebook''' iter = self.get_active() if iter == -1: return None else: model = self.get_model() return model[iter][INFO_COL].uri class DefaultNotebookComboBox(NotebookComboBox): '''Combobox which sets the default notebook''' def __init__(self, model=None): NotebookComboBox.__init__(self, model, current=None) self.connect('changed', self.__class__.do_changed) def do_changed(self): # Set default if triggered by user action model = self.get_model() iter = self.get_active() if iter >= 0: model.set_default_from_iter(iter) else: model.set_default_from_iter(None) class NotebookDialog(Dialog): '''Dialog which allows the user to select a notebook from a list of defined notebooks. Can either be run modal using run(), in which case the selected notebook is returned (or None when the dialog is canceled). To run this dialog non-model a callback needs to be specified which will be called with the path for the selected notebook. ''' def __init__(self, ui, callback=None): Dialog.__init__(self, ui, _('Open Notebook')) # T: dialog title # TODO set button to "OPEN" instead of "OK" self.callback = callback self.set_default_size(500, 400) self.set_help(':Help:Notebooks') # show some art work in an otherwise boring dialog path = data_file('globe_banner_small.png').path image = gtk.Image() image.set_from_file(path) # new_from_file not in 2.6 align = gtk.Alignment(0,0.5, 0,0) align.add(image) self.vbox.pack_start(align, False) # split between treeview and vbuttonbox hbox = gtk.HBox(spacing=12) self.vbox.add(hbox) # add notebook list - open notebook on clicking a row self.treeview = NotebookTreeView() self.treeview.connect( 'row-activated', lambda *a: self.response(gtk.RESPONSE_OK)) hbox.add(ScrolledWindow(self.treeview)) # add buttons for modifying the treeview vbbox = gtk.VButtonBox() vbbox.set_layout(gtk.BUTTONBOX_START) hbox.pack_start(vbbox, False) add_button = gtk.Button(stock='gtk-add') add_button.connect('clicked', self.do_add_notebook) #~ edit_button = gtk.Button(stock='gtk-edit') #~ edit_button.connect('clicked', self.do_edit_notebook) rm_button = gtk.Button(stock='gtk-remove') rm_button.connect('clicked', self.do_remove_notebook) #~ for b in (add_button, edit_button, rm_button): for b in (add_button, rm_button): b.set_alignment(0.0, 0.5) vbbox.add(b) # FIXME buttons for "up" and "down" ? # add dropdown to select default self.combobox = DefaultNotebookComboBox(self.treeview.get_model()) # clear button de-selects any item in the combobox clear_button = IconButton('gtk-clear') clear_button.connect('clicked', lambda o: self.combobox.set_active(-1)) hbox = gtk.HBox(spacing=5) hbox.pack_start(gtk.Label(_('Default notebook')+': '), False) # T: Input label in 'open notebook' dialog hbox.pack_start(self.combobox, False) hbox.pack_start(clear_button, False) self.vbox.pack_start(hbox, False) def show_all(self): # We focus on the treeview so that the user can start typing the # notebook name directly when the dialog opens. Dialog.show_all(self) self.treeview.grab_focus() def do_response_ok(self): model, iter = self.treeview.get_selection().get_selected() model.write() # List will be read by open_notebook again.. if iter is None: return False else: self.result = model[iter][INFO_COL].uri if self.callback: self.callback(self.result) return True def do_add_notebook(self, *a): fields = AddNotebookDialog(self).run() if fields: dir = Dir(fields['folder']) init_notebook(dir, name=fields['name']) model = self.treeview.get_model() model.append_notebook(dir.uri, name=fields['name']) #~ def do_edit_notebook(self, *a): #~ model, iter = self.treeview.get_selection().get_selected() #~ if iter is None: #~ return #~ name = unicode(model[iter][NAME_COL]) #~ folder = unicode(model[iter][PATH_COL]) #~ properties = EditNotebookDialog(self, name, folder).run() #~ if properties: #~ model.set(iter, #~ OPEN_COL, False, #~ NAME_COL, properties['name'], #~ PATH_COL, properties['folder'] ) #~ model.write() def do_remove_notebook(self, *a): model, iter = self.treeview.get_selection().get_selected() model.remove(iter) # explicitly _no_ model.write() def show_help(self, page=None): # Overloaded because self.ui may be None if self.ui: Dialog.show_help(self, page) else: from zim import ZimCmd if page is None: page = self.help_page ZimCmd(('--manual', page)).spawn() class AddNotebookDialog(Dialog): def __init__(self, ui, name=None, folder=None): Dialog.__init__(self, ui, _('Add Notebook')) # T: Dialog window title label = gtk.Label(_('Please select a name and a folder for the notebook.')) # T: Label in Add Notebook dialog label.set_alignment(0.0, 0.5) self.vbox.pack_start(label, False) self._name_set = not name is None self._folder_set = not folder is None if ui_environment['platform'] == 'maemo': nb_folder = '~/MyDocs/Notebooks/' # 'MyDocs' is the "Device" folder on maemo else: nb_folder = '~/Notebooks/' if not self._name_set and not self._folder_set: name = 'Notes' folder = nb_folder + name # else set below by _changed methods self.add_form(( ('name', 'string', _('Name')), # T: input field in 'Add Notebook' dialog ('folder', 'dir', _('Folder')), # T: input field in 'Add Notebook' dialog ), { 'name': name, 'folder': folder, }) self.add_help_text('''\ To create a new notebook you need to select an empty folder. Of course you can also select an existing zim notebook folder. ''') # T: help text in the 'Add Notebook' dialog # Hook entries to copy name when appropriate self._block_update = False self.on_name_changed(None, interactive=False) self.on_folder_changed(None, interactive=False) self.form.widgets['name'].connect('changed', self.on_name_changed) self.form.widgets['folder'].connect('changed', self.on_folder_changed) def on_name_changed(self, o, interactive=True): # When name is changed, update folder accordingly # unless the folder was set explicitly already if self._block_update: return self._name_set = self._name_set or interactive if self._folder_set: return name = self.form.widgets['name'].get_text() folder = self.form.widgets['folder'].get_text() dir = os.path.dirname(folder).strip('/\\') self._block_update = True self.form.widgets['folder'].set_text(os.path.join(dir, name)) self._block_update = False def on_folder_changed(self, o, interactive=True): # When folder is changed, update name accordingly if self._block_update: return self._folder_set = self._folder_set or interactive # Check notebook info (even when name was set already) if interactive or not self._name_set: folder = self.form['folder'] if folder and folder.exists(): info = get_notebook_info(folder) if info: # None when no config found self._block_update = True self.form['name'] = info.name self._block_update = False return # Else use basename unless the name was set explicitly already if self._name_set: return folder = self.form.widgets['folder'].get_text().strip('/\\') self._block_update = True self.form['name'] = os.path.basename(folder) self._block_update = False def do_response_ok(self): name = self.form['name'] folder = self.form['folder'] if name and folder: self.result = {'name': name, 'folder': folder} return True else: return False zim-0.60/zim/gui/searchdialog.py0000664000175000017500000001416412132472704016502 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import gtk import gobject import logging from zim.notebook import Path from zim.gui.widgets import Dialog, BrowserTreeView, InputEntry, ErrorDialog, ScrolledWindow from zim.search import * logger = logging.getLogger('zim.gui.searchdialog') class SearchDialog(Dialog): READY = 0 SEARCHING = 1 CANCELLED = 2 def __init__(self, ui): Dialog.__init__(self, ui, _('Search'), # T: Dialog title buttons=gtk.BUTTONS_CLOSE, help='Help:Searching', defaultwindowsize=(400, 300) ) hbox = gtk.HBox(spacing=5) self.vbox.pack_start(hbox, False) hbox.pack_start(gtk.Label(_('Search')+': '), False) # T: input label self.query_entry = InputEntry() hbox.add(self.query_entry) self.search_button = gtk.Button(stock=gtk.STOCK_FIND) hbox.pack_start(self.search_button, False) if gtk.gtk_version >= (2, 20) \ and gtk.pygtk_version >= (2, 22): self.spinner = gtk.Spinner() hbox.pack_start(self.spinner, False) else: self.spinner = None self.cancel_button = gtk.Button(stock=gtk.STOCK_STOP) hbox.pack_start(self.cancel_button, False) self._set_state(self.READY) help_text = _( 'For advanced search you can use operators like\n' 'AND, OR and NOT. See the help page for more details.' ) # T: help text for the search dialog if gtk.gtk_version >= (2, 12, 0): self.query_entry.set_tooltip_text(help_text) else: tooltips = gtk.Tooltips() tooltips.set_tip(self.query_entry, help_text) self.namespacecheckbox = gtk.CheckButton(_('Limit search to current namespace')) # T: checkbox option in search dialog self.vbox.pack_start(self.namespacecheckbox, False) # TODO advanced query editor # TODO checkbox _('Match c_ase') # TODO checkbox _('Whole _word') self.results_treeview = SearchResultsTreeView(self.ui) self.vbox.add(ScrolledWindow(self.results_treeview)) self.search_button.connect_object('clicked', self.__class__._search, self) self.cancel_button.connect_object('clicked', self.__class__._cancel, self) self.query_entry.connect_object('activate', self.__class__._search, self) def search(self, query): '''Trigger a search to be performed. Because search can take a long time to execute it is best to call this method after the dialog is shown. @param query: the query as string ''' self.query_entry.set_text(query) self._search() def _search(self): string = self.query_entry.get_text() if self.namespacecheckbox.get_active(): string = 'Namespace: "%s" ' % self.ui.page.name + string #~ print '!! QUERY: ' + string self._set_state(self.SEARCHING) try: self.results_treeview.search(string) except Exception, error: ErrorDialog(self, error).run() if not self.results_treeview.cancelled: self._set_state(self.READY) else: self._set_state(self.CANCELLED) def _cancel(self): self.results_treeview.cancelled = True def _set_state(self, state): # TODO set cursor for treeview part # TODO set label or something ? def hide(button): button.hide_all() button.set_no_show_all(True) def show(button): button.set_no_show_all(False) button.show_all() if state in (self.READY, self.CANCELLED): self.query_entry.set_sensitive(True) hide(self.cancel_button) if self.spinner: self.spinner.stop() hide(self.spinner) show(self.search_button) elif state == self.SEARCHING: self.query_entry.set_sensitive(False) hide(self.search_button) if self.spinner: show(self.spinner) self.spinner.start() show(self.cancel_button) else: assert False, 'BUG: invalid state' class SearchResultsTreeView(BrowserTreeView): NAME_COL = 0 SCORE_COL = 1 PATH_COL = 2 def __init__(self, ui): model = gtk.ListStore(str, int, object) # NAME_COL, SCORE_COL, PATH_COL BrowserTreeView.__init__(self, model) self.ui = ui self.query = None self.selection = SearchSelection(ui.notebook) self.cancelled = False cell_renderer = gtk.CellRendererText() for name, i in ( (_('Page'), 0), # T: Column header search dialog (_('Score'), 1), # T: Column header search dialog ): column = gtk.TreeViewColumn(name, cell_renderer, text=i) column.set_sort_column_id(i) if i == 0: column.set_expand(True) self.append_column(column) model.set_sort_column_id(1, gtk.SORT_DESCENDING) # By default sort by score self.connect('row-activated', self._do_open_page) self.connect('destroy', self.__class__._cancel) def _cancel(self): self.cancelled = True def search(self, query): query = query.strip() if not query: return logger.info('Searching for: %s', query) self.get_model().clear() self.cancelled = False self.query = Query(query) self.selection.search(self.query, callback=self._search_callback) self._update_results(self.selection) def _search_callback(self, results, path): # Returning False will cancel the search #~ print '!! CB', path if results is not None: self._update_results(results) while gtk.events_pending(): gtk.main_iteration(block=False) return not self.cancelled def _update_results(self, results): model = self.get_model() if not model: return # Update score for paths that are already present order = [] seen = set() i = -1 for i, row in enumerate(model): path = row[self.PATH_COL] if path in results: score = results.scores.get(path, row[self.SCORE_COL]) else: score = -1 # went missing !??? - technically a bug row[self.SCORE_COL] = score order.append((score, i)) seen.add(path) # Add new paths new = results - seen for path in new: score = results.scores.get(path, 0) model.append((path.name, score, path)) i += 1 order.append((score, i)) # re-order order.sort() # sort on first item, which is score model.reorder([x[1] for x in order]) # use second item def _do_open_page(self, view, path, col): page = Path( self.get_model()[path][0].decode('utf-8') ) self.ui.open_page(page) # Popup find dialog with same query if self.query and self.query.simple_match: string = self.query.simple_match string = string.strip('*') # support partial matches self.ui.mainwindow.pageview.show_find(string, highlight=True) zim-0.60/zim/gui/customtools.py0000644000175000017500000001343112100717176016442 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Jaap Karssenberg '''This module contains code for defining and managing custom commands. ''' import gtk import logging from zim.gui.applications import CustomToolManager from zim.gui.widgets import Dialog, IconButton, IconChooserButton from zim.fs import File logger = logging.getLogger('zim.gui') class CustomToolManagerDialog(Dialog): def __init__(self, ui): Dialog.__init__(self, ui, _('Custom Tools'), buttons=gtk.BUTTONS_CLOSE) # T: Dialog title self.set_help(':Help:Custom Tools') self.manager = CustomToolManager() self.add_help_text(_( 'You can configure custom tools that will appear\n' 'in the tool menu and in the tool bar or context menus.' ) ) # T: help text in "Custom Tools" dialog hbox = gtk.HBox(spacing=5) self.vbox.add(hbox) self.listview = CustomToolList(self.manager) hbox.add(self.listview) vbox = gtk.VBox(spacing=5) hbox.pack_start(vbox, False) for stock, handler, data in ( (gtk.STOCK_ADD, self.__class__.on_add, None), (gtk.STOCK_EDIT, self.__class__.on_edit, None), (gtk.STOCK_DELETE, self.__class__.on_delete, None), (gtk.STOCK_GO_UP, self.__class__.on_move, -1), (gtk.STOCK_GO_DOWN, self.__class__.on_move, 1), ): button = IconButton(stock) # TODO tooltips for icon button if data: button.connect_object('clicked', handler, self, data) else: button.connect_object('clicked', handler, self) vbox.pack_start(button, False) def on_add(self): properties = EditCustomToolDialog(self).run() if properties: self.manager.create(**properties) self.listview.refresh() def on_edit(self): name = self.listview.get_selected() if name: tool = self.manager.get_tool(name) properties = EditCustomToolDialog(self, tool=tool).run() if properties: tool.update(**properties) tool.write() self.listview.refresh() def on_delete(self): name = self.listview.get_selected() if name: self.manager.delete(name) self.listview.refresh() def on_move(self, step): name = self.listview.get_selected() if name: i = self.manager.index(name) self.manager.reorder(name, i + step) self.listview.refresh() self.listview.select(i+step) class CustomToolList(gtk.TreeView): PIXBUF_COL = 0 TEXT_COL = 1 NAME_COL = 2 def __init__(self, manager): self.manager = manager model = gtk.ListStore(gtk.gdk.Pixbuf, str, str) # PIXBUF_COL, TEXT_COL, NAME_COL gtk.TreeView.__init__(self, model) self.get_selection().set_mode(gtk.SELECTION_BROWSE) self.set_headers_visible(False) cr = gtk.CellRendererPixbuf() column = gtk.TreeViewColumn('_pixbuf_', cr, pixbuf=self.PIXBUF_COL) self.append_column(column) cr = gtk.CellRendererText() column = gtk.TreeViewColumn('_text_', cr, markup=self.TEXT_COL) self.append_column(column) self.refresh() def get_selected(self): model, iter = self.get_selection().get_selected() if model and iter: return model[iter][self.NAME_COL] else: return None def select(self, i): path = (i, ) self.get_selection().select_path(path) def refresh(self): from zim.gui.widgets import encode_markup_text model = self.get_model() model.clear() for tool in self.manager: pixbuf = tool.get_pixbuf(gtk.ICON_SIZE_MENU) text = '%s\n%s' % (encode_markup_text(tool.name), encode_markup_text(tool.comment)) model.append((pixbuf, text, tool.key)) class EditCustomToolDialog(Dialog): def __init__(self, ui, tool=None): Dialog.__init__(self, ui, _('Edit Custom Tool')) # T: Dialog title self.set_help(':Help:Custom Tools') self.vbox.set_spacing(12) if tool: name = tool.name comment = tool.comment execcmd = tool.execcmd readonly = tool.isreadonly toolbar = tool.showintoolbar else: name = '' comment = '' execcmd = '' readonly = False toolbar = False self.add_form(( ('Name', 'string', _('Name')), # T: Input in "Edit Custom Tool" dialog ('Comment', 'string', _('Description')), # T: Input in "Edit Custom Tool" dialog ('X-Zim-ExecTool', 'string', _('Command')), # T: Input in "Edit Custom Tool" dialog ), { 'Name': name, 'Comment': comment, 'X-Zim-ExecTool': execcmd, }, trigger_response=False) # FIXME need ui builder to take care of this as well self.iconbutton = IconChooserButton(stock=gtk.STOCK_EXECUTE) if tool and tool.icon and tool.icon != gtk.STOCK_EXECUTE: try: self.iconbutton.set_file(File(tool.icon)) except Exception, error: logger.exception('Could not load: %s', tool.icon) label = gtk.Label(_('Icon')+':') # T: Input in "Edit Custom Tool" dialog label.set_alignment(0.0, 0.5) hbox = gtk.HBox() i = self.form.get_property('n-rows') self.form.attach(label, 0,1, i,i+1, xoptions=0) self.form.attach(hbox, 1,2, i,i+1) hbox.pack_start(self.iconbutton, False) self.form.add_inputs(( ('X-Zim-ReadOnly', 'bool', _('Command does not modify data')), # T: Input in "Edit Custom Tool" dialog ('X-Zim-ShowInToolBar', 'bool', _('Show in the toolbar')), # T: Input in "Edit Custom Tool" dialog )) self.form.update({ 'X-Zim-ReadOnly': readonly, 'X-Zim-ShowInToolBar': toolbar, }) self.add_help_text(_('''\ The following parameters will be substituted in the command when it is executed: %f the page source as a temporary file %d the attachment directory of the current page %s the real page source file (if any) %n the notebook location (file or folder) %D the document root (if any) %t the selected text or word under cursor %T the selected text including wiki formatting ''') ) # T: Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting def do_response_ok(self): fields = self.form.copy() fields['Icon'] = self.iconbutton.get_file() or None self.result = fields return True zim-0.60/zim/gui/exportdialog.py0000644000175000017500000002373612054221710016551 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import gtk import zim.formats import zim.templates from zim.fs import File, Dir from zim.exporter import Exporter from zim.stores import encode_filename from zim.gui.widgets import Assistant, AssistantPage, \ ProgressBarDialog, ErrorDialog, QuestionDialog class ExportDialog(Assistant): def __init__(self, ui): Assistant.__init__(self, ui, _('Export'), # T: dialog title help=':Help:Export', defaultwindowsize=(400, 325)) self.append_page(InputPage(self)) self.append_page(FormatPage(self)) self.append_page(OutputPage(self)) def do_response_ok(self): #~ import pprint #~ pprint.pprint(self.uistate) #~ return True options = {} for k in ('format', 'template', 'index_page'): if self.uistate[k] and not self.uistate[k].isspace(): options[k] = self.uistate[k] options['format'] = \ zim.formats.canonical_name(options['format']) if options['template'] == '__file__': options['template'] = self.uistate['template_file'] if self.uistate['document_root_url'] == 'url': options['document_root_url'] = self.uistate['document_root_url'] try: exporter = Exporter(self.ui.notebook, **options) except Exception, error: ErrorDialog(self, error).run() return False index = self.ui.notebook.index if index.updating: with ProgressBarDialog(self, _('Updating index')) as dialog: # T: Title of progressbar dialog index.ensure_update(callback=lambda p: dialog.pulse(p.name)) if dialog.cancelled: return False if self.uistate['selection'] == 'all': dir = Dir(self.uistate['output_folder']) if dir.exists() and len(dir.list()) > 0: ok = QuestionDialog(self, ( _('Folder exists: %s') % dir.path, # T: message heading _('Folder already exists and has content, ' 'exporting to this folder may overwrite ' 'existing files. ' 'Do you want to continue?' ) # T: detailed message, answers are Yes and No ) ).run() if not ok: return False with ProgressBarDialog(self, _('Exporting notebook')) as dialog: # T: Title for progressbar window exporter.export_all(dir, callback=lambda p: dialog.pulse(p.name)) elif self.uistate['selection'] == 'selection': pass # TODO elif self.uistate['selection'] == 'page': file = File(self.uistate['output_file']) if file.exists(): ok = QuestionDialog(self, ( _('File exists'), # T: message heading _('This file already exists.\n' 'Do you want to overwrite it?' ) # T: detailed message, answers are Yes and No ) ).run() if not ok: return False page = self.ui.notebook.get_page(self.uistate['selected_page']) # FIXME - HACK - dump and parse as wiki first to work # around glitches in pageview parsetree dumper # main visibility when copy pasting bullet lists # Same hack in gui clipboard code from zim.notebook import Path, Page from zim.formats import get_format parsetree = page.get_parsetree() dumper = get_format('wiki').Dumper() text = ''.join( dumper.dump(parsetree) ).encode('utf-8') parser = get_format('wiki').Parser() parsetree = parser.parse(text) page = Page(Path(page.name), parsetree=parsetree) exporter.export_page(file.dir, page, filename=file.basename) return True class InputPage(AssistantPage): '''Assistant page allowing to select the page(s) for export''' title = _('Select the pages to export') # T: title of step in export dialog def __init__(self, assistant): AssistantPage.__init__(self, assistant) self.add_form(( ('selection:all', 'option', _('Complete _notebook')), # T: Option in export dialog to export complete notebook #~ ('selection:selection', 'option', _('_Selection')), # T: Option in export dialog to export selection #~ ('selection_query', 'string', None), ('selection:page', 'option', _('Single _page')), # T: Option in export dialog to export selection None, ('page', 'page', _('Page')), # T: Input field in export dialog #~ ('recursive', 'bool', _('Recursive')), ), { 'page': assistant.ui.page, }, depends={ 'page': 'selection:page', #~ 'recursive': 'selection:page', } ) self.form.widgets['page'].existing_only = True def init_uistate(self): #~ self.uistate.setdefault('selection', 'all', ('all', 'page')) self.uistate.setdefault('selection', 'all') #~ self.uistate.setdefault('selection_recursive', False) self.form['selection'] = self.uistate['selection'] def save_uistate(self): self.uistate['selection'] = self.form['selection'] self.uistate['selected_page'] = self.form['page'] class FormatPage(AssistantPage): '''Assistant page allowing to select the output format and template''' title = _('Select the export format') # T: title of step in export dialog CHOICE_OTHER = _('Other...') # T: Option in drop down menu to specify another file # FUTURE: this page could have a dynamic form with additional # fields requested by the template, e.g. author etc. def __init__(self, assistant): AssistantPage.__init__(self, assistant) self.export_formats = zim.formats.list_formats(zim.formats.EXPORT_FORMAT) self.add_form(( ('format', 'choice', _('Format'), self.export_formats), # T: Input label in the export dialog ('template', 'choice', _('Template'), ()), # T: Input label in the export dialog ('template_file', 'file', None), None, ('document_root:absolute', 'option', _('Link files under document root with full file path')), # T: radio option in export dialog ('document_root:url', 'option', _('Map document root to URL')+': '), # T: radio option in export dialog ('document_root_url', 'string', None), ), depends={ 'document_root_url': 'document_root:url' } ) # Set template list based on selected format def set_templates(self): format = self.form['format'] format = zim.formats.canonical_name(format) combobox = self.form.widgets['template'] combobox.get_model().clear() for name, _ in zim.templates.list_templates(format): combobox.append_text(name) combobox.append_text(self.CHOICE_OTHER) combobox.set_sensitive(True) template = self.uistate['template'] if template == '__file__': # Select "Other..." combobox.set_active(len(templates)) else: try: self.form['template'] = template except ValueError: combobox.set_active(0) self.form.widgets['format'].connect_object('changed', set_templates, self) # Hook template entry to be sensitive on "Other.." self.form.widgets['template_file'].set_sensitive(False) self.form.widgets['template'].connect('changed', lambda o: self.form.widgets['template_file'].set_sensitive( o.get_active_text() == self.CHOICE_OTHER) ) # Check if we have a document root - if not disable all options docroot = assistant.ui.notebook.document_root if not docroot: for widget in self.form.widgets: if widget.startswith('document_root:'): self.form.widgets[widget].set_sensitive(False) self.uistate['document_root_url'] = '' def init_uistate(self): self.uistate.setdefault('format', 'HTML') self.uistate.setdefault('template', 'Default') self.uistate.setdefault('template_file', '') self.uistate.setdefault('document_root', 'absolute', check=set(('absolute', 'url'))) self.uistate.setdefault('document_root_url', '') try: self.form['format'] = self.uistate['format'] if self.uistate['template'] == '__file__': self.form['template'] = self.CHOICE_OTHER else: self.form['template'] = self.uistate['template'] except ValueError: pass self.form['template_file'] = self.uistate['template_file'] self.form['document_root'] = self.uistate['document_root'] self.form['document_root_url'] = self.uistate['document_root_url'] def save_uistate(self): self.uistate.update(self.form) if self.uistate['template'] == self.CHOICE_OTHER: self.uistate['template'] = '__file__' class OutputPage(AssistantPage): '''Assistant page allowing to select output file or folder''' title = _('Select the output file or folder') # T: title of step in export dialog def __init__(self, assistant): AssistantPage.__init__(self, assistant) self.add_form(( ('folder', 'dir', _('Output folder')), # T: Label for folder selection in export dialog ('index', 'string', _('Index page')), # T: Label for setting a name for the index of exported pages # TODO validation for this entry - valid name, but not existing ('file', 'output-file', _('Output file')), # T: Label for file selection in export dialog ), depends={ 'index': 'folder', } ) for widget in self.form.widgets: self.form.widgets[widget].set_no_show_all(True) def init_uistate(self): # Switch between folder selection or file selection based # on whether we selected full notebook or single page in the # first page self.uistate.setdefault('output_folder', '', Dir) self.uistate.setdefault('index_page', '') self.uistate.setdefault('output_file', '', File) show_file = self.uistate.get('selection') == 'page' if show_file: self.form.widgets['folder'].set_sensitive(False) self.form.widgets['folder'].hide() self.form.widgets['file'].set_sensitive(True) self.form.widgets['file'].show() else: self.form.widgets['folder'].set_sensitive(True) self.form.widgets['folder'].show() self.form.widgets['file'].set_sensitive(False) self.form.widgets['file'].hide() if show_file: basename = self.uistate['selected_page'].basename ext = zim.formats.get_format(self.uistate['format']).info['extension'] if self.uistate['output_file'] \ and isinstance(self.uistate['output_file'], File): dir = self.uistate['output_file'].dir file = dir.file(encode_filename(basename + '.' + ext)) else: file = File('~/' + encode_filename(basename + '.' + ext)) self.uistate['output_file'] = file self.form['file'] = self.uistate['output_file'] self.form['folder'] = self.uistate['output_folder'] def save_uistate(self): self.uistate['output_file'] = self.form['file'] self.uistate['output_folder'] = self.form['folder'] self.uistate['index_page'] = self.form['index'] zim-0.60/zim/gui/widgets.py0000664000175000017500000037632012132472704015530 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2012 Jaap Karssenberg '''This module contains a number of custom gtk widgets that are used in the zim gui modules. These include base clases for windows and dialogs like L{Window}, L{Dialog}, L{FileDialog}, L{QuestionDialog}, L{ErrorDialog}, and L{Assistant}. Especially the Dialog class contains a number of convenience methods. An important class is te L{InputForm} which is used extensively in the zim gui to layout forms of input fields etc. And the related specialized input widgets like L{InputEntry}, L{FileEntry}, L{FolderEntry}, L{LinkEntry}, L{PageEntry} and L{NamespaceEntry}. These widgets take care of converting specific object types, proper utf-8 encoding etc. The remaining classes are various widgets used in the gui: L{Button}, L{IconButton}, L{IconChooserButton}, L{MenuButton}, L{ImageView}, L{SingleClickTreeView}, L{BrowserTreeView}, and L{TextBuffer} @newfield requires: Requires ''' import gobject import gtk import pango import logging import sys import os import re import weakref import unicodedata try: import gtksourceview2 except ImportError: gtksourceview2 = None import zim import zim.errors import zim.config from zim.fs import File, Dir from zim.config import value_is_coord from zim.notebook import Notebook, Path, PageNameError from zim.parsing import link_type from zim.signals import ConnectorMixin logger = logging.getLogger('zim.gui') if os.environ.get('ZIM_TEST_RUNNING'): TEST_MODE = True TEST_MODE_RUN_CB = None else: TEST_MODE = False TEST_MODE_RUN_CB = None # Check the (undocumented) list of constants in gtk.keysyms to see all names KEYVAL_LEFT = gtk.gdk.keyval_from_name('Left') KEYVAL_RIGHT = gtk.gdk.keyval_from_name('Right') KEYVALS_ASTERISK = ( gtk.gdk.unicode_to_keyval(ord('*')), gtk.gdk.keyval_from_name('KP_Multiply')) KEYVALS_SLASH = ( gtk.gdk.unicode_to_keyval(ord('\\')), gtk.gdk.unicode_to_keyval(ord('/')), gtk.gdk.keyval_from_name('KP_Divide')) KEYVAL_ESC = gtk.gdk.keyval_from_name('Escape') # UI Environment config. Would properly belong in zim.gui.__init__ # but defined here to avoid unnecessary dependencies on zim.gui ui_environment = { 'platform': None, # platform name to trigger platform specific optimizations 'maxscreensize': None, # max screensize _if_ fixed by the platform 'smallscreen': False, # trigger optimizations for small screens } # Check for Maemo environment if zim.PLATFORM == 'maemo': import hildon gtkwindowclass = hildon.Window ui_environment['platform'] = 'maemo' if hasattr(gtkwindowclass,'set_app_menu'): ui_environment['maemo_version'] = 'maemo5' else: ui_environment['maemo_version'] = 'maemo4' ui_environment['maxscreensize'] = (800, 480) ui_environment['smallscreen'] = True # Maemo gtk UI bugfix: expander-size is set to 0 by default gtk.rc_parse_string('''\ style "toolkit" { GtkTreeView::expander-size = 12 } class "GtkTreeView" style "toolkit" ''' ) else: gtkwindowclass = gtk.Window def encode_markup_text(text): '''Encode text such that it can be used in a piece of markup text without causing errors. Needed for all places where e.g. a label depends on user input and is formatted with markup to show it as bold text. @param text: label text as string @returns: encoded text ''' return text.replace('&', '&').replace('>', '>').replace('<', '<') def decode_markup_text(text): '''Decode text that was encoded with L{encode_markup_text()} and remove any markup tags. @param text: markup text @returns: normal text ''' text = re.sub('<.*?>', '', text) return text.replace('>', '>').replace('<', '<').replace('&', '&') def gtk_window_set_default_icon(): '''Function to set the zim icon as the default window icon for all gtk windows in this process. ''' from zim.config import ZIM_DATA_DIR, XDG_DATA_HOME, XDG_DATA_DIRS iconlist = [] if ZIM_DATA_DIR: dir = ZIM_DATA_DIR + '../icons' for name in ('zim16.png', 'zim32.png', 'zim48.png'): file = dir.file(name) if file.exists(): pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) iconlist.append(pixbuf) else: sizes = ['16x16', '32x32', '48x48'] for dir in [XDG_DATA_HOME] + XDG_DATA_DIRS: for size in sizes: file = dir.file('icons/hicolor/%s/apps/zim.png' % size) if file.exists(): sizes.remove(size) pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) iconlist.append(pixbuf) if not sizes: break if not iconlist: # fall back to data/zim.png file = zim.config.data_file('zim.png') pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) iconlist.append(pixbuf) # also register it as stock since theme apparently is not found factory = gtk.IconFactory() factory.add_default() set = gtk.IconSet(pixbuf=pixbuf) factory.add('zim', set) if len(iconlist) < 3: logger.warn('Could not find all icon sizes for the application icon') gtk.window_set_default_icon_list(*iconlist) def ScrolledWindow(widget, hpolicy=gtk.POLICY_AUTOMATIC, vpolicy=gtk.POLICY_AUTOMATIC): '''Wrap C{widget} in a C{gtk.ScrolledWindow} and return the resulting widget @param widget: any Gtk widget @param hpolicy: the horizontal scrollbar policy @param vpolicy: the vertical scrollbar policy @returns: a C{gtk.ScrolledWindow} ''' window = gtk.ScrolledWindow() window.set_policy(hpolicy, vpolicy) window.set_shadow_type(gtk.SHADOW_IN) window.add(widget) if hpolicy == gtk.POLICY_NEVER: hsize = -1 # do not set else: hsize = 24 if vpolicy == gtk.POLICY_NEVER: vsize = -1 # do not set else: vsize = 24 window.set_size_request(hsize, vsize) # scrolled widgets have at least this size... # by setting this minimum widgets can not "disappear" when # HPaned or VPaned bar is pulled all the way return window def ScrolledTextView(text=None, monospace=False): '''Initializes a C{gtk.TextView} with sane defaults for displaying a piece of multiline text and wraps it in a scrolled window @param text: initial text to show in the textview @param monospace: when C{True} the font will be set to monospaced and line wrapping disabled, use this to display log files etc. @returns: a 2-tuple of the scrolled window and the textview ''' textview = gtk.TextView(TextBuffer()) textview.set_editable(False) textview.set_left_margin(5) textview.set_right_margin(5) if monospace: font = pango.FontDescription('Monospace') textview.modify_font(font) else: textview.set_wrap_mode(gtk.WRAP_WORD) if text: textview.get_buffer().set_text(text) window = ScrolledWindow(textview) return window, textview def ScrolledSourceView(text=None, syntax=None): '''If GTKSourceView was succesfully loaded, this generates a SourceView and initializes it. Otherwise ScrolledTextView will be used as a fallback. @param text: initial text to show in the view @param syntax: this will try to enable syntax highlighting for the given language. If None, no syntax highlighting will be enabled. @returns: a 2-tuple of a window and a view. ''' if gtksourceview2: gsvbuf = gtksourceview2.Buffer() if syntax: gsvbuf.set_highlight_syntax(True) language_manager = gtksourceview2.LanguageManager() gsvbuf.set_language(language_manager.get_language(syntax)) if text: gsvbuf.set_text(text) textview = gtksourceview2.View(gsvbuf) textview.set_property("show-line-numbers", True) textview.set_property("auto-indent", True) font = pango.FontDescription('Monospace') textview.modify_font(font) textview.set_property("smart-home-end", True) window = ScrolledWindow(textview) return (window, textview) else: return ScrolledTextView(text=text, monospace=True) def populate_popup_add_separator(menu, prepend=False): '''Convenience function that adds a C{gtk.SeparatorMenuItem} to a context menu. Checks if the menu already contains items, if it is empty does nothing. Also if the menu already has a seperator in the required place this function does nothing. This helps with building menus more dynamically. @param menu: the C{gtk.Menu} object for the popup @param prepend: if C{False} append, if C{True} prepend ''' items = menu.get_children() if not items: pass # Nothing to do elif prepend: if not isinstance(items[0], gtk.SeparatorMenuItem): sep = gtk.SeparatorMenuItem() menu.prepend(sep) else: if not isinstance(items[-1], gtk.SeparatorMenuItem): sep = gtk.SeparatorMenuItem() menu.append(sep) def gtk_combobox_set_active_text(combobox, text): '''Opposite of C{gtk.ComboBox.get_active_text()}. Sets the active item based on a string. Will match this string against the list of options and select the correct index. @raises ValueError: when the string is not found in the list. ''' model = combobox.get_model() for i, value in enumerate(model): if value[0] == text: return combobox.set_active(i) else: raise ValueError, text def gtk_notebook_get_active_tab(nb): '''Returns the label of the active tab or C{None}''' widget = gtk_notebook_get_active_page(nb) if widget: return nb.get_tab_label_text(widget) else: return None def gtk_notebook_get_active_page(nb): '''Returns the active child widget or C{None}''' num = nb.get_current_page() if num >= 0: return nb.get_nth_page(num) else: return None def gtk_notebook_set_active_tab(nb, label): '''Set active tab by the label of the tab''' for child in nb.get_children(): if nb.get_tab_label_text(child) == label: num = nb.page_num(child) nb.set_current_page(num) break else: raise ValueError, 'No such tab: %s' % label class TextBuffer(gtk.TextBuffer): '''Sub-class of C{gtk.TextBuffer} that handles utf-8 decoding''' def get_text(self, start, end, include_hidden_chars=True): text = gtk.TextBuffer.get_text(self, start, end, include_hidden_chars) if text: text = text.decode('utf-8') return text def get_slice(self, start, end, include_hidden_chars=True): text = gtk.TextBuffer.get_slice(self, start, end, include_hidden_chars) if text: text = text.decode('utf-8') return text def rotate_pixbuf(pixbuf): '''Rotate the pixbuf to match orientation from EXIF info. This is intended for e.g. photos that have EXIF information that shows how the camera was held. @returns: a new version of the pixbuf or the pixbuf itself. ''' # Values for orientation seen in some random snippet in gtkpod o = pixbuf.get_option('orientation') if o: o = int(o) if o == 3: # 180 degrees return pixbuf.rotate_simple(gtk.gdk.PIXBUF_ROTATE_UPSIDEDOWN) elif o == 6: # 270 degrees return pixbuf.rotate_simple(gtk.gdk.PIXBUF_ROTATE_CLOCKWISE) elif o == 9: # 90 degrees return pixbuf.rotate_simple(gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE) else: # No rotation info, older gtk version, or advanced transpose return pixbuf def help_text_factory(text): '''Create a label with an "info" icon in front of it. Intended for informational text in dialogs. @param text: the text to display @returns: a C{gtk.HBox} ''' hbox = gtk.HBox(spacing=12) image = gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_BUTTON) image.set_alignment(0.5, 0.0) hbox.pack_start(image, False) label = gtk.Label(text) label.set_use_markup(True) label.set_alignment(0.0, 0.0) hbox.add(label) return hbox def _do_sync_widget_state(widget, a, subject): # Signal handler to update state of subject based on state of widget subject.set_sensitive(widget.get_property('sensitive')) subject.set_no_show_all(widget.get_no_show_all()) if widget.get_property('visible'): subject.show() else: subject.hide() def _do_sync_widget_state_check_active(widget, *a): if len(a) == 1: subject = a[0] else: subject = a[1] _do_sync_widget_state(widget, '', subject) subject.set_sensitive(widget.get_active()) def _sync_widget_state(widget, subject, check_active=False): # Hook label or secondary widget to follow state of e.g. entry widget # check_active is only meaningful if widget is a togglebutton and # will also add a dependency on the active state of the widget check_active = check_active and hasattr(widget, 'get_active') if check_active: func = _do_sync_widget_state_check_active else: func = _do_sync_widget_state func(widget, '', subject) for property in ('visible', 'no-show-all', 'sensitive'): widget.connect_after('notify::%s' % property, func, subject) if check_active: subject.set_sensitive(widget.get_active()) widget.connect_after('toggled', func, subject) def input_table_factory(inputs, table=None): '''Function to help with the layout of widgets in tables. Only use this function directly if you want a completely custom input form. For standard forms see the L{InputForm} class. @param inputs: a list of inputs. These inputs should be either a tuple of a string and one or more widgets, a single widget, or C{None}. For a tuple the lable will be lined out in the first column followed by all the widgets. If a tuple is given and the first item is C{None}, the widget will be lined out in the 2nd column. A single widget will be lined out in line with the lables (this is meant for e.g. checkboxes that have the label behind the checkbox as part of the widget). A input that has a C{None} value will result in an empty row in the table, separating field above and below. @param table: options C{gtk.Table}, if given inputs will be appended to this table @returns: a C{gtk.Table} ''' if table is None: table = gtk.Table() table.set_border_width(5) table.set_row_spacings(5) table.set_col_spacings(12) i = table.get_property('n-rows') for input in inputs: if input is None: table.attach(gtk.Label(' '), 0,1, i,i+1, xoptions=gtk.FILL) # HACK: force empty row to have height of label elif isinstance(input, tuple): text = input[0] if text: label = gtk.Label(text + ':') label.set_alignment(0.0, 0.5) else: label = gtk.Label(' '*4) # minimum label width table.attach(label, 0,1, i,i+1, xoptions=gtk.FILL) _sync_widget_state(input[1], label) for j, widget in enumerate(input[1:]): if isinstance(widget, gtk.Entry): table.attach(widget, j+1,j+2, i,i+1, xoptions=gtk.FILL|gtk.EXPAND) else: table.attach(widget, j+1,j+2, i,i+1, xoptions=gtk.FILL) if j > 0: _sync_widget_state(input[1], widget) else: widget = input table.attach(widget, 0,4, i,i+1) # We span 4 columns here so in case these widgets are # the widest in the tables (e.g. checkbox + label) # they don't force expanded size on first 3 columns # (e.g. label + entry + button). i += 1 return table class Button(gtk.Button): '''Sub-class of C{gtk.Button} which changes the constructor to allow specifying a stock icon I{and} a label at the same time. ''' def __init__(self, label=None, stock=None, use_underline=True, status_bar_style=False): '''Constructor If both C{label} and C{stock} are given the button will have a stock icon but a custom label (for the default C{gtk.Button} class this is an "either or" choice). If only stock or only label is given, it falls back to the default behavior. @param label: text for the button @param stock: constant for a stock item @param use_underline: if C{True} a "_" in the label will @param status_bar_style: when C{True} all padding and border underline the next character ''' if label is None or stock is None: gtk.Button.__init__(self, label=label, stock=stock) else: gtk.Button.__init__(self, label=label) icon = gtk.image_new_from_stock(stock, gtk.ICON_SIZE_BUTTON) self.set_image(icon) self.set_use_underline(use_underline) if status_bar_style: button_set_statusbar_style(self) class IconButton(gtk.Button): '''Button with a stock icon, but no label.''' def __init__(self, stock, relief=True, size=gtk.ICON_SIZE_BUTTON): '''Constructor @param stock: constant for the stock item @param relief: when C{False} the button has no visible raised edge and will be flat against the background @param size: the icon size ''' gtk.Button.__init__(self) icon = gtk.image_new_from_stock(stock, size) self.add(icon) self.set_alignment(0.5, 0.5) if not relief: self.set_relief(gtk.RELIEF_NONE) def CloseButton(): '''Constructs a close button for panes and bars''' return IconButton(gtk.STOCK_CLOSE, relief=False, size=gtk.ICON_SIZE_MENU) class IconChooserButton(gtk.Button): '''Widget to allow the user to choose an icon. Intended e.g. for the dialog to configure a custom tool to set an icon for the tool. Shows a button with an image of the icon which opens up a file dialog when clicked. ''' def __init__(self, stock=gtk.STOCK_MISSING_IMAGE, pixbuf=None): '''Constructor @param stock: initial stock icon (until an icon is selected) @param pixbuf: initial image as pixbuf (until an icon is selected) ''' gtk.Button.__init__(self) self.file = None image = gtk.Image() self.add(image) self.set_alignment(0.5, 0.5) if pixbuf: image.set_from_pixbuf(pixbuf) else: image.set_from_stock(stock, gtk.ICON_SIZE_DIALOG) def do_clicked(self): dialog = FileDialog(self, _('Select File')) # T: dialog title dialog.add_filter_images() file = dialog.run() if file: self.set_file(file) def set_file(self, file): '''Set the file to display in the chooser button @param file: a L{File} object ''' image = self.get_child() size = max(image.size_request()) # HACK to get icon size pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(file.path, size, size) image.set_from_pixbuf(pixbuf) self.file = file def get_file(self): '''Get the selected icon file @returns: a L{File} object ''' return self.file # Need to register classes defining / overriding gobject signals gobject.type_register(IconChooserButton) class SingleClickTreeView(gtk.TreeView): '''Sub-class of C{gtk.TreeView} that implements single-click navigation. ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'populate-popup': (gobject.SIGNAL_RUN_LAST, None, (object,)), } mask = gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK # backwards compatibility if gtk.gtk_version < (2, 12, 0): def set_rubber_banding(self, enable): pass def is_rubber_banding_active(self): return False def do_button_press_event(self, event): # Implement hook for context menu if event.type == gtk.gdk.BUTTON_PRESS \ and event.button == 3: # Check selection state - item under cursor should be selected # see do_button_release_event for comments x, y = map(int, event.get_coords()) info = self.get_path_at_pos(x, y) selection = self.get_selection() if x > 0 and y > 0 and not info is None: path, column, x, y = info if not selection.path_is_selected(path): selection.unselect_all() selection.select_path(path) # else the clcik was on a already selected path else: # click outside area with items ? selection.unselect_all() # Pop menu menu = self.get_popup() if menu: menu.show_all() menu.popup(None, None, None, 3, event.get_time()) else: return gtk.TreeView.do_button_press_event(self, event) def do_button_release_event(self, event): # Implement single click behavior for activating list items # this needs to be done on button release to avoid conflict with # selections, drag-n-drop, etc. if event.type == gtk.gdk.BUTTON_RELEASE \ and event.button == 1 and not event.state & self.mask \ and not self.is_rubber_banding_active(): x, y = map(int, event.get_coords()) # map to int to suppress deprecation warning :S # note that get_coords() gives back (0, 0) when cursor # is outside the treeview window (e.g. drag & drop that # was started inside the tree - see bug lp:646987) info = self.get_path_at_pos(x, y) if x > 0 and y > 0 and not info is None: path, column, x, y = info if self.get_selection().path_is_selected(path): self.row_activated(path, column) # This action is conditional on the path being selected # because otherwise we can not toggle the folding state # of a path without activating it. The assumption being # that the path gets selected on button press and then # gets activated on button release. Clicking the # expander in front of a path should not select the path. # This logic is based on particulars of the C implementation # and might not be future proof. return gtk.TreeView.do_button_release_event(self, event) def get_popup(self): '''Get a popup menu (the context menu) for this widget @returns: a C{gtk.Menu} or C{None} @emits: populate-popup @implementation: do NOT overload this method, implement L{do_initialize_popup} instead ''' menu = gtk.Menu() self.do_initialize_popup(menu) self.emit('populate-popup', menu) if len(menu.get_children()) > 0: return menu else: return None def do_initialize_popup(self, menu): '''Initialize the context menu. This method is called before the C{populate-popup} signal and can be used to put any standard items in the menu. @param menu: the C{gtk.Menu} object for the popup @implementation: can be implemented by sub-classes. Default implementation calls L{populate_popup_expand_collapse()} if the model is a C{gtk.TreeStore}. Otherwise it does nothing. ''' model = self.get_model() if isinstance(model, gtk.TreeStore): self.populate_popup_expand_collapse(menu) def populate_popup_expand_collapse(self, menu, prepend=False): '''Adds "Expand _all" and "Co_llapse all" items to a context menu. Called automatically by the default implementation of L{do_initialize_popup()}. @param menu: the C{gtk.Menu} object for the popup @param prepend: if C{False} append, if C{True} prepend ''' expand = gtk.MenuItem(_("Expand _All")) # T: menu item in context menu expand.connect_object('activate', self.__class__.expand_all, self) collapse = gtk.MenuItem(_("_Collapse All")) # T: menu item in context menu collapse.connect_object('activate', self.__class__.collapse_all, self) populate_popup_add_separator(menu, prepend=prepend) if prepend: menu.prepend(collapse) menu.prepend(expand) else: menu.append(expand) menu.append(collapse) def get_cell_renderer_number_of_items(self): '''Get a C{gtk.CellRendererText} that is set up for rendering the number of items below a tree item. Used to enforce common style between tree views. @returns: a C{gtk.CellRendererText} object ''' cr = gtk.CellRendererText() cr.set_property('xalign', 1.0) #~ cr2.set_property('scale', 0.8) cr.set_property('foreground', 'darkgrey') return cr # Need to register classes defining / overriding gobject signals gobject.type_register(SingleClickTreeView) class BrowserTreeView(SingleClickTreeView): '''Sub-class of C{gtk.TreeView} that is intended for hierarchic lists that can be navigated in "browser mode". It inherits the single-click behavior of L{SingleClickTreeView} and adds the following keybindings: - C{}: Collapse sub-items - C{}: Expand sub-items - C{\}: Collapse whole tree - C{*}: Expand whole tree ''' # TODO some global option to restore to double click navigation ? def __init__(self, *arg): '''Constructor, all arguments are passed to C{gtk.TreeView}''' gtk.TreeView.__init__(self, *arg) self.get_selection().set_mode(gtk.SELECTION_BROWSE) def do_key_press_event(self, event): # Keybindings for the treeview: # * expand all # / or \ collapse all # Right expand sub items # Left collapse sub items handled = True #~ print 'KEY %s (%i)' % (gtk.gdk.keyval_name(event.keyval), event.keyval) if event.keyval in KEYVALS_ASTERISK: self.expand_all() elif event.keyval in KEYVALS_SLASH: self.collapse_all() elif event.keyval == KEYVAL_LEFT: model, paths = self.get_selection().get_selected_rows() if len(paths) == 1: self.collapse_row(paths[0]) elif event.keyval == KEYVAL_RIGHT: model, paths = self.get_selection().get_selected_rows() if len(paths) == 1: self.expand_row(paths[0], 0) else: handled = False if handled: return True else: return gtk.TreeView.do_key_press_event(self, event) # Need to register classes defining / overriding gobject signals gobject.type_register(BrowserTreeView) def button_set_statusbar_style(button): # Set up a style for the statusbar variant to decrease spacing of the button gtk.rc_parse_string('''\ style "zim-statusbar-button-style" { GtkWidget::focus-padding = 0 GtkWidget::focus-line-width = 0 xthickness = 0 ythickness = 0 } widget "*.zim-statusbar-button" style "zim-statusbar-button-style" ''') button.set_name('zim-statusbar-button') button.set_relief(gtk.RELIEF_NONE) class MenuButton(gtk.HBox): '''This class implements a button which pops up a menu when clicked. It behaves different from a combobox because it is not a selector and the button does not show the selected item. So it more like a normal menu. Main example where this class is used is the button with backlinks in the statusbar of the main window. This module is based loosely on gedit-status-combo-box.c from the gedit sources. ''' def __init__(self, label, menu, status_bar_style=False): '''Constructor @param label: the label to show on the button (string or C{gtk.Label}) @param menu: the menu to show on button click @param status_bar_style: when C{True} all padding and border is removed so the button fits in the status bar ''' gtk.HBox.__init__(self) if isinstance(label, basestring): self.label = gtk.Label() self.label.set_markup_with_mnemonic(label) else: assert isinstance(label, gtk.Label) self.label = label self.menu = menu self.button = gtk.ToggleButton() if status_bar_style: button_set_statusbar_style(self.button) widget = self.label else: arrow = gtk.Arrow(gtk.ARROW_UP, gtk.SHADOW_NONE) widget = gtk.HBox(spacing=3) widget.pack_start(self.label, False) widget.pack_start(arrow, False) self.button.add(widget) # We need to wrap stuff in an eventbox in order to get the gdk.Window # which we need to get coordinates when positioning the menu self.eventbox = gtk.EventBox() self.eventbox.add(self.button) self.add(self.eventbox) self.button.connect_object( 'button-press-event', self.__class__.popup_menu, self) self._clicked_signal = self.button.connect_object( 'clicked', self.__class__.popup_menu, self) # TODO reduce size of toggle-button - see gedit-status-combo for example # TODO looks like other statusbar items resize on toggle button def popup_menu(self, event=None): '''This method actually pops up the menu. @param event: the gdk event that triggered this action @implementation: can be overloaded, e.g. to populate the menu dynamically. ''' if not self.get_property('sensitive'): return if event: # we came from button-press-event or similar button = event.button time = event.time if self.button.get_active(): return else: button = 0 time = gtk.get_current_event_time() self.button.handler_block(self._clicked_signal) self.button.set_active(True) self.button.handler_unblock(self._clicked_signal) self.menu.connect('deactivate', self._deactivate_menu) self.menu.show_all() self.menu.popup(None, None, self._position_menu, button, time) def _position_menu(self, menu): x, y = self.eventbox.window.get_origin() w, h = menu.get_toplevel().size_request() y -= h # make the menu pop above the button return x, y, False def _deactivate_menu(self, menu): self.button.handler_block(self._clicked_signal) self.button.set_active(False) self.button.handler_unblock(self._clicked_signal) # Need to register classes defining / overriding gobject signals gobject.type_register(MenuButton) class PanedClass(object): # We change default packing to shrink=False def pack1(self, widget, resize=True, shrink=False): gtk.Paned.pack1(self, widget, resize, shrink) def pack2(self, widget, resize=True, shrink=False): gtk.Paned.pack2(self, widget, resize, shrink) add1 = pack1 add2 = pack2 def add(*a): raise NotImplementedError def pack(*a): raise NotImplementedError class HPaned(PanedClass, gtk.HPaned): pass class VPaned(PanedClass, gtk.VPaned): pass class InputForm(gtk.Table): '''This class implements a table with input widgets. It takes care of constructing the widgets and lay them out as a well formatted input form. This class can be accessed as a dict to get and set the values of the various input widgets by name. This makes it more or less transparent when getting and setting values from the form into the config or preferences. @ivar notebook: the L{Notebook} object, used e.g. for completion in L{PageEntry} inputs @ivar widgets: a dict with the input widgets by name. Use this to access the widgets directly (e.g. to wire more signals). @signal: C{last-activated ()}: this signal is emitted when the last widget in the form is activated, can be used to trigger a default response in a dialog. @signal: C{input-valid-changes ()}: valid state the form changed ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'last-activated': (gobject.SIGNAL_RUN_LAST, None, ()), 'input-valid-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } # Supported input widgets: # CheckButton # RadioButton # SpinButton # ComboBox (text based) # PageEntry / NamespaceEntry / LinkEntry # InputEntry # Because of naming used to map radio buttons into a group # we can't use the keys of the widget mapping one-on-one for # the value mapping. This is why we keep the attribute '_keys'. def __init__(self, inputs=None, values=None, depends=None, notebook=None): '''Constructor. @param inputs: list with input definitions, see L{add_inputs()} for details @param values: initial values for the inputs @param depends: dict with dependencies between widgets, see L{depends()} for details @param notebook: a L{Notebook} object, e.g. for completion in L{PageEntry} inputs ''' gtk.Table.__init__(self) self.set_border_width(5) self.set_row_spacings(5) self.set_col_spacings(12) self.notebook = notebook self._input_valid = True self._keys = [] # names of options - radiogroups are represented as a single item self.widgets = {} # all widgets - contains individual radiobuttons self._widgets = [] # sequence for widgets in self.widgets if inputs: self.add_inputs(inputs) if depends: for k, v in depends.items(): self.depends(k, v) if values: self.update(values) #{ Form construction methods def add_inputs(self, inputs): '''Add input widgets to the form. Inputs are defined by 3-tuples or 4-tuples of: - The input name - The input type - The label to put in front of the input field - optional extra argument The following input types are supported: - "C{bool}" - C{True} or C{False} (checkbox) - "C{int}" - integer (spin button) - "C{string}" - text entry (L{InputEntry}) - "C{password}" - text entry with chars hidden (L{InputEntry}) - "C{page}" - a page L{Path} (L{PageEntry}) - "C{namespace}" - a namespace L{Path} (L{NamespaceEntry}) - "C{link}" - a link as string (L{LinkEntry}) - "C{dir}" - a L{Dir} object (L{FolderEntry}) - "C{file}" - a L{File} object for an existing file (L{FileEntry}) - "C{image}" - like 'file' but specific for images - "C{output-file}" - like 'file' but for new or existing file - "C{option}" - single option in a group (radio checkboxes) - "C{choice}" - list with choices (combo box) - "C{color}" - color string The "C{int}" and "C{choice}" options need an extra argument to specify the allowed inputs. For "C{int}" this should be a 2-tuple with the minimum and maximum values. For 'choice' it should be a tuple or list with the items to choose from. If the items in the list are 2-tuples they are considered pairs of a key and a user readable label. The input type "C{option}"' can be used to have groups of checkboxes. In this case the name should exist of two parts separated by a ':', first part is the group name and the second part the key for this option. This way multiple options of the same group can be specified as separate widgets. Only the group name will show up as a key in the form, and the value will be the option name of the selected radio button. So you can have names like "select:all" and "select:page" which will result in two radiobuttons. The form will have a key "select" which has either a value "all" or a value "page". The "C{page}", "C{namespace}" and "C{link}" types support an optional extra argument which gives the reference L{Path} for resolving relative paths. This also requires the notebook to be set. A L{None} value in the input list will result in additional row spacing in the form. ''' # For options we use rsplit to split group and option name. # The reason for this that if there are any other ":" separated # parts they belong to the group name, not the option name. # (This is used in e.g. the preference dialog to encode sections # where an option goes in the config.) widgets = [] for input in inputs: if input is None: widgets.append(None) continue if len(input) == 4: name, type, label, extra = input else: name, type, label = input extra = None if type == 'bool': widgets.append(gtk.CheckButton(label=label)) elif type == 'option': assert ':' in name, 'BUG: options should have name of the form "group:key"' key, _ = name.rsplit(':', 1) # using rsplit to assure another ':' in the # group name is harmless group = self._get_radiogroup(key) if not group: group = None # we are the first widget else: group = group[0][1] # link first widget in group widgets.append(gtk.RadioButton(group=group, label=label)) elif type == 'int': button = gtk.SpinButton() button.set_range(*extra) button.set_increments(1, 5) widgets.append((label, button)) elif type == 'choice': combobox = gtk.combo_box_new_text() if all(isinstance(t, tuple) for t in extra): mapping = {} for key, value in extra: combobox.append_text(value) mapping[value] = key combobox.zim_key_mapping = mapping else: for option in extra: combobox.append_text(option) widgets.append((label, combobox)) elif type == 'link': #~ assert self.notebook entry = LinkEntry(self.notebook, path=extra) # FIXME use inline icon for newer versions of Gtk button = gtk.Button('_Browse') button.connect_object('clicked', entry.__class__.popup_dialog, entry) widgets.append((label, entry, button)) elif type == 'page': #~ assert self.notebook entry = PageEntry(self.notebook, path=extra) widgets.append((label, entry)) elif type == 'namespace': #~ assert self.notebook entry = NamespaceEntry(self.notebook, path=extra) widgets.append((label, entry)) elif type in ('dir', 'file', 'image', 'output-file'): if type == 'dir': entry = FolderEntry() else: new = (type == 'output-file') entry = FileEntry(new=new) entry.file_type_hint = type # FIXME use inline icon for newer versions of Gtk button = gtk.Button('_Browse') button.connect_object('clicked', entry.__class__.popup_dialog, entry) widgets.append((label, entry, button)) elif type in ('string', 'password'): entry = InputEntry() entry.zim_type = type if type == 'password': entry.set_visibility(False) if extra: entry.set_check_func(extra) widgets.append((label, entry)) elif type == 'color': button = gtk.ColorButton() widgets.append((label, button)) else: assert False, 'BUG: unknown field type: %s' % type # Register widget widget = widgets[-1] if isinstance(widget, tuple): widget = widget[1] self.widgets[name] = widget self._widgets.append(name) if ':' in name: # radio button - only add group once group, _ = name.split(':', 1) if not group in self._keys: self._keys.append(group) else: self._keys.append(name) # Connect activate signal if isinstance(widget, gtk.Entry): widget.connect('activate', self.on_activate_widget) elif isinstance(widget, gtk.ComboBox): widget.connect('changed', self.on_activate_widget) else: pass # Connect valid state if isinstance(widget, InputEntry): widget.connect('input-valid-changed', self._check_input_valid) for property in ('visible', 'sensitive'): widget.connect_after('notify::%s' % property, self._check_input_valid) input_table_factory(widgets, table=self) self._check_input_valid() # update our state def depends(self, subject, object): '''Make one of the inputs depend on another widget. This means that e.g. the "subject" widget will become insensitive when the "object" widget is made insensitive. Also hiding the "object" will result in the "subject" being hidden as well. If the "object" has an active state (e.g. if it is an checkbox or a radio option) the "subject" will only be sensitive when the "object" is active. This is useful e.g. when you want a text input that is only sensitive when a specific radio box is selected. @param subject: the name of the subject widget @param object: the name of the object widget ''' subject = self.widgets[subject] object = self.widgets[object] _sync_widget_state(object, subject, check_active=True) def get_input_valid(self): '''Get combined state of all sensitive widgets in the form @returns: C{True} if all sensitive widgets have a valid input ''' return self._input_valid def _check_input_valid(self, *a): # Called by signals when widget state changes #~ print '-'*42 valid = [] for name in self._widgets: widget = self.widgets[name] if isinstance(widget, InputEntry) \ and widget.get_property('visible') \ and widget.get_property('sensitive'): valid.append(self.widgets[name].get_input_valid()) #~ print '>', name, valid[-1] #~ print '=', all(valid) valid = all(valid) if self._input_valid != valid: self._input_valid = valid self.emit('input-valid-changed') def _get_radiogroup(self, name): name += ':' group = [k for k in self._widgets if k.startswith(name)] return [(k, self.widgets[k]) for k in group] def on_activate_widget(self, widget): if not self._focus_next(widget, activatable=True): self.emit('last-activated') def focus_first(self): '''Focus the first widget in the form''' return self._focus_next(None) def focus_next(self): '''Focus the next input in the form''' if gtk.gtk_version >= (2, 14, 0): widget = self.get_focus_child() else: for w in self.widgets.values(): if w.is_focus: widget = w break if widget: return self._focus_next(widget) else: return False def _focus_next(self, widget, activatable=False): # If 'activatable' is True we only focus widgets that have # an 'activated' signal (mainly just TextEntries). This is used # to fine tune the last-activated signal if widget is None: i = 0 else: for k, v in self.widgets.items(): if v == widget: i = self._widgets.index(k) + 1 break else: raise ValueError for k in self._widgets[i:]: widget = self.widgets[k] if widget.get_property('sensitive') \ and widget.get_property('visible') \ and not ( activatable and not isinstance(widget, (gtk.Entry, gtk.ComboBox)) ): widget.grab_focus() return True else: return False #} #{ Dict access methods def __getitem__(self, key): if not key in self._keys: raise KeyError, key elif key in self.widgets: widget = self.widgets[key] if isinstance(widget, LinkEntry): return widget.get_text() # Could be either page or file elif isinstance(widget, (PageEntry, NamespaceEntry)): return widget.get_path() elif isinstance(widget, FSPathEntry): return widget.get_path() elif isinstance(widget, InputEntry): return widget.get_text() elif isinstance(widget, gtk.CheckButton): return widget.get_active() elif isinstance(widget, gtk.ComboBox): if hasattr(widget, 'zim_key_mapping'): label = widget.get_active_text() return widget.zim_key_mapping.get(label) or label else: return widget.get_active_text() elif isinstance(widget, gtk.SpinButton): return int(widget.get_value()) elif isinstance(widget, gtk.ColorButton): if gtk.gtk_version > (2, 14, 0): # This version supposedly gives compacter values return str(widget.get_color()) else: return widget.get_color().to_string() else: raise TypeError, widget.__class__.name else: # Group of RadioButtons for name, widget in self._get_radiogroup(key): if widget.get_active(): _, name = name.rsplit(':', 1) # using rsplit to assure another ':' in the # group name is harmless return name def __setitem__(self, key, value): if not key in self._keys: raise KeyError, key elif key in self.widgets: widget = self.widgets[key] if isinstance(widget, LinkEntry): assert isinstance(value, basestring) widget.set_text(value) elif isinstance(widget, (PageEntry, NamespaceEntry)): if isinstance(value, Path): widget.set_path(value) else: widget.set_text(value or '') elif isinstance(widget, FSPathEntry): if isinstance(value, (File, Dir)): widget.set_path(value) else: widget.set_text(value or '') elif isinstance(widget, InputEntry): value = value or '' widget.set_text(value) elif isinstance(widget, gtk.CheckButton): widget.set_active(value) elif isinstance(widget, gtk.ComboBox): if hasattr(widget, 'zim_key_mapping'): for key, v in widget.zim_key_mapping.items(): if v == value: gtk_combobox_set_active_text(widget, key) break else: gtk_combobox_set_active_text(widget, value) else: gtk_combobox_set_active_text(widget, value) elif isinstance(widget, gtk.SpinButton): widget.set_value(value) elif isinstance(widget, gtk.ColorButton): color = gtk.gdk.color_parse(value) widget.set_color(color) else: raise TypeError, widget.__class__.name else: # RadioButton widget = self.widgets[key + ':' + value] widget.set_active(True) def __iter__(self): return iter(self._keys) def __contains__(self, key): return key in self._keys def keys(self): return self._keys def items(self): return [(k, self[k]) for k in self._keys] def update(self, map): '''Update the value for any existing widget to the value given in C{map}. Unkown keys in C{map} are ignored and widgets that do not have a value in C{map} keep their original value. @param map: a dict with new values for the widgets ''' for key, value in map.items(): if key in self._keys: self[key] = value def copy(self): '''Copy the values of all widgets in the form into a normal dict @returns: a dict with widget values ''' values = {} for key in self._keys: values[key] = self[key] return values #} # Need to register classes defining / overriding gobject signals gobject.type_register(InputForm) class InputEntry(gtk.Entry): '''Sub-class of C{gtk.Entry} with support for highlighting mal-formatted inputs and handles UTF-8 decoding. This class must be used as a generic replacement for C{gtk.Entry} to avoid UTF-8 issues. (This is enforced by the zim test suite which will throw an error for any module using C{gtk.Entry} directly.) The widget has a "valid" state which determines if the content is well formed or not. When the state is invalid the widget will have a red background color. This is used e.g. in dialog response handlers to show the user what widget to modify. The valid state can be either done manually by calling L{set_input_valid()}, or it can be done automatically by providing a function to check what content is valid. Using a function is recommended because it gives more immediate feedback to the user. @signal: C{input-valid-changes ()}: valid state of the widget changed ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'input-valid-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } ERROR_COLOR = '#EF7F7F' # light red (derived from Tango style guide) def __init__(self, check_func=None, allow_empty=True, show_empty_invalid=False, placeholder_text=None, allow_whitespace=False): '''Constructor @param check_func: a function to check input is valid. This function will be called with the current text as argument and should return C{True} if this text is a valid input. @param allow_empty: if C{False} an empty string is considered invalid input @param show_empty_invalid: if C{True} a red background is also shown when the entry is still empty, if C{False} the background is kept normal even if the empty input is invalid. Without this option a whole input form would start in red color, which looks bad. @param placeholder_text: text to show in the widget when it is empty and does not have focus, text will be shown in a color different from normal text and disappear when the user selects the widget. Used to set hints on the usage of the widget. @param allow_whitespace: if C{True} allow trailing whitespace or even string containing only whitespace. If C{False} all whitespace is stripped. ''' # NOTE: when porting to Gtk3 use gtk.Entry.set_placeholder_text() # and remove our own implementation gtk.Entry.__init__(self) self._normal_color = None self.allow_empty = allow_empty self.show_empty_invalid = show_empty_invalid self.allow_whitespace = allow_whitespace self.placeholder_text = placeholder_text self._placeholder_text_shown = False self.check_func = check_func self._input_valid = False self.do_changed() # Initialize state self.connect('changed', self.__class__.do_changed) def _init_base_color(*a): # This is handled on expose event, because style does not # yet reflect theming on construction if self._normal_color is None: self._normal_color = self.style.base[gtk.STATE_NORMAL] self._set_base_color(self.get_input_valid()) self.connect('expose-event', _init_base_color) def set_check_func(self, check_func): '''Set a function to check whether input is valid or not @param check_func: the function ''' self.check_func = check_func self.do_changed() def set_icon(self, icon, cb_func, tooltip=None): '''Add an icon in the entry widget behind the text @param icon: the icon as stock ID @param cb_func: the callback when the icon is clicked; the callback will be called without any arguments @param tooltip: tooltip text for the icon @returns: C{True} if succesful, C{False} if not supported by Gtk version @requires: Gtk >= 2.16 @todo: add argument to set tooltip on the icon ''' if gtk.gtk_version < (2, 16, 0): return False self.set_property('secondary-icon-stock', icon) if tooltip: self.set_property('secondary-icon-tooltip-text', tooltip) def on_icon_press(self, icon_pos, event): if icon_pos == gtk.ENTRY_ICON_SECONDARY: cb_func() self.connect('icon-press', on_icon_press) return True def set_icon_to_clear(self): '''Adds a "clear" icon in the entry widget This method calls L{set_icon()} with the right defaults for a stock "Clear" icon. In addition it makes the icon insensitive when there is no text in the entry. Clicking the icon will clear the entry. @returns: C{True} if succesful, C{False} if not supported by Gtk version @requires: Gtk >= 2.16 ''' if gtk.gtk_version < (2, 16, 0): return False self.set_icon(gtk.STOCK_CLEAR, self.clear, _('Clear')) # T: tooltip for the inline icon to clear a text entry widget def check_icon_sensitive(self): text = self.get_text() self.set_property('secondary-icon-sensitive', bool(text)) check_icon_sensitive(self) self.connect('changed', check_icon_sensitive) return True def get_text(self): '''Get the text from the widget. Like C{gtk.Entry.get_text()} but with UTF-8 decoding and whitespace stripped. @returns: string ''' if self._placeholder_text_shown: return '' text = gtk.Entry.get_text(self) if not text: return '' elif self.allow_whitespace: return text.decode('utf-8') else: return text.decode('utf-8').strip() def set_text(self, text): '''Wrapper for C{gtk.Entry.set_text()}. @param text: string ''' if not text \ and not self.get_property('has-focus'): gtk.Entry.set_text(self, text) self._show_placeholder_text() else: self._hide_placeholder_text() gtk.Entry.set_text(self, text) def get_input_valid(self): '''Get the valid state. @returns: C{True} if the input is valid ''' return self._input_valid def set_input_valid(self, valid, show_empty_invalid=None): '''Set input valid or invalid state @param valid: C{True} or C{False} @param show_empty_invalid: if not C{None} change the C{show_empty_invalid} attribute ''' if show_empty_invalid is not None: self.show_empty_invalid = show_empty_invalid if valid == self._input_valid: return if self._normal_color: self._set_base_color(valid) # else: not yet initialized self._input_valid = valid self.emit('input-valid-changed') def _set_base_color(self, valid): if valid \ or (not self.get_text() and not self.show_empty_invalid): self.modify_base(gtk.STATE_NORMAL, self._normal_color) else: self.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse(self.ERROR_COLOR)) def clear(self): '''Clear the text in the entry''' self.set_text('') def do_expose_event(self, event): gtk.Entry.do_expose_event(self, event) if not self.get_property('has-focus'): self._show_placeholder_text() def do_focus_in_event(self, event): self._hide_placeholder_text() gtk.Entry.do_focus_in_event(self, event) def do_focus_out_event(self, event): gtk.Entry.do_focus_out_event(self, event) self._show_placeholder_text() def _show_placeholder_text(self): if not self.get_text() \ and self.placeholder_text: self._placeholder_text_shown = True gtk.Entry.set_text(self, self.placeholder_text) layout = self.get_layout() attr = pango.AttrList() end = len(self.placeholder_text) attr.insert(pango.AttrStyle(pango.STYLE_ITALIC, 0, end)) c = 65535/16*8 attr.insert(pango.AttrForeground(c,c,c, 0, end)) # TODO make color configurable, now just solid grey layout.set_attributes(attr) # The layout is reset when new text is set, so # no need to "unset" the style at _hide_placeholder_text() def _hide_placeholder_text(self): if self._placeholder_text_shown: gtk.Entry.set_text(self, '') self._placeholder_text_shown = False def do_changed(self): text = self.get_text() or '' if self.check_func: self.set_input_valid(self.check_func(text)) else: self.set_input_valid(bool(text) or self.allow_empty) # Need to register classes defining / overriding gobject signals gobject.type_register(InputEntry) class FSPathEntry(InputEntry): '''Base class for L{FileEntry} and L{FolderEntry}, handles input of file system paths. File paths can either be absolute paths or relative to the notebook. When a notebook and optionally a page path are set, L{Notebook.resolve_file()} is used to make file paths relative. This class should not be instantiated directly, use either L{FileEntry} or L{FolderEntry}. @todo: add completion for file paths - make sure both absolute and relative paths are supported + re-use this completion in L{LinkEntry} ''' def __init__(self): InputEntry.__init__(self, allow_empty=False) self.notebook = None self.notebookpath = None self.action = None self.file_type_hint = None def set_use_relative_paths(self, notebook, path=None): '''Set the notebook and path to be used for relative paths. @param notebook: the L{Notebook} object for resolving paths or C{None} to disable relative paths. @param path: a L{Path} object used for resolving relative links ''' self.notebook = notebook self.notebookpath = path def set_path(self, path): '''Set the file path for this entry @param path: a L{File} or L{Dir} object ''' assert isinstance(path, (File, Dir)) if self.notebook: text = self.notebook.relative_filepath(path, self.notebookpath) if text is None: if self.notebook.document_root: text = path.uri else: text = path.path self.set_text(text) else: self.set_text(path.user_path or path.path) def get_path(self): '''Get the file path for this entry @returns: a L{File} or L{Dir} object (depending on sub-class) ''' text = self.get_text() if text: if self.notebook: path = self.notebook.resolve_file(text, self.notebookpath) if path: return self._class(path.path) return self._class(text) else: return None def popup_dialog(self): '''Run a dialog to browse for a file or folder. Used by the 'browse' button in input forms. ''' window = self.get_toplevel() if self.action == gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER: title = _('Select Folder') # T: dialog title elif self.file_type_hint == 'image': title = _('Select Image') # T: dialog title else: title = _('Select File') # T: dialog title dialog = FileDialog(window, title, self.action) if self.file_type_hint == 'image': dialog.add_filter_images() path = FSPathEntry.get_path(self) # overloaded in LinkEntry if path: dialog.set_file(path) file = dialog.run() if not file is None: FSPathEntry.set_path(self, file) class FileEntry(FSPathEntry): '''Widget to select a file''' _class = File def __init__(self, file=None, new=False): '''Constructor. @param file: a L{File} object @param new: if C{True} the intention is a new file (e.g. output file), or to overwrite an existing file. If C{False} only existing files can be selected. ''' FSPathEntry.__init__(self) self.file_type_hint = 'file' if new: self.action = gtk.FILE_CHOOSER_ACTION_SAVE else: self.action = gtk.FILE_CHOOSER_ACTION_OPEN if file: self.set_file(file) set_file = FSPathEntry.set_path get_file = FSPathEntry.get_path class FolderEntry(FSPathEntry): '''Widget to select a folder''' _class = Dir def __init__(self, folder=None): '''Constructor @param folder: a L{Dir} object ''' FSPathEntry.__init__(self) self.file_type_hint = 'dir' self.action = gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER if folder: self.set_folder(folder) set_folder = FSPathEntry.set_path get_folder = FSPathEntry.get_path def gtk_entry_completion_match_func(completion, key, iter, column): if key is None: return False key = key.decode('utf-8').lower() key = unicodedata.normalize('NFKD', key) # decode utf-8 because we are called by gtk function # normalization could be done elsewhere, but keep together model = completion.get_model() text = model.get_value(iter, column) if text is not None: text = unicodedata.normalize('NFKD', text.decode('utf-8')) return key in text.lower() else: return False def gtk_entry_completion_match_func_startswith(completion, key, iter, column): if key is None: return False key = key.decode('utf-8').lower() key = unicodedata.normalize('NFKD', key) # decode utf-8 because we are called by gtk function # normalization could be done elsewhere, but keep together model = completion.get_model() text = model.get_value(iter, column) if text is not None: text = unicodedata.normalize('NFKD', text.decode('utf-8')) return text.lower().startswith(key) else: return False class PageEntry(InputEntry): '''Widget to select a zim page path This widget features completion for existing page names and shows whether the entered text is not a valid page name. The page paths can be shown eitehr absolute or relative. If a reference path is given paths will be shown relative to this reference. ''' _allow_select_root = False # This attribute implements logic needed for NamespaceEntry def __init__(self, notebook, path=None, subpaths_only=False, existing_only=False): '''Constructor @param notebook: the L{Notebook} object for resolving paths and completing existing pages, but allowed to be C{None} e.g. for testing @param path: a L{Path} object used for resolving relative links @param subpaths_only: if C{True} the input will always be considered a child 'C{path}' @param existing_only: if C{True} only allow to select existing pages @note: 'C{subpaths_only}' and 'C{existing_only}' can also be set using the like named attributes ''' self.notebook = notebook self.notebookpath = path self.subpaths_only = subpaths_only self.existing_only = existing_only self._current_completion = () if self._allow_select_root: placeholder_text = _('') # T: default text for empty namespace selection else: placeholder_text = None InputEntry.__init__(self, allow_empty=self._allow_select_root, placeholder_text=placeholder_text) assert path is None or isinstance(path, Path) completion = gtk.EntryCompletion() completion.set_model(gtk.ListStore(str, str)) # visible name, match name completion.set_text_column(0) completion.set_inline_completion(True) self.set_completion(completion) def set_use_relative_paths(self, notebook, path=None): '''Set the notebook and path to be used for relative paths. @param notebook: the L{Notebook} object for resolving paths and completing existing pages, or C{None} to disable relative paths. @param path: a L{Path} object used for resolving relative links ''' self.notebook = notebook self.notebookpath = path def set_path(self, path): '''Set the path to be shown in the entry. If you have the link as a string, use L{set_text()} instead @param path: L{Path} object ''' self.set_text(':'+path.name) def get_path(self): '''Get the path shown in the widget. If C{None} is returned the widget is flagged as invalid. So e.g. in a dialog you can get a path and refuse to close a dialog if the path is None and the user will automatically be alerted to the missing input. @returns: a L{Path} object or C{None} is no valid path was entered ''' name = self.get_text().decode('utf-8').strip() if self._allow_select_root and (name == ':' or not name): return Path(':') elif not name: self.set_input_valid(False) return None else: if self.subpaths_only and not name.startswith('+'): name = '+' + name try: if self.notebook: path = self.notebook.resolve_path(name, source=self.notebookpath) else: path = Path(name) except PageNameError: self.set_input_valid(False) return None else: if self.existing_only: page = self.notebook.get_page(path) if not (page and page.exists()): return None return path @staticmethod def _walk_relative(notebook, path): # sort nearest neighbor first using relative paths ## TODO can be more efficient with a visitor pattern ## that can stop recursion of some branches or force order # first yield children index = notebook.index for p in index.walk(path): yield notebook.relative_link(path, p), p.basename # than peers and parents, sort by distance if path.namespace: parent = Path(path.parts[0]) peers = [] for p in index.walk(parent): if not p.ischild(path): relname = notebook.relative_link(path, p) basename = p.basename distance = relname.count(':') peers.append((distance, relname, basename)) peers.sort() for distance, relname, basename in peers: yield relname, basename else: parent = path # than the rest of the tree, excluding direct parent for p in index.walk(): if not p.ischild(parent): yield notebook.relative_link(path, p), p.basename def do_changed(self): text = self.get_text() if not text: if self.existing_only: self.set_input_valid(False) else: self.set_input_valid(True) # FIXME: why should pageentry always allow empty input ? return # Check for a valid page name and clean up the text for completion orig = text if text in (':', '+'): pass else: try: text = Notebook.cleanup_pathname(text.lstrip('+')) except PageNameError: self.set_input_valid(False) return else: if self.existing_only: path = self.get_path() # get_path() checks existence self.set_input_valid(not path is None) else: self.set_input_valid(True) # restore pre- and postfix to cleaned up text if orig[0] == ':' and text[0] != ':': text = ':' + text elif orig[0] == '+' and text[0] != '+': text = '+' + text if orig[-1] == ':' and text[-1] != ':': text = text + ':' # Start completion #~ print 'COMPLETE page: "%s", raw: "%s", ref: %s' % (text, orig, self.notebookpath) if not self.notebook: return # no completion without a notebook if ':' in text: i = text.rfind(':') prefix = text[:i+1] # can still start with "+" elif text.startswith('+'): prefix = '+' else: prefix = '' # Check if we completed already for this case if prefix == self._current_completion: return else: self._current_completion = prefix # Resolve path if prefix == ':': path = Path(':') elif prefix == '': if self.notebookpath: path = Path(self.notebookpath.namespace) else: path = Path(':') elif prefix == '+': path = self.notebookpath or Path(':') else: link = prefix reference = self.notebookpath or Path(':') if self.subpaths_only and not link.startswith('+'): link = '+' + link.lstrip(':') try: path = self.notebook.resolve_path(link, source=reference) except PageNameError: return # Fill model with pages from pathname completion = self.get_completion() model = completion.get_model() model.clear() if prefix: # Complete a single namespace based on the prefix completion.set_match_func(gtk_entry_completion_match_func_startswith, 1) for p in self.notebook.index.list_pages(path): model.append((prefix+p.basename, prefix+p.basename)) else: # Find any pages that match the text completion.set_match_func(gtk_entry_completion_match_func, 1) if self.notebookpath: for relname, basename in self._walk_relative(self.notebook, self.notebookpath): model.append((relname, basename)) else: for p in self.notebook.index.walk(): model.append((":"+p.name, p.basename)) completion.complete() class NamespaceEntry(PageEntry): '''Widget to select a zim page path as a namespace Use this instead of L{PageEntry} when you want to allow selecting a namespace. E.g. this will be allowed to select ":" or empty string for the root namespace, which is not allowed in PageEntry. ''' _allow_select_root = True class LinkEntry(PageEntry, FileEntry): '''Widget entering links in zim pages. This widget accepts either zim page paths, file paths and URLs. ''' _class = File def __init__(self, notebook, path=None): '''Constructor @param notebook: the L{Notebook} object for resolving paths and completing existing pages, but allowed to be C{None} e.g. for testing @param path: a L{Path} object used for resolving relative links ''' PageEntry.__init__(self, notebook, path) self.action = gtk.FILE_CHOOSER_ACTION_OPEN self.file_type_hint = None def get_path(self): # Check we actually got a valid path text = self.get_text().decode('utf-8').strip() if text: type = link_type(text) if type == 'page': return PageEntry.get_path(self) else: return None else: return None def do_changed(self): # Switch between path completion and file completion text = self.get_text().decode('utf-8').strip() if text: type = link_type(text) if type == 'page': PageEntry.do_changed(self) #~ elif type == 'file': #~ FileEntry.do_changed(self) else: self.set_input_valid(True) else: self.set_input_valid(True) def format_title(title): '''Formats a window title (in fact just adds " - Zim" to the end).''' assert not title.lower().endswith(' zim') return '%s - Zim' % title def get_window(ui): '''Returns a C{gtk.Window} object or C{None}. Used to find the parent window for dialogs. @param ui: a parent dialog or window, or GtkInterface object @returns: a C{gtk.Window} object or C{None} ''' if isinstance(ui, gtk.Window): return ui elif hasattr(ui, 'mainwindow') \ and isinstance(ui.mainwindow, gtk.Window): return ui.mainwindow else: return None def register_window(window): '''Register this instance with the zim application, if not done so already. ''' if hasattr(window, 'ui') \ and hasattr(window.ui, 'register_new_window') \ and not window in window.ui.windows: window.ui.register_new_window(window) # Some constants used to position widgets in the window panes # These are named rather than numbered because they also appear # in plugin preferences as options and as uistate keys TOP = 'top' #: Top frame position in window BOTTOM = 'bottom'#: Bottom frame position in window LEFT_PANE = 'left_pane' #: Left pane position in window RIGHT_PANE = 'right_pane' #: Right pane position in window TOP_PANE = 'top_pane' #: Top pane position in window BOTTOM_PANE = 'bottom_pane' #: Bottom pane position in window PANE_POSITIONS = ( (LEFT_PANE, _('Left Side Pane')), # T: Option for placement of plugin widgets (RIGHT_PANE, _('Right Side Pane')), # T: Option for placement of plugin widgets (BOTTOM_PANE, _('Bottom Pane')), # T: Option for placement of plugin widgets (TOP_PANE, _('Top Pane')), # T: Option for placement of plugin widgets ) WIDGET_POSITIONS = ( ((LEFT_PANE, TOP), _('Top Left')), # T: Option for placement of plugin widgets ((LEFT_PANE, BOTTOM), _('Bottom Left')), # T: Option for placement of plugin widgets ((RIGHT_PANE, TOP), _('Top Right')), # T: Option for placement of plugin widgets ((RIGHT_PANE, BOTTOM), _('Bottom Right')), # T: Option for placement of plugin widgets ) class WindowSidePane(gtk.VBox): # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'close': (gobject.SIGNAL_RUN_LAST, None, ()), } def __init__(self): gtk.VBox.__init__(self) # Add bar with label and close button self.topbar = gtk.HBox() self.topbar.label = gtk.Label() self.topbar.label.set_alignment(0.0, 0.5) self.topbar.pack_start(self.topbar.label) self.topbar.pack_end(self._close_button(), False) self.pack_start(self.topbar, False) # Add notebook self.notebook = gtk.Notebook() self.notebook.set_show_border(False) if gtk.gtk_version >= (2, 22, 0): button = self._close_button() self.notebook.set_action_widget(button, gtk.PACK_END) self.add(self.notebook) self._update_topbar() def _close_button(self): button = CloseButton() button.connect('clicked', lambda o: self.emit('close')) return button def _update_topbar(self): children = self.get_children() assert children[0] == self.topbar n_pages = self.notebook.get_n_pages() # remove close button if any for widget in children: if isinstance(widget, WindowSidePaneWidget): widget.embed_closebutton(None) for widget in self.notebook.get_children(): if isinstance(widget, WindowSidePaneWidget): widget.embed_closebutton(None) # Option 1: widget above notebook or no tabs in notebook # Show topbar without title, show tabs in notebook # (or embed close button in widget) if children[1] != self.notebook or n_pages == 0: embedded = False if children[1] != self.notebook \ and isinstance(children[1], WindowSidePaneWidget): # see if we can embed the close button in the widget button = self._close_button() embedded = children[1].embed_closebutton(button) if not embedded: self.topbar.label.set_text('') # no title self.topbar.set_no_show_all(False) self.topbar.show_all() else: self.topbar.set_no_show_all(True) self.topbar.hide() self.notebook.set_show_tabs(True) if gtk.gtk_version >= (2, 22, 0): button = self.notebook.get_action_widget(gtk.PACK_END) button.set_no_show_all(True) button.hide() # TODO: for widget + single tab case add another title bar ? # Option 2: notebook with single tab # hide tabs, use topbar to show tab label # (or embed close button in notebook tab) elif n_pages == 1: self.notebook.set_show_tabs(False) child = self.notebook.get_nth_page(0) title = self.notebook.get_tab_label_text(child) self.topbar.label.set_text(title) if gtk.gtk_version >= (2, 22, 0): button = self.notebook.get_action_widget(gtk.PACK_END) button.set_no_show_all(True) button.hide() embedded = False if isinstance(child, WindowSidePaneWidget): # see if we can embed the close button in the widget button = self._close_button() embedded = child.embed_closebutton(button) if not embedded: self.topbar.set_no_show_all(False) self.topbar.show_all() else: self.topbar.set_no_show_all(True) self.topbar.hide() # Option 3: notebook with multiple tabs # show tabs, no text in topbar # If possible put close button next to tabs else: self.notebook.set_show_tabs(True) self.topbar.label.set_text('') # no title if gtk.gtk_version >= (2, 22, 0): button = self.notebook.get_action_widget(gtk.PACK_END) button.set_no_show_all(False) button.show_all() self.topbar.set_no_show_all(True) self.topbar.hide() else: self.topbar.set_no_show_all(False) self.topbar.show_all() def add_widget(self, widget, position): self.pack_start(widget, False) if position == TOP: # shuffle above notebook, below close bar self.reorder_child(widget, 1) self._update_topbar() def add_tab(self, title, widget): self.notebook.append_page(widget, tab_label=gtk.Label(title)) self._update_topbar() def remove(self, widget): # Note: try box.remove() except .. causes GErrors here :( if widget in self.get_children(): gtk.Box.remove(self, widget) self._update_topbar() return True elif widget in self.notebook.get_children(): self.notebook.remove(widget) self._update_topbar() return True else: return False def is_empty(self): children = self.get_children() if len(children) == 2: assert children[0] == self.topbar assert children[1] == self.notebook return children[1].get_n_pages() == 0 # check for tabs else: return False # some widget in the pane def grab_focus(self): if self.is_empty(): return widget = gtk_notebook_get_active_page(self.notebook) if widget: widget.grab_focus() elif self.notebook.get_n_pages() > 0: self.notebook.set_current_page(0) widget = self.notebook.get_nth_page(0) widget.grab_focus() else: for widget in self.get_children(): if widget != self.topbar and widget != self.notebook: widget.grab_focus() break def do_key_press_event(self, event): if event.keyval == KEYVAL_ESC: self.emit('close') return True else: return gtk.VBox.do_key_press_event(self, event) # Need to register classes defining gobject signals gobject.type_register(WindowSidePane) class WindowSidePaneWidget(object): '''Base class for widgets that want to integrate nicely in the L{WindowSidePane} ''' def embed_closebutton(self, button): '''Embed a button in the widget to close the side pane @param button: an L{IconButton} or C{None} to un-set @returns: C{True} if supported and succesful ''' return False class Window(gtkwindowclass): '''Sub-class of C{gtk.Window} that will take care of hooking the window into the application framework and adds entry points so plugins can add side panes etc. It will divide the window horizontally in 3 panes, and the center pane again vertically in 3. The result is something like this:: +-----------------------------+ |menu | +-----+----------------+------+ | | top pane | | | | | | | s +----------------+ s | | i | Main widget | i | | d | | d | | e | | e | | b +----------------+ b | | a |tabs| | a | | r | bottom pane | r | | | | | +----------------------+------+ Any pane that is not used will not been shown. The important thing is to create placeholders where plugins *might* want to add some widget. When zim is configured to run on a maemo device this class will inherit from C{hildon.Window} instead of C{gtk.Window} to make sure it plays nicely with the maemo environment. All windows in zim must inherit from this class. @signal: C{pane-state-changed (pane, visible, active)}: emitted when visibility or active tab changed for a specific pane ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'pane-state-changed': (gobject.SIGNAL_RUN_LAST, None, (object, bool, object)), } def __init__(self): gtkwindowclass.__init__(self) self._last_sidepane_focus = None self._zim_window_main = gtk.VBox() self._zim_window_left_paned = HPaned() self._zim_window_right_paned = HPaned() self._zim_window_top_paned = VPaned() self._zim_window_bottom_paned = VPaned() self._zim_window_left_pane = WindowSidePane() self._zim_window_right_pane = WindowSidePane() self._zim_window_top_pane = WindowSidePane() self._zim_window_bottom_pane = WindowSidePane() self._zim_window_top_special = gtk.VBox() gtkwindowclass.add(self, self._zim_window_main) self._zim_window_main.add(self._zim_window_left_paned) self._zim_window_left_paned.pack1(self._zim_window_left_pane, resize=False) self._zim_window_left_paned.pack2(self._zim_window_right_paned, resize=True) self._zim_window_right_paned.pack1(self._zim_window_top_special, resize=True) self._zim_window_right_paned.pack2(self._zim_window_right_pane, resize=False) self._zim_window_top_special.add(self._zim_window_top_paned) self._zim_window_top_paned.pack1(self._zim_window_top_pane, resize=False) self._zim_window_top_paned.pack2(self._zim_window_bottom_paned, resize=True) self._zim_window_bottom_paned.pack2(self._zim_window_bottom_pane, resize=True) self._zim_window_sidepanes = { LEFT_PANE: ( self._zim_window_left_paned, self._zim_window_left_pane), RIGHT_PANE: ( self._zim_window_right_paned, self._zim_window_right_pane), TOP_PANE: ( self._zim_window_top_paned, self._zim_window_top_pane), BOTTOM_PANE: ( self._zim_window_bottom_paned, self._zim_window_bottom_pane), } def _on_switch_page(notebook, page, pagenum, key): visible, size, active = self.get_pane_state(key) self.emit('pane-state-changed', key, visible, active) for key, value in self._zim_window_sidepanes.items(): paned, pane = value pane.set_no_show_all(True) pane.zim_pane_state = (False, 200, None) pane.connect('close', lambda o, k: self.set_pane_state(k, False), key) pane.notebook.connect_after('switch-page', _on_switch_page, key) def add(self, widget): '''Add the main widget. @param widget: gtk widget to add in the window ''' self._zim_window_bottom_paned.pack1(widget, resize=True) def add_bar(self, widget, position): '''Add a bar to top or bottom of the window. Used e.g. to add menu-, tool- & status-bars. @param widget: gtk widget for the bar @param position: C{TOP} or C{BOTTOM} ''' self._zim_window_main.pack_start(widget, False) if position == TOP: # reshuffle widget to go above main widgets but # below earlier added bars i = self._zim_window_main.child_get_property( self._zim_window_left_paned, 'position') self._zim_window_main.reorder_child(widget, i) self._zim_window_main.set_focus_chain([self._zim_window_left_paned]) # Force to ignore the bars in keyboard navigation # items in the bars are all accesible by accelerators def add_tab(self, title, widget, pane): '''Add a tab in one of the panes. @param title: string with title to put in the tab @param widget: the gtk widget to show in the tab @param pane: can be one of: C{LEFT_PANE}, C{RIGHT_PANE}, C{TOP_PANE} or C{BOTTOM_PANE}. ''' key = pane paned, pane = self._zim_window_sidepanes[key] pane.add_tab(title, widget) self.set_pane_state(key, True) def add_widget(self, widget, position): '''Add a widget in one of the panes outside of the tabs @param widget: the gtk widget to show in the tab @param position: a 2-tuple of a pane and a position in the pane. First element can be either C{LEFT_PANE} or C{RIGHT_PANE} (C{TOP_PANE} and C{BOTTOM_PANE} are not supported). Second element can be either C{TOP}, or C{BOTTOM}. @note: Placing a widget in C{TOP_PANE}, C{TOP}, is supported as a special case, but should not be used by plugins. ''' key, pos = position if key in (TOP_PANE, BOTTOM_PANE): if key == TOP_PANE and pos == TOP: # Special case for top widget outside of pane # used especially for PathBar self._zim_window_top_special.pack_start(widget, False) self._zim_window_top_special.reorder_child(widget, 0) else: raise NotImplementedError elif key in (LEFT_PANE, RIGHT_PANE): paned, pane = self._zim_window_sidepanes[key] pane.add_widget(widget, pos) self.set_pane_state(key, True) else: raise KeyError def remove(self, widget): '''Remove widget from any pane @param widget: the widget to remove ''' if self._last_sidepane_focus == widget: self._last_sidepane_focus = None box = self._zim_window_top_special if widget in box.get_children(): box.remove(widget) return for key in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): paned, pane = self._zim_window_sidepanes[key] if pane.remove(widget): if pane.is_empty(): self.set_pane_state(key, False) break else: raise ValueError, 'Widget not found in this window' def init_uistate(self): assert self.uistate def check_toggle(value, default): # Must be list of valid pane names if isinstance(default, (tuple, list)) \ and all(e in self._zim_window_sidepanes for e in value): return value else: raise AssertionError self.uistate.setdefault('toggle_panes', [], check_toggle) def check(value, default): # Check value is state as used by set_pane_state() and # get_pane_state(), so 3 elements: boolean, integer and # a label or None if isinstance(value, (tuple, list)) \ and len(value) == 3 \ and isinstance(value[0], bool) \ and isinstance(value[1], int) \ and (value[2] is None or isinstance(value[2], basestring)): return value else: raise AssertionError for key in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): default = self.get_pane_state(key) self.uistate.setdefault(key, default, check) self.set_pane_state(key, *self.uistate[key]) def save_uistate(self): assert self.uistate for key in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): self.uistate[key] = self.get_pane_state(key) def get_pane_state(self, pane): '''Returns the state of a side pane. @param pane: can be one of: C{LEFT_PANE}, C{RIGHT_PANE}, C{TOP_PANE} or C{BOTTOM_PANE}. @returns: a 3-tuple of visibility (boolean), pane size (integer), and active tab (label). ''' # FIXME revert calculate size instead of position for left # and bottom widget key = pane paned, pane = self._zim_window_sidepanes[key] if pane.get_property('visible'): position = paned.get_position() active = gtk_notebook_get_active_tab(pane.notebook) return (True, position, active) else: return pane.zim_pane_state return state def set_pane_state(self, pane, visible, size=None, activetab=None, grab_focus=False): '''Returns the state of a side pane. @param pane: can be one of: C{LEFT_PANE}, C{RIGHT_PANE}, C{TOP_PANE} or C{BOTTOM_PANE}. @param visible: C{True} to show the pane, C{False} to hide @param size: size of the side pane @param activetab: label of the active tab in the notebook or None (fails silently if tab is not found) @param grab_focus: if C{True} active tab will grab focus ''' # FIXME get parent widget size and subtract to get position # for left and botton notebook # FIXME enforce size < parent widget and > 0 key = pane paned, pane = self._zim_window_sidepanes[key] if pane.get_property('visible') == visible \ and size is None and activetab is None: if grab_focus: pane.grab_focus() return # nothing else to do oldstate = self.get_pane_state(key) if size is None: size = oldstate[1] if activetab is None: activetab = oldstate[2] position = size if visible: if not pane.is_empty(): pane.set_no_show_all(False) pane.show_all() paned.set_position(position) if activetab is not None: try: gtk_notebook_set_active_tab(pane.notebook, activetab) except ValueError: pass if grab_focus: pane.grab_focus() #else: # logger.debug('Trying to show an empty pane...') else: pane.hide() pane.set_no_show_all(True) pane.zim_pane_state = (visible, size, activetab) self.emit('pane-state-changed', key, visible, activetab) def toggle_panes(self, show=None): '''Toggle between showing and not showing panes. Will remember the panes that were shown last time this method was called but defaults to showing all panes. @param show: if C{True} show panes, if C{False} hide them, if C{None} toggle current state ''' # Note that our uistate['toggle_panes'] does not # reflect what panes are visible when e.g. restarting zim # - this is saved in the pane state uistate - instead it # remembers what panes could be shown when toggling. visible = bool(self.get_visible_panes()) if show is None: show = not visible elif show == visible: return # nothing to do if show: panes = self.uistate['toggle_panes'] \ or (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE) for pane in panes: self.set_pane_state(pane, True) else: self.uistate['toggle_panes'] = self.get_visible_panes() for pane in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): self.set_pane_state(pane, False) def show_all_panes(self): for pane in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): self.set_pane_state(pane, True) def get_visible_panes(self): '''Returns a list of panes that are visible''' panes = [] for key in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): paned, pane = self._zim_window_sidepanes[key] if not pane.is_empty() and pane.get_property('visible'): panes.append(key) return panes def get_used_panes(self): '''Returns a list of panes that are in use (i.e. not empty)''' panes = [] for key in (LEFT_PANE, RIGHT_PANE, TOP_PANE, BOTTOM_PANE): paned, pane = self._zim_window_sidepanes[key] if not pane.is_empty(): panes.append(key) return panes def do_set_focus(self, widget): # keep track of last sidepane widget that had focus.. if widget: parent = widget.get_parent() while parent: if isinstance(parent, WindowSidePane): self._last_sidepane_focus = widget break parent = parent.get_parent() return gtkwindowclass.do_set_focus(self, widget) def focus_last_sidepane(self): if self._last_sidepane_focus \ and self._last_sidepane_focus.get_property('visible'): self._last_sidepane_focus.grab_focus() return True else: return False def pack_start(self, *a): raise NotImplementedError, "Use add() instead" def show(self): self.show_all() def show_all(self): # First register, than init uistate - this ensures plugins # are enabled before we finalize the presentation of the window. # This is important for state of e.g. panes to work correctly register_window(self) if hasattr(self, 'uistate') and self.uistate: self.init_uistate() gtkwindowclass.show_all(self) # Need to register classes defining gobject signals gobject.type_register(Window) class Dialog(gtk.Dialog, ConnectorMixin): '''Sub-class of C{gtk.Dialog} with a number of convenience methods to create dialogs. Also takes care of registering dialogs with the main interface object, so plugins can hook into them. Intended as base class for all input dialogs in zim. (See L{ErrorDialog}, L{QuestionDialog}, L{MessageDialog} and L{FileDialog} for other dialog types). A minimal sub-class should implement a constructor which calls L{Dialog.__init__()} and L{Dialog.add_form()} to defined the dialog, and implements C{do_response_ok()} to handle the result. The C{Dialog} class takes care of calling L{ConnecterMixin.disconnect_all()} when it is destroyed. So sub-classes can use the L{ConnectorMixin} methods and all callbacks will be cleaned up after the dialog. @ivar ui: parent C{gtk.Window} or C{GtkInterface} @ivar vbox: C{gtk.VBox} for main widgets of the dialog @ivar form: L{InputForm} added by C{add_form()} @ivar uistate: L{ListDict} to store state of the dialog, persistent per notebook. The size and position of the dialog are stored as automatically in this dict already. @ivar result: result to be returned by L{run()} @ivar destroyed: when C{True} the dialog is already destroyed ''' @classmethod def unique(klass, handler, *args, **opts): '''Constructor which ensures there is only one instance of this dialog at a time. It implements a singleton pattern by installing a weak reference in the handler object. If there is an dialog active which is not yet destroyed, this dialog is returned, otherwise a new dialog is created. Typically you can use this as:: dialog = MyDialog.unique(ui, somearg) dialog.present() @param handler: the object constructing the dialog @param args: arguments to pass to the dialog constructor @param opts: arguments to pass to the dialog constructor @note: when a dialog already existed the arguments provided to this constructor are not used ''' attr = '_unique_dialog_%s' % klass.__name__ dialog = None if hasattr(handler, attr): ref = getattr(handler, attr) dialog = ref() if dialog is None or dialog.destroyed: if dialog: dialog.destroy() # just to be sure - can be called several times without problem dialog = klass(*args, **opts) setattr(handler, attr, weakref.ref(dialog)) return dialog def __init__(self, ui, title, buttons=gtk.BUTTONS_OK_CANCEL, button=None, help_text=None, help=None, defaultwindowsize=(-1, -1) ): '''Constructor. @param ui: either a parent window or dialog or the main C{GtkInterface} object @param title: the dialog title @param buttons: a constant controlling what kind of buttons the dialog will have. One of: - C{None} or C{gtk.BUTTONS_NONE}: for dialogs taking care of constructing the buttons themselves - C{gtk.BUTTONS_OK_CANCEL}: Render Ok and Cancel - C{gtk.BUTTONS_CLOSE}: Only set a Close button @param button: a 2-tuple of a label and a stock item to use instead of the default 'Ok' button (either stock or label can be None). @param help_text: set the help text, see L{add_help_text()} @param help: pagename for a manual page, see L{set_help()} @param defaultwindowsize: default window size in pixels @note: some sub-classes expect C{self.ui} to always be a L{GtkInterface} ''' self.ui = ui self.result = None gtk.Dialog.__init__( self, parent=get_window(self.ui), title=format_title(title), flags=gtk.DIALOG_NO_SEPARATOR|gtk.DIALOG_DESTROY_WITH_PARENT, ) if not ui_environment['smallscreen']: self.set_border_width(10) self.vbox.set_spacing(5) if hasattr(self, 'uistate'): assert isinstance(self.uistate, zim.config.ListDict) # just to be sure elif hasattr(ui, 'uistate') \ and isinstance(ui.uistate, zim.config.ConfigDict): key = self.__class__.__name__ self.uistate = ui.uistate[key] else: self.uistate = zim.config.ListDict() # note: _windowpos is defined with a leading "_" so it is not # persistent across instances, this is intentional to avoid # e.g. messy placement for seldom used dialogs self.uistate.setdefault('_windowpos', None, check=value_is_coord) if self.uistate['_windowpos'] is not None: x, y = self.uistate['_windowpos'] self.move(x, y) self.uistate.setdefault('windowsize', defaultwindowsize, check=value_is_coord) if self.uistate['windowsize'] is not None: w, h = self.uistate['windowsize'] self.set_default_size(w, h) self._no_ok_action = False if not button is None: button = Button(*button) if buttons is None or buttons == gtk.BUTTONS_NONE: self._no_ok_action = True elif buttons == gtk.BUTTONS_OK_CANCEL: self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) if button: self.add_action_widget(button, gtk.RESPONSE_OK) else: self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) elif buttons == gtk.BUTTONS_CLOSE: self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_OK) self._no_ok_action = True else: assert False, 'BUG: unknown button type' # TODO set Ok button as default widget # see gtk.Window.set_default() if help_text: self.add_help_text(help_text) if help: self.set_help(help) def destroy(self): self.disconnect_all() gtk.Dialog.destroy(self) @property def destroyed(self): return not self.has_user_ref_count # Returns True when dialog has been destroyed #{ Layout methods def add_extra_button(self, button, pack_start=True): '''Add a button to the action area at the bottom of the dialog. Packs the button in the list of primary buttons (by default these are in the lower right of the dialog) @param button: the C{gtk.Button} (or other widget) @param pack_start: if C{True} pack to the left (towards the middle of the dialog), if C{False} pack to the right. ''' self.action_area.pack_start(button, False) if pack_start: self.action_area.reorder_child(button, 0) def set_help(self, pagename): '''Set the name of the manual page with help for this dialog. Setting this will add a "help" button to the dialog. @param pagename: the manual page name ''' #~ assert hasattr(self.ui, 'show_help'), 'Need ui object to open help' self.help_page = pagename button = gtk.Button(stock=gtk.STOCK_HELP) button.connect_object('clicked', self.__class__.show_help, self) self.action_area.add(button) self.action_area.set_child_secondary(button, True) def show_help(self, page=None): '''Show a help page @param page: the manual page, if C{None} the page as set with L{set_help()} is used ''' self.ui.show_help(page or self.help_page) # recurses until gui.show_help is reached def add_help_text(self, text): '''Adds a label with an info icon in front of it. Intended for informational text in dialogs. @param text: help text ''' hbox = help_text_factory(text) self.vbox.pack_start(hbox, False) def add_text(self, text): '''Adds a label to the dialog Also see L{add_help_text()} for another style option. @param text: dialog text ''' label = gtk.Label(text) label.set_use_markup(True) label.set_alignment(0.0, 0.0) self.vbox.pack_start(label, False) def add_form(self, inputs, values=None, depends=None, trigger_response=True): '''Convenience method to construct a form with input widgets and add them to the dialog. See L{InputForm.add_inputs()} for details. @param inputs: list with input definitions @param values: initial values for the inputs @param depends: dict with dependencies between inputs @param trigger_response: if C{True} pressing C{} in the last entry widget will immediatly call L{response_ok()}. Set to C{False} if more forms will follow in the same dialog. ''' if hasattr(self.ui, 'notebook'): notebook = self.ui.notebook else: notebook = None self.form = InputForm(inputs, values, depends, notebook) if trigger_response: self.form.connect('last-activated', lambda o: self.response_ok()) self.vbox.pack_start(self.form, False) return self.form #} #{ Interaction methods def run(self): '''Wrapper for C{gtk.Dialog.run()}, also calls C{show_all()} @returns: C{self.result} ''' self.show_all() if TEST_MODE: assert TEST_MODE_RUN_CB, 'Dialog run without test callback' TEST_MODE_RUN_CB(self) else: while not self.destroyed: gtk.Dialog.run(self) return self.result def present(self): self.show_all() gtk.Dialog.present(self) def show(self): self.show_all() def show_all(self): logger.debug('Opening dialog "%s"', self.title) register_window(self) if not TEST_MODE: gtk.Dialog.show_all(self) def response_ok(self): '''Trigger the response signal with response type 'OK'.''' self.response(gtk.RESPONSE_OK) def assert_response_ok(self): '''Like L{response_ok()}, but raise an error when L{do_response_ok} returns C{False}. Also it explicitly does not handle errors in L{do_response_ok}. Intended for use by the test suite. @returns: C{self.result} @raises AssertionError: if L{do_response_ok} returns C{False} ''' if not (self._no_ok_action or self.do_response_ok() is True): raise AssertionError, '%s.do_response_ok() did not return True' % self.__class__.__name__ self.save_uistate() self.destroy() return self.result def do_response(self, id): # Handler for the response signal, dispatches to do_response_ok() # or do_response_cancel() and destroys the dialog if that function # returns True. # Ensure the dialog always closes on delete event, regardless # of any errors or bugs that may occur. if id == gtk.RESPONSE_OK and not self._no_ok_action: logger.debug('Dialog response OK') try: destroy = self.do_response_ok() except Exception, error: ErrorDialog(self.ui, error).run() destroy = False else: if not destroy: logger.warning('Dialog input not valid') elif id == gtk.RESPONSE_CANCEL: logger.debug('Dialog response CANCEL') try: destroy = self.do_response_cancel() except Exception, error: ErrorDialog(self.ui, error).run() destroy = False else: if not destroy: logger.warning('Could not cancel dialog') else: destroy = True try: if ui_environment['platform'] != 'maemo': x, y = self.get_position() self.uistate['_windowpos'] = (x, y) w, h = self.get_size() self.uistate['windowsize'] = (w, h) self.save_uistate() except: logger.exception('Exception in do_response()') if destroy: self.destroy() logger.debug('Closed dialog "%s"', self.title[:-6]) def do_response_ok(self): '''Handler called when the user clicks the "OK" button (or an equivalent button) @returns: C{True} if succesful and the dialog can close. Returns C{False} if e.g. input is not valid, this will keep the dialog open. @implementation: must be implemented by sub-classes that have an "OK" button ''' raise NotImplementedError def do_response_cancel(self): '''Handler called when the user clicks the "Cancel" button. @note: this method is B{not} called when the dialog is closed using e.g. the "[x]" button in the window decoration. It is only used when the user explicitly clicks "Cancel". @returns: C{True} if the dialog can be destroyed close. Returning C{False} will keep the dialog open. @implementation: can be implemented by sub-classes that have an "Cancel" button ''' return True def save_uistate(self): '''Method when the dialog is about to exit or hide and wants to save the uistate. Sub-classes implementing this method should use it to set additional state parameter in C{self.uistate}. @implementation: can be implemented by sub-classes that have some additional uistate to save ''' pass #} # Need to register classes defining gobject signals gobject.type_register(Dialog) class ErrorDialog(gtk.MessageDialog): '''The is the main class for error dialogs in zim. It not only presents the error to the user, but also takes care of logging it. So the error dialog can be used as a generic catch all for exceptions in the user interface. The way the error is shown depends on the class of the exception: For exceptions that inherit from L{zim.errors.Error} or C{EnvironmentError} (e.g. C{OSError} or C{IOError}) a normal error dialog will be shown. This covers errors that can can occur in normal usage. As a special case the "filename" attribute of Environment errors is used and added to the error message. On the other all exceptions that do not inherit from these classes (so all standard in exceptions like C{AssertionError}, C{KeyError} etc.) are considered the result of bugs and the dialog will say: "Looks like you found a bug" and show a stack trace. @note: in menu action handlers you typically do not need to catch exceptions with an error dialog. The standard menu wrapper takes care of that. ''' def __init__(self, ui, error, exc_info=None): '''Constructor @param ui: either a parent window or dialog or the main C{GtkInterface} object @param error: the actual error, either an C{Exception} object (including instances of L{zim.errors.Error}), a string with the error description, or a 2-tuple of the short message and the longer description as strings. Using a tuple here will give a better looking dialog over using a simple string. @param exc_info: this is an optional argument that takes the result of C{sys.exc_info()}. This parameter is not necessary in most cases where the dialog is run while the exception is still in scope. One reason to pass it on explicitly is the handling of errors from an async operation in the main tread. ''' self.error = error show_trace = False if isinstance(error, zim.errors.Error): msg = error.msg description = error.description elif isinstance(error, EnvironmentError): # e.g. OSError or IOError msg = error.strerror if hasattr(error, 'filename') and error.filename: msg += ': ' + error.filename description = None elif isinstance(error, Exception): msg = _('Looks like you found a bug') # T: generic error dialog # TODO point to bug tracker description = error.__class__.__name__ + ': ' + unicode(error) description += '\n\n' + _('When reporting this bug please include\nthe information from the text box below') # T: generic error dialog text show_trace = True elif isinstance(error, tuple): msg, description = error else: # other object or string msg = unicode(error) description = None gtk.MessageDialog.__init__( self, parent=get_window(ui), type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format=msg ) if description: self.format_secondary_text(description) # Add widget with debug info if show_trace: text = self.get_debug_text(exc_info) window, textview = ScrolledTextView(text, monospace=True) window.set_size_request(350, 200) self.vbox.add(window) self.vbox.show_all() # TODO use an expander here ? def get_debug_text(self, exc_info=None): '''Get the text to show in the log of a "You found a bug" dialog. Includes zim version info and traceback info. @param exc_info: this is an optional argument that takes the result of C{sys.exc_info()} @returns: debug log as string ''' import zim import traceback if not exc_info: exc_info = sys.exc_info() if exc_info[2]: tb = exc_info[2] else: tb = None text = 'This is zim %s\n' % zim.__version__ + \ 'Python version is %s\n' % str(sys.version_info) + \ 'Gtk version is %s\n' % str(gtk.gtk_version) + \ 'Pygtk version is %s\n' % str(gtk.pygtk_version) + \ 'Platform is %s\n' % os.name text += zim.get_zim_revision() + '\n' # FIXME: more info here? Like notebook path, page, environment etc. ? text += '\n======= Traceback =======\n' if tb: lines = traceback.format_tb(tb) text += ''.join(lines) else: text += '\n' text += self.error.__class__.__name__ + ': ' + unicode(self.error) return text def run(self): '''Runs the dialog and destroys it directly.''' logger.debug('Running %s', self.__class__.__name__) exc_info = sys.exc_info() # Check if we are in an exception handler if exc_info[0] is None: exc_info = None logger.error(self.error, exc_info=exc_info) del exc_info # Recommended in pydoc sys sys.exc_clear() # Avoid showing same message again later while True: response = gtk.MessageDialog.run(self) if response == gtk.RESPONSE_OK and not self.do_response_ok(): continue else: break self.destroy() def do_response_ok(self): '''Response handler for the 'OK' button @implementation: optional to be implemented by sub-classes that want to run some action after presenting the error. ''' return True class QuestionDialog(gtk.MessageDialog): '''Convenience class to prompt the user with Yes/No answer type of questions. Note that message dialogs do not have a title. ''' def __init__(self, ui, question): '''Constructor. @param ui: either a parent window or dialog or the main C{GtkInterface} object @param question: a question that can be answered by 'yes' or 'no', either as sring or a 2-tuple of the actual question and a longer explanation as srtings. Using a tuple here will give a better looking dialog. ''' if isinstance(question, tuple): question, text = question else: text = None self.question = question self.response = None gtk.MessageDialog.__init__( self, parent=get_window(ui), type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=question ) if text: self.format_secondary_text(text) self.connect('response', self.__class__.do_response) def do_response(self, id): self.response = id def run(self): '''Runs the dialog and destroys it directly. @returns: C{True} if the user clicked 'Yes', C{False} otherwise. ''' logger.debug('Running QuestionDialog') logger.debug('Q: %s', self.question) if TEST_MODE: assert TEST_MODE_RUN_CB, 'Dialog run without test callback' TEST_MODE_RUN_CB(self) else: gtk.MessageDialog.run(self) self.destroy() answer = self.response == gtk.RESPONSE_YES logger.debug('A: %s', answer) return answer class MessageDialog(gtk.MessageDialog): '''Convenience wrapper for C{gtk.MessageDialog}, should be used for informational popups without an action. Note that message dialogs do not have a title. ''' def __init__(self, ui, msg): '''Constructor. @param ui: either a parent window or dialog or the main C{GtkInterface} object @param msg: the message either as sring or a 2-tuple of the actual question and a longer explanation as strings. Using a tuple here will give a better looking dialog. ''' if isinstance(msg, tuple): msg, text = msg else: text = None self.response = None gtk.MessageDialog.__init__( self, parent=get_window(ui), type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK, message_format=msg, flags=gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT, ) if text: self.format_secondary_text(text) def run(self): '''Runs the dialog and destroys it directly.''' logger.debug('Running MessageDialog') gtk.MessageDialog.run(self) self.destroy() class FileDialog(Dialog): '''File Chooser dialog, that allows to browser the file system and select files or folders. Similar to C{gtk.FileChooserDialog} but inherits from L{Dialog} instead. This dialog will automatically show previews for image files. When using C{dialog.run()} it will return the selected file(s) or dir(s) based on the arguments given during construction. ''' def __init__(self, ui, title, action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=gtk.BUTTONS_OK_CANCEL, button=None, help_text=None, help=None, multiple=False ): '''Constructor. @param ui: either a parent window or dialog or the main C{GtkInterface} object @param title: the dialog title @param action: the file chooser action, one of:: gtk.FILE_CHOOSER_ACTION_OPEN gtk.FILE_CHOOSER_ACTION_SAVE gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER @param buttons: see L{Dialog.__init__()} @param button: see L{Dialog.__init__()} @param help_text: see L{Dialog.__init__()} @param help: see L{Dialog.__init__()} @param multiple: if C{True} the dialog will allow selecting multiple files at once. ''' if button is None: if action == gtk.FILE_CHOOSER_ACTION_OPEN: button = (None, gtk.STOCK_OPEN) elif action == gtk.FILE_CHOOSER_ACTION_SAVE: button = (None, gtk.STOCK_SAVE) # else Ok will do if ui_environment['platform'] == 'maemo': defaultsize = (800, 480) else: defaultsize = (500, 400) Dialog.__init__(self, ui, title, defaultwindowsize=defaultsize, buttons=buttons, button=button, help_text=help_text, help=help) self.filechooser = gtk.FileChooserWidget(action=action) self.filechooser.set_do_overwrite_confirmation(True) self.filechooser.set_select_multiple(multiple) self.filechooser.connect('file-activated', lambda o: self.response_ok()) self.vbox.add(self.filechooser) # FIXME hook to expander to resize window for FILE_CHOOSER_ACTION_SAVE self.preview_widget = gtk.Image() self.filechooser.set_preview_widget(self.preview_widget) self.filechooser.connect('update-preview', self.on_update_preview) def on_update_preview(self, *a): filename = self.filechooser.get_preview_filename() try: info, w, h = gtk.gdk.pixbuf_get_file_info(filename) if w <= 128 and h <= 128: # Show icons etc. on real size pixbuf = gtk.gdk.pixbuf_new_from_file(filename) else: # Scale other images to fit the window pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, 128, 128) self.preview_widget.set_from_pixbuf(pixbuf) self.filechooser.set_preview_widget_active(True) except: self.filechooser.set_preview_widget_active(False) return def set_file(self, file): '''Set the file or dir to pre select in the dialog @param file: a L{File} or L{Dir} object ''' ok = self.filechooser.set_filename(file.path) if not ok: raise Exception, 'Could not set filename: %s' % file.path def get_file(self): '''Get the current selected file @returns: a L{File} object or C{None}. ''' path = self.filechooser.get_filename() if path is None: return None else: return File(path.decode('utf-8')) def get_files(self): '''Get list of selected file. Assumes the dialog was created with C{multiple=True}. @returns: a list of L{File} objects ''' paths = [path.decode('utf-8') for path in self.filechooser.get_filenames()] return [File(path) for path in paths] def get_dir(self): '''Get the the current selected dir. Assumes the dialog was created with action C{gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER} or C{gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER}. @returns: a L{Dir} object or C{None} ''' path = self.filechooser.get_filename().decode('utf-8') if path is None: return None else: return Dir(path) def _add_filter_all(self): filter = gtk.FileFilter() filter.set_name(_('All Files')) # T: Filter in open file dialog, shows all files (*) filter.add_pattern('*') self.filechooser.add_filter(filter) def add_filter(self, name, glob): '''Add a filter for files with specific extensions in the dialog @param name: the label to display in the filter selection @param glob: a file pattern (e.g. "*.txt") @returns: the C{gtk.FileFilter} object ''' if len(self.filechooser.list_filters()) == 0: self._add_filter_all() filter = gtk.FileFilter() filter.set_name(name) filter.add_pattern(glob) self.filechooser.add_filter(filter) self.filechooser.set_filter(filter) return filter def add_filter_images(self): '''Add a standard file filter for selecting image files. @returns: the C{gtk.FileFilter} object ''' if len(self.filechooser.list_filters()) == 0: self._add_filter_all() filter = gtk.FileFilter() filter.set_name(_('Images')) # T: Filter in open file dialog, shows image files only filter.add_pixbuf_formats() filter.add_mime_type('image/*') # to allow types like .ico self.filechooser.add_filter(filter) self.filechooser.set_filter(filter) return filter def do_response_ok(self): '''Default response handler. Will check filechooser action and whether or not we select multiple files or dirs and set result of the dialog accordingly, so the method run() will return the selected file(s) or folder(s). ''' action = self.filechooser.get_action() multiple = self.filechooser.get_select_multiple() if action in ( gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER ): if multiple: self.result = self.get_dirs() else: self.result = self.get_dir() else: if multiple: self.result = self.get_files() else: self.result = self.get_file() return bool(self.result) class ProgressBarDialog(gtk.Dialog): '''This class implements a dialog with a progress bar. ProgressBarDialogs supposed to run modal, but are not called with C{run()} as they are typically driven by a callback of a async action. Typical construct would be:: dialog = ProgressBarDialog(ui, 'My progress bar') def cb_func(*arg): cancel = dialog.pulse() return cancel with dialog: self.async_foo(callback=cb_func) This example assumes that the method C{async_foo()} will cancel as soon as the callback returns C{False}. The dialog is used as context manager, so the dialog is properly destroyed in case of an error. The usage of a progress bar dialog I{must} implement a cancel action. Note that progress bars dialogs do not have a title. But the given title will be shown as a label in the dialog itself. If you know how often L{pulse()} will be called and give this total number the bar will display a percentage. Otherwise the bar will just bounce up and down without indication of remaining time. ''' def __init__(self, ui, text, total=None): '''Constructor @param ui: either a parent window or dialog or the main C{GtkInterface} object @param text: text to show above the progress bar. Typically should be the action being executed, like "Updating Links". This is not a dialog title, so phrasing is slightly different. @param total: number of times we expect L{pulse()} to be called, if known. Will result in the bar showing progress by percentage. Can later be modified by supplying a new total number directly to L{pulse()}. ''' self.ui = ui self.cancelled = False gtk.Dialog.__init__( # no title - see HIG about message dialogs self, parent=get_window(self.ui), title='', flags=gtk.DIALOG_NO_SEPARATOR | gtk.DIALOG_MODAL, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) ) self.set_border_width(10) self.vbox.set_spacing(5) self.set_default_size(300, 0) label = gtk.Label() label.set_markup(''+encode_markup_text(text)+'') label.set_alignment(0.0, 0.5) self.vbox.pack_start(label, False) self.progressbar = gtk.ProgressBar() self.vbox.pack_start(self.progressbar, False) self.msg_label = gtk.Label() self.msg_label.set_alignment(0.0, 0.5) self.msg_label.set_ellipsize(pango.ELLIPSIZE_START) self.vbox.pack_start(self.msg_label, False) self.set_total(total) def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.destroy() return False # re-raises error def set_total(self, total): '''Set the number of times we expect L{pulse()} to be called, calling this method also resets the count @param total: number of times we expect L{pulse()} to be called ''' self.total = total self.count = 0 def pulse(self, msg=None, count=None, total=None): '''update the dialog and move the progress bar by one step. First call to C{pulse()} will also trigger a C{show_all()} if the dialog is not shown yet. By not showing the dialog before C{pulse()} is called prevents the dialog flashing over the screen when the operation was very quick after all and never needed to call the callback. This method also run other pending gtk events. So the interface keeps looking repsonsive is a long operation calls this method often enough. @param msg: optional message to show below the progress bar, e.g. the name of the item being processed @param count: count of steps already done, if C{None} the number of steps is equal to number of times C{pulse()} has been called. @param total: total number of steps expected, if C{None} a previous set total is used. If no total is known the bar will just bounce up and down without indication of remaining items. @returns: C{True} until the 'Cancel' button has been pressed, this should be used to decide if the background job should continue or not. ''' if not TEST_MODE and not self.get_property('visible'): self.show_all() if total and total != self.total: self.set_total(total) self.count = count or 0 elif count: self.count = count - 1 if self.total and self.count < self.total: self.count += 1 fraction = float(self.count) / self.total self.progressbar.set_fraction(fraction) self.progressbar.set_text('%i%%' % int(fraction * 100)) else: self.progressbar.pulse() if msg: self.msg_label.set_markup(''+encode_markup_text(msg)+'') while gtk.events_pending(): gtk.main_iteration(block=False) return not self.cancelled def show_all(self): logger.debug('Opening ProgressBarDialog') if not TEST_MODE: gtk.Dialog.show_all(self) def do_response(self, id): logger.debug('ProgressBarDialog get response %s', id) self.cancelled = True #def do_destroy(self): # logger.debug('Closed ProgressBarDialog') # Need to register classes defining gobject signals gobject.type_register(ProgressBarDialog) class Assistant(Dialog): '''Dialog with multi-page input, sometimes also revert to as a "wizard". Similar to C{gtk.Assistent} separate implementation to allow more flexibility in the dialog layout. Each "page" in the assistant is a step in the work flow. Pages should inherit from L{AssistantPage}. Pages share the 'uistate' dict with assistant object, and can also use this to communicate state to another page. So each step can change its look based on state set in the previous step. (This is sometimes called a "Whiteboard" design pattern: each page can access the same "whiteboard" that is the uistate dict.) Sub-classes of this dialog can freely manipulate the flow of pages e.g. by overloading the L{previous_page()} and L{next_page()} methods. ''' def __init__(self, ui, title, **options): '''Constructor @param ui: either a parent window or dialog or the main C{GtkInterface} object @param title: dialog title @param options: other dialog options, see L{Dialog.__init__()} ''' Dialog.__init__(self, ui, title, **options) self.set_border_width(5) self._pages = [] self._page = -1 self._uistate = self.uistate self.uistate = self._uistate.copy() # Use temporary state, so we can cancel the wizard buttons = [b for b in self.action_area.get_children() if not self.action_area.child_get_property(b, 'secondary')] #~ print [b.get_label() for b in buttons] self.ok_button = buttons[0] # HACK: not sure this order fixed self.ok_button.set_no_show_all(True) self.back_button = gtk.Button(stock=gtk.STOCK_GO_BACK) self.back_button.connect_object('clicked', self.__class__.previous_page, self) self.action_area.add(self.back_button) self.forw_button = gtk.Button(stock=gtk.STOCK_GO_FORWARD) self.forw_button.set_no_show_all(True) self.forw_button.connect_object('clicked', self.__class__.next_page, self) self.action_area.add(self.forw_button) self.action_area.reorder_child(self.ok_button, -1) def append_page(self, page): '''Append a page @param page: an L{AssistantPage} object ''' assert isinstance(page, AssistantPage) page.connect('input-valid-changed', self._update_valid) self._pages.append(page) def run(self): assert self._pages self.set_page(0) Dialog.run(self) def get_pages(self): '''Get all pages @returns: a list of L{AssistantPage} objects ''' return self._pages def get_page(self): '''Get the current page @returns: a L{AssistantPage} object ''' if self._page > -1: return self._pages[self._page] else: return None def set_page(self, i): '''Set the current page, based on sequence number @param i: the index of the page to be shown ''' if i < 0 or i >= len(self._pages): return False # Wrap up previous page if self._page > -1: self._pages[self._page].save_uistate() # Remove previous page for child in self.vbox.get_children(): if not isinstance(child, gtk.ButtonBox): self.vbox.remove(child) self._page = i page = self._pages[self._page] # Add page title - use same color as used by gtkassistent.c # This is handled on expose event, because style does not # yet reflect theming on construction # However also need to disconnect the signal after first use, # because otherwise this keeps firing, which hangs the loop # for handling events in ProgressBarDialog.pulse() - LP #929247 ebox = gtk.EventBox() def _set_heading_color(*a): ebox.modify_fg(gtk.STATE_NORMAL, self.style.fg[gtk.STATE_SELECTED]) ebox.modify_bg(gtk.STATE_NORMAL, self.style.bg[gtk.STATE_SELECTED]) self.disconnect(self._expose_event_id) self._expose_event_id = \ self.connect('expose-event', _set_heading_color) hbox = gtk.HBox() hbox.set_border_width(5) ebox.add(hbox) self.vbox.pack_start(ebox, False) label = gtk.Label() label.set_markup('' + page.title + '') hbox.pack_start(label, False) label = gtk.Label() label.set_markup('(%i/%i)' % (self._page+1, len(self._pages))) hbox.pack_end(label, False) # Add actual page self.vbox.add(page) self.vbox.show_all() page.init_uistate() self.back_button.set_sensitive(self._page > 0) if self._page < len(self._pages) - 1: self.forw_button.show() self.ok_button.hide() else: self.forw_button.hide() self.ok_button.show() self._update_valid() return True def _update_valid(self, *a): page = self._pages[self._page] ok = page.get_input_valid() self.forw_button.set_sensitive(ok) self.ok_button.set_sensitive(ok) def next_page(self): '''Go forward to the next page''' return self.set_page(self._page + 1) def previous_page(self): '''Go back to the previous page''' return self.set_page(self._page - 1) def do_response(self, id): if id == gtk.RESPONSE_OK: # Wrap up previous page if self._page > -1: self._pages[self._page].save_uistate() self._uistate.update(self.uistate) Dialog.do_response(self, id) def assert_response_ok(self): # Wrap up previous page if self._page > -1: self._pages[self._page].save_uistate() self._uistate.update(self.uistate) if not self.do_response_ok() is True: raise AssertionError, '%s.do_response_ok() did not return True' % self.__class__.__name__ self.save_uistate() self.destroy() return self.result class AssistantPage(gtk.VBox): '''Base class for pages in an L{Assistant} dialog. Typically each page will contain a number of input widgets that are logically grouped. After filling them in the user presses "Forward" to go to the next page. In order for the "Forward" button to becomes sensitive all widgets must have valid input. @cvar title: title to show above this page @ivar uistate: dict shared between all pages in the same dialog, use this to set values giving the interface state. @ivar assistant: the dialog this page belongs to @ivar form: an L{InputForm} when L{add_form()} was used @signal: C{input-valid-changed ()}: emitted when the valid state of the page changed ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'input-valid-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } title = '' def __init__(self, assistant): '''Constructor @param assistant: the L{Assistant} dialog ''' gtk.VBox.__init__(self) self.set_border_width(5) self.uistate = assistant.uistate self.assistant = assistant self._input_valid = True self.form = None def init_uistate(self): '''This method is called when this page is shown in the dialog. Should be used to update uistate according to input of other pages. Keep in mind that uistate can have changed since the constructor was called - even when this is the first page, the dialog has a "Back" button. @implementation: must be implementated by all subclasseses ''' pass def save_uistate(self): '''This method is called before leaving the page. It should be used to update uitstate based on in put widgets. @implementation: must be implementated by all subclasseses that do not update uistate in real time ''' pass def add_form(self, inputs, values=None, depends=None): '''Convenience method to construct a form with input widgets and add them to the dialog. See L{InputForm.add_inputs()} for details. @param inputs: list with input definitions @param values: initial values for the inputs @param depends: dict with dependencies between inputs ''' self.form = InputForm(inputs, values, depends, notebook=self.assistant.ui.notebook) self.form.connect('input-valid-changed', lambda o: self.check_input_valid()) self.pack_start(self.form, False) self.check_input_valid() return self.form def get_input_valid(self): '''Get valid state for the page @returns: C{True} if all input is valid ''' return self._input_valid def check_input_valid(self): '''Check overall valid stat of the page. Called if the valid state if the form is changed. And should be called for any other custom widgets in the page. @implementation: should be implemented by sub-classes that add widgets outside of the form @emits: input-valid ''' if self.form: valid = self.form.get_input_valid() else: valid = True if self._input_valid != valid: self._input_valid = valid self.emit('input-valid-changed') # Need to register classes defining gobject signals gobject.type_register(AssistantPage) class ImageView(gtk.Layout): '''Widget to show an image, scales the image and sets proper background. ''' SCALE_FIT = 1 #: scale image with the window (if the image is bigger) SCALE_STATIC = 2 #: use scaling factor __gsignals__ = { 'size-allocate': 'override', } def __init__(self, bgcolor='#FFF', checkerboard=True): '''Constructor @param bgcolor: background color as color hex code, (e.g. "#FFF") @param checkerboard: if C{True} a checkerboard is drawn behind transparent images, if C{False} it is just the background color. ''' gtk.Layout.__init__(self) self.set_flags(gtk.CAN_FOCUS) self.scaling = self.SCALE_FIT self.factor = 1 self._pixbuf = None self._render_size = None # allocation w, h for which we have rendered self._render_timeout = None # timer before updating rendering self._image = gtk.Image() # pixbuf is set for the image in _render() self.add(self._image) colormap = self._image.get_colormap() self._lightgrey = colormap.alloc_color('#666') self._darkgrey = colormap.alloc_color('#999') if bgcolor: self.set_bgcolor(bgcolor) self.checkerboard = checkerboard def set_bgcolor(self, bgcolor): '''Set background color @param bgcolor: background color as color hex code, (e.g. "#FFF") ''' assert bgcolor.startswith('#'), 'BUG: Should specify colors in hex' color = gtk.gdk.color_parse(bgcolor) # gtk.gdk.Color(spec) only for gtk+ >= 2.14 self.modify_bg(gtk.STATE_NORMAL, color) def set_checkerboard(self, checkerboard): '''Set checkerboard for transparent images @param checkerboard: if C{True} a checkerboard is drawn behind transparent images, if C{False} it is just the background color. ''' self.checkerboard = checkerboard def set_scaling(self, scaling, factor=1): '''Set the scaling @param scaling: C{SCALE_FIT} to make the image scale down to the size of the view, or C{SCALE_STATIC} to set scaling to a fixed factor. @param factor: static scaling factor (in combination with C{SCALE_STATIC}) ''' assert scaling in (SCALE_FIT, SCALE_STATIC) self.scaling = scaling self.factor = factor self._render() def set_file(self, file): '''Set the image to display from a file @param file: a L{File} object ''' pixbuf = None if file: try: pixbuf = gtk.gdk.pixbuf_new_from_file(str(file)) except: logger.exception('Could not load image "%s"', file) else: pass self.set_pixbuf(pixbuf) def set_pixbuf(self, pixbuf): '''Set the image to display from a pixbuf @param pixbuf: a C{gtk.gdk.Pixbuf} or C{None} to display a broken image icon. ''' if pixbuf is None: pixbuf = self.render_icon( gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_DIALOG).copy() self._pixbuf = pixbuf self._render() def do_size_allocate(self, allocation): gtk.Layout.do_size_allocate(self, allocation) # remove timer if any if self._render_timeout: gobject.source_remove(self._render_timeout) if not self._pixbuf \ or (allocation.width, allocation.height) == self._render_size: pass # no update of rendering needed else: # set new timer for 100ms self._render_timeout = gobject.timeout_add(100, self._render) def _render(self): # remove timer if any if self._render_timeout: gobject.source_remove(self._render_timeout) # Determine what size we want to render the image allocation = self.allocation wwin, hwin = allocation.width, allocation.height wsrc, hsrc = self._pixbuf.get_width(), self._pixbuf.get_height() self._render_size = (wwin, hwin) #~ print 'Allocated', (wwin, hwin), #~ print 'Source', (wsrc, hsrc) if self.scaling == self.SCALE_STATIC: wimg = self.factor * wsrc himg = self.factor * hsrc elif self.scaling == self.SCALE_FIT: if hsrc <= wwin and hsrc <= hwin: # image fits in the screen - no scaling wimg, himg = wsrc, hsrc elif (float(wwin)/wsrc) < (float(hwin)/hsrc): # Fit by width wimg = wwin himg = int(hsrc * float(wwin)/wsrc) else: # Fit by height wimg = int(wsrc * float(hwin)/hsrc) himg = hwin else: assert False, 'BUG: unknown scaling type' #~ print 'Image', (wimg, himg) # Scale pixbuf to new size wimg = max(wimg, 1) himg = max(himg, 1) if not self.checkerboard or not self._pixbuf.get_has_alpha(): if (wimg, himg) == (wsrc, hsrc): pixbuf = self._pixbuf else: pixbuf = self._pixbuf.scale_simple( wimg, himg, gtk.gdk.INTERP_NEAREST) else: # Generate checkerboard background while scaling pixbuf = self._pixbuf.composite_color_simple( wimg, himg, gtk.gdk.INTERP_NEAREST, 255, 16, self._lightgrey.pixel, self._darkgrey.pixel ) # And align the image in the layout wvirt = max((wwin, wimg)) hvirt = max((hwin, himg)) #~ print 'Virtual', (wvirt, hvirt) self._image.set_from_pixbuf(pixbuf) self.set_size(wvirt, hvirt) self.move(self._image, (wvirt-wimg)/2, (hvirt-himg)/2) return False # We could be called by a timeout event # Need to register classes defining gobject signals gobject.type_register(ImageView) class PromptExistingFileDialog(Dialog): '''Dialog that is used e.g. when a file should be attached to zim, but a file with the same name already exists in the attachment directory. This Dialog allows to suggest a new name or overwrite the existing one. For this dialog C{run()} will return either the original file (for overwrite), a new file, or None when the dialog was canceled. ''' def __init__(self, ui, file): '''Constructor @param ui: either a parent window or dialog or the main C{GtkInterface} object @param file: a L{File} object for an existing file ''' Dialog.__init__(self, ui, _('File Exists'), buttons=None) # T: Dialog title self.add_help_text( _('''\ A file with the name "%s" already exists. You can use another name or overwrite the existing file.''' % file.basename), ) # T: Dialog text in 'new filename' dialog self.old_file = file self.dir = file.dir suggested_filename = file.dir.new_file(file.basename).basename self.add_form(( ('name', 'string', _('Filename')), # T: Input label ), { 'name': suggested_filename } ) self.form.widgets['name'].set_check_func(self._check_valid) # all buttons are defined in this class, to get the ordering right # [show folder] [overwrite] [cancel] [ok] button = gtk.Button(_('_Browse')) # T: Button label button.connect('clicked', self.do_show_folder) self.action_area.add(button) self.action_area.set_child_secondary(button, True) button = gtk.Button(_('Overwrite')) # T: Button label button.connect('clicked', self.do_response_overwrite) self.add_action_widget(button, gtk.RESPONSE_NONE) self.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) self._no_ok_action = False self.form.widgets['name'].connect('focus-in-event', self._on_focus) def _on_focus(self, widget, event): # filename length without suffix length = len(os.path.splitext(widget.get_text())[0]) widget.select_region(0, length) def _check_valid(self, filename): # Only valid when same dir and does not yet exist file = self.dir.file(filename) return file.dir == self.dir and not file.exists() def do_show_folder(self, *a): self.ui.open_file(self.dir) def do_response_overwrite(self, *a): logger.info('Overwriting %s', self.old_file.path) self.result = self.old_file def do_response_ok(self): if not self.form.widgets['name'].get_input_valid(): return False newfile = self.dir.file(self.form['name']) logger.info('Selected %s', newfile.path) assert newfile.dir == self.dir # just to be real sure assert not newfile.exists() # just to be real sure self.result = newfile return True zim-0.60/zim/gui/pathbar.py0000664000175000017500000004530312132472704015475 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import gtk import gobject from zim.gui.widgets import encode_markup_text # Constants DIR_FORWARD = 1 DIR_BACKWARD = -1 class ScrolledHBox(gtk.HBox): '''This class provides a widget that behaves like a HBox when there is enough space to render all child widgets. When space is limited it shows arrow buttons on the left and on the right to allow scrolling through the widgets. Note that this class does not (yet?) support packing options like 'expand', 'fill' etc. All child widgets can just be added with 'add()'. TODO this class does not yet support homogeneous spacing ''' # In order to display as many items as possible we use the following # scrolling algorithm: # # There is an attribute "anchor" which is a tuple of a direction and the index # of a child item. This anchor represents the last scrolling action. # We start filling the space by taking this anchor item as either left or right # side of the visible range (depending on the given direction) and start adding # other items from there. We can run out of items when we reach the end of the # item list, or we can run out of space when the next item is larger than the # space that is left. # Next we check if we can show more items by adding items in the opposite # direction. Possibly replacing our anchor as outer left or outer right item. # Once we know which items can be shown we start allocating space to the widgets. # # The indices of the first and last visible items are put in the attributes # "_first" and "_last". In subsequent scroll actions the new anchor item can be # determined based on these indices.Keep in mind that whether the items are rendered # left-to-right or right-to-left depends on the current locale. So the first and # last items can either be on the left or on the right. # # Slide buttons are shown unless all children fit in the given space. So # the space is calculated either with or without sliders. At the end we # check if the sliders are really needed. We choose to hide the slider if # it can't be used to scroll more instead of making it insensitive because # the arrows do not show very clear when they are sensitive and when not. # The space that is freed when a slider is hidden is not recycled because # that would pose the risk of clicking on a button when the slider suddenly # disappears # We also add the two scroll buttons to our child widgets, so when dealing # with the widgets that are scrolled one should use "get_children()[2:]". # Not sure if there is a cleaner way to do this # Actually wanted to inherit from gtk.Box instead of gtk.HBox, but seems # we can not call gtk.Box.__init__() to instantiate the object. __gsignals__ = { 'size-request': 'override', 'size-allocate': 'override', } initial_scroll_timeout = 300 # timeout before starting scrolling on button press scroll_timeout = 150 # timeout between scroll steps def __init__(self, spacing=0, homogeneous=False): gtk.HBox.__init__(self) self.set_spacing(spacing) self.set_homogeneous(homogeneous) self._scroll_timeout = None self._anchor = None # tuple of (direction, n) - used in allocate self._first = None # int for first item - set in allocate self._last = None # int for last item - set in allocate self._forw_button = ScrollButton(DIR_FORWARD) self._back_button = ScrollButton(DIR_BACKWARD) for button in (self._forw_button, self._back_button): self.add(button) button.connect('button-press-event', self._on_button_press) button.connect('button-release-event', self._on_button_release) button.connect('clicked', self._on_button_clicked) # TODO looks like gtk.widget_push_composite_child is intended # to flag internal children versus normal children # use this property + define forall to have sane API for these buttons def __del__(self): self.stop_scrolling() def _on_button_press(self, button, event): if event.button == 1: self.start_scrolling(button.direction, initial_timeout=True) def _on_button_release(self, button, event): self.stop_scrolling() def _on_button_clicked(self, button): self.scroll(button.direction) def scroll(self, direction, n=1): '''Scroll n items in either direction. Direction should be either DIR_FORWARD or DIR_BACKWARD, while n should be integer. Returns boolean for success. ''' # returning boolean also controls timeout behavior index = None max = len(self.get_children()[2:])-1 if direction == DIR_FORWARD: if self._last == max: return False else: index = self._last + n elif direction == DIR_BACKWARD: if self._first == 0: return False else: index = self._first - n else: assert False if index > max: index = max elif index < 0: index = 0 self._anchor = (direction, index) self.queue_resize() return True def scroll_to_child(self, child): i = self.get_children()[2:].index(child) if i < self._first: self.scroll(DIR_BACKWARD, self._first - i) elif i > self._last: self.scroll(DIR_FORWARD, i - self._last) else: pass # child was visible already def start_scrolling(self, direction, initial_timeout=False): '''Start continues scrolling. Direction should be either DIR_FORWARD or DIR_BACKWARD. If we were scrolling already, stops this action before setting new scroll direction. ''' self.stop_scrolling() if initial_timeout: self._scroll_timeout = \ gobject.timeout_add(self.initial_scroll_timeout, self.start_scrolling, direction) # indirect recurs else: self._scroll_timeout = \ gobject.timeout_add(self.scroll_timeout, self.scroll, direction) return False # make sure we are only called once from a timeout def stop_scrolling(self): '''Stop continues scrolling. Does not do anything if we were not scrolling. ''' if not self._scroll_timeout is None: gobject.source_remove(self._scroll_timeout) self._scroll_timeout = None def do_size_request(self, requisition): # Determine minimum size needed and store it in requisition # Minimum size should be enough to render the largest child with # scroll buttons on both sides + spacing + border child_wh_tuples = [c.size_request() for c in self.get_children()[2:]] if child_wh_tuples: width = max([c[0] for c in child_wh_tuples]) height = max([c[1] for c in child_wh_tuples]) else: width = 0 height = 0 spacing = self.get_spacing() for button in (self._forw_button, self._back_button): w, h = button.size_request() if h > height: height = h width += w + spacing border = self.get_border_width() width += 2 * border height += 2 * border #~ print "Requesting WxH: %i x %i" % (width, height) requisition.height = height requisition.width = width def do_size_allocate(self, allocation): # Assign the available space to the child widgets # See discussion of allocation algorithm above #~ print "Allocated WxH: %i x %i" % (allocation.width, allocation.height) #~ print "At X,Y: %i, %i" % (allocation.x, allocation.y) children = self.get_children()[2:] if not children: return # nothing to render direction, index = self._anchor or (DIR_FORWARD, len(children)-1) assert 0 <= index <= len(children) assert direction in (DIR_FORWARD, DIR_BACKWARD) # default (DIR_FORWARD, -1) should show the last item (right most) # and starts filling the space backward (to the left) spacing = self.get_spacing() border = self.get_border_width() widths = [c.get_child_requisition()[0] for c in children] total = reduce(int.__add__, widths) + len(widths) * spacing + 2 * border if total <= allocation.width: show_scroll_buttons = False first, last = 0, len(children)-1 else: # determine which children to show show_scroll_buttons = True first, last = index, index available = allocation.width - widths[index] for button in (self._forw_button, self._back_button): available -= button.get_child_requisition()[0] + spacing if direction == DIR_FORWARD: # fill items from the direction we came from with last scroll for i in range(index-1, -1, -1): needed = widths[i] + spacing if needed > available: break else: first = i available -= needed # see if there is any space to fill items on the other side for i in range(index+1, len(children), 1): needed = widths[i] + spacing if needed > available: break else: last = i available -= needed else: # DIR_BACKWARD # fill items from the direction we came from with last scroll for i in range(index+1, len(children)): needed = widths[i] + spacing if needed > available: break else: last = i available -= needed # see if there is any space to fill items on the other side for i in range(index-1, -1, -1): needed = widths[i] + spacing if needed > available: break else: first = i available -= needed self._first, self._last = first, last # Allocate children y = allocation.y + border h = allocation.height - 2*border child_allocation = gtk.gdk.Rectangle(y=y, height=h) # y and height are the same for all if not self.get_direction() == gtk.TEXT_DIR_RTL: # Left to Right child_allocation.x = allocation.x + border if show_scroll_buttons and first != 0: child_allocation.width = self._back_button.get_child_requisition()[0] self._back_button.set_child_visible(True) self._back_button.size_allocate(child_allocation) else: self._back_button.set_child_visible(False) if show_scroll_buttons: # Reserve the space, even if hidden child_allocation.x += self._back_button.get_child_requisition()[0] + spacing for i in range(first, last+1): child_allocation.width = widths[i] children[i].set_child_visible(True) children[i].size_allocate(child_allocation) child_allocation.x += widths[i] + spacing # set x for next child if show_scroll_buttons and last != len(children)-1: # reset x - there may be space between last button and scroll button child_allocation.width = self._forw_button.get_child_requisition()[0] child_allocation.x = allocation.x + allocation.width - child_allocation.width - border self._forw_button.set_child_visible(True) self._forw_button.size_allocate(child_allocation) else: # hide scroll button self._forw_button.set_child_visible(False) else: # Right to Left child_allocation.x = allocation.x + allocation.width - border if show_scroll_buttons and first != 0: child_allocation.width = self._back_button.get_child_requisition()[0] child_allocation.x -= child_allocation.width self._back_button.set_child_visible(True) self._back_button.size_allocate(child_allocation) child_allocation.x -= spacing else: self._back_button.set_child_visible(False) if show_scroll_buttons: # Reserve the space, even if hidden child_allocation.x = self._back_button.get_child_requisition()[0] + spacing for i in range(first, last+1): child_allocation.width = widths[i] child_allocation.x -= child_allocation.width children[i].set_child_visible(True) children[i].size_allocate(child_allocation) child_allocation.x -= spacing # set x for next child if show_scroll_buttons and last != len(children)-1: # reset x - there may be space between last button and scroll button child_allocation.width = self._forw_button.get_child_requisition()[0] child_allocation.x = allocation.x + border self._forw_button.set_child_visible(True) self._forw_button.size_allocate(child_allocation) else: # hide scroll button self._forw_button.set_child_visible(False) # Hide remaining children for child in children[0:first]: child.set_child_visible(False) for child in children[last+1:]: child.set_child_visible(False) def do_focus(self, direction): # Overrule navigation for while leaving # navigation with and in tact # (so do not "sub-navigate" with ). # Otherwise the user has to tab through all buttons before # he can tab to the next widget. if direction in (gtk.DIR_TAB_FORWARD, gtk.DIR_TAB_BACKWARD) \ and self.focus_child is not None: return False # Let outer container go to next widget else: return gtk.HBox.do_focus(self, direction) # Need to register classes defining gobject signals gobject.type_register(ScrolledHBox) class ScrollButton(gtk.Button): '''Arrow buttons used by ScrolledHBox''' def __init__(self, direction): gtk.Button.__init__(self) self.direction = direction if self.get_direction() != gtk.TEXT_DIR_RTL: # Left to Right if direction == DIR_FORWARD: arrow_dir = gtk.ARROW_RIGHT else: arrow_dir = gtk.ARROW_LEFT else: # Right to Left if direction == DIR_FORWARD: arrow_dir = gtk.ARROW_LEFT else: arrow_dir = gtk.ARROW_RIGHT self.add(gtk.Arrow(arrow_dir, gtk.SHADOW_OUT)) self.set_relief(gtk.RELIEF_NONE) class PathBar(ScrolledHBox): '''Base class for pathbars in the zim GUI, extends ScrolledHBox for usage with a list of ToggleButtons representing zim Path objects''' def __init__(self, ui, history=None, spacing=0, homogeneous=False): ScrolledHBox.__init__(self, spacing, homogeneous) self.ui = ui self.history = None self._selected = None if history: self.set_history(history) self.ui.connect_after('open-page', self._after_open_page) def set_history(self, history): self.history = history self.history.connect('changed', lambda o: self._update()) self._update() self._select(history.get_current()) def _after_open_page(self, ui, page, path): # Since we connect after open page, update has likely been done # already from the history 'changed' signal - if not trigger it here. self._select(path) if self._selected is None: self._update() self._select(path) def _update(self): if self.history is None: return for button in self.get_children()[2:]: self.remove(button) self._selected = None for path in self.get_paths(): button = gtk.ToggleButton(label=path.basename) button.set_use_underline(False) button.zim_path = path button.connect('clicked', self.on_button_clicked) button.connect('popup-menu', self.on_button_popup_menu) button.connect('button-release-event', self.do_button_release_event) # TODO Drag n drop support also nice to have button.show() self.add(button) # FIXME tooltips seem not to work - not sure why if gtk.gtk_version >= (2, 12, 0): for button in self.get_children()[2:]: button.set_tooltip_text(button.zim_path.name) else: tooltips = gtk.Tooltips() for button in self.get_children()[2:]: tooltips.set_tip(button, button.zim_path.name) def get_paths(self): '''To be implemented by the sub class, should return a list (or iterable) of notebook paths to show in the pathbar. ''' raise NotImplemented def _select(self, path): def set_active(button, active): button.handler_block_by_func(self.on_button_clicked) button.set_active(active) label = button.get_child() if active: label.set_markup(''+encode_markup_text(label.get_text())+'') else: label.set_text(label.get_text()) # get_text() gives string without markup button.handler_unblock_by_func(self.on_button_clicked) if not self._selected is None: set_active(self._selected, False) for button in reversed(self.get_children()[2:]): if button.zim_path == path: self._selected = button break else: self._selected = None if not self._selected is None: set_active(self._selected, True) def on_button_clicked(self, button): self.ui.open_page(button.zim_path) def do_button_release_event(self, button, event): '''Handler for button-release-event, triggers popup menu''' if event.button == 3: button.emit('popup-menu') # FIXME do we need to pass x/y and button ? return True def on_button_popup_menu(self, button): menu = gtk.Menu() self.ui.populate_popup('page_popup', menu, button.zim_path) menu.popup(None, None, None, 3, 0) return True def get_selected_path(self): '''Returns path currently selected or None''' if self._selected: return self._selected.zim_path else: return None class HistoryPathBar(PathBar): # Get last X paths from history, add buttons # Clicking in the pathbar will always add another entry for that # path to the last position def get_paths(self): # TODO enforce max number of paths shown paths = list(self.history.get_history()) paths.reverse() return paths class RecentPathBar(PathBar): # Get last X unique paths from history, add buttons # When a button is clicked we do not want to change the view # So on open page we need to check if the page was in the list # already or not def get_paths(self): # TODO enforce max number of paths shown paths = list(self.history.get_recent()) paths.reverse() return paths class RecentChangesPathBar(PathBar): def __init__(self, *arg, **kwarg): PathBar.__init__(self, *arg, **kwarg) self.ui.notebook.connect_after('stored-page', self.on_stored_page) def on_stored_page(self, *a): self._update() current = self.history.get_current() if current: self._select(current) def get_paths(self): index = self.ui.notebook.index return reversed(list( index.list_recent_pages(offset=0, limit=10))) class NamespacePathBar(PathBar): # Add buttons for namespace up to and including current page # Use history to query for sub-pages to show as well # Clicking a button in the pathbar should not change the view def get_paths(self): # no need to enforce a max number of paths here current = self.history.get_current() if not current: return [] path = self.history.get_grandchild(current) or current paths = list(path.parents()) paths.reverse() paths.pop(0) # remove root paths.append(path) # add leaf return paths ############################ class TestPath(object): def __init__(self, name): self.name = name self.basename = name class TestPathBar(PathBar): def __init__(self): PathBar.__init__(self, None, None) self.history = 'XXX' self._update() def get_paths(self): for path in ('foo', 'bar', 'baz', 'looooooongggggggg item here', 'dus', 'ja', 'hmm'): yield TestPath(path) if __name__ == '__main__': window = gtk.Window() window.connect('destroy', lambda o: gtk.main_quit()) window.add(TestPathBar()) window.show_all() gtk.main() zim-0.60/zim/gui/pageview.py0000664000175000017500000064424512111222610015657 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''This module contains the main text editor widget. It includes all classes needed to display and edit a single page as well as related dialogs like the dialogs to insert images, links etc. The main widget accessed by the rest of the application is the L{PageView} class. This wraps a L{TextView} widget which actually shows the page. The L{TextBuffer} class is the data model used by the L{TextView}. @todo: for documentation group functions in more logical order ''' from __future__ import with_statement import logging import gobject import gtk import pango import re import string import datetime import zim.formats from zim.fs import File, Dir, normalize_file_uris from zim.errors import Error from zim.notebook import Path, interwiki_link from zim.parsing import link_type, Re, url_re from zim.config import config_file, get_config from zim.formats import get_format, increase_list_iter, \ ParseTree, TreeBuilder, ParseTreeBuilder, \ BULLET, CHECKED_BOX, UNCHECKED_BOX, XCHECKED_BOX from zim.gui.widgets import ui_environment, \ Dialog, FileDialog, QuestionDialog, ErrorDialog, \ Button, CloseButton, MenuButton, BrowserTreeView, InputEntry, \ ScrolledWindow, \ rotate_pixbuf, populate_popup_add_separator from zim.gui.applications import OpenWithMenu from zim.gui.clipboard import Clipboard, SelectionClipboard, \ PARSETREE_ACCEPT_TARGETS, parsetree_from_selectiondata logger = logging.getLogger('zim.gui.pageview') STOCK_CHECKED_BOX = 'zim-checked-box' STOCK_UNCHECKED_BOX = 'zim-unchecked-box' STOCK_XCHECKED_BOX = 'zim-xchecked-box' bullet_types = { CHECKED_BOX: STOCK_CHECKED_BOX, UNCHECKED_BOX: STOCK_UNCHECKED_BOX, XCHECKED_BOX: STOCK_XCHECKED_BOX, } # reverse dict bullets = {} for bullet in bullet_types: bullets[bullet_types[bullet]] = bullet # E.g. Maemo devices have no hardware [] keys, # so allow () to be used for the same purpose autoformat_bullets = { '*': BULLET, '[]': UNCHECKED_BOX, '[*]': CHECKED_BOX, '[x]': XCHECKED_BOX, '()': UNCHECKED_BOX, '(*)': CHECKED_BOX, '(x)': XCHECKED_BOX, } BULLETS = (BULLET, UNCHECKED_BOX, CHECKED_BOX, XCHECKED_BOX) CHECKBOXES = (UNCHECKED_BOX, CHECKED_BOX, XCHECKED_BOX) NUMBER_BULLET = '#.' # Special case for autonumbering is_numbered_bullet_re = re.compile('^(\d+|\w|#)\.$') #: This regular expression is used to test whether a bullet belongs to a numbered list or not # Check the (undocumented) list of constants in gtk.keysyms to see all names KEYVALS_HOME = map(gtk.gdk.keyval_from_name, ('Home', 'KP_Home')) KEYVALS_ENTER = map(gtk.gdk.keyval_from_name, ('Return', 'KP_Enter', 'ISO_Enter')) KEYVALS_BACKSPACE = map(gtk.gdk.keyval_from_name, ('BackSpace',)) KEYVALS_TAB = map(gtk.gdk.keyval_from_name, ('Tab', 'KP_Tab')) KEYVALS_LEFT_TAB = map(gtk.gdk.keyval_from_name, ('ISO_Left_Tab',)) #~ CHARS_END_OF_WORD = (' ', ')', '>', '.', '!', '?') CHARS_END_OF_WORD = ('\t', ' ', ')', '>', ';') KEYVALS_END_OF_WORD = map( gtk.gdk.unicode_to_keyval, map(ord, CHARS_END_OF_WORD)) + KEYVALS_TAB KEYVALS_ASTERISK = ( gtk.gdk.unicode_to_keyval(ord('*')), gtk.gdk.keyval_from_name('KP_Multiply')) KEYVALS_SLASH = ( gtk.gdk.unicode_to_keyval(ord('/')), gtk.gdk.keyval_from_name('KP_Divide')) KEYVALS_GT = (gtk.gdk.unicode_to_keyval(ord('>')),) KEYVALS_SPACE = (gtk.gdk.unicode_to_keyval(ord(' ')),) KEYVAL_ESC = gtk.gdk.keyval_from_name('Escape') KEYVAL_POUND = gtk.gdk.unicode_to_keyval(ord('#')) # States that influence keybindings - we use this to explicitly # exclude other states. E.g. MOD2_MASK seems to be set when either # numlock or fn keys are active, resulting in keybindings failing KEYSTATES = gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK | gtk.gdk.MOD1_MASK ui_actions = ( # name, stock id, label, accelerator, tooltip, readonly ('undo', 'gtk-undo', _('_Undo'), 'Z', '', False), # T: Menu item ('redo', 'gtk-redo', _('_Redo'), 'Z', '', False), # T: Menu item ('redo_alt1', None, '', 'Y', '', False), ('cut', 'gtk-cut', _('Cu_t'), 'X', '', False), # T: Menu item ('copy', 'gtk-copy', _('_Copy'), 'C', '', False), # T: Menu item ('paste', 'gtk-paste', _('_Paste'), 'V', '', False), # T: Menu item ('delete', 'gtk-delete', _('_Delete'), '', '', False), # T: Menu item ('toggle_checkbox', STOCK_CHECKED_BOX, _('Toggle Checkbox \'V\''), 'F12', '', False), # T: Menu item ('xtoggle_checkbox', STOCK_XCHECKED_BOX, _('Toggle Checkbox \'X\''), 'F12', '', False), # T: Menu item ('edit_object', 'gtk-properties', _('_Edit Link or Object...'), 'E', '', False), # T: Menu item ('remove_link', None, _('_Remove Link'), '', '', False), # T: Menu item ('insert_date', None, _('_Date and Time...'), 'D', '', False), # T: Menu item ('insert_image', None, _('_Image...'), '', '', False), # T: Menu item ('insert_bullet_list', None, _('Bulle_t List'), '', '', False), # T: Menu item ('insert_numbered_list', None, _('_Numbered List'), '', '', False), # T: Menu item ('insert_checkbox_list', None, _('Checkbo_x List'), '', '', False), # T: Menu item, ('apply_format_bullet_list', None, _('Bulle_t List'), '', '', False), # T: Menu item, ('apply_format_numbered_list', None, _('_Numbered List'), '', '', False), # T: Menu item, ('apply_format_checkbox_list', None, _('Checkbo_x List'), '', '', False), # T: Menu item, ('insert_text_from_file', None, _('Text From _File...'), '', '', False), # T: Menu item ('insert_link', 'zim-link', _('_Link...'), 'L', _('Insert Link'), False), # T: Menu item ('clear_formatting', None, _('_Clear Formatting'), '9', '', False), # T: Menu item ('show_find', 'gtk-find', _('_Find...'), 'F', '', True), # T: Menu item ('show_find_alt1', None, '', 'F3', '', True), ('find_next', None, _('Find Ne_xt'), 'G', '', True), # T: Menu item ('find_next_alt1', None, '', 'F3', '', True), # T: Menu item ('find_previous', None, _('Find Pre_vious'), 'G', '', True), # T: Menu item ('find_previous_alt1', None, '', 'F3', '', True), ('show_find_and_replace', 'gtk-find-and-replace', _('_Replace...'), 'H', '', False), # T: Menu item ('show_word_count', None, _('Word Count...'), '', '', True), # T: Menu item ('zoom_in', 'gtk-zoom-in', _('_Zoom In'), 'plus', '', True), # T: Menu item ('zoom_in_alt1', None, '', 'equal', '', True), ('zoom_out', 'gtk-zoom-out', _('Zoom _Out'), 'minus', '', True), # T: Menu item ('zoom_reset', 'gtk-zoom-100', _('_Normal Size'), '0', '', True), # T: Menu item to reset zoom # name, stock id, label ('insert_new_file_menu', None, _('New _Attachment')), # T: Menu title # name, stock id, label, accelerator, tooltip, readonly ('open_file_templates_folder', 'gtk-directory', _('File _Templates...'), '', '', False), # T: Menu item in "Insert > New File Attachment" submenu ) ui_format_actions = ( # name, stock id, label, accelerator, tooltip ('apply_format_h1', None, _('Heading _1'), '1', _('Heading 1')), # T: Menu item ('apply_format_h2', None, _('Heading _2'), '2', _('Heading 2')), # T: Menu item ('apply_format_h3', None, _('Heading _3'), '3', _('Heading 3')), # T: Menu item ('apply_format_h4', None, _('Heading _4'), '4', _('Heading 4')), # T: Menu item ('apply_format_h5', None, _('Heading _5'), '5', _('Heading 5')), # T: Menu item ('apply_format_strong', 'gtk-bold', _('_Strong'), 'B', _('Strong')), # T: Menu item ('apply_format_emphasis', 'gtk-italic', _('_Emphasis'), 'I', _('Emphasis')), # T: Menu item ('apply_format_mark', 'gtk-underline', _('_Mark'), 'U', _('Mark')), # T: Menu item ('apply_format_strike', 'gtk-strikethrough', _('_Strike'), 'K', _('Strike')), # T: Menu item ('apply_format_sub', None, _('_Subscript'), '', _('_Subscript')), # T: Menu item ('apply_format_sup', None, _('_Superscript'), '', _('_Superscript')), # T: Menu item ('apply_format_code', None, _('_Verbatim'), 'T', _('Verbatim')), # T: Menu item ) ui_format_toggle_actions = ( # name, stock id, label, accelerator, tooltip ('toggle_format_strong', 'gtk-bold', _('_Strong'), '', _('Strong')), ('toggle_format_emphasis', 'gtk-italic', _('_Emphasis'), '', _('Emphasis')), ('toggle_format_mark', 'gtk-underline', _('_Mark'), '', _('Mark')), ('toggle_format_strike', 'gtk-strikethrough', _('_Strike'), '', _('Strike')), ) COPY_FORMATS = zim.formats.list_formats(zim.formats.TEXT_FORMAT) ui_preferences = ( # key, type, category, label, default ('follow_on_enter', 'bool', 'Interface', _('Use the key to follow links\n(If disabled you can still use )'), True), # T: option in preferences dialog ('read_only_cursor', 'bool', 'Interface', _('Show the cursor also for pages that can not be edited'), False), # T: option in preferences dialog ('autolink_camelcase', 'bool', 'Editing', _('Automatically turn "CamelCase" words into links'), True), # T: option in preferences dialog ('autolink_files', 'bool', 'Editing', _('Automatically turn file paths into links'), True), # T: option in preferences dialog ('autoselect', 'bool', 'Editing', _('Automatically select the current word when you apply formatting'), True), # T: option in preferences dialog ('unindent_on_backspace', 'bool', 'Editing', _('Unindent on \n(If disabled you can still use )'), True), # T: option in preferences dialog ('cycle_checkbox_type', 'bool', 'Editing', _('Repeated clicking a checkbox cyles through the checkbox states'), True), # T: option in preferences dialog ('recursive_indentlist', 'bool', 'Editing', _('(Un-)Indenting a list item also change any sub-items'), True), # T: option in preferences dialog ('recursive_checklist', 'bool', 'Editing', _('Checking a checkbox also change any sub-items'), False), # T: option in preferences dialog ('auto_reformat', 'bool', 'Editing', _('Reformat wiki markup on the fly'), False), # T: option in preferences dialog ('copy_format', 'choice', 'Editing', _('Default format for copying text to the clipboard'), 'Text', COPY_FORMATS), # T: option in preferences dialog ('file_templates_folder', 'dir', 'Editing', _('Folder with templates for attachment files'), '~/Templates'), # T: option in preferences dialog ) if ui_environment['platform'] == 'maemo': # Manipulate preferences with Maemo specific settings ui_preferences = list(ui_preferences) for i in range(len(ui_preferences)): if ui_preferences[i][0] == 'follow_on_enter': ui_preferences[i] = \ ('follow_on_enter', 'bool', None, None, True) # There is no ALT key on maemo devices elif ui_preferences[i][0] == 'unindent_on_backspace': ui_preferences[i] = \ ('unindent_on_backspace', 'bool', None, None, True) # There is no hardware TAB key on maemo devices ui_preferences = tuple(ui_preferences) _is_zim_tag = lambda tag: hasattr(tag, 'zim_type') _is_indent_tag = lambda tag: _is_zim_tag(tag) and tag.zim_type == 'indent' _is_not_indent_tag = lambda tag: _is_zim_tag(tag) and tag.zim_type != 'indent' _is_heading_tag = lambda tag: hasattr(tag, 'zim_tag') and tag.zim_tag == 'h' _is_pre_tag = lambda tag: hasattr(tag, 'zim_tag') and tag.zim_tag == 'pre' _is_line_based_tag = lambda tag: _is_indent_tag(tag) or _is_heading_tag(tag) or _is_pre_tag(tag) _is_not_line_based_tag = lambda tag: not _is_line_based_tag(tag) _is_style_tag = lambda tag: _is_zim_tag(tag) and tag.zim_type == 'style' _is_not_style_tag = lambda tag: not (_is_zim_tag(tag) and tag.zim_type == 'style') _is_link_tag = lambda tag: _is_zim_tag(tag) and tag.zim_type == 'link' _is_not_link_tag = lambda tag: not (_is_zim_tag(tag) and tag.zim_type == 'link') _is_tag_tag = lambda tag: _is_zim_tag(tag) and tag.zim_type == 'tag' _is_not_tag_tag = lambda tag: not (_is_zim_tag(tag) and tag.zim_type == 'tag') PIXBUF_CHR = u'\uFFFC' # Minimal distance from mark to window border after scroll_to_mark() SCROLL_TO_MARK_MARGIN = 0.2 # Regexes used for autoformatting heading_re = Re(r'^(={2,7})\s*(.*)\s*(\1)?$') page_re = Re(r'''( [\w\.\-\(\)]*(?: :[\w\.\-\(\)]{2,} )+:? | \+\w[\w\.\-\(\)]+(?: :[\w\.\-\(\)]{2,} )*:? )$''', re.X | re.U) # e.g. namespace:page or +subpage, but not word without ':' or '+' interwiki_re = Re(r'\w[\w\+\-\.]+\?\w\S+$', re.U) # name?page, where page can be any url style file_re = Re(r'''( ~/[^/\s] | ~[^/\s]*/ | \.\.?/ | /[^/\s] )\S*$''', re.X | re.U) # ~xxx/ or ~name/xxx or ../xxx or ./xxx or /xxx markup_re = {'style-strong' : Re(r'(\*{2})(.*)\1'), 'style-emphasis' : Re(r'(\/{2})(.*)\1'), 'style-mark' : Re(r'(_{2})(.*)\1'), 'style-pre' : Re(r'(\'{2})(.*)\1'), 'style-strike' : Re(r'(~{2})(.*)\1')} tag_re = Re(r'^(@\w+)$', re.U) # These sets adjust to the current locale - so not same as "[a-z]" .. # Must be kidding - no classes for this in the regex engine !? _classes = { 'upper': string.uppercase, 'lower': string.lowercase, 'letters': string.letters } camelcase_re = Re(r'[%(upper)s]+[%(lower)s]+[%(upper)s]+\w*$' % _classes) twoletter_re = re.compile(r'[%(letters)s]{2}' % _classes) del _classes def increase_list_bullet(bullet): '''Like L{increase_list_iter()}, but handles bullet string directly @param bullet: a numbered list bullet, e.g. C{"1."} @returns: the next bullet, e.g. C{"2."} or C{None} ''' next = increase_list_iter(bullet.rstrip('.')) if next: return next + '.' else: return None class UserActionContext(object): '''Context manager to wrap actions in proper user-action signals This class used for the L{TextBuffer.user_action} attribute This allows syntax like:: with buffer.user_action: buffer.insert(...) instead off:: buffer.begin_user_action() buffer.insert(...) buffer.end_user_action() By wrapping actions in this "user-action" block the L{UndoStackManager} will see it as a single action and make it undo-able in a single step. ''' def __init__(self, buffer): self.buffer = buffer def __enter__(self): self.buffer.begin_user_action() def __exit__(self, *a): self.buffer.end_user_action() class SaveCursorContext(object): '''Context manager used by L{TextBuffer.tmp_cursor()} This allows syntax like:: with buffer.tmp_cursor(iter): # some manipulation using iter as cursor position # old cursor position restored Basically it keeps a mark for the old cursor and restores it after exiting the context. ''' def __init__(self, buffer, iter=None): self.buffer = buffer self.iter = iter self.mark = None def __enter__(self): buffer = self.buffer cursor = buffer.get_iter_at_mark(buffer.get_insert()) self.mark = buffer.create_mark(None, cursor, left_gravity=True) if self.iter: buffer.place_cursor(self.iter) def __exit__(self, *a): buffer = self.buffer iter = buffer.get_iter_at_mark(self.mark) buffer.place_cursor(iter) buffer.delete_mark(self.mark) class TextBuffer(gtk.TextBuffer): '''Data model for the editor widget This sub-class of C{gtk.TextBuffer} manages the contents of the L{TextView} widget. It has an internal data model that allows to manipulate the formatted text by cursor positions. It manages images, links, bullet lists etc. The methods L{set_parsetree()} and L{get_parsetree()} can exchange the formatted text as a L{ParseTree} object which can be parsed by the L{zim.formats} modules. Styles ====== Formatting styles like bold, italic etc. as well as functional text objects like links and tags are represented by C{gtk.TextTags}. For static styles these TextTags have the same name as the style. For links and tag anonymous TextTags are used. Be aware thoush that not all TextTags in the model are managed by us, e.g. gtkspell uses it's own tags. TextTags that are managed by us have an additional attribute C{zim_type} which gives the format type for this tag. All TextTags without this attribute are not ours. All TextTags that have a C{zim_type} attribute also have an C{zim_attrib} attribute, which can be either C{None} or contain some properties, like the C{href} property for a link. See the parsetree documentation for what properties to expect. The buffer keeps an internal state for what tags should be applied to new text and applies these automatically when text is inserted. E.g. when you place the cursor at the end of a bold area and start typing the new text will be bold as well. However when you move to the beginning of the area it will not be bold. One limitation is that the current code supposes only one format style can be applied to a part of text at the same time. This means you can not overlap e.g. bold and italic styles. But it makes the code simpler because we only deal with one style at a time. Images ====== Embedded images and icons are handled by C{gtk.gdk.Pixbuf} object. Again the ones that are handled by us have the extry C{zim_type} and C{zim_attrib} attributes. Lists ===== As far as this class is concerned bullet and checkbox lists are just a number of lines that start with a bullet (checkboxes are rendered with small images or icons, but are also considered bullets). There is some logic to keep list formatting nicely but it only applies to one line at a time. For functionality affecting a list as a whole see the L{TextBufferList} class. @todo: The buffer needs a reference to the notebook and page objects for the text that is being shown to make sure that e.g. serializing links works correctly. Check if we can get rid of page and notebook here and just put provide them as arguments when needed. @cvar tag_styles: This dict defines the formatting styles supported by the editor. The style properties are overruled by the values from the X{style.conf} config file. @ivar notebook: The L{Notebook} object @ivar page: The L{Page} object @ivar user_action: A L{UserActionContext} context manager @ivar finder: A L{TextFinder} for this buffer @signal: C{begin-insert-tree ()}: Emitted at the begin of a complex insert @signal: C{end-insert-tree ()}: Emitted at the end of a complex insert @signal: C{inserted-tree (start, end, tree, interactive)}: Gives inserted tree after inserting it @signal: C{textstyle-changed (style)}: Emitted when textstyle at the cursor changes @signal: C{clear ()}: emitted to clear the whole buffer before destruction @signal: C{undo-save-cursor (iter)}: emitted in some specific case where the undo stack should lock the current cursor position @todo: document tag styles that are supported ''' # We rely on the priority of gtk TextTags to sort links before styles, # and styles before indenting. Since styles are initialized on init, # while indenting tags are created when needed, indenting tags always # have the higher priority. By explicitly lowering the priority of new # link tags to zero we keep those tags on the lower endof the scale. # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'insert-text': 'override', 'begin-insert-tree': (gobject.SIGNAL_RUN_LAST, None, ()), 'end-insert-tree': (gobject.SIGNAL_RUN_LAST, None, ()), 'inserted-tree': (gobject.SIGNAL_RUN_LAST, None, (object, object, object, object)), 'textstyle-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'clear': (gobject.SIGNAL_RUN_LAST, None, ()), 'undo-save-cursor': (gobject.SIGNAL_RUN_LAST, None, (object,)), } # style attributes pixels_indent = 30 #: pixels indent for a single indent level #: text styles supported by the editor tag_styles = { 'h1': {'weight': pango.WEIGHT_BOLD, 'scale': 1.15**4}, 'h2': {'weight': pango.WEIGHT_BOLD, 'scale': 1.15**3}, 'h3': {'weight': pango.WEIGHT_BOLD, 'scale': 1.15**2}, 'h4': {'weight': pango.WEIGHT_ULTRABOLD, 'scale': 1.15}, 'h5': {'weight': pango.WEIGHT_BOLD, 'scale': 1.15, 'style': 'italic'}, 'h6': {'weight': pango.WEIGHT_BOLD, 'scale': 1.15}, 'emphasis': {'style': 'italic'}, 'strong': {'weight': pango.WEIGHT_BOLD}, 'mark': {'background': 'yellow'}, 'strike': {'strikethrough': 'true', 'foreground': 'grey'}, 'code': {'family': 'monospace'}, 'pre': {'family': 'monospace', 'wrap-mode': 'none'}, 'sub': {'rise': -3500, 'scale':0.7}, 'sup': {'rise': 7500, 'scale':0.7}, 'link': {'foreground': 'blue'}, 'tag': {'foreground': '#ce5c00'}, 'indent': {}, 'bullet-list': {}, 'numbered-list': {}, 'unchecked-checkbox': {}, 'checked-checkbox': {}, 'xchecked-checkbox': {}, 'find-highlight': {'background': 'magenta', 'foreground': 'white'}, 'find-match': {'background': '#38d878', 'foreground': 'white'} } #: tags that can be mapped to named TextTags _static_style_tags = ( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'emphasis', 'strong', 'mark', 'strike', 'code', 'pre', 'sub', 'sup' ) tag_attributes = set( ( 'weight', 'scale', 'style', 'background', 'foreground', 'strikethrough', 'family', 'wrap-mode', 'indent', 'underline', 'linespacing', ) ) #: Valid properties for a style in tag_styles def __init__(self, notebook=None, page=None): '''Constructor @param notebook: a L{Notebook} object @param page: a L{Page} object ''' gtk.TextBuffer.__init__(self) self.notebook = notebook self.page = page self._insert_tree_in_progress = False self._check_edit_mode = False self._check_renumber = [] self._renumbering = False self.user_action = UserActionContext(self) self.finder = TextFinder(self) for name in self._static_style_tags: tag = self.create_tag('style-'+name, **self.tag_styles[name]) tag.zim_type = 'style' if name in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): # This is needed to get proper output in get_parse_tree tag.zim_tag = 'h' tag.zim_attrib = {'level': int(name[1])} else: tag.zim_tag = name tag.zim_attrib = None self._editmode_tags = () #~ import sys #~ for s in ( #~ 'apply-tag', 'remove-tag', #~ 'delete-range', 'insert-pixbuf', 'insert-text', #~ 'mark-deleted', 'mark-set' #~ 'changed', , 'modified-changed', #~ ): #~ self.connect(s, lambda *a: sys.stderr.write('>>> %s\n' % a[-1]), s) #~ def do_begin_user_action(self): #~ print '>>>> USER ACTION' #~ pass def do_end_user_action(self): #~ print '<<<< USER ACTION' if self._check_edit_mode: self.update_editmode() # This flag can e.g. indicate a delete happened in this # user action, but we did not yet update edit mode - # so we do it here so we are all set for the next action if True: # not self._renumbering: lines = list(self._check_renumber) # copy to avoid infinite loop when updating bullet triggers new delete self._renumbering = True for line in lines: self.renumber_list(line) # This flag means we deleted a line, and now we need # to check if the numbering is still valid. # It is delayed till here because this logic only applies # to interactive actions. self._renumbering = False self._check_renumber = [] def clear(self): '''Clear all content from the buffer''' self.emit('clear') def do_clear(self): self._editmode_tags = () self.delete(*self.get_bounds()) def get_insert_iter(self): '''Get a C{gtk.TextIter} for the current cursor position''' return self.get_iter_at_mark(self.get_insert()) def tmp_cursor(self, iter=None): '''Get a L{SaveCursorContext} object @param iter: a C{gtk.TextIter} for the new (temporary) cursor position ''' return SaveCursorContext(self, iter) def set_parsetree(self, tree): '''Load a new L{ParseTree} in the buffer This method replaces any content in the buffer with the new parser tree. @param tree: a L{ParseTree} object ''' self.clear() try: self.insert_parsetree_at_cursor(tree) except: # Prevent auto-save to kick in at any cost self.set_modified(False) raise else: self.set_modified(False) def insert_parsetree(self, iter, tree, interactive=False): '''Insert a L{ParseTree} in the buffer This method inserts a parsetree at a specific place in the buffer. @param iter: a C{gtk.TextIter} for the insert position @param tree: a L{ParseTree} object @param interactive: Boolean which determines how current state in the buffer is handled. If not interactive we break any existing tags and insert the tree, otherwise we insert using the formatting tags that that are present at iter. For example when a parsetree is inserted because the user pastes content from the clipboard C{interactive} should be C{True}. ''' with self.tmp_cursor(iter): self.insert_parsetree_at_cursor(tree, interactive) def insert_parsetree_at_cursor(self, tree, interactive=False): '''Insert a L{ParseTree} in the buffer Like L{insert_parsetree()} but inserts at the current cursor position. @param tree: a L{ParseTree} object @param interactive: Boolean which determines how current state in the buffer is handled. ''' #~ print 'INSERT AT CURSOR', tree.tostring() # Check tree root = tree.getroot() assert root.tag == 'zim-tree' raw = root.attrib.get('raw') if isinstance(raw, basestring): raw = (raw != 'False') # Check if we are at a bullet or checkbox line iter = self.get_iter_at_mark(self.get_insert()) if not raw and iter.starts_line() \ and not tree.get_ends_with_newline(): bullet = self._get_bullet_at_iter(iter) if bullet: self._iter_forward_past_bullet(iter, bullet) self.place_cursor(iter) # Prepare startoffset = iter.get_offset() if not interactive: self._editmode_tags = () tree.decode_urls() # Actual insert modified = self.get_modified() try: self.emit('begin-insert-tree') if root.text: self.insert_at_cursor(root.text) self._insert_element_children(root, raw=raw) except: # Try to recover buffer state before raising self.update_editmode() startiter = self.get_iter_at_offset(startoffset) enditer = self.get_iter_at_mark(self.get_insert()) self.delete(startiter, enditer) self.set_modified(modified) self.emit('end-insert-tree') raise else: # Signal the tree that was inserted self.update_editmode() startiter = self.get_iter_at_offset(startoffset) enditer = self.get_iter_at_mark(self.get_insert()) self.emit('end-insert-tree') self.emit('inserted-tree', startiter, enditer, tree, interactive) def do_begin_insert_tree(self): self._insert_tree_in_progress = True def do_end_insert_tree(self): self._insert_tree_in_progress = False self.emit('textstyle-changed', self.get_textstyle()) # emitting textstyle-changed is skipped while loading the tree def _insert_element_children(self, node, list_level=-1, list_type=None, list_start='0', raw=False): # FIXME should load list_level from cursor position #~ list_level = get_indent --- with bullets at indent 0 this is not bullet proof... list_iter = list_start def set_indent(level, bullet=None): # Need special set_indent() function here because the normal # function affects the whole line. THis has unwanted side # effects when we e.g. paste a multi-line tree in the # middle of a indented line. # In contrast to the normal set_indent we treat level=None # and level=0 as different cases. self._editmode_tags = filter(_is_not_indent_tag, self._editmode_tags) if level is None: return # Nothing more to do iter = self.get_insert_iter() if not iter.starts_line(): # Check existing indent - may have bullet type while we have not tags = filter(_is_indent_tag, self.iter_get_zim_tags(iter)) assert len(tags) <= 1, 'BUG: overlapping indent tags' if tags and int(tags[0].zim_attrib['indent']) == level: self._editmode_tags += (tags[0],) return # Re-use tag tag = self._get_indent_tag(level, bullet) self._editmode_tags += (tag,) def force_line_start(): # Inserts a newline if we are not at the beginning of a line # makes pasting a tree halfway in a line more sane if not raw: iter = self.get_iter_at_mark( self.get_insert() ) if not iter.starts_line(): self.insert_at_cursor('\n') for element in node.getchildren(): if element.tag in ('p', 'div'): # No force line start here on purpose if 'indent' in element.attrib: set_indent(int(element.attrib['indent'])) else: set_indent(None) if element.text: self.insert_at_cursor(element.text) self._insert_element_children(element, list_level=list_level, raw=raw) # recurs set_indent(None) elif element.tag in ('ul', 'ol'): start = element.attrib.get('start') if 'indent' in element.attrib: level = int(element.attrib['indent']) else: level = list_level + 1 self._insert_element_children(element, list_level=level, list_type=element.tag, list_start=start, raw=raw) # recurs set_indent(None) elif element.tag == 'li': force_line_start() if 'indent' in element.attrib: list_level = int(element.attrib['indent']) elif list_level < 0: list_level = 0 # We skipped the
    - raw tree ? if list_type == 'ol': bullet = list_iter + '.' list_iter = increase_list_iter(list_iter) elif 'bullet' in element.attrib and element.attrib['bullet'] != '*': bullet = element.attrib['bullet'] else: bullet = BULLET # default to '*' set_indent(list_level, bullet) self._insert_bullet_at_cursor(bullet, raw=raw) if element.text: self.insert_at_cursor(element.text) self._insert_element_children(element, list_level=list_level, raw=raw) # recurs set_indent(None) if not raw: self.insert_at_cursor('\n') elif element.tag == 'link': self.set_textstyle(None) # Needed for interactive insert tree after paste self.insert_link_at_cursor(element.text, **element.attrib) elif element.tag == 'tag': self.set_textstyle(None) # Needed for interactive insert tree after paste self.insert_tag_at_cursor(element.text, **element.attrib) elif element.tag == 'img': file = element.attrib['_src_file'] self.insert_image_at_cursor(file, alt=element.text, **element.attrib) elif element.tag == 'pre': if 'indent' in element.attrib: set_indent(int(element.attrib['indent'])) self.set_textstyle(element.tag) if element.text: self.insert_at_cursor(element.text) self.set_textstyle(None) set_indent(None) else: # Text styles if element.tag == 'h': force_line_start() tag = 'h'+str(element.attrib['level']) self.set_textstyle(tag) elif element.tag in self._static_style_tags: self.set_textstyle(element.tag) elif element.tag == '_ignore_': # raw tree from undo can contain these self._insert_element_children(element, list_level=list_level, raw=raw) # recurs else: assert False, 'Unknown tag: %s' % element.tag if element.text: self.insert_at_cursor(element.text) self.set_textstyle(None) if element.tail: self.insert_at_cursor(element.tail) def insert_link(self, iter, text, href, **attrib): '''Insert a link into the buffer @param iter: a C{gtk.TextIter} for the insert position @param text: the text for the link as string @param href: the target (URL, pagename) of the link as string @param attrib: any other link attributes ''' with self.tmp_cursor(iter): self.insert_link_at_cursor(text, href, **attrib) def insert_link_at_cursor(self, text, href=None, **attrib): '''Insert a link into the buffer Like insert_link() but inserts at the current cursor position @param text: the text for the link as string @param href: the target (URL, pagename) of the link as string @param attrib: any other link attributes ''' tag = self._create_link_tag(text, href, **attrib) self._editmode_tags = \ filter(_is_not_link_tag, filter(_is_not_style_tag, self._editmode_tags) ) + (tag,) self.insert_at_cursor(text) self._editmode_tags = self._editmode_tags[:-1] def _create_link_tag(self, text, href, **attrib): '''Creates an anonymouse TextTag for a link''' if isinstance(href, File): href = href.uri assert isinstance(href, basestring) tag = self.create_tag(None, **self.tag_styles['link']) tag.set_priority(0) # force links to be below styles tag.zim_type = 'link' tag.zim_tag = 'link' tag.zim_attrib = attrib if href == text: tag.zim_attrib['href'] = None else: tag.zim_attrib['href'] = href return tag def get_link_tag(self, iter): '''Get the C{gtk.TextTag} for a link at a specific position, if any @param iter: a C{gtk.TextIter} @returns: a C{gtk.TextTag} if there is a link at C{iter}, C{None} otherwise ''' # Explicitly left gravity, otherwise position behind the link # would also be considered part of the link. Position before the # link is included here. for tag in iter.get_tags(): if hasattr(tag, 'zim_type') and tag.zim_type == 'link': return tag else: return None def get_link_data(self, iter): '''Get the link attributes for a link at a specific position, if any @param iter: a C{gtk.TextIter} @returns: a dict with link properties if there is a link at C{iter}, C{None} otherwise ''' tag = self.get_link_tag(iter) if tag: link = tag.zim_attrib.copy() if link['href'] is None: # Copy text content as href start, end = self.get_tag_bounds(iter, tag) link['href'] = start.get_text(end) return link else: return None def get_tag_bounds(self, iter, tag): start = iter.copy() if not start.begins_tag(tag): start.backward_to_tag_toggle(tag) end = iter.copy() if not end.ends_tag(tag): end.forward_to_tag_toggle(tag) return start, end def insert_tag(self, iter, text, **attrib): '''Insert a tag into the buffer Insert a tag in the buffer (not a TextTag, but a tag like "@foo") @param iter: a C{gtk.TextIter} object @param text: The text for the tag @param attrib: any other tag attributes ''' with self.tmp_cursor(iter): self.insert_tag_at_cursor(text, **attrib) def insert_tag_at_cursor(self, text, **attrib): '''Insert a tag into the buffer Like C{insert_tag()} but inserts at the current cursor position @param text: The text for the tag @param attrib: any other tag attributes ''' tag = self._create_tag_tag(text, **attrib) self._editmode_tags = \ filter(_is_not_tag_tag, filter(_is_not_style_tag, self._editmode_tags) ) + (tag,) self.insert_at_cursor(text) self._editmode_tags = self._editmode_tags[:-1] def _create_tag_tag(self, text, **attrib): '''Creates an annonymous TextTag for a tag''' tag = self.create_tag(None, **self.tag_styles['tag']) tag.set_priority(0) # force tags to be below styles tag.zim_type = 'tag' tag.zim_tag = 'tag' tag.zim_attrib = attrib tag.zim_attrib['name'] = None return tag def get_tag_tag(self, iter): '''Get the C{gtk.TextTag} for a tag at a specific position, if any @param iter: a C{gtk.TextIter} @returns: a C{gtk.TextTag} if there is a tag at C{iter}, C{None} otherwise ''' # Explicitly left gravity, otherwise position behind the tag # would also be considered part of the tag. Position before the # tag is included here. for tag in iter.get_tags(): if hasattr(tag, 'zim_type') and tag.zim_type == 'tag': return tag else: return None def get_tag_data(self, iter): '''Get the attributes for a tag at a specific position, if any @param iter: a C{gtk.TextIter} @returns: a dict with tag properties if there is a link at C{iter}, C{None} otherwise ''' tag = self.get_tag_tag(iter) if tag: attrib = tag.zim_attrib.copy() # Copy text content as name start = iter.copy() if not start.begins_tag(tag): start.backward_to_tag_toggle(tag) end = iter.copy() if not end.ends_tag(tag): end.forward_to_tag_toggle(tag) attrib['name'] = start.get_text(end).lstrip('@').strip() return attrib else: return None def insert_image(self, iter, file, src, **attrib): '''Insert an image in the buffer @param iter: a C{gtk.TextIter} for the insert position @param file: a L{File} object or a file path or URI @param src: the file path the show to the user If the image is e.g. specified in the page source as a relative link, C{file} should give the absolute path the link resolves to, while C{src} gives the relative path. @param attrib: any other image properties ''' #~ If there is a property 'alt' in attrib we try to set a tooltip. #~ ''' if isinstance(file, basestring): file = File(file) try: if 'width' in attrib or 'height' in attrib: w = int(attrib.get('width', -1)) h = int(attrib.get('height', -1)) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(file.path, w, h) else: pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) pixbuf = rotate_pixbuf(pixbuf) except: #~ logger.exception('Could not load image: %s', file) logger.warn('No such image: %s', file) widget = gtk.HBox() # Need *some* widget here... pixbuf = widget.render_icon(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_DIALOG) pixbuf = pixbuf.copy() # need unique instance to set zim_attrib pixbuf.zim_type = 'image' pixbuf.zim_attrib = attrib pixbuf.zim_attrib['src'] = src pixbuf.zim_attrib['_src_file'] = file self.insert_pixbuf(iter, pixbuf) def insert_image_at_cursor(self, file, src, **attrib): '''Insert an image in the buffer Like L{insert_image()} but inserts at the current cursor position @param file: a L{File} object or a file path or URI @param src: the file path the show to the user @param attrib: any other image properties ''' iter = self.get_iter_at_mark(self.get_insert()) self.insert_image(iter, file, src, **attrib) def get_image_data(self, iter): '''Get the attributes for an image at a specific position, if any @param iter: a C{gtk.TextIter} object @returns: a dict with image properties or C{None} ''' pixbuf = iter.get_pixbuf() if pixbuf and hasattr(pixbuf, 'zim_type') and pixbuf.zim_type == 'image': return pixbuf.zim_attrib.copy() else: return None def set_bullet(self, line, bullet): '''Sets the bullet type for a line Replaces any bullet that may already be present on the line. Set bullet C{None} to remove any bullet at this line. @param line: the line number @param bullet: the bullet type, one of:: BULLET UNCHECKED_BOX CHECKED_BOX XCHECKED_BOX NUMBER_BULLET None or a numbered bullet, like C{"1."} ''' if bullet == NUMBER_BULLET: indent = self.get_indent(line) _, prev = self._search_bullet(line, indent, -1) if prev and is_numbered_bullet_re.match(prev): bullet = increase_list_bullet(prev) else: bullet = '1.' with self.user_action: self._replace_bullet(line, bullet) if bullet and is_numbered_bullet_re.match(bullet): self.renumber_list(line) def _replace_bullet(self, line, bullet): indent = self.get_indent(line) with self.tmp_cursor(): iter = self.get_iter_at_line(line) bound = iter.copy() self.iter_forward_past_bullet(bound) self.delete(iter, bound) # Will trigger do_delete_range, which will update indent tag if not bullet is None: iter = self.get_iter_at_line(line) self.place_cursor(iter) # update editmode self._insert_bullet_at_cursor(bullet) #~ self.update_indent_tag(line, bullet) self._set_indent(line, indent, bullet) def _insert_bullet_at_cursor(self, bullet, raw=False): '''Insert a bullet plus a space at the cursor position. If 'raw' is True the space will be omitted and the check that cursor position must be at the start of a line will not be enforced. External interface should use set_bullet(line, bullet) instead of calling this method directly. ''' assert bullet in BULLETS or is_numbered_bullet_re.match(bullet), 'Bullet: >>%s<<' % bullet if not raw: insert = self.get_insert_iter() assert insert.starts_line(), 'BUG: bullet not at line start' if not filter(_is_indent_tag, self._editmode_tags): # Without indent get_parsetree will not recognize # the icon as a bullet item. This will mess up # undo stack. If 'raw' we assume indent tag is set # already. tag = self._get_indent_tag(0, bullet) self._editmode_tags = self._editmode_tags + (tag,) with self.user_action: if bullet == BULLET: if raw: self.insert_at_cursor(u'\u2022') else: self.insert_at_cursor(u'\u2022 ') elif bullet in bullet_types: # Insert icon stock = bullet_types[bullet] widget = gtk.HBox() # Need *some* widget here... pixbuf = widget.render_icon(stock, gtk.ICON_SIZE_MENU) if pixbuf is None: logger.warn('Could not find icon: %s', stock) pixbuf = widget.render_icon(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_MENU) pixbuf.zim_type = 'icon' pixbuf.zim_attrib = {'stock': stock} self.insert_pixbuf(self.get_insert_iter(), pixbuf) if not raw: self.insert_at_cursor(' ') else: # Numbered if raw: self.insert_at_cursor(bullet) else: self.insert_at_cursor(bullet + ' ') def renumber_list(self, line): '''Renumber list from this line downward This method is called when the user just typed a new bullet or when we suspect the user deleted some line(s) that are part of a numbered list. Typically there is no need to call this method directly, but it is exposed for testing. @param line: line number to start updating ''' # The rules implemented here are: # # 1. If this is top of the list, number down # 2. Otherwise look at bullet above and number down from there # (this means whatever the user typed doesn't really matter) # 3. If above bullet is non-number bullet, replace the numbered # item with that bullet (for checkboxes always an open # checkbox is used.) # # Note that the bullet on the line we look at does not have # to be a numbered bullet. The one above or below may still be # number. And vice versa # # TODO - should this go into code for TextBufferList ?? indent = self.get_indent(line) bullet = self.get_bullet(line) if bullet is None: return _, prev = self._search_bullet(line, indent, -1) if prev: newbullet = increase_list_bullet(prev) or prev else: newbullet = bullet if is_numbered_bullet_re.match(newbullet) \ or is_numbered_bullet_re.match(bullet): self._renumber_list(line, indent, newbullet) # else we had a normal bullet, and no numbered bullet above def renumber_list_after_indent(self, line, old_indent): '''Like L{renumber_list()}, but more complex rules because indent change has different heuristics. ''' # The rules implemented here are: # # 1. If this is now middle of a list (above item is same or # more indenting) look above and renumber # 2. If this is now top of a sublist (above item is lower # indent) look _below_ and copy bullet found there then # number down # 3. If this is the top of a new sublist (no item below) # switch bullet style (numbers vs letters) and reset count # 4. If this is the top of the list (no bullet above) don't # need to do anything # # ALSO look at previous level where item went missing, # look at above item at that level and number downward indent = self.get_indent(line) bullet = self.get_bullet(line) #~ print 'RENUMBER after indent', line, indent, bullet, old_indent if bullet is None: return _, prev = self._search_bullet(line, indent, -1) if prev: newbullet = increase_list_bullet(prev) or prev else: _, newbullet = self._search_bullet(line, indent, +1) if not newbullet: if not is_numbered_bullet_re.match(bullet): return elif bullet.rstrip('.') in string.letters: newbullet = '1.' # switch e.g. "a." -> "1." else: newbullet = 'a.' # switch "1." -> "a." if is_numbered_bullet_re.match(newbullet) \ or is_numbered_bullet_re.match(bullet): self._renumber_list(line, indent, newbullet) # else we had a normal bullet, and no numbered bullet above # Now find place to update list at old indent level newline, newbullet = self._search_bullet(line, old_indent, -1) if newline is not None: # Was middle of list on old level, just renumber down if is_numbered_bullet_re.match(newbullet): self._renumber_list(newline, old_indent, newbullet) else: # If no item above on old level, was top on old level, # use old bullet to renumber down from next item newline, newbullet = self._search_bullet(line, old_indent, +1) if newline is not None: if is_numbered_bullet_re.match(newbullet): self._renumber_list(newline, old_indent, bullet) def _search_bullet(self, line, indent, step): # Return bullet for previous/next bullet item at same level while True: line += step try: mybullet = self.get_bullet(line) myindent = self.get_indent(line) except ValueError: return None, None if not mybullet or myindent < indent: return None, None elif myindent == indent: return line, mybullet # else mybullet and myindent > indent def _renumber_list(self, line, indent, newbullet): # Do the actual renumbering if not is_numbered_bullet_re.match(newbullet): # Replace numbered bullet with normal bullet if newbullet == BULLET: self._replace_bullet(line, BULLET) elif newbullet in CHECKBOXES: self._replace_bullet(line, UNCHECKED_BOX) else: pass # !? else: # Actually renumber for a given line downward while True: try: mybullet = self.get_bullet(line) myindent = self.get_indent(line) except ValueError: break if not mybullet or myindent < indent: break elif myindent == indent: if mybullet != newbullet: self._replace_bullet(line, newbullet) newbullet = increase_list_bullet(newbullet) # else mybullet and myindent > indent line += 1 def set_textstyle(self, name): '''Sets the current text format style. @param name: the name of the format style This style will be applied to text inserted at the cursor. Use C{set_textstyle(None)} to reset to normal text. ''' self._editmode_tags = filter(_is_not_style_tag, self._editmode_tags) if not name is None: tag = self.get_tag_table().lookup('style-'+name) if _is_heading_tag(tag): self._editmode_tags = \ filter(_is_not_indent_tag, self._editmode_tags) self._editmode_tags = self._editmode_tags + (tag,) if not self._insert_tree_in_progress: self.emit('textstyle-changed', name) def get_textstyle(self): '''Get the name of the formatting style that will be applied to newly inserted text This style may change as soon as the cursor position changes, so only relevant for current cursor position. ''' tags = filter(_is_style_tag, self._editmode_tags) if tags: assert len(tags) == 1, 'BUG: can not have multiple text styles' return tags[0].get_property('name')[6:] # len('style-') == 6 else: return None def update_editmode(self): '''Updates the text style and indenting applied to newly inderted text based on the current cursor position This method is triggered automatically when the cursor is moved, but there are some cases where you may need to call it manually to force a consistent state. ''' self._check_edit_mode = False bounds = self.get_selection_bounds() if bounds: # For selection we set editmode based on left hand side and looking forward # so counting tags that apply to start of selection tags = filter(_is_zim_tag, bounds[0].get_tags()) else: # Otherwise base editmode on cursor position (looking backward) iter = self.get_insert_iter() tags = self.iter_get_zim_tags(iter) tags = tuple(tags) if not tags == self._editmode_tags: #~ print '>', [(t.zim_type, t.get_property('name')) for t in tags] self._editmode_tags = tags for tag in tags: if tag.zim_type == 'style': name = tag.get_property('name')[6:] self.emit('textstyle-changed', name) break else: self.emit('textstyle-changed', None) def iter_get_zim_tags(self, iter): '''Replacement for C{gtk.TextIter.get_tags()} which returns zim specific tags In contrast to C{gtk.TextIter.get_tags()} this method assumes "left gravity" for TextTags. This means that it returns TextTags ending to the left of the iter position but not TextTags starting to the right. For TextTags that should be applied per line (like 'indent', 'h', 'pre') some additional logic is used to keep them consistent. So at the start of the line, we do copy TextTags starting to the right and not inadvertently copy formatting from the previous line which ends on the left. This method is for exampel used by L{update_editmode()} to determine which TextTags should be applied to newly inserted text at at a specific location. @param iter: a C{gtk.TextIter} @returns: a list of C{gtk.TextTag}s (sorted by priority) ''' # Current logic works without additional indent set in # do_end_of_line due to the fact that the "\n" also caries # formatting. So putting a new \n at the end of e.g. an indented # line will result in two indent formatted \n characters. # The start of the new line is in between and has continuous # indent formatting. start_tags = filter(_is_zim_tag, iter.get_toggled_tags(True)) tags = filter(_is_zim_tag, iter.get_tags()) for tag in start_tags: if tag in tags: tags.remove(tag) end_tags = filter(_is_zim_tag, iter.get_toggled_tags(False)) # So now we have 3 separate sets with tags ending here, # starting here and being continuous here. Result will be # continuous tags and ending tags but logic for line based # tags can mix in tags starting here and filter out # tags ending here. if iter.starts_line(): tags += filter(_is_line_based_tag, start_tags) tags += filter(_is_not_line_based_tag, end_tags) elif iter.ends_line(): # Force only use tags from the left in order to prevent tag # from next line "spilling over" (should not happen, since # \n after end of line is still formatted with same line # based tag as rest of line, but handled anyway to be # robust to edge cases) tags += end_tags else: # Take any tag from left or right, with left taking precendence # # HACK: We assume line based tags are mutually exclusive # if this assumption breaks down need to check by tag type tags += end_tags if not filter(_is_line_based_tag, tags): tags += filter(_is_line_based_tag, start_tags) tags.sort(key=lambda tag: tag.get_priority()) return tags def toggle_textstyle(self, name): '''Toggle the current textstyle If there is a selection toggle the text style of the selection, otherwise toggle the text style for newly inserted text. This method is mainly to change the behavior for interactive editing. E.g. it is called indirectly when the user clicks one of the formatting buttons in the toolbar. For selections we remove the format if the whole range has the format already. If some part of the range does not have the format we apply the format to the whole tange. This makes the behavior of the format buttons consistent if a single tag applies to any range. @param name: the format style name ''' if not self.get_has_selection(): if name == self.get_textstyle(): self.set_textstyle(None) else: self.set_textstyle(name) else: with self.user_action: start, end = self.get_selection_bounds() if name == 'code': text = start.get_text(end) if '\n' in text: name = 'pre' tag = self.get_tag_table().lookup('style-'+name) had_tag = self.whole_range_has_tag(tag, start, end) self.remove_textstyle_tags(start, end) if not had_tag: self.apply_tag(tag, start, end) self.set_modified(True) self.update_editmode() def whole_range_has_tag(self, tag, start, end): '''Check if a certain TextTag is applied to the whole range or not @param tag: a C{gtk.TextTag} @param start: a C{gtk.TextIter} @param end: a C{gtk.TextIter} ''' if tag in start.get_tags() \ and tag in self.iter_get_zim_tags(end): iter = start.copy() if iter.forward_to_tag_toggle(tag): return iter.compare(end) >= 0 else: return True else: return False def range_has_tag(self, tag, start, end): '''Check if a certain TextTag appears anywhere in a range @param tag: a C{gtk.TextTag} @param start: a C{gtk.TextIter} @param end: a C{gtk.TextIter} ''' # test right gravity for start iter, but left gravity for end iter if tag in start.get_tags() \ or tag in self.iter_get_zim_tags(end): return True else: iter = start.copy() if iter.forward_to_tag_toggle(tag): return iter.compare(end) < 0 else: return False def range_has_tags(self, func, start, end): '''Like L{range_has_tag()} but uses a function to check for multiple tags. The function gets called for each TextTag in the range and the method returns as soon as the function returns C{True} for any tag. There are a number of lambda functions defined in the module to test categories of TextTags. @param func: a function that is called as: C{func(tag)} for each TextTag in the range @param start: a C{gtk.TextIter} @param end: a C{gtk.TextIter} ''' # test right gravity for start iter, but left gravity for end iter if any(filter(func, start.get_tags())) \ or any(filter(func, self.iter_get_zim_tags(end))): return True else: iter = start.copy() iter.forward_to_tag_toggle(None) while iter.compare(end) == -1: if any(filter(func, iter.get_tags())): return True if not iter.forward_to_tag_toggle(None): return False return False def remove_textstyle_tags(self, start, end): '''Removes all format style TexTags from a range @param start: a C{gtk.TextIter} @param end: a C{gtk.TextIter} ''' # Also remove links until we support links nested in tags self.smart_remove_tags(_is_style_tag, start, end) self.smart_remove_tags(_is_link_tag, start, end) self.smart_remove_tags(_is_tag_tag, start, end) self.update_editmode() def smart_remove_tags(self, func, start, end): '''This method removes tags over a range based on a function So L{range_has_tags()} for a details on such a test function. Please use this method instead of C{remove_tag()} when you are not sure if specific tags are present in the first place. Calling C{remove_tag()} will emit signals which make the L{UndoStackManager} assume the tag was there. If this was not the case the undo stack gets messed up. ''' with self.user_action: iter = start.copy() while iter.compare(end) == -1: for tag in filter(func, iter.get_tags()): bound = iter.copy() bound.forward_to_tag_toggle(tag) if not bound.compare(end) == -1: bound = end.copy() self.remove_tag(tag, iter, bound) self.set_modified(True) if not iter.forward_to_tag_toggle(None): break def get_indent_at_cursor(self): '''Get the indent level at the cursor @returns: a number for the indenting level ''' iter = self.get_iter_at_mark(self.get_insert()) return self.get_indent(iter.get_line()) def get_indent(self, line): '''Get the indent level for a specific line @param line: the line number @returns: a number for the indenting level ''' iter = self.get_iter_at_line(line) tags = filter(_is_indent_tag, iter.get_tags()) if tags: assert len(tags) == 1, 'BUG: overlapping indent tags' return int( tags[0].zim_attrib['indent'] ) else: return 0 def _get_indent_tag(self, level, bullet=None): name = 'indent-%i' % level if bullet: name += '-' + bullet tag = self.get_tag_table().lookup(name) if tag is None: if bullet: if bullet == BULLET: stylename = 'bullet-list' elif bullet == CHECKED_BOX: stylename = 'checked-checkbox' elif bullet == UNCHECKED_BOX: stylename = 'unchecked-checkbox' elif bullet == XCHECKED_BOX: stylename = 'xchecked-checkbox' elif is_numbered_bullet_re.match(bullet): stylename = 'numbered-list' else: raise AssertionError, 'BUG: Unkown bullet type' margin = 12 + self.pixels_indent * level # offset from left side for all lines indent = -12 # offset for first line (bullet) tag = self.create_tag(name, left_margin=margin, indent=indent, **self.tag_styles[stylename]) else: margin = 12 + self.pixels_indent * level tag = self.create_tag(name, left_margin=margin, **self.tag_styles['indent']) # Note: I would think the + 12 is not needed here, but # the effect in the view is different than expected, # putting text all the way to the left against the # window border tag.zim_type = 'indent' tag.zim_tag = 'indent' tag.zim_attrib = {'indent': level} return tag def set_indent(self, line, level, interactive=False): '''Set the indenting for a specific line. May also trigger renumbering for numbered lists. @param line: the line number @param level: the indenting level as a number, C{0} for no indenting, C{1} for the equivalent of 1 tab, etc. @param interactive: hint if indenting is result of user interaction, or automatic action If interactive, the line will be forced to end with a newline. Reason is that if the last line of the buffer is empty and does not end with a newline, the indenting will not be visible, giving the impression that it failed. @returns: C{True} for success (e.g. indenting a heading is not allowed, if you try it will fail and return C{False} here) ''' level = level or 0 if interactive: # Without content effect of indenting is not visible # end-of-line gives content to empty line, but last line # may not have end-of-line. start, end = self.get_line_bounds(line) bufferend = self.get_end_iter() if start.equal(end) or end.equal(bufferend): with self.tmp_cursor(): self.insert(end, '\n') start, end = self.get_line_bounds(line) bullet = self.get_bullet(line) ok = self._set_indent(line, level, bullet) if ok: self.set_modified(True) return ok def update_indent_tag(self, line, bullet): '''Update the indent TextTag for a given line The TextTags used for indenting differ between normal indented paragraphs and indented items in a bullet list. The reason for this is that the line wrap behavior of list items should be slightly different to align wrapped text with the bullet. This method does not change the indent level for a specific line, but it makes sure the correct TextTag is applied. Typically called e.g. after inserting or deleting a bullet. @param line: the line number @param bullet: the bullet type for this line, or C{None} ''' level = self.get_indent(line) self._set_indent(line, level, bullet) def _set_indent(self, line, level, bullet): # Common code between set_indent() and update_indent_tag() start, end = self.get_line_bounds(line) tags = filter(_is_indent_tag, start.get_tags()) if tags: assert len(tags) == 1, 'BUG: overlapping indent tags' self.remove_tag(tags[0], start, end) if filter(_is_heading_tag, start.get_tags()): return level == 0 # False if you try to indent a header if level > 0 or bullet: # For bullets there is a 0-level tag, otherwise 0 means None tag = self._get_indent_tag(level, bullet) self.apply_tag(tag, start, end) self.update_editmode() # also updates indent tag return True def indent(self, line, interactive=False): '''Increase the indent for a given line Can be used as function for L{foreach_line_in_selection()}. @param line: the line number @param interactive: hint if indenting is result of user interaction, or automatic action @returns: C{True} if successful ''' level = self.get_indent(line) return self.set_indent(line, level+1, interactive) def unindent(self, line, interactive=False): '''Decrease the indent level for a given line Can be used as function for L{foreach_line_in_selection()}. @param line: the line number @param interactive: hint if indenting is result of user interaction, or automatic action @returns: C{True} if successful ''' level = self.get_indent(line) return self.set_indent(line, level-1, interactive) def foreach_line_in_selection(self, func, *args, **kwarg): '''Convenience function to call a function for each line that is currently selected @param func: function which will be called as:: func(line, *args, **kwargs) where C{line} is the line number @param args: additional argument for C{func} @param kwarg: additional keyword argument for C{func} @returns: C{False} if there is no selection, C{True} otherwise ''' bounds = self.get_selection_bounds() if bounds: start, end = bounds if end.starts_line(): # exclude last line if selection ends at newline # because line is not visually part of selection end.backward_char() for line in range(start.get_line(), end.get_line() + 1): func(line, *args, **kwarg) return True else: return False def do_mark_set(self, iter, mark): gtk.TextBuffer.do_mark_set(self, iter, mark) if mark.get_name() in ('insert', 'selection_bound'): self.update_editmode() def do_insert_text(self, iter, string, length): '''Signal handler for insert-text signal''' #~ print 'INSERT', string def end_or_protect_tags(string, length): tags = filter(_is_tag_tag, self._editmode_tags) if tags: if iter.ends_tag(tags[0]): # End tags if end-of-word char is typed at end of a tag # without this you can not insert text behind a tag e.g. at the end of a line self._editmode_tags = filter(_is_not_tag_tag, self._editmode_tags) else: # Forbid breaking a tag return '', 0 # TODO this should go into the TextView, not here # Now it goes OK only because we only check single char inserts, but would break # for multi char inserts from the view - fixing that here breaks insert parsetree return string, length # Check if we are at a bullet or checkbox line # if so insert behind the bullet when you type at start of line # FIXME FIXME FIXME - break undo - instead disallow this home position ? if not self._insert_tree_in_progress and iter.starts_line() \ and not string.endswith('\n'): bullet = self._get_bullet_at_iter(iter) if bullet: self._iter_forward_past_bullet(iter, bullet) self.place_cursor(iter) # Check current formatting if string == '\n': # CHARS_END_OF_LINE # Break tags that are not allowed to span over multiple lines self._editmode_tags = filter( lambda tag: _is_pre_tag(tag) or _is_not_style_tag(tag), self._editmode_tags) self._editmode_tags = filter(_is_not_link_tag, self._editmode_tags) self.emit('textstyle-changed', None) # TODO make this more robust for multiline inserts string, length = end_or_protect_tags(string, length) elif string in CHARS_END_OF_WORD: # Break links if end-of-word char is typed at end of a link # without this you can not insert text behind a link e.g. at the end of a line links = filter(_is_link_tag, self._editmode_tags) if links and iter.ends_tag(links[0]): self._editmode_tags = filter(_is_not_link_tag, self._editmode_tags) # TODO this should go into the TextView, not here # Now it goes OK only because we only check single char inserts, but would break # for multi char inserts from the view - fixing that here breaks insert parsetree string, length = end_or_protect_tags(string, length) # Call parent for the actual insert gtk.TextBuffer.do_insert_text(self, iter, string, length) # And finally apply current text style # Note: looks like parent call modified the position of the TextIter object # since it is still valid and now matched the end of the inserted string length = len(unicode(string)) # default function argument gives byte length :S start = iter.copy() start.backward_chars(length) self.remove_all_tags(start, iter) for tag in self._editmode_tags: self.apply_tag(tag, start, iter) def insert_pixbuf(self, iter, pixbuf): # Make sure we always apply the correct tags when inserting a pixbuf if iter.equal(self.get_iter_at_mark(self.get_insert())): gtk.TextBuffer.insert_pixbuf(self, iter, pixbuf) else: with self.tmp_cursor(iter): gtk.TextBuffer.insert_pixbuf(self, iter, pixbuf) def do_insert_pixbuf(self, iter, pixbuf): # Like do_insert_text() but for pixbuf # however only apply indenting tags, ignore other gtk.TextBuffer.do_insert_pixbuf(self, iter, pixbuf) start = iter.copy() start.backward_char() self.remove_all_tags(start, iter) for tag in filter(_is_indent_tag, self._editmode_tags): self.apply_tag(tag, start, iter) def do_delete_range(self, start, end): # Wrap actual delete to hook _do_lines_merged and do some logic # when deleting bullets # # Implementation detail: # (Interactive) deleting a formatted word with , or # should drop the formatting, however selecting a formatted word and # than typing to replace it, should keep formatting # Since we don't know at this point what scenario we are part # off, we do NOT touch the editmode. However we do set a flag # that edit mode needs to be checked at the end of the user # action. line = start.get_line() if start.starts_line(): bullet = self._get_bullet_at_iter(start) else: bullet = None multiline = start.get_line() != end.get_line() with self.user_action: # FIXME why is this wrapper here !? - undo functions ?? if multiline: gtk.TextBuffer.do_delete_range(self, start, end) self._do_lines_merged(start) else: gtk.TextBuffer.do_delete_range(self, start, end) if bullet and not self._get_bullet_at_iter(start): # had a bullet, but no longer (implies we are start of # line - case where we are not start of line is # handled by _do_lines_merged by extending the indent tag) self.update_indent_tag(start.get_line(), None) elif start.starts_line() and self._get_bullet_at_iter(start): # did not have a bullet but has one now self._check_renumber.append(start.get_line()) elif multiline and self.get_bullet(start.get_line()): # we deleted some lines, and although not at start of # line, this line does have a bullet - so check if # we need to renumber self._check_renumber.append(start.get_line()) # else we don't have anything to do with bullet lists self._check_edit_mode = True def _do_lines_merged(self, iter): # Enforce tags like 'h', 'pre' and 'indent' to be consistent over the line if iter.starts_line() or iter.ends_line(): return # TODO Why is this ??? end = iter.copy() end.forward_to_line_end() self.smart_remove_tags(_is_line_based_tag, iter, end) for tag in self.iter_get_zim_tags(iter): if _is_line_based_tag(tag): if tag.zim_tag == 'pre': self.smart_remove_tags(_is_zim_tag, iter, end) self.apply_tag(tag, iter, end) self.update_editmode() def get_bullet(self, line): '''Get the bullet type on a specific line, if any @param line: the line number @returns: the bullet type, if any, or C{None}. The bullet type can be any of:: BULLET UNCHECKED_BOX CHECKED_BOX XCHECKED_BOX or a numbered list bullet (test with L{is_numbered_bullet_re}) ''' iter = self.get_iter_at_line(line) return self._get_bullet_at_iter(iter) def get_bullet_at_iter(self, iter): '''Return the bullet type in a specific location Like L{get_bullet()} @param iter: a C{gtk.TextIter} @returns: a bullet type, or C{None} ''' if not iter.starts_line(): return None else: return self._get_bullet_at_iter(iter) def _get_bullet_at_iter(self, iter): pixbuf = iter.get_pixbuf() if pixbuf: if hasattr(pixbuf, 'zim_type') and pixbuf.zim_type == 'icon' \ and pixbuf.zim_attrib['stock'] in ( STOCK_CHECKED_BOX, STOCK_UNCHECKED_BOX, STOCK_XCHECKED_BOX): return bullets[pixbuf.zim_attrib['stock']] else: return None else: bound = iter.copy() if not self.iter_forward_word_end(bound): return None # empty line or whitespace at start of line text = iter.get_slice(bound) if text.startswith(u'\u2022'): return BULLET elif is_numbered_bullet_re.match(text): return text else: return None def iter_forward_past_bullet(self, iter): '''Move an TextIter past a bullet This method is useful because we typically want to insert new text on a line with a bullet after the bullet. This method can help to find that position. @param iter: a C{gtk.TextIter}. The position of this iter will be modified by this method. ''' bullet = self.get_bullet_at_iter(iter) if bullet: self._iter_forward_past_bullet(iter, bullet) return True else: return False def _iter_forward_past_bullet(self, iter, bullet, raw=False): if bullet in (BULLET, CHECKED_BOX, UNCHECKED_BOX, XCHECKED_BOX): # Each of these just means one char iter.forward_char() else: assert is_numbered_bullet_re.match(bullet) self.iter_forward_word_end(iter) if not raw: # Skip whitespace as well bound = iter.copy() bound.forward_char() while iter.get_text(bound) == ' ': if iter.forward_char(): bound.forward_char() else: break def get_parsetree(self, bounds=None, raw=False): '''Get a L{ParseTree} representing the buffer contents @param bounds: a 2-tuple with two C{gtk.TextIter} specifying a range in the buffer (e.g. current selection). If C{None} the whole buffer is returned. @param raw: if C{True} you get a tree that is B{not} nicely cleaned up. This raw tree should result in the exact same contents in the buffer when reloaded. However such a 'raw' tree may cause problems when passed to one of the format modules. So it is intended only for internal use between the buffer and e.g. the L{UndoStackManager}. Raw parsetrees have an attribute to flag them as a raw tree, so on insert we can make sure they are inserted in the same way. When C{raw} is C{False} reloading the same tree may have subtle differences. @returns: a L{ParseTree} object ''' if bounds is None: start, end = self.get_bounds() attrib = {} else: start, end = bounds attrib = {'partial': True} if raw: builder = TreeBuilder() attrib['raw'] = True builder.start('zim-tree', attrib) else: builder = ParseTreeBuilder() builder.start('zim-tree', attrib) open_tags = [] def set_tags(iter, tags): # This function changes the parse tree based on the TextTags in # effect for the next section of text. # It does so be keeping the stack of open tags and compare it # with the new set of tags in order to decide which of the # tags can be closed and which new ones need to be opened. # # We assume that by definition we only get one tag for each tag # type and that we get tags in such an order that the one we get # first should be closed first while closing later ones breaks the # ones before. This is enforced using the priorities of the tags # in the TagTable. tags.sort(key=lambda tag: tag.get_priority(), reverse=True) i = 0 while i < len(tags) and i < len(open_tags) \ and tags[i] == open_tags[i][0]: i += 1 # so i is the breakpoint where new stack is different while len(open_tags) > i: builder.end(open_tags[-1][1]) open_tags.pop() # Convert some tags on the fly if tags: continue_attrib = {} for tag in tags[i:]: t, attrib = tag.zim_tag, tag.zim_attrib if t == 'indent': bullet = self._get_bullet_at_iter(iter) if bullet: t = 'li' attrib = attrib.copy() # break ref with tree attrib['bullet'] = bullet self._iter_forward_past_bullet(iter, bullet, raw=raw) elif not raw and not iter.starts_line(): # Indent not visible if it does not start at begin of line t = '_ignore_' elif len(filter(lambda t: t.zim_tag == 'pre', tags[i:])): # Indent of 'pre' blocks handled in subsequent iteration continue_attrib.update(attrib) continue else: t = 'div' elif t == 'pre' and not raw and not iter.starts_line(): # Without indenting 'pre' looks the same as 'code' # Prevent turning into a separate paragraph here t = 'code' elif t == 'pre': if attrib: attrib.update(continue_attrib) else: attrib = continue_attrib continue_attrib = {} elif t == 'link': attrib = self.get_link_data(iter) if not attrib['href']: t = '_ignore_' elif t == 'tag': attrib = self.get_tag_data(iter) if not attrib['name']: t = '_ignore_' builder.start(t, attrib) open_tags.append((tag, t)) if t == 'li': break # HACK - ignore any other tags because we moved # the cursor - needs also a break_tags before # which is special cased below # TODO: cleaner solution for this issue - # maybe easier when tags for list and indent # are separated ? def break_tags(type): # Forces breaking the stack of open tags on the level of 'tag' # The next set_tags() will re-open any tags that are still open i = 0 for i in range(len(open_tags)): if open_tags[i][1] == type: break # so i is the breakpoint while len(open_tags) > i: builder.end(open_tags[-1][1]) open_tags.pop() # And now the actual loop going through the buffer iter = start.copy() set_tags(iter, filter(_is_zim_tag, iter.get_tags())) while iter.compare(end) == -1: pixbuf = iter.get_pixbuf() if pixbuf: if pixbuf.zim_type == 'icon': # Reset all tags - and let set_tags parse the bullet if open_tags: break_tags(open_tags[0][1]) set_tags(iter, filter(_is_indent_tag, iter.get_tags())) else: pass # reset all tags except indenting set_tags(iter, filter(_is_indent_tag, iter.get_tags())) pixbuf = iter.get_pixbuf() # iter may have moved if pixbuf is None: continue if pixbuf.zim_type == 'icon': #~ raise AssertionError, 'BUG: Checkbox outside of indent ?' logger.warn('BUG: Checkbox outside of indent ?') elif pixbuf.zim_type == 'image': attrib = pixbuf.zim_attrib.copy() if 'alt' in attrib: text = attrib.pop('alt') or '' builder.start('img', attrib) builder.data(text) builder.end('img') else: builder.start('img', attrib) builder.end('img') else: assert False, 'BUG: unknown pixbuf type' iter.forward_char() # FUTURE: elif embedded widget else: # Set tags copy = iter.copy() bullet = self.get_bullet_at_iter(iter) # implies check for start of line if bullet: break_tags('indent') # This is part of the HACK for bullets in # set_tags() set_tags(iter, filter(_is_zim_tag, iter.get_tags())) if not iter.equal(copy): # iter moved continue # Find biggest slice without tags being toggled bound = iter.copy() toggled = [] while not toggled: if not bound.is_end() and bound.forward_to_tag_toggle(None): # For some reason the not is_end check is needed # to prevent an odd corner case infinite loop toggled = filter(_is_zim_tag, bound.get_toggled_tags(False) + bound.get_toggled_tags(True) ) else: bound = end.copy() # just to be sure.. break # But limit slice to first pixbuf # FUTURE: also limit slice to any embedded widget text = iter.get_slice(bound) if text.startswith(PIXBUF_CHR): text = text[1:] # special case - we see this char, but get_pixbuf already returned None, so skip it if PIXBUF_CHR in text: i = text.index(PIXBUF_CHR) bound = iter.copy() bound.forward_chars(i) text = text[:i] # And limit to end if bound.compare(end) == 1: bound = end.copy() text = iter.get_slice(end) if filter(lambda t: t[1] == 'li', open_tags) \ and bound.get_line() != iter.get_line(): # And limit bullets to a single line orig = bound bound = iter.copy() bound.forward_line() assert bound.compare(orig) < 1 text = iter.get_slice(bound).rstrip('\n') builder.data(text) break_tags('li') builder.data('\n') # add to tail else: # Else just insert text we got builder.data(text) iter = bound # close any open tags set_tags(end, []) builder.end('zim-tree') tree = ParseTree(builder.close()) tree.encode_urls() #~ print tree.tostring() return tree def select_line(self): '''Selects the current line @returns: C{True} when successful ''' # Differs from get_line_bounds because we exclude the trailing # line break while get_line_bounds selects these iter = self.get_iter_at_mark(self.get_insert()) line = iter.get_line() return self.select_lines(line, line) def select_lines(self, first, last): '''Select multiple lines @param first: line number first line @param last: line number last line @returns: C{True} when successful ''' start = self.get_iter_at_line(first) end = self.get_iter_at_line(last) if end.ends_line(): if end.equal(start): return False else: pass else: end.forward_to_line_end() self.select_range(start, end) return True def select_word(self): '''Selects the current word, if any @returns: C{True} when succcessful ''' insert = self.get_iter_at_mark(self.get_insert()) if not insert.inside_word(): return False bound = insert.copy() if not insert.starts_word(): insert.backward_word_start() if not bound.ends_word(): bound.forward_word_end() self.select_range(insert, bound) return True def strip_selection(self): '''Shrinks the selection to exclude any whitespace on start and end. If only white space was selected this function will not change the selection. @returns: C{True} when this function changed the selection. ''' bounds = self.get_selection_bounds() if not bounds: return False text = bounds[0].get_text(bounds[1]) if not text or text.isspace(): return False start, end = bounds[0].copy(), bounds[1].copy() iter = start.copy() iter.forward_char() text = start.get_text(iter) while text and text.isspace(): start.forward_char() iter.forward_char() text = start.get_text(iter) iter = end.copy() iter.backward_char() text = iter.get_text(end) while text and text.isspace(): end.backward_char() iter.backward_char() text = iter.get_text(end) if (start.equal(bounds[0]) and end.equal(bounds[1])): return False else: self.select_range(start, end) return True def select_link(self): '''Selects the current link, if any @returns: link attributes when succcessful, C{None} otherwise ''' insert = self.get_iter_at_mark(self.get_insert()) tag = self.get_link_tag(insert) if tag is None: return None start, end = self.get_tag_bounds(insert, tag) self.select_range(start, end) return self.get_link_data(start) def get_has_link_selection(self): '''Check whether a link is selected or not @returns: link attributes when succcessful, C{None} otherwise ''' bounds = self.get_selection_bounds() if not bounds: return None insert = self.get_iter_at_mark(self.get_insert()) tag = self.get_link_tag(insert) if tag is None: return None start, end = self.get_tag_bounds(insert, tag) if start.equal(bounds[0]) and end.equal(bounds[1]): return self.get_link_data(start) else: return None def remove_link(self, start, end): '''Removes any links between in a range @param start: a C{gtk.TextIter} @param end: a C{gtk.TextIter} ''' self.smart_remove_tags(_is_link_tag, start, end) self.update_editmode() def toggle_checkbox(self, line, checkbox_type=None, recursive=False): '''Toggles the state of the checkbox at a specific line, if any @param line: the line number @param checkbox_type: the checkbox type that we want to toggle: one of C{CHECKED_BOX}, C{XCHECKED_BOX}. If C{checkbox_type} is given, it toggles between this type and unchecked. Otherwise it rotates through unchecked, checked and xchecked. @param recursive: When C{True} any child items in the list will also be upadted accordingly (see L{TextBufferList.set_bullet()} @returns: C{True} for success, C{False} if no checkbox was found. ''' # For mouse click no checkbox type is given, so we cycle # For and checkbox_type is given so we toggle # between the two bullet = self.get_bullet(line) if bullet in CHECKBOXES: if checkbox_type: if bullet == checkbox_type: newbullet = UNCHECKED_BOX else: newbullet = checkbox_type else: i = list(CHECKBOXES).index(bullet) # use list() to be python 2.5 compatible next = (i + 1) % len(CHECKBOXES) newbullet = CHECKBOXES[next] else: return False if recursive: row, clist = TextBufferList.new_from_line(self, line) clist.set_bullet(row, newbullet) else: self.set_bullet(line, newbullet) return True def toggle_checkbox_for_cursor_or_selection(self, checkbox_type=None, recursive=False): '''Like L{toggle_checkbox()} but applies to current line or current selection. Intended for interactive use. @param checkbox_type: the checkbox type that we want to toggle @param recursive: When C{True} any child items in the list will also be upadted accordingly (see L{TextBufferList.set_bullet()} ''' if self.get_has_selection(): self.foreach_line_in_selection(self.toggle_checkbox, checkbox_type, recursive) else: line = self.get_insert_iter().get_line() return self.toggle_checkbox(line, checkbox_type, recursive) def iter_backward_word_start(self, iter): '''Like C{gtk.TextIter.backward_word_start()} but less intelligent. This method does not take into account the language or punctuation and just skips to either the last whitespace or the beginning of line. @param iter: a C{gtk.TextIter}, the position of this iter will be modified @returns: C{True} when successful ''' if iter.starts_line(): return False orig = iter.copy() while True: if iter.starts_line(): break else: bound = iter.copy() bound.backward_char() char = bound.get_slice(iter) if char == PIXBUF_CHR or char.isspace(): break # whitespace or pixbuf before start iter else: iter.backward_char() return iter.compare(orig) != 0 def iter_forward_word_end(self, iter): '''Like C{gtk.TextIter.forward_word_end()} but less intelligent. This method does not take into account the language or punctuation and just skips to either the next whitespace or the end of the line. @param iter: a C{gtk.TextIter}, the position of this iter will be modified @returns: C{True} when successful ''' if iter.ends_line(): return False orig = iter.copy() while True: if iter.ends_line(): break else: bound = iter.copy() bound.forward_char() char = bound.get_slice(iter) if char == PIXBUF_CHR or char.isspace(): break # whitespace or pixbuf after iter else: iter.forward_char() return iter.compare(orig) != 0 def get_iter_at_line(self, line): '''Like C{gtk.TextBuffer.get_iter_at_line()} but with additional safety check @param line: an integer line number counting from 0 @returns: a gtk.TextIter @raises ValueError: when line is not within the buffer ''' # Gtk TextBuffer returns iter of last line for lines past the # end of the buffer if line < 0: raise ValueError, 'Negative line number: %i' % line else: iter = gtk.TextBuffer.get_iter_at_line(self, line) if iter.get_line() != line: raise ValueError, 'Line number beyond the end of the buffer: %i' % line return iter def get_line_bounds(self, line): '''Get the TextIters at start and end of line @param line: the line number @returns: a 2-tuple of C{gtk.TextIter} for start and end of the line ''' start = self.get_iter_at_line(line) end = start.copy() end.forward_line() return start, end def get_line_is_empty(self, line): '''Check for empty lins @param line: the line number @returns: C{True} if the line only contains whitespace ''' start, end = self.get_line_bounds(line) return start.equal(end) or start.get_slice(end).isspace() def get_has_selection(self): '''Check if there is a selection Method available in C{gtk.TextBuffer} for gtk version >= 2.10 reproduced here for backward compatibility. @returns: C{True} when there is a selection ''' return bool(self.get_selection_bounds()) def iter_in_selection(self, iter): '''Check if a specific TextIter is within the selection @param iter: a C{gtk.TextIter} @returns: C{True} if there is a selection and C{iter} is within the range of the selection ''' bounds = self.get_selection_bounds() return bounds \ and bounds[0].compare(iter) <= 0 \ and bounds[1].compare(iter) >= 0 # not using iter.in_range to be inclusive of bounds def unset_selection(self): '''Remove any selection in the buffer''' iter = self.get_iter_at_mark(self.get_insert()) self.select_range(iter, iter) def copy_clipboard(self, clipboard, format='plain'): '''Copy current selection to a clipboard @param clipboard: a L{Clipboard} object @param format: a format name ''' bounds = self.get_selection_bounds() if bounds: tree = self.get_parsetree(bounds) clipboard.set_parsetree(self.notebook, self.page, tree, format) def cut_clipboard(self, clipboard, default_editable): '''Cut current selection to a clipboard First copies the selection to the clipboard and then deletes the selection in the buffer. @param clipboard: a L{Clipboard} object @param default_editable: default state of the L{TextView} ''' if self.get_has_selection(): self.copy_clipboard(clipboard) self.delete_selection(True, default_editable) def paste_clipboard(self, clipboard, iter, default_editable): '''Paste data from a clipboard into the buffer @param clipboard: a L{Clipboard} object @param iter: a C{gtk.TextIter} for the insert location @param default_editable: default state of the L{TextView} ''' if not default_editable: return if iter is None: iter = self.get_iter_at_mark(self.get_insert()) elif self.get_has_selection(): # unset selection if explicit iter is given bound = self.get_selection_bound() insert = self.get_insert() self.move_mark(bound, self.get_iter_at_mark(insert)) mark = self.get_mark('zim-paste-position') if mark: self.move_mark(mark, iter) else: self.create_mark('zim-paste-position', iter, left_gravity=False) #~ clipboard.debug_dump_contents() parsetree = clipboard.get_parsetree(self.notebook, self.page) if not parsetree: return #~ print '!! PASTE', parsetree.tostring() with self.user_action: if self.get_has_selection(): start, end = self.get_selection_bounds() self.delete(start, end) mark = self.get_mark('zim-paste-position') if not mark: return # prevent crash - see lp:807830 iter = self.get_iter_at_mark(mark) self.delete_mark(mark) self.place_cursor(iter) parsetree.resolve_images(self.notebook, self.page) self.insert_parsetree_at_cursor(parsetree, interactive=True) # Need to register classes defining gobject signals gobject.type_register(TextBuffer) class TextBufferList(list): '''This class represents a bullet or checkbox list in a L{TextBuffer}. It is used to perform recursive actions on the list. While the L{TextBuffer} just treats list items as lines that start with a bullet, the TextBufferList maps to a number of lines that together form a list. It uses "row ids" to refer to specific items within this range. TextBufferList objects will become invalid after any modification to the buffer that changes the line count within the list. Using them after such modification will result in errors. ''' # This class is a list of tuples, each tuple is a pair of # (linenumber, indentlevel, bullettype) LINE_COL = 0 INDENT_COL = 1 BULLET_COL = 2 @classmethod def new_from_line(self, textbuffer, line): '''Constructor for a new TextBufferList mapping the list at a specific line in the buffer @param textbuffer: a L{TextBuffer} object @param line: a line number This line should be part of a list, the TextBufferList object that is returned maps the full list, so it possibly extends above and below C{line}. @returns: a 2-tuple of a row id and a the new TextBufferList object, or C{(None, None)} if C{line} is not part of a list. The row id points to C{line} in the list. ''' if textbuffer.get_bullet(line) is None: return None, None # find start of list start = line for myline in range(start, -1, -1): if textbuffer.get_bullet(myline) is None: break # TODO skip lines with whitespace else: start = myline # find end of list end = line lastline = textbuffer.get_end_iter().get_line() for myline in range(end, lastline+1, 1): if textbuffer.get_bullet(myline) is None: break # TODO skip lines with whitespace else: end = myline list = TextBufferList(textbuffer, start, end) row = list.get_row_at_line(line) #~ print '!! LIST %i..%i ROW %i' % (start, end, row) #~ print '>>', list return row, list def __init__(self, textbuffer, firstline, lastline): '''Constructor @param textbuffer: a L{TextBuffer} object @param firstline: the line number for the first line of the list @param lastline: the line number for the last line of the list ''' self.buffer = textbuffer self.firstline = firstline self.lastline = lastline for line in range(firstline, lastline+1): bullet = self.buffer.get_bullet(line) indent = self.buffer.get_indent(line) if bullet: self.append((line, indent, bullet)) def get_row_at_line(self, line): '''Get the row in the list for a specific line @param line: the line number for a line in the L{TextBuffer} @returns: the row id for a row in the list or C{None} when the line was outside of the list ''' for i in range(len(self)): if self[i][self.LINE_COL] == line: return i else: return None def can_indent(self, row): '''Check whether a specific item in the list can be indented List items can only be indented if they are on top of the list or when there is some node above them to serve as new parent node. This avoids indenting two levels below the parent. So e.g. in the case of:: * item a * item b then "item b" can indent and become a child of "item a". However after indenting once:: * item a * item b now "item b" can not be indented further because it is already one level below "item a". @param row: the row id @returns: C{True} when indenting is possible ''' if row == 0: return True else: parents = self._parents(row) if row-1 in parents: return False # we are first child else: return True def can_unindent(self, row): '''Check if a specific item in the list has indenting which can be reduced @param row: the row id @returns: C{True} when the item has indenting ''' return self[row][self.INDENT_COL] > 0 def indent(self, row): '''Indent a list item and all it's children For example, when indenting "item b" in this list:: * item a * item b * item C it will result in:: * item a * item b * item C @param row: the row id @returns: C{True} if succesfull ''' if not self.can_indent(row): return False with self.buffer.user_action: self._indent(row, 1) return True def unindent(self, row): '''Un-indent a list item and it's children @param row: the row id @returns: C{True} if succesfull ''' if not self.can_unindent(row): return False with self.buffer.user_action: self._indent(row, -1) return True def _indent(self, row, step): line, level, bullet = self[row] self._indent_row(row, step) if row == 0: # Indent the whole list for i in range(1, len(self)): if self[i][self.INDENT_COL] >= level: # double check implicit assumtion that first item is at lowest level self._indent_row(i, step) else: break else: # Indent children for i in range(row+1, len(self)): if self[i][self.INDENT_COL] > level: self._indent_row(i, step) else: break # Renumber - *after* children have been updated as well # Do not restrict to number bullets - we might be moving # a normal bullet into a numbered sub list # TODO - pull logic of renumber_list_after_indent here and use just renumber_list self.buffer.renumber_list_after_indent(line, level) def _indent_row(self, row, step): #~ print "(UN)INDENT", row, step line, level, bullet = self[row] newlevel = level + step if self.buffer.set_indent(line, newlevel): self.buffer.update_editmode() # also updates indent tag self[row] = (line, newlevel, bullet) def set_bullet(self, row, bullet): '''Set the bullet type for a specific item and update parents and children accordingly Used to (un-)check the checkboxes and synchronize child nodes and parent nodes. When a box is checked, any open child nodes are checked. Also when this is the last checkbox on the given level to be checked, the parent box can be checked as well. When a box is un-checked, also the parent checkbox is un-checked. Both updating of children and parents is recursive. @param row: the row id @param bullet: the bullet type, which can be one of:: BULLET CHECKED_BOX UNCHECKED_BOX XCHECKED_BOX ''' assert bullet in BULLETS with self.buffer.user_action: self._change_bullet_type(row, bullet) if bullet == BULLET: pass elif bullet == UNCHECKED_BOX: self._checkbox_unchecked(row) else: # CHECKED_BOX or XCHECKED_BOX self._checkbox_checked(row, bullet) def _checkbox_unchecked(self, row): # When a row is unchecked, it's children are untouched but # all parents will be unchecked as well for parent in self._parents(row): if self[parent][self.BULLET_COL] not in CHECKBOXES: continue # ignore non-checkbox bullet self._change_bullet_type(parent, UNCHECKED_BOX) def _checkbox_checked(self, row, state): # If a row is checked, all un-checked children are updated as # well. For parent nodes we first check consistency of all # children before we check them. # First synchronize down level = self[row][self.INDENT_COL] for i in range(row+1, len(self)): if self[i][self.INDENT_COL] > level: if self[i][self.BULLET_COL] == UNCHECKED_BOX: self._change_bullet_type(i, state) else: # ignore non-checkbox bullet # ignore xchecked items etc. pass else: break # Then go up, checking direct children for each parent # if children are inconsistent, do not change the parent # and break off updating parents. Do overwrite parents that # are already checked with a different type. for parent in self._parents(row): if self[parent][self.BULLET_COL] not in CHECKBOXES: continue # ignore non-checkbox bullet consistent = True level = self[parent][self.INDENT_COL] for i in range(parent+1, len(self)): if self[i][self.INDENT_COL] <= level: break elif self[i][self.INDENT_COL] == level+1 \ and self[i][self.BULLET_COL] in CHECKBOXES \ and self[i][self.BULLET_COL] != state: consistent = False break if consistent: self._change_bullet_type(parent, state) else: break def _change_bullet_type(self, row, bullet): line, indent, _ = self[row] self.buffer.set_bullet(line, bullet) self[row] = (line, indent, bullet) def _parents(self, row): # Collect row ids of parent nodes parents = [] level = self[row][self.INDENT_COL] for i in range(row, -1, -1): if self[i][self.INDENT_COL] < level: parents.append(i) level = self[i][self.INDENT_COL] return parents FIND_CASE_SENSITIVE = 1 #: Constant to find case sensitive FIND_WHOLE_WORD = 2 #: Constant to find whole words only FIND_REGEX = 4 #: Constant to find based on regexes class TextFinder(object): '''This class handles finding text in the L{TextBuffer} Typically you should get an instance of this class from the L{TextBuffer.finder} attribute. ''' def __init__(self, textbuffer): '''constructor @param textbuffer: a L{TextBuffer} object ''' self.buffer = textbuffer self._signals = () self.regex = None self.string = None self.flags = 0 self.highlight = False self.highlight_tag = self.buffer.create_tag( None, **self.buffer.tag_styles['find-highlight'] ) self.match_tag = self.buffer.create_tag( None, **self.buffer.tag_styles['find-match'] ) def get_state(self): '''Get the query and any options. Used to copy the current state of find, can be restored later using L{set_state()}. @returns: a 3-tuple of the search string, the option flags, and the highlight state ''' return self.string, self.flags, self.highlight def set_state(self, string, flags, highlight): '''Set the query and any options. Can be used to restore the state of a find action without triggering a find immediatly. @param string: the text (or regex) to find @param flags: a combination of C{FIND_CASE_SENSITIVE}, C{FIND_WHOLE_WORD} & C{FIND_REGEX} @param highlight: highlight state C{True} or C{False} ''' if not string is None: self._parse_query(string, flags) self.set_highlight(highlight) def find(self, string, flags=0): '''Find and select the next occurrence of a given string @param string: the text (or regex) to find @param flags: options, a combination of: - C{FIND_CASE_SENSITIVE}: check case of matches - C{FIND_WHOLE_WORD}: only match whole words - C{FIND_REGEX}: input is a regular expression @returns: C{True} if a match was found ''' self._parse_query(string, flags) #~ print '!! FIND "%s" (%s, %s)' % (self.regex.pattern, string, flags) if self.highlight: self._update_highlight() iter = self.buffer.get_insert_iter() return self._find_next(iter) def _parse_query(self, string, flags): assert isinstance(string, basestring) self.string = string self.flags = flags if not flags & FIND_REGEX: string = re.escape(string) if flags & FIND_WHOLE_WORD: string = '\\b' + string + '\\b' if flags & FIND_CASE_SENSITIVE: self.regex = re.compile(string, re.U) else: self.regex = re.compile(string, re.U | re.I) def find_next(self): '''Skip to the next match and select it @returns: C{True} if a match was found ''' iter = self.buffer.get_insert_iter() iter.forward_char() # Skip current position return self._find_next(iter) def _find_next(self, iter): # Common functionality between find() and find_next() # Looking for a match starting at iter if self.regex is None: self.unset_match() return False line = iter.get_line() lastline = self.buffer.get_end_iter().get_line() for start, end, _ in self._check_range(line, lastline, 1): if start.compare(iter) == -1: continue else: self.set_match(start, end) return True for start, end, _ in self._check_range(0, line, 1): self.set_match(start, end) return True self.unset_match() return False def find_previous(self): '''Go back to the previous match and select it @returns: C{True} if a match was found ''' if self.regex is None: self.unset_match() return False iter = self.buffer.get_insert_iter() line = iter.get_line() lastline = self.buffer.get_end_iter().get_line() for start, end, _ in self._check_range(line, 0, -1): if start.compare(iter) != -1: continue else: self.set_match(start, end) return True for start, end, _ in self._check_range(lastline, line, -1): self.set_match(start, end) return True self.unset_match() return False def set_match(self, start, end): self._remove_tag() self.buffer.apply_tag(self.match_tag, start, end) self.buffer.select_range(start, end) self._signals = tuple( self.buffer.connect(s, self._remove_tag) for s in ('mark-set', 'changed') ) def unset_match(self): self._remove_tag() self.buffer.unset_selection() def _remove_tag(self, *a): if len(a) > 2 and isinstance(a[2], gtk.TextMark) \ and a[2] is not self.buffer.get_insert(): # mark-set signal, but not for cursor return for id in self._signals: self.buffer.disconnect(id) self._signals = () self.buffer.remove_tag(self.match_tag, *self.buffer.get_bounds()) def select_match(self): # Select last match bounds = self.match_bounds if not None in bounds: self.buffer.select_range(*bounds) def set_highlight(self, highlight): '''Toggle highlighting of matches in the L{TextBuffer} @param highlight: C{True} to enable highlighting, C{False} to disable ''' self.highlight = highlight self._update_highlight() # TODO we could connect to buffer signals to update highlighting # when the buffer is modified. def _update_highlight(self): # Clear highlighting tag = self.highlight_tag start, end = self.buffer.get_bounds() self.buffer.remove_tag(tag, start, end) # Set highlighting if self.highlight: lastline = end.get_line() for start, end, _ in self._check_range(0, lastline, 1): self.buffer.apply_tag(tag, start, end) def _check_range(self, firstline, lastline, step): # Generator for matches in a line. Arguments are start and # end line numbers and a step size (1 or -1). If the step is # negative results are yielded in reversed order. Yields pair # of TextIter's for begin and end of the match as well as the # match object. assert self.regex for line in range(firstline, lastline+step, step): start = self.buffer.get_iter_at_line(line) if start.ends_line(): continue end = start.copy() end.forward_to_line_end() text = start.get_slice(end) matches = self.regex.finditer(text) if step == -1: matches = list(matches) matches.reverse() for match in matches: startiter = self.buffer.get_iter_at_line_offset( line, match.start() ) enditer = self.buffer.get_iter_at_line_offset( line, match.end() ) yield startiter, enditer, match def replace(self, string): '''Replace current match @param string: the replacement string In case of a regex find and replace the string will be expanded with terms from the regex. @returns: C{True} is successful ''' iter = self.buffer.get_insert_iter() if not self._find_next(iter): return False iter = self.buffer.get_insert_iter() line = iter.get_line() for start, end, match in self._check_range(line, line, 1): if start.equal(iter): if self.flags & FIND_REGEX: string = match.expand(string) offset = start.get_offset() with self.buffer.user_action: self.buffer.select_range(start, end) # ensure editmode logic is used self.buffer.delete(start, end) self.buffer.insert_at_cursor(string) start = self.buffer.get_iter_at_offset(offset) end = self.buffer.get_iter_at_offset(offset+len(string)) self.buffer.select_range(start, end) return True else: return False self._update_highlight() def replace_all(self, string): '''Replace all matched Like L{replace()} but replaces all matches in the buffer @param string: the replacement string @returns: C{True} is successful ''' # Avoid looping when replace value matches query matches = [] orig = string lastline = self.buffer.get_end_iter().get_line() for start, end, match in self._check_range(0, lastline, 1): if self.flags & FIND_REGEX: string = match.expand(orig) matches.append((start.get_offset(), end.get_offset(), string)) matches.reverse() # work our way back top keep offsets valid with self.buffer.user_action: with self.buffer.tmp_cursor(): for start, end, string in matches: start = self.buffer.get_iter_at_offset(start) end = self.buffer.get_iter_at_offset(end) self.buffer.select_range(start, end) # ensure editmode logic is used self.buffer.delete(start, end) self.buffer.insert(start, string) self._update_highlight() CURSOR_TEXT = gtk.gdk.Cursor(gtk.gdk.XTERM) #: the C{gtk.gdk.Cursor} for normal text CURSOR_LINK = gtk.gdk.Cursor(gtk.gdk.HAND2) #: the C{gtk.gdk.Cursor} for links CURSOR_WIDGET = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) #: the C{gtk.gdk.Cursor} for widgets and objects class TextView(gtk.TextView): '''Widget to display a L{TextBuffer} with page content. Implements zim specific behavior like additional key bindings, on-mouse-over signals for links, and the custom popup menu. @ivar preferences: dict with preferences @signal: C{link-clicked (link)}: Emitted when the user clicks a link @signal: C{link-enter (link)}: Emitted when the mouse pointer enters a link @signal: C{link-leave (link)}: Emitted when the mouse pointer leaves a link @signal: C{end-of-word (start, end, word, char, editmode)}: Emitted when the user typed a character like space that ends a word - C{start}: a C{gtk.TextIter} for the start of the word - C{end}: a C{gtk.TextIter} for the end of the word - C{word}: the word as string - C{char}: the character that caused the signal (a space, tab, etc.) - C{editmode}: a list of constants for the formatting being in effect, e.g. C{VERBATIM} Plugins that want to add auto-formatting logic can connect to this signal. If the handler matches the word it should stop the signal with C{stop_emission()} to prevent other hooks from formatting the same word. @signal: C{end-of-line (end)}: Emitted when the user typed a newline ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { # New signals 'link-clicked': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'link-enter': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'link-leave': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'end-of-word': (gobject.SIGNAL_RUN_LAST, None, (object, object, object, object, object)), 'end-of-line': (gobject.SIGNAL_RUN_LAST, None, (object,)), # Override clipboard interaction 'copy-clipboard': 'override', 'cut-clipboard': 'override', 'paste-clipboard': 'override', # And some events we want to connect to 'motion-notify-event': 'override', 'visibility-notify-event': 'override', 'button-press-event': 'override', 'button-release-event': 'override', 'key-press-event': 'override', } def __init__(self, preferences): '''Constructor @param preferences: dict with preferences @todo: make sure code sets proper defaults for preferences & document preferences used ''' gtk.TextView.__init__(self, TextBuffer(None, None)) self.set_name('zim-pageview') self._cursor = CURSOR_TEXT self._cursor_link = None self.gtkspell = None self.set_left_margin(10) self.set_right_margin(5) self.set_wrap_mode(gtk.WRAP_WORD) self.preferences = preferences actions = gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_LINK self.drag_dest_set(0, PARSETREE_ACCEPT_TARGETS, actions) # Flags is 0 because gtktextview does everything itself def set_buffer(self, buffer): '''Set a new L{TextBuffer} to display @param buffer: a L{TextBuffer} object ''' if not self.gtkspell is None: # Hardcoded hook because using signals here # seems to introduce lag self.gtkspell.detach() self.gtkspell = None gtk.TextView.set_buffer(self, buffer) def do_copy_clipboard(self, format=None): # Overriden to force usage of our Textbuffer.copy_clipboard # over gtk.TextBuffer.copy_clipboard format = format or self.preferences['copy_format'] format = zim.formats.canonical_name(format) self.get_buffer().copy_clipboard(Clipboard, format) def do_cut_clipboard(self): # Overriden to force usage of our Textbuffer.cut_clipboard # over gtk.TextBuffer.cut_clipboard self.get_buffer().cut_clipboard(Clipboard, self.get_editable()) self.scroll_mark_onscreen(self.get_buffer().get_insert()) def do_paste_clipboard(self): # Overriden to force usage of our Textbuffer.paste_clipboard # over gtk.TextBuffer.paste_clipboard self.get_buffer().paste_clipboard(Clipboard, None, self.get_editable()) self.scroll_mark_onscreen(self.get_buffer().get_insert()) #~ def do_drag_motion(self, context, *a): #~ # Method that echos drag data types - only enable for debugging #~ print context.targets def do_drag_data_received(self, dragcontext, x, y, selectiondata, info, timestamp): # Handle drag and drop compatibility for all copy-past data types if not self.get_editable(): dragcontext.finish(False, False, timestamp) # NOK return logger.debug('Drag data received of type "%s"', selectiondata.target) buffer = self.get_buffer() tree = parsetree_from_selectiondata(selectiondata, buffer.notebook, buffer.page) if tree is None: logger.warn('Could not drop data type "%s"', selectiondata.target) dragcontext.finish(False, False, timestamp) # NOK return x, y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, x, y) iter = self.get_iter_at_location(x, y) buffer.insert_parsetree(iter, tree, interactive=True) dragcontext.finish(True, False, timestamp) # OK def do_motion_notify_event(self, event): # Update the cursor type when the mouse moves cont = gtk.TextView.do_motion_notify_event(self, event) x, y = event.get_coords() x, y = int(x), int(y) # avoid some strange DeprecationWarning coords = self.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, x, y) self.update_cursor(coords) return cont # continue emit ? def do_visibility_notify_event(self, event): # Update the cursor type when the window visibility changed self.update_cursor() return False # continue emit def do_button_press_event(self, event): # Handle middle click for pasting and right click for context menu # Needed to override these because implementation details of # gtktextview.c do not use proper ignals for these actions. # # Note that clicking links is in button-release to avoid # conflict with making selections buffer = self.get_buffer() if event.type == gtk.gdk.BUTTON_PRESS: iter, coords = self._get_pointer_location() if event.button == 2 and not buffer.get_has_selection(): buffer.paste_clipboard(SelectionClipboard, iter, self.get_editable()) return False elif event.button == 3: self._set_popup_menu_mark(iter) return gtk.TextView.do_button_press_event(self, event) def do_button_release_event(self, event): # Handle clicking a link or checkbox cont = gtk.TextView.do_button_release_event(self, event) if not self.get_buffer().get_has_selection(): if self.get_editable(): if event.button == 1: if self.preferences['cycle_checkbox_type']: # Cycle through all states - more useful for # single click input devices self.click_link() or self.click_checkbox() else: self.click_link() or self.click_checkbox(CHECKED_BOX) elif event.button == 3: self.click_checkbox(XCHECKED_BOX) elif event.button == 1: # no changing checkboxes for read-only content self.click_link() return cont # continue emit ? def do_popup_menu(self): # Handler that gets called when user activates the popup-menu # by a keybinding (Shift-F10 or "menu" key). # Due to implementation details in gtktextview.c this method is # not called when a popup is triggered by a mouse click. buffer = self.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_insert()) self._set_popup_menu_mark(iter) return gtk.TextView.do_popup_menu(self) def get_popup(self): '''Get the popup menu - intended for testing''' buffer = self.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_insert()) self._set_popup_menu_mark(iter) menu = gtk.Menu() self.emit('populate-popup', menu) return menu def _set_popup_menu_mark(self, iter): buffer = self.get_buffer() mark = buffer.get_mark('zim-popup-menu') if mark: buffer.move_mark(mark, iter) else: mark = buffer.create_mark('zim-popup-menu', iter, True) def do_key_press_event(self, event): # This method defines extra key bindings. It also triggers # end-of-word and end-of-line signals. # # Note that on maemo only TAB triggers this method, other keys # avoid it somehow # # Calls in read-only mode or selection mode are dispatched to two # methods below. handled = False buffer = self.get_buffer() #~ print 'KEY %s (%i)' % (gtk.gdk.keyval_name(event.keyval), event.keyval) #~ print 'STATE %s' % event.state if not self.get_editable(): # Dispatch read-only mode if self._do_key_press_event_readonly(event): return True else: return gtk.TextView.do_key_press_event(self, event) elif buffer.get_has_selection(): # Dispatch selection mode if self._do_key_press_event_selection(event): return True else: return gtk.TextView.do_key_press_event(self, event) elif (event.keyval in KEYVALS_HOME and not event.state & gtk.gdk.CONTROL_MASK): # Smart Home key - can be combined with shift state insert = buffer.get_iter_at_mark(buffer.get_insert()) home, ourhome = self.get_visual_home_positions(insert) if insert.equal(ourhome): iter = home else: iter = ourhome if event.state & gtk.gdk.SHIFT_MASK: buffer.move_mark_by_name('insert', iter) else: buffer.place_cursor(iter) handled = True elif event.keyval in KEYVALS_TAB and not (event.state & KEYSTATES): # Tab at start of line indents iter = buffer.get_insert_iter() home, ourhome = self.get_visual_home_positions(iter) if home.starts_line() and iter.compare(ourhome) < 1 \ and not filter(_is_pre_tag, iter.get_tags()): row, list = TextBufferList.new_from_line(buffer, iter.get_line()) if list and self.preferences['recursive_indentlist']: list.indent(row) else: buffer.indent(iter.get_line(), interactive=True) handled = True elif (event.keyval in KEYVALS_LEFT_TAB and not (event.state & KEYSTATES & ~gtk.gdk.SHIFT_MASK) ) or (event.keyval in KEYVALS_BACKSPACE and self.preferences['unindent_on_backspace'] and not (event.state & KEYSTATES) ): # Backspace or Ctrl-Tab unindents line # note that Shift-Tab give Left_Tab + Shift mask, so allow shift iter = buffer.get_iter_at_mark(buffer.get_insert()) home, ourhome = self.get_visual_home_positions(iter) if home.starts_line() and iter.compare(ourhome) < 1 \ and not filter(_is_pre_tag, iter.get_tags()): bullet = buffer.get_bullet_at_iter(home) indent = buffer.get_indent(home.get_line()) if event.keyval in KEYVALS_BACKSPACE \ and bullet and indent == 0 and not iter.equal(home): # Delete bullet at start of line (if iter not before bullet) buffer.delete(home, ourhome) handled = True elif indent == 0 or indent is None: # Nothing to unindent pass elif bullet: # Unindent list maybe recursive row, list = TextBufferList.new_from_line(buffer, iter.get_line()) if list and self.preferences['recursive_indentlist']: handled = list.unindent(row) else: handled = buffer.unindent(iter.get_line(), interactive=True) else: # Unindent normal text handled = buffer.unindent(iter.get_line(), interactive=True) if event.keyval in KEYVALS_LEFT_TAB: handled = True # Prevent to insert a Tab if unindent fails elif event.keyval in KEYVALS_ENTER: # Enter can trigger links iter = buffer.get_iter_at_mark(buffer.get_insert()) tag = buffer.get_link_tag(iter) if tag and not iter.begins_tag(tag): # get_link_tag() is left gravitating, we additionally # exclude the position in front of the link. # As a result you can not "Enter" a 1 character link, # this is by design. if (self.preferences['follow_on_enter'] or event.state & gtk.gdk.MOD1_MASK): # MOD1 == Alt self.click_link_at_iter(iter) # else do not insert newline, just ignore handled = True if handled: return True # end of event chain elif not gtk.TextView.do_key_press_event(self, event): # Parent class also has no handler for this key return False elif (event.keyval in KEYVALS_END_OF_WORD or event.keyval in KEYVALS_ENTER): # Trigger end-of-line and/or end-of-word signals if char was # really inserted by parent class. # # We do it this way because in some cases e.g. a space is not # inserted but is used to select an option in an input mode e.g. # to select between various Chinese characters. See lp:460438 insert = buffer.get_iter_at_mark(buffer.get_insert()) mark = buffer.create_mark(None, insert, left_gravity=False) iter = insert.copy() iter.backward_char() if event.keyval in KEYVALS_ENTER: char = '\n' elif event.keyval in KEYVALS_TAB: char = '\t' else: char = unichr(gtk.gdk.keyval_to_unicode(event.keyval)) if iter.get_text(insert) != char: return True with buffer.user_action: buffer.emit('undo-save-cursor', insert) start = iter.copy() if buffer.iter_backward_word_start(start): word = start.get_text(iter) editmode = [t.zim_tag for t in buffer._editmode_tags if hasattr(t, 'zim_tag') ] self.emit('end-of-word', start, iter, word, char, editmode) if event.keyval in KEYVALS_ENTER: # iter may be invalid by now because of end-of-word iter = buffer.get_iter_at_mark(mark) iter.backward_char() self.emit('end-of-line', iter) buffer.place_cursor(buffer.get_iter_at_mark(mark)) self.scroll_mark_onscreen(mark) buffer.delete_mark(mark) return True def _do_key_press_event_readonly(self, event): # Key bindings in read-only mode: # Space scrolls one page # Shift-Space scrolls one page up handled = True if event.keyval in KEYVALS_SPACE: if event.state & gtk.gdk.SHIFT_MASK: i = -1 else: i = 1 self.emit('move-cursor', gtk.MOVEMENT_PAGES, i, False) else: handled = False return handled def _do_key_press_event_selection(self, event): # Key bindings when there is an active selections: # Tab indents whole selection # Shift-Tab and optionally Backspace unindent whole selection # * Turns whole selection in bullet list, or toggle back # > Quotes whole selection with '>' handled = True buffer = self.get_buffer() def delete_char(line): # Deletes the character at the iterator position iter = buffer.get_iter_at_line(line) next = iter.copy() if next.forward_char(): buffer.delete(iter, next) def decrement_indent(start, end): # Check if inside verbatim block AND entire selection without tag toggle if selection_in_pre_block(start, end): # Handle indent in pre differently missing_tabs = [] check_tab = lambda l: (buffer.get_iter_at_line(l).get_char() == '\t') or missing_tabs.append(1) buffer.foreach_line_in_selection(check_tab) if len(missing_tabs) == 0: return buffer.foreach_line_in_selection(delete_char) else: return False elif multi_line_indent(start, end): level = [] buffer.foreach_line_in_selection( lambda l: level.append(buffer.get_indent(l)) ) if level and min(level) > 0: # All lines have some indent return buffer.foreach_line_in_selection(buffer.unindent) else: return False else: return False def selection_in_pre_block(start, end): # Checks if there are any tag changes within the selection if filter(_is_pre_tag, start.get_tags()): toggle = start.copy() toggle.forward_to_tag_toggle(None) return toggle.compare(end) < 0 else: return False def multi_line_indent(start, end): # Check if: # a) one line selected from start till end or # b) multiple lines selected and selection starts at line start home, ourhome = self.get_visual_home_positions(start) if not (home.starts_line() and start.compare(ourhome) < 1): return False else: return end.ends_line() \ or end.get_line() > start.get_line() start, end = buffer.get_selection_bounds() with buffer.user_action: if event.keyval in KEYVALS_TAB: if selection_in_pre_block(start, end): # Handle indent in pre differently prepend_tab = lambda l: buffer.insert(buffer.get_iter_at_line(l), '\t') buffer.foreach_line_in_selection(prepend_tab) elif multi_line_indent(start, end): buffer.foreach_line_in_selection(buffer.indent) else: handled = False elif event.keyval in KEYVALS_LEFT_TAB: decrement_indent(start, end) # do not set handled = False when decrement failed - # LEFT_TAB should not do anything else elif event.keyval in KEYVALS_BACKSPACE \ and self.preferences['unindent_on_backspace']: handled = decrement_indent(start, end) elif event.keyval in KEYVALS_ASTERISK + (KEYVAL_POUND,): def toggle_bullet(line, newbullet): bullet = buffer.get_bullet(line) if not bullet and not buffer.get_line_is_empty(line): buffer.set_bullet(line, newbullet) elif bullet == newbullet: # FIXME broken for numbered list buffer.set_bullet(line, None) if event.keyval == KEYVAL_POUND: buffer.foreach_line_in_selection(toggle_bullet, NUMBER_BULLET) else: buffer.foreach_line_in_selection(toggle_bullet, BULLET) elif event.keyval in KEYVALS_GT \ and multi_line_indent(start, end): def email_quote(line): iter = buffer.get_iter_at_line(line) bound = iter.copy() bound.forward_char() if iter.get_text(bound) == '>': buffer.insert(iter, '>') else: buffer.insert(iter, '> ') buffer.foreach_line_in_selection(email_quote) else: handled = False return handled def _get_pointer_location(self): '''Get an iter and coordinates for the mouse pointer @returns: a 2-tuple of a C{gtk.TextIter} and a C{(x, y)} tupple with coordinates for the mouse pointer. ''' x, y = self.get_pointer() x, y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, x, y) return self.get_iter_at_location(x, y), (x, y) def _get_pixbuf_at_pointer(self, iter, coords): '''Returns the pixbuf that is under the mouse or C{None}. The parameters should be the TextIter and the (x, y) coordinates from L{_get_pointer_location()}. This method handles the special case where the pointer it on an iter next to the image but the mouse is visible above the image. ''' pixbuf = iter.get_pixbuf() if not pixbuf: # right side of pixbuf will map to next iter iter = iter.copy() iter.backward_char() pixbuf = iter.get_pixbuf() if pixbuf and hasattr(pixbuf, 'zim_type'): # If we have a pixbuf double check the cursor is really # over the image and not actually on the next cursor position area = self.get_iter_location(iter) if (coords[0] >= area.x and coords[0] <= area.x + area.width and coords[1] >= area.y and coords[1] <= area.y + area.height): return pixbuf else: return None else: return None def update_cursor(self, coords=None): '''Update the mouse cursor type E.g. set a "hand" cursor when hovering over a link. @param coords: a tuple with C{(x, y)} position in buffer coords. Only give this argument if coords are known from an event, otherwise the current cursor position is used. @emits: link-enter @emits: link-leave ''' if coords is None: iter, coords = self._get_pointer_location() else: iter = self.get_iter_at_location(*coords) link = None pixbuf = self._get_pixbuf_at_pointer(iter, coords) if pixbuf: if pixbuf.zim_type == 'icon' and pixbuf.zim_attrib['stock'] in ( STOCK_CHECKED_BOX, STOCK_UNCHECKED_BOX, STOCK_XCHECKED_BOX): cursor = CURSOR_WIDGET elif 'href' in pixbuf.zim_attrib: link = {'href': pixbuf.zim_attrib['href']} cursor = CURSOR_LINK else: cursor = CURSOR_TEXT else: link = self.get_buffer().get_link_data(iter) if link: cursor = CURSOR_LINK else: cursor = CURSOR_TEXT if cursor != self._cursor: window = self.get_window(gtk.TEXT_WINDOW_TEXT) window.set_cursor(cursor) # Check if we need to emit any events for hovering if self._cursor == CURSOR_LINK: # was over link before if cursor == CURSOR_LINK: # still over link if link != self._cursor_link: # but other link self.emit('link-leave', self._cursor_link) self.emit('link-enter', link) else: self.emit('link-leave', self._cursor_link) elif cursor == CURSOR_LINK: # was not over link, but is now self.emit('link-enter', link) self._cursor = cursor self._cursor_link = link def click_link(self): '''Activate the link under the mouse pointer, if any @emits: link-clicked @returns: C{True} when there was indeed a link ''' iter, coords = self._get_pointer_location() pixbuf = self._get_pixbuf_at_pointer(iter, coords) if pixbuf and pixbuf.zim_attrib.get('href'): self.emit('link-clicked', {'href': pixbuf.zim_attrib['href']}) return True else: return self.click_link_at_iter(iter) def click_link_at_iter(self, iter): '''Activate the link at C{iter}, if any Like L{click_link()} but activates a link at a specific text iter location @emits: link-clicked @param iter: a C{gtk.TextIter} @returns: C{True} when there was indeed a link ''' link = self.get_buffer().get_link_data(iter) if link: self.emit('link-clicked', link) return True else: return False def click_checkbox(self, checkbox_type=None): '''Toggle the checkbox under the mouse pointer, if any @param checkbox_type: the checkbox type to toggle between, see L{TextBuffer.toggle_checkbox()} for details. @returns: C{True} for success, C{False} if no checkbox was found. ''' iter, coords = self._get_pointer_location() if iter.get_line_offset() < 2: # Only position 0 or 1 can map to a checkbox buffer = self.get_buffer() recurs = self.preferences['recursive_checklist'] return buffer.toggle_checkbox(iter.get_line(), checkbox_type, recurs) else: return False def get_visual_home_positions(self, iter): '''Get the TextIters for the visuale start of the line @param iter: a C{gtk.TextIter} @returns: a 2-tuple with two C{gtk.TextIter} The first iter is the start of the visual line - which can be the start of the line as the buffer sees it (which is also called the paragraph start in the view) or the iter at the place where the line is wrapped. The second iter is the start of the line after skipping any bullets and whitespace. For a wrapped line the second iter will be the same as the first. ''' home = iter.copy() if not self.starts_display_line(home): self.backward_display_line_start(home) if home.starts_line(): ourhome = home.copy() self.get_buffer().iter_forward_past_bullet(ourhome) bound = ourhome.copy() bound.forward_char() while ourhome.get_text(bound) in (' ', '\t'): if ourhome.forward_char(): bound.forward_char() else: break return home, ourhome else: # only start visual line, not start of real line return home, home.copy() def do_end_of_word(self, start, end, word, char, editmode): # Default handler with built-in auto-formatting options buffer = self.get_buffer() handled = True #~ print 'WORD >>%s<< CHAR >>%s<<' % (word, char) if filter(_is_not_indent_tag, buffer.iter_get_zim_tags(start)) \ or filter(_is_not_indent_tag, buffer.iter_get_zim_tags(end)): # DO not auto-format if any zim tags are applied except for indent return def apply_tag(match): #~ print "TAG >>%s<<" % word start = end.copy() if not start.backward_chars(len(match)): return False if buffer.range_has_tags(_is_not_indent_tag, start, end): return False tag = buffer._create_tag_tag(match) buffer.apply_tag(tag, start, end) return True def apply_link(match): #~ print "LINK >>%s<<" % word start = end.copy() if not start.backward_chars(len(match)): return False if buffer.range_has_tags(_is_not_indent_tag, start, end): return False tag = buffer._create_link_tag(match, match) buffer.apply_tag(tag, start, end) return True if (char == ' ' or char == '\t') and start.starts_line() \ and (word in autoformat_bullets or is_numbered_bullet_re.match(word)): # format bullet and checkboxes line = start.get_line() end.forward_char() # also overwrite the space triggering the action buffer.delete(start, end) bullet = autoformat_bullets.get(word) or word buffer.set_bullet(line, bullet) elif tag_re.match(word): apply_tag(tag_re[0]) elif url_re.match(word): apply_link(url_re[0]) elif page_re.match(word): # Do not link "10:20h", "10:20PM" etc. so check two letters before first ":" w = word.strip(':').split(':') if w and twoletter_re.search(w[0]): apply_link(page_re[0]) else: handled = False elif interwiki_re.match(word): apply_link(interwiki_re[0]) elif self.preferences['autolink_files'] and file_re.match(word): apply_link(file_re[0]) elif self.preferences['autolink_camelcase'] and camelcase_re.match(word): apply_link(camelcase_re[0]) elif self.preferences['auto_reformat']: handled = False linestart = buffer.get_iter_at_line(end.get_line()) partial_line = linestart.get_slice(end) for style,re in markup_re.items(): if not re.search(partial_line) == None: matchstart = linestart.copy() matchstart.forward_chars(re.start()) matchend = linestart.copy() matchend.forward_chars(re.end()) if filter(_is_not_indent_tag,buffer.iter_get_zim_tags(matchstart)) \ or filter(_is_not_indent_tag,buffer.iter_get_zim_tags(matchend)): continue buffer.delete(matchstart,matchend) buffer.insert_with_tags_by_name(matchstart,re[2],style) handled_here = True break else: handled = False if handled: self.stop_emission('end-of-word') def do_end_of_line(self, end): # Default handler, takes care of cutting of formatting on the # line end, set indenting and bullet items on the new line etc. buffer = self.get_buffer() if end.starts_line(): return # empty line start = buffer.get_iter_at_line(end.get_line()) line = start.get_text(end) #~ print 'LINE >>%s<<' % line if heading_re.match(line): level = len(heading_re[1])-1 heading = heading_re[2] mark = buffer.create_mark(None, end) buffer.delete(start, end) buffer.insert_with_tags_by_name( buffer.get_iter_at_mark(mark), heading, 'style-h'+str(level)) buffer.delete_mark(mark) elif not buffer.get_bullet_at_iter(start) is None: # we are part of bullet list # FIXME should logic be handled by TextBufferList ? ourhome = start.copy() buffer.iter_forward_past_bullet(ourhome) newlinestart = end.copy() newlinestart.forward_line() if ourhome.equal(end) and newlinestart.ends_line(): # line with bullet but no text - break list if no text on next line line, newline = start.get_line(), newlinestart.get_line() buffer.delete(start, end) buffer.set_indent(line, None) buffer.set_indent(newline, None) else: # determine indent newline = newlinestart.get_line() indent = buffer.get_indent(start.get_line()) nextlinestart = newlinestart.copy() if nextlinestart.forward_line() \ and buffer.get_bullet_at_iter(nextlinestart): nextindent = buffer.get_indent(nextlinestart.get_line()) if nextindent >= indent: # we are at the head of a sublist indent = nextindent # add bullet on new line bullet = buffer.get_bullet_at_iter(start) if bullet in (CHECKED_BOX, XCHECKED_BOX): bullet = UNCHECKED_BOX elif is_numbered_bullet_re.match(bullet): bullet = increase_list_bullet(bullet) buffer.set_bullet(newline, bullet) # apply indent buffer.set_indent(newline, indent) buffer.update_editmode() # also updates indent tag # Need to register classes defining gobject signals gobject.type_register(TextView) class UndoActionGroup(list): '''Group of actions that should un-done or re-done in a single step Inherits from C{list}, so can be treates as a list of actions. See L{UndoStackManager} for more details on undo actions. @ivar can_merge: C{True} when this group can be merged with another group @ivar cursor: the position to restore the cursor afre un-/re-doning ''' __slots__ = ('can_merge', 'cursor') def __init__(self): self.can_merge = False self.cursor = None def reversed(self): '''Returns a new UndoActionGroup with the reverse actions of this group. ''' group = UndoActionGroup() group.cursor = self.cursor for action in self: # constants are defined such that negating them reverses the action action = (-action[0],) + action[1:] group.insert(0, action) return group class UndoStackManager: '''Undo stack implementation for L{TextBuffer}. It records any changes to the buffer and allows undoing and redoing edits. The stack undostack will be folded when you undo a few steps and then start editing again. This means that even the 'undo' action is recorded in the undo stakc and can always be undone itself; so no data is discarded. Say you start with a certain buffer state "A", then make two edits ("B" and "C") and then undo the last one, so you get back in state "B":: State A --> State B --> State C <-- undo when you now make a new edit ("D"), state "C" is not discarded, instead it is "folded" as follows:: State A --> State B --> State C --> State B --> State D so you can still go back to state "C" using Undo. Undo actions ============ Each action is recorded as a 4-tuple of: - C{action_type}: one of C{ACTION_INSERT}, C{ACTION_DELETE}, C{ACTION_APPLY_TAG}, C{ACTION_REMOVE_TAG} - C{start_iter}: a C{gtk.TextIter} - C{end_iter}: a C{gtk.TextIter} - C{data}: either a (raw) L{ParseTree} or a C{gtk.TextTag} These actions are low level operations, so they are Actions are collected as L{UndoActionGroup}s. When the user selects Undo or Redo we actually undo or redo a whole UndoActionGroup as a single step. E.g. inserting a link will consist of inserting the text and than applying the TextTag with the link data. These are technically two separate modifications of the TextBuffer, however when selecting Undo both are undone at once because they are combined in a single group. Typically when recording modifications the action groups are delimited by the begin-user-action and end-user-action signals of the L{TextBuffer}. (This is why we use the L{TextBuffer.user_action} attribute context manager in the TextBuffer code.) Also we try to group single-character inserts and deletes into words. This makes the stack more compact and makes the undo action more meaningful. ''' # Each interactive action (e.g. every single key stroke) is wrapped # in a set of begin-user-action and end-user-action signals. We use # these signals to group actions. This implies that any sequence on # non-interactive actions will also end up in a single group. An # interactively created group consisting of a single character insert # or single character delete is a candidate for merging. MAX_UNDO = 100 #: Constant for the max number of undo steps to be remembered # Constants for action types - negating an action gives it opposite. ACTION_INSERT = 1 #: action type for inserting text ACTION_DELETE = -1 #: action type for deleting text ACTION_APPLY_TAG = 2 #: action type for applying a C{gtk.TextTag} ACTION_REMOVE_TAG = -2 #: action type for removing a C{gtk.TextTag} def __init__(self, textbuffer): '''Constructor @param textbuffer: a C{gtk.TextBuffer} ''' self.buffer = textbuffer self.stack = [] # stack of actions & action groups self.group = UndoActionGroup() # current group of actions self.interactive = False # interactive edit or not self.insert_pending = False # whether we need to call flush insert or not self.undo_count = 0 # number of undo steps that were done self.block_count = 0 # number of times block() was called self.recording_handlers = [] # handlers to be blocked when not recording for signal, handler in ( ('undo-save-cursor', self.do_save_cursor), ('insert-text', self.do_insert_text), #~ ('inserted-tree', self.do_insert_tree), # TODO ('insert-pixbuf', self.do_insert_pixbuf), ('delete-range', self.do_delete_range), ('begin-user-action', self.do_begin_user_action), ('end-user-action', self.do_end_user_action), ): self.recording_handlers.append( self.buffer.connect(signal, handler) ) for signal, handler in ( ('end-user-action', self.do_end_user_action), ): self.recording_handlers.append( self.buffer.connect_after(signal, handler) ) for signal, action in ( ('apply-tag', self.ACTION_APPLY_TAG), ('remove-tag', self.ACTION_REMOVE_TAG), ): self.recording_handlers.append( self.buffer.connect(signal, self.do_change_tag, action) ) #~ self.buffer.connect_object('begin-insert-tree', #~ self.__class__.block, self) #~ self.buffer.connect_object('end-insert-tree', #~ self.__class__.unblock, self) self.buffer.connect_object('clear', self.__class__.clear, self) #~ self.buffer.connect_object('edit-textstyle-changed', #~ self.__class__._flush_if_typing, self) #~ self.buffer.connect_object('set-mark', #~ self.__class__._flush_if_typing, self) def block(self): '''Stop listening to events from the L{TextBuffer} until the next call to L{unblock()}. Any change in between will not be undo-able (and mess up the undo stack) unless it is recorded explicitly. The number of calls C{block()} and C{unblock()} is counted, so they can be called recursively. ''' if self.block_count == 0: for id in self.recording_handlers: self.buffer.handler_block(id) self.block_count += 1 def unblock(self): '''Start listening to events from the L{TextBuffer} again''' if self.block_count > 1: self.block_count -= 1 else: for id in self.recording_handlers: self.buffer.handler_unblock(id) self.block_count = 0 def clear(self): '''Clear the undo stack''' self.stack = [] self.group = UndoActionGroup() self.interactive = False self.insert_pending = False self.undo_count = 0 self.block_count = 0 self.block() def do_save_cursor(self, buffer, iter): # Store the cursor position self.group.cursor = iter.get_offset() def do_begin_user_action(self, buffer): # Start a group of actions that will be undone as a single action if self.undo_count > 0: self.flush_redo_stack() if self.group: self.stack.append(self.group) self.group = UndoActionGroup() while len(self.stack) > self.MAX_UNDO: self.stack.pop(0) self.interactive = True def do_end_user_action(self, buffer): # End a group of actions that will be undone as a single action if self.group: self.stack.append(self.group) self.group = UndoActionGroup() while len(self.stack) > self.MAX_UNDO: self.stack.pop(0) self.interactive = False #~ def do_inserted_tree(self, buffer, start, end, parsetree): #~ if self.undo_count > 0: self._flush_redo_stack() #~ start, end = start.get_offset(), end.get_offset() #~ self.group.append((self.ACTION_INSERT, start, end, tree)) def do_insert_text(self, buffer, iter, text, length): # Handle insert text event # Do not use length argument, it gives length in bytes, not characters text = text.decode('utf-8') length = len(text) if self.undo_count > 0: self.flush_redo_stack() start = iter.get_offset() end = start + length #~ print 'INSERT at %i: "%s" (%i)' % (start, text, length) if length == 1 and not text.isspace() \ and self.interactive and not self.group: # we can merge if self.stack and self.stack[-1].can_merge: previous = self.stack[-1][-1] if previous[0] == self.ACTION_INSERT \ and previous[2] == start \ and previous[3] is None: # so can previous group - let's merge self.group = self.stack.pop() self.group[-1] = (self.ACTION_INSERT, previous[1], end, None) return # we didn't merge - set flag for next self.group.can_merge = True self.group.append((self.ACTION_INSERT, start, end, None)) self.insert_pending = True def do_insert_pixbuf(self, buffer, iter, pixbuf): # Handle insert pixbuf event if self.undo_count > 0: self.flush_redo_stack() elif self.insert_pending: self.flush_insert() start = iter.get_offset() end = start + 1 #~ print 'INSERT PIXBUF at %i' % start self.group.append((self.ACTION_INSERT, start, end, None)) self.group.can_merge = False self.insert_pending = True def flush_insert(self): '''Flush all pending actions and store them on the stack The reason for this method is that because of the possibility of merging actions we do not immediatly request the parse tree for each single character insert. Instead we first group inserts based on cursor positions and then request the parse tree for the group at once. This method proceses all such delayed requests. ''' def _flush_group(group): for i in reversed(range(len(group))): action, start, end, tree = group[i] if action == self.ACTION_INSERT and tree is None: bounds = (self.buffer.get_iter_at_offset(start), self.buffer.get_iter_at_offset(end)) tree = self.buffer.get_parsetree(bounds, raw=True) #~ print 'FLUSH %i to %i\n\t%s' % (start, end, tree.tostring()) group[i] = (self.ACTION_INSERT, start, end, tree) else: return False return True if _flush_group(self.group): for i in reversed(range(len(self.stack))): if not _flush_group(self.stack[i]): break self.insert_pending = False def do_delete_range(self, buffer, start, end): # Handle deleting text if self.undo_count > 0: self.flush_redo_stack() elif self.insert_pending: self.flush_insert() bounds = (start, end) tree = self.buffer.get_parsetree(bounds, raw=True) start, end = start.get_offset(), end.get_offset() #~ print 'DELETE RANGE from %i to %i\n\t%s' % (start, end, tree.tostring()) self.group.append((self.ACTION_DELETE, start, end, tree)) self.group.can_merge = False def do_change_tag(self, buffer, tag, start, end, action): assert action in (self.ACTION_APPLY_TAG, self.ACTION_REMOVE_TAG) if not hasattr(tag, 'zim_type'): return start, end = start.get_offset(), end.get_offset() if self.group \ and self.group[-1][0] == self.ACTION_INSERT \ and self.group[-1][1] <= start \ and self.group[-1][2] >= end \ and self.group[-1][3] is None: pass # for text that is not yet flushed tags will be in the tree else: if self.undo_count > 0: self.flush_redo_stack() elif self.insert_pending: self.flush_insert() #~ print 'TAG CHANGED', start, end, tag self.group.append((action, start, end, tag)) self.group.can_merge = False def undo(self): '''Undo one user action''' if self.group: self.stack.append(self.group) self.group = UndoActionGroup() if self.insert_pending: self.flush_insert() #~ import pprint #~ pprint.pprint( self.stack ) l = len(self.stack) if self.undo_count == l: return False else: self.undo_count += 1 i = l - self.undo_count self._replay(self.stack[i].reversed()) return True def flush_redo_stack(self): '''Fold the "redo" part of the stack, called before new actions are appended after some step was undone. ''' i = len(self.stack) - self.undo_count fold = UndoActionGroup() for group in reversed(self.stack[i:]): fold.extend(group.reversed()) self.stack.append(fold) self.undo_count = 0 def redo(self): '''Redo one user action''' if self.undo_count == 0: return False else: assert not self.group, 'BUG: undo count should have been zero' i = len(self.stack) - self.undo_count self._replay(self.stack[i]) self.undo_count -= 1 return True def _replay(self, actiongroup): self.block() #~ print '='*80 for action, start, end, data in actiongroup: iter = self.buffer.get_iter_at_offset(start) bound = self.buffer.get_iter_at_offset(end) if action == self.ACTION_INSERT: #~ print 'INSERTING', data.tostring() self.buffer.place_cursor(iter) self.buffer.insert_parsetree_at_cursor(data) elif action == self.ACTION_DELETE: #~ print 'DELETING', data.tostring() self.buffer.place_cursor(iter) tree = self.buffer.get_parsetree((iter, bound), raw=True) #~ print 'REAL', tree.tostring() with self.buffer.user_action: self.buffer.delete(iter, bound) self.buffer._check_renumber = [] # Flush renumber check - HACK to avoid messing up the stack if tree.tostring() != data.tostring(): logger.warn('Mismatch in undo stack\n%s\n%s\n', tree.tostring(), data.tostring()) elif action == self.ACTION_APPLY_TAG: #~ print 'APPLYING', data self.buffer.apply_tag(data, iter, bound) self.buffer.place_cursor(bound) elif action == self.ACTION_REMOVE_TAG: #~ print 'REMOVING', data self.buffer.remove_tag(data, iter, bound) self.buffer.place_cursor(bound) else: assert False, 'BUG: unknown action type' if not actiongroup.cursor is None: iter = self.buffer.get_iter_at_offset(actiongroup.cursor) self.buffer.place_cursor(iter) self.unblock() class PageView(gtk.VBox): '''Widget to display a single page, consists of a L{TextView} and a L{FindBar}. Also adds menu items and in general integrates the TextView with the rest of the application. @cvar style: a L{ListDict} with style properties. Although this is a class attribute loading the data from the config file is delayed till the first object is constructed @ivar ui: the main L{GtkInterface} object @ivar page: L{Page} object for the current page displayed in the widget @ivar readonly: C{True} when the widget is read-only, see L{set_readonly()} for details @ivar secondary: hint that the PageView is running in a secondairy window (instead of the main window) @ivar undostack: the L{UndoStackManager} object for @ivar image_generator_plugins: dict with plugins mapped by type, this used to find the correct dialog to handle e.g. embedded equations and diagrams. Each plugin in this dict should have at least a method C{edit_object(buffer, iter, image_data)} and a method C{do_populate_popup(menu, buffer, iter, image_data)}. @ivar view: the L{TextView} child object @ivar find_bar: the L{FindBar} child widget @ivar preferences: a L{ListDict} with preferences @signal: C{modified-changed ()}: emitted when the page is edited @todo: document preferences supported by PageView @todo: document extra keybindings implemented in this widget @todo: document style properties supported by this widget @todo: refactor such that the PageView doesn't need to know whether it is in a secondairy window or not ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'modified-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } style = None # set below when constructing first instance def __init__(self, ui, secondary=False): '''Constructor @param ui: the L{GtkInterface} object @param secondary: C{True} if this widget is part of a secondary widget ''' gtk.VBox.__init__(self) self.ui = ui self._buffer_signals = () self.page = None self.readonly = True self._widget_readonly = False self.secondary = secondary if self.secondary: self._widget_readonly = True self.undostack = None self.image_generator_plugins = {} self._current_toggle_action = None self._showing_template = False self.preferences = self.ui.preferences['PageView'] if not self.secondary: # HACK avoid registering a second time self.ui.register_preferences('PageView', ui_preferences) self.view = TextView(preferences=self.preferences) self.add(ScrolledWindow(self.view)) self.view.connect_object('link-clicked', PageView.do_link_clicked, self) self.view.connect_object('link-enter', PageView.do_link_enter, self) self.view.connect_object('link-leave', PageView.do_link_leave, self) self.view.connect_object('populate-popup', PageView.do_populate_popup, self) ## Create search box self.find_bar = FindBar(textview=self.view) self.pack_end(self.find_bar, False) self.find_bar.hide() ## setup GUI actions if self.secondary: # HACK - divert actions from uimanager self.actiongroup = gtk.ActionGroup('SecondaryPageView') self.ui.add_actions(ui_actions, self) # setup hooks for new file submenu action = self.actiongroup.get_action('insert_new_file_menu') action.zim_readonly = False action.connect('activate', self._update_new_file_submenu) # format actions need some custom hooks actiongroup = self.actiongroup actiongroup.add_actions(ui_format_actions) actiongroup.add_toggle_actions(ui_format_toggle_actions) for name in [a[0] for a in ui_format_actions]: action = actiongroup.get_action(name) action.zim_readonly = False #~ action.connect('activate', lambda o, *a: logger.warn(o.get_name())) action.connect('activate', self.do_toggle_format_action) for name in [a[0] for a in ui_format_toggle_actions]: action = actiongroup.get_action(name) action.zim_readonly = False #~ action.connect('activate', lambda o, *a: logger.warn(o.get_name())) action.connect('activate', self.do_toggle_format_action) if self.style is None: # Initialize class attribute - first object instance only PageView.style = get_config('style.conf') PageView.style.profile = None # this can be reset later when the profile changes self.on_preferences_changed(self.ui) # also initializes the style self.ui.connect('preferences-changed', self.on_preferences_changed) self.ui.connect_object('readonly-changed', PageView.set_readonly, self) if self.ui.notebook: self.on_open_notebook(self.ui, self.ui.notebook) else: self.ui.connect('open-notebook', self.on_open_notebook) def grab_focus(self): self.view.grab_focus() def on_preferences_changed(self, ui): self._reload_style() # Needed because font is taken from preferences self.view.set_cursor_visible( self.preferences['read_only_cursor'] or not self.readonly) def _reload_style(self): '''(Re-)intializes properties for TextView, TextBuffer and TextTags based on the properties in the style config. ''' self.style['TextView'].setdefault('indent', TextBuffer.pixels_indent) self.style['TextView'].setdefault('tabs', None, int) # Don't set a default for 'tabs' as not to break pages that # were created before this setting was introduced. self.style['TextView'].setdefault('linespacing', 3) self.style['TextView'].setdefault('font', None, basestring) self.style['TextView'].setdefault('justify', None, basestring) #~ print self.style['TextView'] # Set properties for TextVIew if self.style['TextView']['tabs']: tabarray = pango.TabArray(1, True) # Initial size, position in pixels tabarray.set_tab(0, pango.TAB_LEFT, self.style['TextView']['tabs']) # We just set the size for one tab, apparently this gets # copied automaticlly when a new tab is created by the textbuffer self.view.set_tabs(tabarray) if self.style['TextView']['linespacing']: self.view.set_pixels_below_lines(self.style['TextView']['linespacing']) if self.style['TextView']['font']: font = pango.FontDescription(self.style['TextView']['font']) self.view.modify_font(font) else: self.view.modify_font(None) if self.style['TextView']['justify']: try: const = self.style['TextView']['justify'] assert hasattr(gtk, const), 'No such constant: gtk.%s' % const self.view.set_justification(getattr(gtk, const)) except: logger.exception('Exception while setting justification:') # Set properties for TextBuffer TextBuffer.pixels_indent = self.style['TextView']['indent'] # Load TextTags testbuffer = gtk.TextBuffer() for tag in [k[4:] for k in self.style.keys() if k.startswith('Tag ')]: try: assert tag in TextBuffer.tag_styles, 'No such tag: %s' % tag attrib = self.style['Tag '+tag].copy() for a in attrib.keys(): assert a in TextBuffer.tag_attributes, 'No such tag attribute: %s' % a if isinstance(attrib[a], basestring): if attrib[a].startswith('PANGO_'): const = attrib[a][6:] assert hasattr(pango, const), 'No such constant: pango.%s' % const attrib[a] = getattr(pango, const) else: attrib[a] = str(attrib[a]) # pango doesn't like unicode attributes if 'linespacing' in attrib: attrib['pixels-below-lines'] = attrib['linespacing'] del attrib['linespacing'] #~ print 'TAG', tag, attrib assert testbuffer.create_tag('style-'+tag, **attrib) except: logger.exception('Exception while parsing tag: %s:', tag) else: TextBuffer.tag_styles[tag] = attrib def on_open_notebook(self, ui, notebook): # Connect to notebook # Also connect to parent window here in a HACK to ensure # we do not hijack keybindings like ^C and ^V while we are not # focus (e.g. paste in find bar) Put it here to ensure # mainwindow is initialized. def set_actiongroup_sensitive(window, widget): #~ print '!! FOCUS SET:', widget sensitive = widget is self.view self._set_menuitems_sensitive(sensitive) window = self.get_toplevel() if window and window != self: window.connect('set-focus', set_actiongroup_sensitive) def assert_not_modified(page, *a): if page == self.page \ and self.view.get_buffer().get_modified(): raise AssertionError, 'BUG: page changed while buffer changed as well' # not using assert here because it could be optimized away for s in ('stored-page', 'deleted-page', 'moved-page'): notebook.connect(s, assert_not_modified) self.on_profile_changed(notebook) notebook.connect('profile-changed', self.on_profile_changed) def on_profile_changed(self, notebook): # Keep in mind that style is a class attribute - maybe multiple # pageview objects in existence when this signal fires if self.style.profile != notebook.profile: if notebook.profile is None: PageView.style = get_config('style.conf') PageView.style.profile = None else: # FIXME should we also check default file here ? file = config_file(('styles', notebook.profile + '.conf')) PageView.style.change_file(file) PageView.style.profile = notebook.profile self._reload_style() def set_page(self, page, cursor=None): '''Set the current page to be displayed in the pageview When the page does not yet exist a template is loaded for a new page which is obtained from L{Notebook.get_template()}. Exceptions while loading the page are handled gracefully with an error dialog and will result in the widget to be read-only and insensitive until the next page is loaded. @param page: a L{Page} object @keyword cursor: optional cursor position (integer) When the cursor is set to C{-1} the cursor will be placed at the end of the buffer. If cursor is C{None} the cursor is set at the start of the page for existing pages or to the end of the template when the page does not yet exist. ''' # unhook from previous page if self.page: self.page.set_ui_object(None) # for some reason keeping a copy of the previous buffer # prevents a number of segfaults ... # we do clear the old buffer to save some memory if self.undostack: self.undostack.block() self.undostack = None self._prev_buffer = self.view.get_buffer() finderstate = self._prev_buffer.finder.get_state() for id in self._buffer_signals: self._prev_buffer.disconnect(id) self._buffer_signals = () self._prev_buffer.clear() # now create the new buffer try: self.page = page buffer = TextBuffer(self.ui.notebook, self.page) self.view.set_buffer(buffer) tree = page.get_parsetree() if tree is None: # TODO check read-only template = self.ui.notebook.get_template(page) tree = template.process_to_parsetree(self.ui.notebook, page) if cursor is None: cursor = -1 else: template = None if cursor is None: cursor = 0 self.set_parsetree(tree, bool(template)) if not self.secondary: page.set_ui_object(self) # only after successful set tree in buffer except Exception, error: # Maybe corrupted parse tree - prevent page to be edited or saved back self.page.readonly = True self.set_readonly() self.set_sensitive(False) ErrorDialog(self.ui, error).run() else: # Finish hooking up the new page self.set_cursor_pos(cursor) self._buffer_signals = ( buffer.connect('textstyle-changed', self.do_textstyle_changed), buffer.connect('modified-changed', lambda o: self.on_modified_changed(o) ), buffer.connect_after('mark-set', self.do_mark_set), ) buffer.finder.set_state(*finderstate) # maintain state self.undostack = UndoStackManager(buffer) self.set_readonly() # initialize menu state self.set_sensitive(True) def get_page(self): '''Get the current page @returns: the current L{Page} object ''' return self.page def on_modified_changed(self, buffer): # one-way traffic, set page modified after modifying the buffer # but do not set page.moified False again when buffer goes # back to un-modified. Reason is that we use the buffer modified # state to track if we already requested the parse tree (see # get_parsetree()) while page modified is used to track need # for saving and is reset after save was done self._showing_template = False if buffer.get_modified() and not self.page.modified: if self.readonly: logger.warn('Buffer edited while read-only - potential bug') else: self.page.modified = True self.emit('modified-changed') def clear(self): '''Clear the buffer''' # Called e.g. by "discard changes" maybe due to an exception in # buffer.get_parse_tree() - so just drop everything... buffer = self.view.get_buffer() buffer.clear() buffer.set_modified(False) self._showing_template = False def get_parsetree(self): '''Get the L{ParseTree} for the content in the widget Note that calling L{Page.get_parsetree()} for the current page will call also call this method by proxy. @returns: a L{ParseTree} object ''' if self._showing_template: return None else: buffer = self.view.get_buffer() if buffer.get_modified(): self._parsetree = buffer.get_parsetree() buffer.set_modified(False) #~ print self._parsetree.tostring() return self._parsetree def set_parsetree(self, tree, istemplate=False): '''Set the L{ParseTree} for the content in the widget Be aware that this will set new content in the current page and modify the page. Note that calling L{Page.set_parsetree()} for the current page will call also call this method by proxy. @param tree: a L{ParseTree} object @param istemplate: C{True} when the tree is a page template instead of the page content ''' buffer = self.view.get_buffer() assert not buffer.get_modified(), 'BUG: changing parsetree while buffer was changed as well' tree.resolve_images(self.ui.notebook, self.page) buffer.set_parsetree(tree) self._parsetree = tree self._showing_template = istemplate def set_readonly(self, readonly=None): '''Set the widget read-only or not Sets the read-only state but also update menu items etc. to reflect the new state. @param readonly: C{True} or C{False} to set the read-only state, C{None} to check read-only state of the current page. Effective read-only state seen in the C{self.readonly} attribute is in fact C{True} (so read-only) when either the widget itself OR the current page is read-only. So setting read-only to C{False} here may not immediatly change C{self.readonly} if a read-only page is loaded. ''' if not readonly is None: self._widget_readonly = readonly if self._widget_readonly: self.readonly = True elif self.page: self.readonly = self.page.readonly or self.ui.readonly else: self.readonly = self.ui.readonly self.view.set_editable(not self.readonly) self.view.set_cursor_visible( self.preferences['read_only_cursor'] or not self.readonly) self._set_menuitems_sensitive(True) def _set_menuitems_sensitive(self, sensitive): '''Batch update global menu sensitivity while respecting sensitivities set due to cursor position, readonly state etc. ''' if sensitive: # partly overrule logic in ui.set_readonly() for action in self.actiongroup.list_actions(): action.set_sensitive( action.zim_readonly or not self.readonly) # update state for menu items for checkboxes and links buffer = self.view.get_buffer() iter = buffer.get_insert_iter() mark = buffer.get_insert() self.do_mark_set(buffer, iter, mark) else: for action in self.actiongroup.list_actions(): action.set_sensitive(False) def set_cursor_pos(self, pos): '''Set the cursor position in the buffer and scroll the TextView to show it @param pos: the cursor position as an integer offset from the start of the buffer As a special case when the cursor position is C{-1} the cursor is set at the end of the buffer. ''' buffer = self.view.get_buffer() if pos < 0: start, end = buffer.get_bounds() iter = end else: iter = buffer.get_iter_at_offset(pos) buffer.place_cursor(iter) self.scroll_cursor_on_screen() def get_cursor_pos(self): '''Get the cursor position in the buffer @returns: the cursor position as an integer offset from the start of the buffer ''' buffer = self.view.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_insert()) return iter.get_offset() def scroll_cursor_on_screen(self): buffer = self.view.get_buffer() self.view.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) def set_scroll_pos(self, pos): pass # FIXME set scroll position def get_scroll_pos(self): pass # FIXME get scroll position def get_selection(self, format=None): '''Convenience method to get the text of the current selection. @param format: format to use for the formatting of the returned text (e.g. 'wiki' or 'html'). If the format is C{None} only the text will be returned without any formatting. @returns: text selection or C{None} ''' buffer = self.view.get_buffer() bounds = buffer.get_selection_bounds() if bounds: if format: tree = buffer.get_parsetree(bounds) dumper = get_format(format).Dumper() lines = dumper.dump(tree) return ''.join(lines) else: return bounds[0].get_text(bounds[1]) else: return None def get_word(self, format=None): '''Convenience method to get the word that is under the cursor @param format: format to use for the formatting of the returned text (e.g. 'wiki' or 'html'). If the format is C{None} only the text will be returned without any formatting. @returns: current word or C{None} ''' buffer = self.view.get_buffer() buffer.select_word() return self.get_selection(format) def register_image_generator_plugin(self, plugin, type): '''Register a plugin for C{self.image_generator_plugins} Intended for "image generator" plugins to register themselves @param plugin: the plugin object @param type: the object type handled by this plugin, e.g. "equation" ''' assert not 'type' in self.image_generator_plugins, \ 'Already have plugin for image type "%s"' % type self.image_generator_plugins[type] = plugin logger.debug('Registered plugin %s for image type "%s"', plugin, type) def unregister_image_generator_plugin(self, plugin): '''Remove a plugin from C{self.image_generator_plugins} @param plugin: the plugin object ''' for type, obj in self.image_generator_plugins.items(): if obj == plugin: self.image_generator_plugins.pop(type) logger.debug('Removed plugin %s for image type "%s"', plugin, type) def do_mark_set(self, buffer, iter, mark): # Update menu items relative to cursor position if self.readonly or mark.get_name() != 'insert': return # Set sensitivity of various menu options line = iter.get_line() bullet = buffer.get_bullet(line) if bullet and bullet in CHECKBOXES: self.actiongroup.get_action('toggle_checkbox').set_sensitive(True) self.actiongroup.get_action('xtoggle_checkbox').set_sensitive(True) else: self.actiongroup.get_action('toggle_checkbox').set_sensitive(False) self.actiongroup.get_action('xtoggle_checkbox').set_sensitive(False) if buffer.get_link_tag(iter): self.actiongroup.get_action('remove_link').set_sensitive(True) self.actiongroup.get_action('edit_object').set_sensitive(True) elif buffer.get_image_data(iter): self.actiongroup.get_action('remove_link').set_sensitive(False) self.actiongroup.get_action('edit_object').set_sensitive(True) else: self.actiongroup.get_action('edit_object').set_sensitive(False) self.actiongroup.get_action('remove_link').set_sensitive(False) def do_textstyle_changed(self, buffer, style): # Update menu items for current style #~ print '>>> SET STYLE', style # set statusbar if style: label = style.title() else: label = 'None' self.ui.mainwindow.statusbar_style_label.set_text(label) # set toolbar toggles if style: style_toggle = 'toggle_format_'+style else: style_toggle = None # Here we explicitly never change the toggle that initiated # the change (_current_toggle_action). Somehow touching this # toggle action will cause a new 'activate' signal to be fired, # *after* we go out of this function and thus after the unblock. # If we are lucky this second signal just undoes our current # action. If we are unlucky, it puts us in an infinite loop... # Not sure of the root cause, probably due to gtk+ internals. # There is no proper way to block it, so we need to avoid # calling it in the first place. for name in [a[0] for a in ui_format_toggle_actions]: action = self.actiongroup.get_action(name) if name == self._current_toggle_action: continue else: action.handler_block_by_func(self.do_toggle_format_action) action.set_active(name == style_toggle) action.handler_unblock_by_func(self.do_toggle_format_action) #~ print '<<<' def do_link_enter(self, link): self.ui.mainwindow.statusbar.push(1, 'Go to "%s"' % link['href']) def do_link_leave(self, link): self.ui.mainwindow.statusbar.pop(1) def do_link_clicked(self, link, new_window=False): assert isinstance(link, dict) href = link['href'] href = normalize_file_uris(href) # can translate file:// -> smb:// so do before link_type() # FIXME implement function in notebook to resolve any link # type and take care of this stuff ? type = link_type(href) logger.debug('Link clicked: %s: %s' % (type, link['href'])) try: if type == 'interwiki': oldhref = href href = interwiki_link(href) if href: # could be file, url, or notebook type = link_type(href) else: if '?' in oldhref: oldhref, p = oldhref.split('?', 1) raise Error(_('No such wiki defined: %s') % oldhref) # T: error when unknown interwiki link is clicked if type == 'page': path = self.ui.notebook.resolve_path(href, source=self.page) if new_window: self.ui.open_new_window(path) else: self.ui.open_page(path) elif type == 'file': path = self.ui.notebook.resolve_file(href, self.page) self.ui.open_file(path) elif type == 'notebook': self.ui.open_notebook(href) else: if type == 'mailto' \ and not href.startswith('mailto:'): href = 'mailto:' + href self.ui.open_url(href) except Exception, error: ErrorDialog(self.ui, error).run() def do_populate_popup(self, menu): # Add custom tool # FIXME need way to (deep)copy widgets in the menu #~ toolmenu = self.ui.uimanager.get_widget('/text_popup') #~ tools = [tool for tool in toolmenu.get_children() #~ if not isinstance(tool, gtk.SeparatorMenuItem)] #~ print '>>> TOOLS', tools #~ if tools: #~ menu.prepend(gtk.SeparatorMenuItem()) #~ for tool in tools: #~ tool.reparent(menu) buffer = self.view.get_buffer() ### Copy As option ### default = self.preferences['copy_format'].lower() copy_as_menu = gtk.Menu() for label in COPY_FORMATS: if label.lower() == default: continue # Covered by default Copy action format = zim.formats.canonical_name(label) item = gtk.MenuItem(label) if buffer.get_has_selection(): item.connect('activate', lambda o, f: self.view.do_copy_clipboard(format=f), format) else: item.set_sensitive(False) copy_as_menu.append(item) item = gtk.MenuItem(_('Copy _As...')) # T: menu item for context menu of editor item.set_submenu(copy_as_menu) item.show_all() menu.insert(item, 2) # position after Copy in the standard menu - may not be robust... # FIXME get code from test to seek stock item ### Move text to new page ### item = gtk.MenuItem(_('Move Selected Text...')) # T: Context menu item for pageview to move selected text to new/other page item.show_all() # FIXME should not be needed here menu.insert(item, 7) # position after Copy in the standard menu - may not be robust... # FIXME get code from test to seek stock item if buffer.get_has_selection(): item.connect('activate', lambda o: MoveTextDialog(self.ui, self).run()) else: item.set_sensitive(False) ### iter = buffer.get_iter_at_mark( buffer.get_mark('zim-popup-menu') ) # This iter can be either cursor position or pointer # position, depending on how the menu was called link = buffer.get_link_data(iter) if link: type = link_type(link['href']) if type == 'file': file = link['href'] else: file = None else: image = buffer.get_image_data(iter) if image is None: # Maybe we clicked right side of an image iter.backward_char() image = buffer.get_image_data(iter) if image: type = 'image' file = image['src'] if 'type' in image \ and image['type'] in self.image_generator_plugins: plugin = self.image_generator_plugins[image['type']] plugin.do_populate_popup(menu, buffer, iter, image) menu.show_all() return # plugin should decide about populating else: return # No link or image if file: file = self.ui.notebook.resolve_file(file, self.page) menu.prepend(gtk.SeparatorMenuItem()) # remove link if link: item = gtk.MenuItem(_('_Remove Link')) item.connect('activate', lambda o: self.remove_link(iter=iter)) item.set_sensitive(not self.readonly) menu.prepend(item) # edit if type == 'image': item = gtk.MenuItem(_('_Edit Properties')) # T: menu item in context menu for image else: item = gtk.MenuItem(_('_Edit Link')) # T: menu item in context menu item.connect('activate', lambda o: self.edit_object(iter=iter)) item.set_sensitive(not self.readonly) menu.prepend(item) # copy def set_pagelink(o, path): Clipboard.set_pagelink(self.ui.notebook, path) SelectionClipboard.set_pagelink(self.ui.notebook, path) def set_uri(o, uri): Clipboard.set_uri(uri) SelectionClipboard.set_uri(uri) if type == 'page': item = gtk.MenuItem(_('Copy _Link')) # T: context menu item path = self.ui.notebook.resolve_path(link['href'], source=self.page) item.connect('activate', set_pagelink, path) elif type == 'mailto': item = gtk.MenuItem(_('Copy Email Address')) # T: context menu item item.connect('activate', set_uri, file or link['href']) else: item = gtk.MenuItem(_('Copy _Link')) # T: context menu item item.connect('activate', set_uri, file or link['href']) menu.prepend(item) menu.prepend(gtk.SeparatorMenuItem()) # open with & open folder if type in ('file', 'image') and file: item = gtk.MenuItem(_('Open Folder')) # T: menu item to open containing folder of files menu.prepend(item) dir = file.dir if dir.exists(): item.connect('activate', lambda o: self.ui.open_file(dir)) else: item.set_sensitive(False) item = gtk.MenuItem(_('Open With...')) # T: menu item for sub menu with applications menu.prepend(item) if file.exists(): submenu = OpenWithMenu(self.ui, file) item.set_submenu(submenu) else: item.set_sensitive(False) elif type not in ('page', 'notebook', 'interwiki', 'file', 'image'): # urls etc. # FIXME: for interwiki inspect final link and base # open with menu beased on that url type item = gtk.MenuItem(_('Open With...')) menu.prepend(item) submenu = OpenWithMenu(self.ui, link['href']) if submenu.get_children(): item.set_submenu(submenu) else: item.set_sensitive(False) # open in new window if type == 'page': item = gtk.MenuItem(_('Open in New _Window')) # T: menu item to open a link item.connect( 'activate', lambda o: self.do_link_clicked(link, new_window=True)) menu.prepend(item) # open if type == 'image': link = {'href': file.uri} item = gtk.MenuItem(_('_Open')) # T: menu item to open a link or file if file and not file.exists(): item.set_sensitive(False) else: item.connect_object( 'activate', PageView.do_link_clicked, self, link) menu.prepend(item) menu.show_all() def undo(self): '''Menu action to undo a single step''' self.undostack.undo() def redo(self): '''Menu action to redo a single step''' self.undostack.redo() def cut(self): '''Menu action for cut to clipboard''' self.view.emit('cut-clipboard') def copy(self): '''Menu action for copy to clipboard''' self.view.emit('copy-clipboard') def paste(self): '''Menu action for paste from clipboard''' self.view.emit('paste-clipboard') def delete(self): '''Menu action for delete''' self.view.emit('delete-from-cursor', gtk.DELETE_CHARS, 1) def toggle_checkbox(self): '''Menu action to toggle checkbox at the cursor or in current selected text ''' buffer = self.view.get_buffer() recurs = self.preferences['recursive_checklist'] buffer.toggle_checkbox_for_cursor_or_selection(CHECKED_BOX, recurs) def xtoggle_checkbox(self): '''Menu action to toggle checkbox at the cursor or in current selected text ''' buffer = self.view.get_buffer() recurs = self.preferences['recursive_checklist'] buffer.toggle_checkbox_for_cursor_or_selection(XCHECKED_BOX, recurs) def edit_object(self, iter=None): '''Menu action to trigger proper edit dialog for the current object at the cursor Can show e.g. L{InsertLinkDialog} for a link, C{EditImageDialog} for the a image, or a plugin dialog for e.g. an equation. @param iter: C{TextIter} for an alternative cursor position ''' buffer = self.view.get_buffer() if iter: buffer.place_cursor(iter) iter = buffer.get_iter_at_mark(buffer.get_insert()) if buffer.get_link_tag(iter): return InsertLinkDialog(self.ui, self).run() image = buffer.get_image_data(iter) if not image: iter.backward_char() # maybe we clicked right side of an image image = buffer.get_image_data(iter) if image: if 'type' in image and image['type'] in self.image_generator_plugins: plugin = self.image_generator_plugins[image['type']] plugin.edit_object(buffer, iter, image) else: EditImageDialog(self.ui, buffer, self.page).run() else: return False def remove_link(self, iter=None): '''Menu action to remove link object at the current cursor position @param iter: C{TextIter} for an alternative cursor position ''' buffer = self.view.get_buffer() if not buffer.get_has_selection() \ or (iter and not buffer.iter_in_selection(iter)): if iter: buffer.place_cursor(iter) buffer.select_link() bounds = buffer.get_selection_bounds() if bounds: buffer.remove_link(*bounds) def insert_date(self): '''Menu action to insert a date, shows the L{InsertDateDialog}''' InsertDateDialog(self.ui, self.view.get_buffer()).run() def insert_image(self, file=None, type=None, interactive=True, force=False): '''Menu action to insert an image, shows the L{InsertImageDialog} @param file: image file to insert (shown in the dialog when interactive) @param type: image type, used by image generator plugins @param interactive: when C{True} show the dialog, when C{False} image is inserted directly @param force: when C{True} the image will be inserted even if it doesn't exist (or it isn't an image) @returns: C{True} if succesfull ''' if interactive: InsertImageDialog(self.ui, self.view.get_buffer(), self.page, file).run() else: # Check if file is supported, otherwise unsupported file # results in broken image icon assert isinstance(file, File) if not force \ and not (file.exists() and gtk.gdk.pixbuf_get_file_info(file.path)): return False src = self.ui.notebook.relative_filepath(file, self.page) or file.uri self.view.get_buffer().insert_image_at_cursor(file, src, type=type) return True def insert_bullet_list(self): '''Menu action insert a bullet item at the cursor''' self._start_bullet(BULLET) def insert_numbered_list(self): '''Menu action insert a numbered list item at the cursor''' self._start_bullet(NUMBER_BULLET) def insert_checkbox_list(self): '''Menu action insert an open checkbox at the cursor''' self._start_bullet(UNCHECKED_BOX) def _start_bullet(self, bullet_type): buffer = self.view.get_buffer() line = buffer.get_insert_iter().get_line() with buffer.user_action: iter = buffer.get_iter_at_line(line) buffer.insert(iter, '\n') buffer.set_bullet(line, bullet_type) iter = buffer.get_iter_at_line(line) iter.forward_to_line_end() buffer.place_cursor(iter) def apply_format_bullet_list(self): '''Menu action to format selection as bullet list''' self._apply_bullet(BULLET) def apply_format_numbered_list(self): '''Menu action to format selection as numbered list''' self._apply_bullet(NUMBER_BULLET) def apply_format_checkbox_list(self): '''Menu action to format selection as checkbox list''' self._apply_bullet(UNCHECKED_BOX) def _apply_bullet(self, bullet_type): buffer = self.view.get_buffer() buffer.foreach_line_in_selection(buffer.set_bullet, bullet_type) def insert_text_from_file(self): '''Menu action to show a L{InsertTextFromFileDialog}''' InsertTextFromFileDialog(self.ui, self.view.get_buffer()).run() def insert_links(self, links): '''Non-interactive method to insert one or more links Inserts the links seperated by newlines. Intended e.g. for drag-and-drop or copy-paste actions of e.g. files from a file browser. @param links: list of links, either as string, L{Path} objects, or L{File} objects ''' links = list(links) for i in range(len(links)): if isinstance(links[i], Path): links[i] = links[i].name continue elif isinstance(links[i], File): file = links[i] else: type = link_type(links[i]) if type == 'file': file = File(links[i]) else: continue # not a file links[i] = self.ui.notebook.relative_filepath(file, self.page) or file.uri if len(links) == 1: sep = ' ' else: sep = '\n' buffer = self.view.get_buffer() with buffer.user_action: if buffer.get_has_selection(): start, end = buffer.get_selection_bounds() buffer.delete(start, end) for link in links: buffer.insert_link_at_cursor(link, link) buffer.insert_at_cursor(sep) def insert_link(self): '''Menu item to show the L{InsertLinkDialog}''' InsertLinkDialog(self.ui, self).run() def _update_new_file_submenu(self, action): dir = self.preferences['file_templates_folder'] if isinstance(dir, basestring): dir = Dir(dir) items = [] if dir.exists(): def handler(menuitem, file): self.insert_new_file(file) for name in dir.list(): # FIXME could use list objects here file = dir.file(name) if file.exists(): # it is a file name = file.basename if '.' in name: name, x = name.rsplit('.', 1) name = name.replace('_', ' ') item = gtk.MenuItem(name) # TODO mimetype icon would be nice to have item.connect('activate', handler, file) item.zim_new_file_action = True items.append(item) if not items: item = gtk.MenuItem(_('No templates installed')) # T: message when no file templates are found in ~/Templates item.set_sensitive(False) item.zim_new_file_action = True items.append(item) for widget in action.get_proxies(): if hasattr(widget, 'get_submenu'): menu = widget.get_submenu() if not menu: continue # clear old items for item in menu.get_children(): if hasattr(item, 'zim_new_file_action'): menu.remove(item) # add new ones populate_popup_add_separator(menu, prepend=True) for item in reversed(items): menu.prepend(item) # and finish up menu.show_all() def insert_new_file(self, template, basename=None): dir = self.ui.notebook.get_attachments_dir(self.page) if not basename: basename = NewFileDialog(self.ui, template.basename).run() if basename is None: return # cancelled file = dir.new_file(basename) template.copyto(file) # Same logic as in zim.gui.AttachFileDialog # TODO - incorporate in the insert_links function ? if file.isimage(): ok = self.insert_image(file, interactive=False) if not ok: # image type not supported? logger.info('Could not insert image: %s', file) self.insert_links([file]) else: self.insert_links([file]) #~ self.ui.open_file(file) # FIXME should this be optional ? def open_file_templates_folder(self): '''Menu action to open the templates folder''' dir = self.preferences['file_templates_folder'] if isinstance(dir, basestring): dir = Dir(dir) if dir.exists(): self.ui.open_file(dir) else: path = dir.user_path or dir.path question = ( _('Create folder?'), # T: Heading in a question dialog for creating a folder _('The folder\n%s\ndoes not yet exist.\nDo you want to create it now?') % path ) # T: Text in a question dialog for creating a folder, %s is the folder path create = QuestionDialog(self, question).run() if create: dir.touch() self.ui.open_file(dir) def clear_formatting(self): '''Menu item to remove formatting from current (auto-)selection''' buffer = self.view.get_buffer() mark = buffer.create_mark(None, buffer.get_insert_iter()) selected = self.autoselect() if buffer.get_has_selection(): start, end = buffer.get_selection_bounds() buffer.remove_textstyle_tags(start, end) if selected: # If we keep the selection we can not continue typing # so remove the selection and restore the cursor. buffer.unset_selection() buffer.place_cursor(buffer.get_iter_at_mark(mark)) else: buffer.set_textstyle(None) buffer.delete_mark(mark) def do_toggle_format_action(self, action): '''Handler that catches all actions to apply and/or toggle formats''' name = action.get_name() logger.debug('Action: %s (toggle_format action)', name) self._current_toggle_action = name if name.startswith('apply_format_'): style = name[13:] elif name.startswith('toggle_format_'): style = name[14:] else: assert False, "BUG: don't known this action" self.toggle_format(style) self._current_toggle_action = None def toggle_format(self, format): '''Toggle the format for the current (auto-)selection or new insertions at the current cursor position When the cursor is in the middle of a word it can be selected automatically to format it. But we only autoselect words that were not formatted - otherwise the behavior is not consistent when trying to break a formatted region by toggling off the formatting. For headings and other line based formats auto-selects the whole line. This is the handler for all the format menu- and toolbar-items. @param format: the format style name (e.g. "h1", "strong" etc.) ''' buffer = self.view.get_buffer() selected = False mark = buffer.create_mark(None, buffer.get_insert_iter()) if format != buffer.get_textstyle(): ishead = format in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6') selected = self.autoselect(selectline=ishead) buffer.toggle_textstyle(format) if selected: # If we keep the selection we can not continue typing # so remove the selection and restore the cursor. buffer.unset_selection() buffer.place_cursor(buffer.get_iter_at_mark(mark)) buffer.delete_mark(mark) def autoselect(self, selectline=False): '''Auto select either a word or a line. Does not do anything if a selection is present already or when the preference for auto-select is set to False. @param selectline: if C{True} auto-select a whole line, only auto-select a single word otherwise @returns: C{True} when this function changed the selection. ''' if not self.preferences['autoselect']: return False buffer = self.view.get_buffer() if buffer.get_has_selection(): if selectline: start, end = buffer.get_selection_bounds() return buffer.select_lines(start.get_line(), end.get_line()) else: return buffer.strip_selection() elif selectline: return buffer.select_line() else: return buffer.select_word() def find(self, string, flags=0): '''Find some string in the text, scroll there and select it @param string: the text to find @param flags: options for find behavior, see L{TextFinder.find()} ''' self.hide_find() # remove previous highlighting etc. buffer = self.view.get_buffer() buffer.finder.find(string, flags) self.view.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) def show_find(self, string=None, flags=0, highlight=False): '''Show the L{FindBar} widget @param string: the text to find @param flags: options for find behavior, see L{TextFinder.find()} @param highlight: if C{True} highlight the results ''' self.find_bar.show() if string: self.find_bar.find(string, flags, highlight) self.view.grab_focus() else: self.find_bar.set_from_buffer() self.find_bar.grab_focus() def hide_find(self): '''Hide the L{FindBar} widget''' self.find_bar.hide() self.view.grab_focus() def find_next(self): '''Menu action to skip to next match''' self.find_bar.show() self.find_bar.find_next() def find_previous(self): '''Menu action to go back to previous match''' self.find_bar.show() self.find_bar.find_previous() def show_find_and_replace(self): '''Menu action to show the L{FindAndReplaceDialog}''' dialog = FindAndReplaceDialog.unique(self, self.ui, self.view) dialog.set_from_buffer() dialog.present() def show_word_count(self): '''Menu action to show the L{WordCountDialog}''' WordCountDialog(self).run() def zoom_in(self): '''Menu action to increase the font size''' self._zoom_increase_decrease_font_size( +1 ) def zoom_out(self): '''Menu action to decrease the font size''' self._zoom_increase_decrease_font_size( -1 ) def _zoom_increase_decrease_font_size(self,plus_or_minus): style = self.style if self.style['TextView']['font']: font = pango.FontDescription(self.style['TextView']['font']) else: logger.debug( 'Switching to custom font implicitly because of zoom action' ) font = self.view.style.font_desc self.style['TextView']['font'] = font.to_string() font_size = font.get_size() if font_size <= 1*1024 and plus_or_minus < 0: return else: font_size_new = font_size + plus_or_minus * 1024 font.set_size( font_size_new ) self.style['TextView']['font'] = font.to_string() self.view.modify_font(font) self.style.write() def zoom_reset(self): '''Menu action to reset the font size''' if not self.style['TextView']['font']: return widget = TextView({}) # Get new widget default_font = widget.style.font_desc font = pango.FontDescription(self.style['TextView']['font']) font.set_size( default_font.get_size() ) if font.to_string() == default_font.to_string(): self.style['TextView']['font'] = None self.view.modify_font(None) else: self.style['TextView']['font'] = font.to_string() self.view.modify_font(font) self.style.write() # Need to register classes defining gobject signals gobject.type_register(PageView) class InsertDateDialog(Dialog): '''Dialog to insert a date-time in the page''' FORMAT_COL = 0 # format string DATE_COL = 1 # strfime rendering of the format def __init__(self, ui, buffer): Dialog.__init__(self, ui, _('Insert Date and Time'), # T: Dialog title button=(_('_Insert'), 'gtk-ok') ) # T: Button label self.buffer = buffer self.date = datetime.datetime.now() self.uistate.setdefault('lastusedformat', '') self.uistate.setdefault('linkdate', False) self.uistate.setdefault('calendar_expanded', False) ## Add format list box label = gtk.Label() label.set_markup(''+_("Format")+'') # T: label in "insert date" dialog label.set_alignment(0.0, 0.5) self.vbox.pack_start((label), False) model = gtk.ListStore(str, str) # FORMAT_COL, DATE_COL self.view = BrowserTreeView(model) self.vbox.add(ScrolledWindow(self.view)) cell_renderer = gtk.CellRendererText() column = gtk.TreeViewColumn('_date_', cell_renderer, text=1) self.view.append_column(column) self.view.set_headers_visible(False) self.view.connect('row-activated', lambda *a: self.response(gtk.RESPONSE_OK) ) ## Add Calendar widget from zim.plugins.calendar import Calendar # FIXME put this in zim.gui.widgets self.calendar_expander = gtk.expander_new_with_mnemonic(''+_("_Calendar")+'') # T: expander label in "insert date" dialog self.calendar_expander.set_use_markup(True) self.calendar_expander.set_expanded(self.uistate['calendar_expanded']) self.calendar = Calendar() self.calendar.display_options( gtk.CALENDAR_SHOW_HEADING | gtk.CALENDAR_SHOW_DAY_NAMES | gtk.CALENDAR_SHOW_WEEK_NUMBERS ) self.calendar.connect('day-selected', lambda c: self.set_date(c.get_date())) self.calendar_expander.add(self.calendar) self.vbox.pack_start(self.calendar_expander, False) ## Add Link checkbox and Edit button self.linkbutton = gtk.CheckButton(_('_Link to date')) # T: check box in InsertDate dialog self.linkbutton.set_active(self.uistate['linkdate']) self.vbox.pack_start(self.linkbutton, False) button = gtk.Button(stock=gtk.STOCK_EDIT) button.connect('clicked', self.on_edit) self.action_area.add(button) self.action_area.reorder_child(button, 1) ## Setup data self.load_file() self.set_date(self.date) def load_file(self): lastused = None model = self.view.get_model() model.clear() file = config_file('dates.list') for line in file.readlines(): line = line.strip() if not line or line.startswith('#'): continue try: format = line iter = model.append((format, format)) if format == self.uistate['lastusedformat']: lastused = iter except: logger.exception('Could not parse date: %s', line) if not lastused is None: path = model.get_path(lastused) self.view.get_selection().select_path(path) def set_date(self, date): self.date = date def update_date(model, path, iter): format = model[iter][self.FORMAT_COL] try: string = date.strftime(format) except ValueError: string = 'INVALID: ' + format model[iter][self.DATE_COL] = string model = self.view.get_model() model.foreach(update_date) link = date.strftime('%Y-%m-%d') # YYYY-MM-DD self.link = self.ui.notebook.suggest_link(self.ui.page, link) self.linkbutton.set_sensitive(not self.link is None) #def run(self): #self.view.grab_focus() #Dialog.run(self) def save_uistate(self): model, iter = self.view.get_selection().get_selected() if iter: format = model[iter][self.FORMAT_COL] self.uistate['lastusedformat'] = format self.uistate['linkdate'] = self.linkbutton.get_active() self.uistate['calendar_expanded'] = self.calendar_expander.get_expanded() def on_edit(self, button): file = config_file('dates.list') if self.ui.edit_config_file(file): self.load_file() def do_response_ok(self): model, iter = self.view.get_selection().get_selected() if not iter: return False text = model[iter][self.DATE_COL] if self.link and self.linkbutton.get_active(): self.buffer.insert_link_at_cursor(text, self.link.name) else: self.buffer.insert_at_cursor(text) return True class InsertImageDialog(FileDialog): '''Dialog to insert an image in the page''' def __init__(self, ui, buffer, path, file=None): FileDialog.__init__( self, ui, _('Insert Image'), gtk.FILE_CHOOSER_ACTION_OPEN) # T: Dialog title self.buffer = buffer self.path = path self.add_filter_images() self.uistate.setdefault('attach_inserted_images', False) checkbox = gtk.CheckButton(_('Attach image first')) # T: checkbox in the "Insert Image" dialog checkbox.set_active(self.uistate['attach_inserted_images']) self.filechooser.set_extra_widget(checkbox) self.uistate.setdefault('last_image_folder','~') self.filechooser.set_current_folder(self.uistate['last_image_folder']) if file: self.set_file(file) def do_response_ok(self): file = self.get_file() if file is None: return False if not gtk.gdk.pixbuf_get_file_info(file.path): ErrorDialog(self, _('File type not supported: %s' % file.get_mimetype())).run() # T: Error message when trying to insert a not supported file as image return False checkbox = self.filechooser.get_extra_widget() self.uistate['attach_inserted_images'] = checkbox.get_active() self.uistate['last_image_folder'] = self.filechooser.get_current_folder() if self.uistate['attach_inserted_images']: # Similar code in zim.gui.AttachFileDialog dir = self.ui.notebook.get_attachments_dir(self.path) if not file.dir == dir: file = self.ui.do_attach_file(self.path, file) if file is None: return False # Cancelled overwrite dialog src = self.ui.notebook.relative_filepath(file, self.path) or file.uri self.buffer.insert_image_at_cursor(file, src) return True class EditImageDialog(Dialog): '''Dialog to edit properties of an embedded image''' def __init__(self, ui, buffer, path): Dialog.__init__(self, ui, _('Edit Image')) # T: Dialog title self.buffer = buffer self.path = path iter = buffer.get_iter_at_mark(buffer.get_insert()) image_data = self.buffer.get_image_data(iter) if image_data is None: iter.backward_char() image_data = self.buffer.get_image_data(iter) assert image_data, 'No image found' self._image_data = image_data.copy() self._iter = iter.get_offset() src = image_data['src'] if '?' in src: i = src.find('?') src = src[:i] href = image_data.get('href', '') self.add_form( [ ('file', 'image', _('Location')), # T: Input in 'edit image' dialog ('href', 'link', _('Link to'), ui.page), # T: Input in 'edit image' dialog ('width', 'int', _('Width'), (0, 1)), # T: Input in 'edit image' dialog ('height', 'int', _('Height'), (0, 1)) # T: Input in 'edit image' dialog ], {'file': src, 'href': href} # range for width and height are set in set_ranges() ) self.form.widgets['file'].set_use_relative_paths(ui.notebook, path) # Show relative paths reset_button = gtk.Button(_('_Reset Size')) # T: Button in 'edit image' dialog hbox = gtk.HBox() hbox.pack_end(reset_button, False) self.vbox.add(hbox) reset_button.connect_object('clicked', self.__class__.reset_dimensions, self) #~ self.form.widgets['file'].connect_object('activate', #~ self.__class__.reset_dimensions, self) self.form.widgets['width'].connect_object('value-changed', self.__class__.do_width_changed, self) self.form.widgets['height'].connect_object('value-changed', self.__class__.do_height_changed, self) # Init ranges based on original self.reset_dimensions() # Set current scale if any if 'width' in image_data: self.form.widgets['width'].set_value(int(image_data['width'])) elif 'height' in image_data: self.form.widgets['height'].set_value(int(image_data['height'])) def reset_dimensions(self): self._image_data.pop('width', None) self._image_data.pop('height', None) width = self.form.widgets['width'] height = self.form.widgets['height'] file = self.form['file'] try: info, w, h = gtk.gdk.pixbuf_get_file_info(file.path) except: logger.warn('Could not get size for image: %s', file.path) width.set_sensitive(False) height.set_sensitive(False) else: width.set_sensitive(True) height.set_sensitive(True) self._block = True width.set_range(0, 4*w) width.set_value(w) height.set_range(0, 4*w) height.set_value(h) self._block = False self._ratio = float(w)/ h def do_width_changed(self): if self._block: return self._image_data.pop('height', None) self._image_data['width'] = int(self.form['width']) h = int(float(self._image_data['width']) / self._ratio) self._block = True self.form['height'] = h self._block = False def do_height_changed(self): if self._block: return self._image_data.pop('width', None) self._image_data['height'] = int(self.form['height']) w = int(self._ratio * float(self._image_data['height'])) self._block = True self.form['width'] = w self._block = False def do_response_ok(self): file = self.form['file'] attrib = self._image_data attrib['src'] = self.ui.notebook.relative_filepath(file, self.path) or file.uri href = self.form['href'] if href: type = link_type(href) if type == 'file': # Try making the path relative linkfile = self.form.widgets['href'].get_file() page = self.ui.page notebook = self.ui.notebook href = notebook.relative_filepath(linkfile, page) or linkfile.uri attrib['href'] = href iter = self.buffer.get_iter_at_offset(self._iter) bound = iter.copy() bound.forward_char() with self.buffer.user_action: self.buffer.delete(iter, bound) self.buffer.insert_image_at_cursor(file, **attrib) return True class InsertTextFromFileDialog(FileDialog): '''Dialog to insert text from an external file into the page''' def __init__(self, ui, buffer): FileDialog.__init__( self, ui, _('Insert Text From File'), gtk.FILE_CHOOSER_ACTION_OPEN) # T: Dialog title self.buffer = buffer def do_response_ok(self): file = self.get_file() if file is None: return False parser = get_format('plain').Parser() tree = parser.parse(file.readlines()) self.buffer.insert_parsetree_at_cursor(tree) return True class InsertLinkDialog(Dialog): '''Dialog to insert a new link in the page or edit properties of an existing link ''' def __init__(self, ui, pageview): self.pageview = pageview href, text = self._get_link_from_buffer() if href: title = _('Edit Link') # T: Dialog title else: title = _('Insert Link') # T: Dialog title Dialog.__init__(self, ui, title, button=(_('_Link'), 'zim-link') ) # T: Dialog button self.add_form([ ('href', 'link', _('Link to'), pageview.page), # T: Input in 'insert link' dialog ('text', 'string', _('Text')) # T: Input in 'insert link' dialog ], { 'href': href, 'text': text, } ) # Hook text entry to copy text from link when apropriate self.form.widgets['href'].connect('changed', self.on_href_changed) self.form.widgets['text'].connect('changed', self.on_text_changed) if self._selected_text or (text and text != href): self._copy_text = False else: self._copy_text = True def _get_link_from_buffer(self): # Get link and text from the text buffer href, text = '', '' buffer = self.pageview.view.get_buffer() if buffer.get_has_selection(): buffer.strip_selection() link = buffer.get_has_link_selection() else: link = buffer.select_link() if not link: self.pageview.autoselect() if buffer.get_has_selection(): start, end = buffer.get_selection_bounds() text = buffer.get_text(start, end) self._selection_bounds = (start.get_offset(), end.get_offset()) # Interaction in the dialog causes buffer to loose selection # maybe due to clipboard focus !?? # Anyway, need to remember bounds ourselves. if link: href = link['href'] self._selected_text = False else: href = text self._selected_text = True else: self._selection_bounds = None self._selected_text = False return href, text def on_href_changed(self, o): # Check if we can also update text if not self._copy_text: return self._copy_text = False # block on_text_changed() self.form['text'] = self.form['href'] self._copy_text = True def on_text_changed(self, o): # Check if we should stop updating text if not self._copy_text: return self._copy_text = self.form['href'] == self.form['text'] def do_response_ok(self): href = self.form['href'] if not href: self.form.widgets['href'].set_input_valid(False) return False type = link_type(href) if type == 'file': # Try making the path relative file = self.form.widgets['href'].get_file() page = self.pageview.page notebook = self.ui.notebook href = notebook.relative_filepath(file, page) or file.uri text = self.form['text'] or href buffer = self.pageview.view.get_buffer() with buffer.user_action: if self._selection_bounds: start, end = map( buffer.get_iter_at_offset, self._selection_bounds) buffer.delete(start, end) buffer.insert_link_at_cursor(text, href) return True class FindWidget(object): '''Base class for L{FindBar} and L{FindAndReplaceDialog}''' def __init__(self, textview): self.textview = textview self.find_entry = InputEntry(allow_whitespace=True) self.find_entry.connect_object( 'changed', self.__class__.on_find_entry_changed, self) self.find_entry.connect_object( 'activate', self.__class__.on_find_entry_activate, self) self.next_button = Button(_('_Next'), gtk.STOCK_GO_FORWARD) # T: button in find bar and find & replace dialog self.next_button.connect_object( 'clicked', self.__class__.find_next, self) self.next_button.set_sensitive(False) self.previous_button = Button(_('_Previous'), gtk.STOCK_GO_BACK) # T: button in find bar and find & replace dialog self.previous_button.connect_object( 'clicked', self.__class__.find_previous, self) self.previous_button.set_sensitive(False) self.case_option_checkbox = gtk.CheckButton(_('Match _case')) # T: checkbox option in find bar and find & replace dialog self.case_option_checkbox.connect_object( 'toggled', self.__class__.on_find_entry_changed, self) self.word_option_checkbox = gtk.CheckButton(_('Whole _word')) # T: checkbox option in find bar and find & replace dialog self.word_option_checkbox.connect_object( 'toggled', self.__class__.on_find_entry_changed, self) self.regex_option_checkbox = gtk.CheckButton(_('_Regular expression')) # T: checkbox option in find bar and find & replace dialog self.regex_option_checkbox.connect_object( 'toggled', self.__class__.on_find_entry_changed, self) self.highlight_checkbox = gtk.CheckButton(_('_Highlight')) # T: checkbox option in find bar and find & replace dialog self.highlight_checkbox.connect_object( 'toggled', self.__class__.on_highlight_toggled, self) @property def _flags(self): flags = 0 if self.case_option_checkbox.get_active(): flags = flags | FIND_CASE_SENSITIVE if self.word_option_checkbox.get_active(): flags = flags | FIND_WHOLE_WORD if self.regex_option_checkbox.get_active(): flags = flags | FIND_REGEX return flags def set_from_buffer(self): '''Copies settings from last find in the buffer. Uses the selected text for find if there is a selection. ''' buffer = self.textview.get_buffer() string, flags, highlight = buffer.finder.get_state() bounds = buffer.get_selection_bounds() if bounds: start, end = bounds string = start.get_slice(end) self.find(string, flags, highlight) def on_find_entry_changed(self): string = self.find_entry.get_text() buffer = self.textview.get_buffer() ok = buffer.finder.find(string, flags=self._flags) if not string: self.find_entry.set_input_valid(True) else: self.find_entry.set_input_valid(ok) for button in (self.next_button, self.previous_button): button.set_sensitive(ok) if ok: self.textview.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) def on_find_entry_activate(self): self.on_find_entry_changed() def on_highlight_toggled(self): highlight = self.highlight_checkbox.get_active() buffer = self.textview.get_buffer() buffer.finder.set_highlight(highlight) def find(self, string, flags=0, highlight=False): if string: self.find_entry.set_text(string) self.case_option_checkbox.set_active(flags & FIND_CASE_SENSITIVE) self.word_option_checkbox.set_active(flags & FIND_WHOLE_WORD) self.regex_option_checkbox.set_active(flags & FIND_REGEX) self.highlight_checkbox.set_active(highlight) # Force update self.on_find_entry_changed() self.on_highlight_toggled() def find_next(self): buffer = self.textview.get_buffer() buffer.finder.find_next() self.textview.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) self.textview.grab_focus() def find_previous(self): buffer = self.textview.get_buffer() buffer.finder.find_previous() self.textview.scroll_to_mark(buffer.get_insert(), SCROLL_TO_MARK_MARGIN) self.textview.grab_focus() class FindBar(FindWidget, gtk.HBox): '''Bar to be shown below the TextView for find functions''' # TODO use smaller buttons ? def __init__(self, textview): gtk.HBox.__init__(self, spacing=5) FindWidget.__init__(self, textview) self.pack_start(gtk.Label(_('Find')+': '), False) # T: label for input in find bar on bottom of page self.pack_start(self.find_entry, False) self.pack_start(self.previous_button, False) self.pack_start(self.next_button, False) if ui_environment['smallscreen']: # E.g. Maemo Nxx0 devices have not enough space for so many # widgets, so let's put options in a menu button. # FIXME need to rewrite this hack to integrate nicely with # the FindWidget base class # FIXME ideally behavior would switch on the fly based on # actual screensize - we can detect when these widgets # fit or not by using "x_size, y_size = mywidget.window.get_size()" # or "mywidget.get_allocation().width" to get the widgets and window size # and probably re-draw when the screensize or windowsize changes # by listening to window resize events. # Alternatively we can always put options in this menu menu = gtk.Menu() item = gtk.CheckMenuItem(self.case_option_checkbox.get_label()) item.connect('toggled', lambda sender, me: me.case_option_checkbox.set_active(sender.get_active()), self) menu.append(item) item = gtk.CheckMenuItem(self.highlight_checkbox.get_label()) item.connect('toggled', lambda sender, me: me.highlight_checkbox.set_active(sender.get_active()),self) menu.append(item) if ui_environment['platform'] == 'maemo': # maemo UI convention: up arrow button with no label button = MenuButton('', menu) else: button = MenuButton(_('Options'), menu) # T: Options button self.pack_start(button, False) else: self.pack_start(self.case_option_checkbox, False) self.pack_start(self.highlight_checkbox, False) close_button = CloseButton() close_button.connect_object('clicked', self.__class__.hide, self) self.pack_end(close_button, False) def grab_focus(self): self.find_entry.grab_focus() def show(self): self.on_highlight_toggled() self.set_no_show_all(False) self.show_all() def hide(self): gtk.HBox.hide(self) self.set_no_show_all(True) buffer = self.textview.get_buffer() buffer.finder.set_highlight(False) self.textview.grab_focus() def on_find_entry_activate(self): self.on_find_entry_changed() self.textview.grab_focus() def do_key_press_event(self, event): if event.keyval == KEYVAL_ESC: self.hide() return True else: return gtk.HBox.do_key_press_event(self, event) # Need to register classes defining gobject signals gobject.type_register(FindBar) class FindAndReplaceDialog(FindWidget, Dialog): '''Dialog for find and replace''' def __init__(self, ui, textview): Dialog.__init__(self, ui, _('Find and Replace'), buttons=gtk.BUTTONS_CLOSE) # T: Dialog title FindWidget.__init__(self, textview) hbox = gtk.HBox(spacing=12) hbox.set_border_width(12) self.vbox.add(hbox) vbox = gtk.VBox(spacing=5) hbox.pack_start(vbox, False) label = gtk.Label(_('Find what')+': ') # T: input label in find & replace dialog label.set_alignment(0.0, 0.5) vbox.add(label) vbox.add(self.find_entry) vbox.add(self.case_option_checkbox) vbox.add(self.word_option_checkbox) vbox.add(self.regex_option_checkbox) vbox.add(self.highlight_checkbox) label = gtk.Label(_('Replace with')+': ') # T: input label in find & replace dialog label.set_alignment(0.0, 0.5) vbox.add(label) self.replace_entry = InputEntry(allow_whitespace=True) vbox.add(self.replace_entry) self.bbox = gtk.VButtonBox() hbox.add(self.bbox) self.bbox.add(self.next_button) self.bbox.add(self.previous_button) replace_button = Button(_('_Replace'), gtk.STOCK_FIND_AND_REPLACE) # T: Button in search & replace dialog replace_button.connect_object('clicked', self.__class__.replace, self) self.bbox.add(replace_button) all_button = Button(_('Replace _All'), gtk.STOCK_FIND_AND_REPLACE) # T: Button in search & replace dialog all_button.connect_object('clicked', self.__class__.replace_all, self) self.bbox.add(all_button) def replace(self): string = self.replace_entry.get_text() buffer = self.textview.get_buffer() buffer.finder.replace(string) buffer.finder.find_next() def replace_all(self): string = self.replace_entry.get_text() buffer = self.textview.get_buffer() buffer.finder.replace_all(string) def do_response(self, id): Dialog.do_response(self, id) buffer = self.textview.get_buffer() buffer.finder.set_highlight(False) class WordCountDialog(Dialog): '''Dialog showing line, word, and character counts''' def __init__(self, pageview): Dialog.__init__(self, pageview.ui, _('Word Count'), buttons=gtk.BUTTONS_CLOSE) # T: Dialog title self.set_resizable(False) def count(buffer, bounds): start, end = bounds lines = end.get_line() - start.get_line() + 1 chars = end.get_offset() - start.get_offset() iter = start.copy() words = 0 while iter.compare(end) < 0: if iter.forward_word_end(): words += 1 elif iter.compare(end) == 0: # When end is end of buffer forward_end_word returns False words += 1 break else: break return lines, words, chars buffer = pageview.view.get_buffer() buffercount = count(buffer, buffer.get_bounds()) insert = buffer.get_iter_at_mark(buffer.get_insert()) start = buffer.get_iter_at_line(insert.get_line()) end = start.copy() end.forward_line() paracount = count(buffer, (start, end)) if buffer.get_has_selection(): selectioncount = count(buffer, buffer.get_selection_bounds()) else: selectioncount = (0, 0, 0) table = gtk.Table(3, 4) table.set_row_spacings(5) table.set_col_spacings(12) self.vbox.add(table) plabel = gtk.Label(_('Page')) # T: label in word count dialog alabel = gtk.Label(_('Paragraph')) # T: label in word count dialog slabel = gtk.Label(_('Selection')) # T: label in word count dialog wlabel = gtk.Label(''+_('Words')+':') # T: label in word count dialog llabel = gtk.Label(''+_('Lines')+':') # T: label in word count dialog clabel = gtk.Label(''+_('Characters')+':') # T: label in word count dialog for label in (wlabel, llabel, clabel): label.set_use_markup(True) label.set_alignment(0.0, 0.5) # Heading table.attach(plabel, 1,2, 0,1) table.attach(alabel, 2,3, 0,1) table.attach(slabel, 3,4, 0,1) # Lines table.attach(llabel, 0,1, 1,2) table.attach(gtk.Label(str(buffercount[0])), 1,2, 1,2) table.attach(gtk.Label(str(paracount[0])), 2,3, 1,2) table.attach(gtk.Label(str(selectioncount[0])), 3,4, 1,2) # Words table.attach(wlabel, 0,1, 2,3) table.attach(gtk.Label(str(buffercount[1])), 1,2, 2,3) table.attach(gtk.Label(str(paracount[1])), 2,3, 2,3) table.attach(gtk.Label(str(selectioncount[1])), 3,4, 2,3) # Characters table.attach(clabel, 0,1, 3,4) table.attach(gtk.Label(str(buffercount[2])), 1,2, 3,4) table.attach(gtk.Label(str(paracount[2])), 2,3, 3,4) table.attach(gtk.Label(str(selectioncount[2])), 3,4, 3,4) class MoveTextDialog(Dialog): def __init__(self, ui, pageview): Dialog.__init__(self, ui, _('Move Text to Other Page'), # T: Dialog title button=(_('_Move'), 'gtk-ok') ) # T: Button label self.pageview = pageview self.page = self.pageview.page assert self.page, 'No source page !?' buffer = self.pageview.view.get_buffer() assert buffer.get_has_selection(), 'No Selection present' self.text = self.pageview.get_selection(format='wiki') assert self.text # just to be sure start, end = buffer.get_selection_bounds() self.bounds = (start.get_offset(), end.get_offset()) # Save selection bounds - can get lost later :S self.uistate.setdefault('link', True) self.uistate.setdefault('open_page', False) self.add_form([ ('page', 'page', _('Move text to'), self.page), # T: Input in 'move text' dialog ('link', 'bool', _('Leave link to new page')), # T: Input in 'move text' dialog ('open_page', 'bool', _('Open new page')), # T: Input in 'move text' dialog ], self.uistate ) def do_response_ok(self): newpage = self.form['page'] if not newpage: return False newpage = self.ui.notebook.get_page(newpage) # Copy text if newpage.exists(): self.ui.append_text_to_page(newpage.name, self.text) else: newpage = self.ui.new_page_from_text(self.text, name=newpage.name, use_template=True) # Delete text (after copy was succesfull..) buffer = self.pageview.view.get_buffer() bounds = map(buffer.get_iter_at_offset, self.bounds) buffer.delete(*bounds) # Insert Link if self.form['link']: href = self.form.widgets['page'].get_text() # TODO add method to Path "get_link" which gives rel path formatted correctly buffer.insert_link_at_cursor(href, href) # Show page if self.form['open_page']: self.ui.open_page(newpage) return True class NewFileDialog(Dialog): def __init__(self, ui, basename): Dialog.__init__(self, ui, _('New File')) # T: Dialog title self.add_form(( ('basename', 'string', _('Name')), # T: input for new file name ), { 'basename': basename }) def show_all(self): Dialog.show_all(self) # Select only first part of name # TODO - make this a widget type in widgets.py text = self.form.widgets['basename'].get_text() if '.' in text: name, ext = text.split('.', 1) self.form.widgets['basename'].select_region(0, len(name)) def do_response_ok(self): self.result = self.form['basename'] return True zim-0.60/zim/gui/preferencesdialog.py0000644000175000017500000003064212020170054017520 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import pango import gtk import logging import zim.plugins from zim.gui.widgets import Dialog, Button, BrowserTreeView, \ ScrolledWindow, ScrolledTextView, InputForm, input_table_factory from zim.gui.pageview import PageView logger = logging.getLogger('zim.gui.preferencesdialog') # define section labels here so xgettext can fing them _label = _('Interface') # T: Tab in preferences dialog _label = _('Editing') # T: Tab in preferences dialog class PreferencesDialog(Dialog): '''Preferences dialog consisting of tabs with various options and a tab with plugins. Options are not defined here, but need to be registered using GtkInterface.register_preferences(). ''' def __init__(self, ui): Dialog.__init__(self, ui, _('Preferences')) # T: Dialog title gtknotebook = gtk.Notebook() self.vbox.add(gtknotebook) # saves a list of loaded plugins to be used later self.p_save_loaded = [p.__class__ for p in self.ui.plugins] # Dynamic tabs self.forms = {} for category, preferences in ui.preferences_register.items(): vbox = gtk.VBox() gtknotebook.append_page(vbox, gtk.Label(_(category))) fields = [] values = {} sections = {} for p in preferences: if len(p) == 4: section, key, type, label = p fields.append((key, type, label)) else: section, key, type, label, check = p fields.append((key, type, label, check)) values[key] = ui.preferences[section][key] sections[key] = section form = InputForm(fields, values) form.preferences_sections = sections vbox.pack_start(form, False) self.forms[category] = form if category == 'Interface': self._add_font_selection(form) # Styles tab #~ gtknotebook.append_page(StylesTab(self), gtk.Label('Styles')) # Keybindings tab #~ gtknotebook.append_page(KeyBindingsTab(self), gtk.Label('Key bindings')) # Plugins tab gtknotebook.append_page(PluginsTab(self), gtk.Label(_('Plugins'))) # T: Heading in preferences dialog def _add_font_selection(self, table): # need to hardcode this, cannot register it as a preference table.add_inputs( ( ('use_custom_font', 'bool', _('Use a custom font')), # T: option in preferences dialog ) ) table.preferences_sections['use_custom_font'] = 'GtkInterface' self.fontbutton = gtk.FontButton() self.fontbutton.set_use_font(True) # preview in button self.fontbutton.set_sensitive(False) try: font = PageView.style['TextView']['font'] if font: self.fontbutton.set_font_name(font) self.fontbutton.set_sensitive(True) table['use_custom_font'] = True except KeyError: pass table.widgets['use_custom_font'].connect('toggled', lambda o: self.fontbutton.set_sensitive(o.get_active()) ) self.fontbutton.set_size_request(100, -1) input_table_factory(((None, self.fontbutton),), table) def do_response_ok(self): # Get dynamic tabs for form in self.forms.values(): for key, value in form.items(): section = form.preferences_sections[key] self.ui.preferences[section][key] = value # Set font - special case, consider it a HACK custom = self.ui.preferences['GtkInterface'].pop('use_custom_font') if custom: font = self.fontbutton.get_font_name() else: font = None PageView.style['TextView']['font'] = font PageView.style.write() # Save all self.ui.save_preferences() return True def do_response_cancel(self): # Obtain an updated list of loaded plugins now_loaded = [p.__class__ for p in self.ui.plugins] # Restore previous situation if the user changed something # in this dialog session for name in zim.plugins.list_plugins(): try: klass = zim.plugins.get_plugin(name) except: continue activatable = klass.check_dependencies_ok() if klass in self.p_save_loaded and activatable and klass not in now_loaded: self.ui.load_plugin(klass.plugin_key) elif klass not in self.p_save_loaded and klass in now_loaded: self.ui.unload_plugin(klass.plugin_key) self.ui.save_preferences() return True class PluginsTab(gtk.HBox): def __init__(self, dialog): gtk.HBox.__init__(self, spacing=12) self.set_border_width(5) self.dialog = dialog treeview = PluginsTreeView(self.dialog.ui) treeview.connect('row-activated', self.do_row_activated) swindow = ScrolledWindow(treeview, hpolicy=gtk.POLICY_NEVER) self.pack_start(swindow, False) vbox = gtk.VBox() self.add(vbox) # Textview with scrollbars to show plugins info. Required by small screen devices swindow, textview = ScrolledTextView() textview.set_cursor_visible(False) self.textbuffer = textview.get_buffer() self.textbuffer.create_tag('bold', weight=pango.WEIGHT_BOLD) self.textbuffer.create_tag('red', foreground='#FF0000') vbox.pack_start(swindow, True) hbox = gtk.HBox(spacing=5) vbox.pack_end(hbox, False) self.plugin_help_button = \ Button(stock=gtk.STOCK_HELP, label=_('_More')) # T: Button in plugin tab self.plugin_help_button.connect('clicked', self.on_help_button_clicked) hbox.pack_start(self.plugin_help_button, False) self.configure_button = \ Button(stock=gtk.STOCK_PREFERENCES, label=_('C_onfigure')) # T: Button in plugin tab self.configure_button.connect('clicked', self.on_configure_button_clicked) hbox.pack_start(self.configure_button, False) self.do_row_activated(treeview, (0,), 0) def do_row_activated(self, treeview, path, col): active = treeview.get_model()[path][0] name = treeview.get_model()[path][2] klass = treeview.get_model()[path][3] self._klass = klass logger.debug('Loading description for "%s"', name) # Insert plugin info into textview with proper formatting self.textbuffer.delete(*self.textbuffer.get_bounds()) # clear self.textbuffer.insert_with_tags_by_name( self.textbuffer.get_end_iter(), _('Name') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog self.textbuffer.insert( self.textbuffer.get_end_iter(), klass.plugin_info['name'].strip() + '\n\n') self.textbuffer.insert_with_tags_by_name( self.textbuffer.get_end_iter(), _('Description') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog self.textbuffer.insert( self.textbuffer.get_end_iter(), klass.plugin_info['description'].strip() + '\n\n') self.textbuffer.insert_with_tags_by_name( self.textbuffer.get_end_iter(), _('Dependencies') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog # Construct dependency list, missing dependencies are marked red check, dependencies = klass.check_dependencies() if not(dependencies): self.textbuffer.insert( self.textbuffer.get_end_iter(), _('No dependencies') + '\n') # T: label in plugin info in preferences dialog else: for dependency in dependencies: text, ok, required = dependency if ok: self.textbuffer.insert( self.textbuffer.get_end_iter(), u'\u2022 ' + text + ' - ' + _('OK') + '\n') # T: dependency is OK elif required: self.textbuffer.insert_with_tags_by_name( self.textbuffer.get_end_iter(), u'\u2022 ' + text +' - ' + _('Failed') + '\n', 'red') # T: dependency failed else: self.textbuffer.insert( self.textbuffer.get_end_iter(), u'\u2022 ' + text +' - ' + _('Failed') # T: dependency failed + ' ' + _('Optional') + '\n') # T: optional dependency self.textbuffer.insert_with_tags_by_name( self.textbuffer.get_end_iter(), '\n' + _('Author') + '\n', 'bold') # T: Heading in plugins tab of preferences dialog self.textbuffer.insert( self.textbuffer.get_end_iter(), klass.plugin_info['author'].strip()) self.configure_button.set_sensitive(active and bool(klass.plugin_preferences)) self.plugin_help_button.set_sensitive('help' in klass.plugin_info) def on_help_button_clicked(self, button): self.dialog.ui.show_help(self._klass.plugin_info['help']) def on_configure_button_clicked(self, button): PluginConfigureDialog(self.dialog, self._klass).run() class PluginsTreeModel(gtk.ListStore): def __init__(self, ui): #columns are: loaded, activatable, name, plugin instance gtk.ListStore.__init__(self, bool, bool, str, object) self.ui = ui loaded = [p.__class__ for p in self.ui.plugins] klasses = [] for name in zim.plugins.list_plugins(): try: klass = zim.plugins.get_plugin(name) klasses.append(klass) except: logger.exception('Could not load plugin %s', name) continue klasses.sort(key=lambda k: k.plugin_info['name']) for klass in klasses: isloaded = klass in loaded try: activatable = klass.check_dependencies_ok() except: logger.exception('Could not load plugin %s', name) continue else: self.append((isloaded, activatable, klass.plugin_info['name'], klass)) def do_toggle_path(self, path): loaded, activatable, name, klass = self[path] if not activatable: return if loaded: self.ui.unload_plugin(klass.plugin_key) self[path][0] = False else: plugin = self.ui.load_plugin(klass.plugin_key) print "GOT", plugin self[path][0] = (plugin is not None) # TODO pop error dialog if failed to load class PluginsTreeView(BrowserTreeView): def __init__(self, ui): BrowserTreeView.__init__(self) model = PluginsTreeModel(ui) self.set_model(model) cellrenderer = gtk.CellRendererToggle() cellrenderer.connect('toggled', lambda o, p: model.do_toggle_path(p)) self.append_column( gtk.TreeViewColumn(_('Enabled'), cellrenderer, active=0, activatable=1)) # T: Column in plugin tab self.append_column( gtk.TreeViewColumn(_('Plugin'), gtk.CellRendererText(), text=2)) # T: Column in plugin tab class PluginConfigureDialog(Dialog): def __init__(self, dialog, klass): Dialog.__init__(self, dialog, _('Configure Plugin')) # T: Dialog title self.ui = dialog.ui classes = [p.__class__ for p in self.ui.plugins] i = classes.index(klass) self.plugin = self.ui.plugins[i] label = gtk.Label() label.set_markup( ''+_('Options for plugin %s') % klass.plugin_info['name']+'') # T: Heading for 'configure plugin' dialog - %s is the plugin name self.vbox.add(label) fields = [] self.preferences = dialog.ui.preferences[klass.__name__] for pref in klass.plugin_preferences: if len(pref) == 4: key, type, label, default = pref self.preferences.setdefault(key, default) # just to be sure else: key, type, label, default, check = pref self.preferences.setdefault(key, default, check=check) # just to be sure if type in ('int', 'choice'): fields.append((key, type, label, check)) else: fields.append((key, type, label)) self.add_form(fields, self.preferences) def do_response_ok(self): # First let the plugin receive the changes, then save them. # The plugin could do some conversion on the fly (e.g. Path to string) self.preferences.update(self.form) self.plugin.emit('preferences-changed') self.ui.save_preferences() return True class StylesTab(gtk.VBox): def __init__(self, dialog): gtk.VBox.__init__(self) self.add(gtk.Label('TODO add treeview with styles')) class StylesTreeModel(gtk.ListStore): def __init__(self, ui): #'weight', 'scale', 'style', 'background', 'foreground', 'strikethrough', # 'family', 'wrap-mode', 'indent', 'underline' gtk.ListStore.__init__(self, bool, str, object) class KeyBindingsTab(gtk.VBox): def __init__(self, dialog): gtk.VBox.__init__(self) self.add(gtk.Label('TODO add treeview with accelerators')) #~ Build editable treeview of menu items + accelerators #~ #~ Just getting action names does not give menu structure, #~ so walk the menu. #~ #~ Menus are containers, have a foreach #~ Menutitems are bin, can have submenu #~ #~ Get label using get_child() etc (probably gives a box with icon, #~ label, accel, etc.) #~ #~ Test get_submenu(), #~ if is None: leaf item, get accelerator #~ elif value: recurs #~ #~ To get the accelerator: #~ accel_path = menuitem.get_accel_path() (make sure this is not the mnemonic..) #~ key, mod = gtk.accel_map_lookup_entry(accel_path) #~ #~ To get / set accelerator labels in the UI use: #~ gtk.accelerator_name() to get a name to display #~ #~ To parse name set by user #~ gtk.accelerator_parse() #~ gtk.accelerator_valid() #~ #~ To change the accelerator: #~ Maybe first unlock path in accel_map and unlock the actiongroup.. #~ gtk.accel_map.change_entry(accel_path, key, mods, replace=True) #~ check return value #~ #~ To get updates for ui use: #~ gtk.accel_map_get().connect('changed', func(o, accel_path, key, mods)) #~ This way we also get any accelerators that were deleted as result of #~ replace=True zim-0.60/zim/gui/__init__.py0000664000175000017500000035117212137742720015622 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2013 Jaap Karssenberg '''This module contains the Gtk user interface for zim. The main widgets and dialogs are separated out in sub-modules. Included here are the main class for the zim GUI L{GtkInterface}, which contains most action handlers and the main window class L{MainWindow}, as well as a number of dialogs. If you want to extend the user interface, also see L{zim.gui.widgets} for common base classes for widgets and dialogs. ''' from __future__ import with_statement import os import re import logging import gobject import gtk import zim from zim import NotebookInterface, NotebookLookupError, ZimCmd from zim.fs import File, Dir, normalize_win32_share from zim.errors import Error, TrashNotSupportedError, TrashCancelledError from zim.signals import DelayedCallback from zim.notebook import Path, Page from zim.stores import encode_filename from zim.index import LINK_DIR_BACKWARD from zim.config import data_file, config_file, data_dirs, ListDict, value_is_coord, set_environ from zim.parsing import url_encode, url_decode, URL_ENCODE_DATA, is_win32_share_re, is_url_re, is_uri_re from zim.history import History, HistoryPath from zim.templates import list_templates, get_template from zim.gui.pathbar import NamespacePathBar, RecentPathBar, RecentChangesPathBar, HistoryPathBar from zim.gui.pageindex import PageIndex from zim.gui.pageview import PageView from zim.gui.widgets import ui_environment, gtk_window_set_default_icon, \ Button, MenuButton, \ Window, Dialog, \ ErrorDialog, QuestionDialog, FileDialog, ProgressBarDialog, MessageDialog, \ PromptExistingFileDialog, \ ScrolledTextView from zim.gui.clipboard import Clipboard from zim.gui.applications import ApplicationManager, CustomToolManager, AddApplicationDialog logger = logging.getLogger('zim.gui') #: Menu actions ui_actions = ( ('file_menu', None, _('_File')), # T: Menu title ('edit_menu', None, _('_Edit')), # T: Menu title ('view_menu', None, _('_View')), # T: Menu title ('insert_menu', None, _('_Insert')), # T: Menu title ('search_menu', None, _('_Search')), # T: Menu title ('format_menu', None, _('For_mat')), # T: Menu title ('tools_menu', None, _('_Tools')), # T: Menu title ('go_menu', None, _('_Go')), # T: Menu title ('help_menu', None, _('_Help')), # T: Menu title ('pathbar_menu', None, _('P_athbar')), # T: Menu title ('toolbar_menu', None, _('_Toolbar')), # T: Menu title # name, stock id, label, accelerator, tooltip, readonly ('new_page', 'gtk-new', _('_New Page...'), 'N', '', False), # T: Menu item ('new_sub_page', 'gtk-new', _('New S_ub Page...'), 'N', '', False), # T: Menu item ('open_notebook', 'gtk-open', _('_Open Another Notebook...'), 'O', '', True), # T: Menu item ('open_new_window', None, _('Open in New _Window'), '', '', True), # T: Menu item ('import_page', None, _('_Import Page...'), '', '', False), # T: Menu item ('save_page', 'gtk-save', _('_Save'), 'S', '', False), # T: Menu item ('save_copy', None, _('Save A _Copy...'), '', '', True), # T: Menu item ('show_export', None, _('E_xport...'), '', '', True), # T: Menu item ('email_page', None, _('_Send To...'), '', '', True), # T: Menu item ('move_page', None, _('_Move Page...'), '', '', False), # T: Menu item ('rename_page', None, _('_Rename Page...'), 'F2', '', False), # T: Menu item ('delete_page', None, _('_Delete Page'), '', '', False), # T: Menu item ('show_properties', 'gtk-properties', _('Proper_ties'), '', '', True), # T: Menu item ('close', 'gtk-close', _('_Close'), 'W', '', True), # T: Menu item ('quit', 'gtk-quit', _('_Quit'), 'Q', '', True), # T: Menu item ('show_search', 'gtk-find', _('_Search...'), 'F', '', True), # T: Menu item ('show_search_backlinks', None, _('Search _Backlinks...'), '', '', True), # T: Menu item ('show_recent_changes', None, _('Recent Changes...'), '', '', True), # T: Menu item ('copy_location', None, _('Copy _Location'), 'L', '', True), # T: Menu item ('show_templateeditor', None, _('_Templates'), '', '', True), # T: Menu item ('show_preferences', 'gtk-preferences', _('Pr_eferences'), '', '', True), # T: Menu item ('reload_page', 'gtk-refresh', _('_Reload'), 'R', '', True), # T: Menu item ('open_attachments_folder', 'gtk-open', _('Open Attachments _Folder'), '', '', True), # T: Menu item ('open_notebook_folder', 'gtk-open', _('Open _Notebook Folder'), '', '', True), # T: Menu item ('open_document_root', 'gtk-open', _('Open _Document Root'), '', '', True), # T: Menu item ('open_document_folder', 'gtk-open', _('Open _Document Folder'), '', '', True), # T: Menu item ('attach_file', 'zim-attachment', _('Attach _File'), '', _('Attach external file'), False), # T: Menu item ('show_clean_notebook', None, _('_Cleanup Attachments'), '', '', False), # T: Menu item ('edit_page_source', 'gtk-edit', _('Edit _Source'), '', '', False), # T: Menu item ('show_server_gui', None, _('Start _Web Server'), '', '', True), # T: Menu item ('reload_index', None, _('Update Index'), '', '', False), # T: Menu item ('manage_custom_tools', 'gtk-preferences', _('Custom _Tools'), '', '', True), # T: Menu item ('open_page_back', 'gtk-go-back', _('_Back'), 'Left', _('Go page back'), True), # T: Menu item ('open_page_forward', 'gtk-go-forward', _('_Forward'), 'Right', _('Go page forward'), True), # T: Menu item ('open_page_parent', 'gtk-go-up', _('_Parent'), 'Up', _('Go to parent page'), True), # T: Menu item ('open_page_child', 'gtk-go-down', _('_Child'), 'Down', _('Go to child page'), True), # T: Menu item ('open_page_previous', None, _('_Previous in index'), 'Page_Up', _('Go to previous page'), True), # T: Menu item ('open_page_next', None, _('_Next in index'), 'Page_Down', _('Go to next page'), True), # T: Menu item ('open_page_home', 'gtk-home', _('_Home'), 'Home', _('Go home'), True), # T: Menu item ('open_page', 'gtk-jump-to', _('_Jump To...'), 'J', '', True), # T: Menu item ('show_help', 'gtk-help', _('_Contents'), 'F1', '', True), # T: Menu item ('show_help_faq', None, _('_FAQ'), '', '', True), # T: Menu item ('show_help_keys', None, _('_Keybindings'), '', '', True), # T: Menu item ('show_help_bugs', None, _('_Bugs'), '', '', True), # T: Menu item ('show_about', 'gtk-about', _('_About'), '', '', True), # T: Menu item ) #: More menu actions ui_actions_window = ( # name, stock id, label, accelerator, tooltip, readonly ('show_all_panes', None, _('_All Panes'), 'F9', _('Show All Panes'), True), # T: Menu item ) #: Menu actions that toggle between two states ui_toggle_actions_window = ( # name, stock id, label, accelerator, tooltip, initial state, readonly ('toggle_toolbar', None, _('_Toolbar'), '', '', True, True), # T: Menu item ('toggle_statusbar', None, _('_Statusbar'), None, '', True, True), # T: Menu item ('toggle_panes', 'gtk-index', _('_Side Panes'), 'F9', _('Show Side Panes'), True, True), # T: Menu item # FIXME review text ('toggle_fullscreen', 'gtk-fullscreen', _('_Fullscreen'), 'F11', '', False, True), # T: Menu item ('toggle_readonly', 'gtk-edit', _('Notebook _Editable'), '', _('Toggle notebook editable'), True, True), # T: menu item ) if ui_environment['platform'] == 'maemo': ui_toggle_actions_window = ( # name, stock id, label, accelerator, tooltip, initial state, readonly ('toggle_toolbar', None, _('_Toolbar'), 'M', '', True, True), # T: Menu item ('toggle_statusbar', None, _('_Statusbar'), None, '', True, True), # T: Menu item ('toggle_panes', 'gtk-index', _('_Side Panes'), 'F9', _('Show Side Panes'), True, True), # T: Menu item # FIXME review text ('toggle_fullscreen', 'gtk-fullscreen', _('_Fullscreen'), 'F11', '', False, True), # T: Menu item ('toggle_readonly', 'gtk-edit', _('Notebook _Editable'), '', _('Toggle notebook editable'), True, True), # T: menu item ) #: Menu items with a radio checkbox ui_pathbar_radio_actions = ( # name, stock id, label, accelerator, tooltip ('set_pathbar_none', None, _('_None'), None, None, 0), # T: Menu item ('set_pathbar_recent', None, _('_Recent pages'), None, None, 1), # T: Menu item ('set_pathbar_recent_changed', None, _('Recently _Changed pages'), None, None, 1), # T: Menu item ('set_pathbar_history', None, _('_History'), None, None, 2), # T: Menu item ('set_pathbar_path', None, _('N_amespace'), None, None, 3), # T: Menu item ) PATHBAR_NONE = 'none' #: Constant for no pathbar PATHBAR_RECENT = 'recent' #: Constant for the recent pages pathbar PATHBAR_RECENT_CHANGED = 'recent_changed' #: Constant for the recent pages pathbar PATHBAR_HISTORY = 'history' #: Constant for the history pathbar PATHBAR_PATH = 'path' #: Constant for the namespace pathbar PATHBAR_TYPES = (PATHBAR_NONE, PATHBAR_RECENT, PATHBAR_RECENT_CHANGED, PATHBAR_HISTORY, PATHBAR_PATH) #: Menu items for the context menu of the toolbar ui_toolbar_style_radio_actions = ( # name, stock id, label, accelerator, tooltip ('set_toolbar_icons_and_text', None, _('Icons _And Text'), None, None, 0), # T: Menu item ('set_toolbar_icons_only', None, _('_Icons Only'), None, None, 1), # T: Menu item ('set_toolbar_text_only', None, _('_Text Only'), None, None, 2), # T: Menu item ) #: Menu items for the context menu of the toolbar ui_toolbar_size_radio_actions = ( # name, stock id, label, accelerator, tooltip ('set_toolbar_icons_large', None, _('_Large Icons'), None, None, 0), # T: Menu item ('set_toolbar_icons_small', None, _('_Small Icons'), None, None, 1), # T: Menu item ('set_toolbar_icons_tiny', None, _('_Tiny Icons'), None, None, 2), # T: Menu item ) TOOLBAR_ICONS_AND_TEXT = 'icons_and_text' TOOLBAR_ICONS_ONLY = 'icons_only' TOOLBAR_TEXT_ONLY = 'text_only' TOOLBAR_ICONS_LARGE = 'large' TOOLBAR_ICONS_SMALL = 'small' TOOLBAR_ICONS_TINY = 'tiny' #: Preferences for the user interface ui_preferences = ( # key, type, category, label, default ('tearoff_menus', 'bool', 'Interface', _('Add \'tearoff\' strips to the menus'), False), # T: Option in the preferences dialog ('toggle_on_ctrlspace', 'bool', 'Interface', _('Use to switch to the side pane'), False), # T: Option in the preferences dialog # default value is False because this is mapped to switch between # char sets in certain international key mappings ('remove_links_on_delete', 'bool', 'Interface', _('Remove links when deleting pages'), True), # T: Option in the preferences dialog ('always_use_last_cursor_pos', 'bool', 'Interface', _('Always use last cursor position when opening a page'), True), # T: Option in the preferences dialog ) if ui_environment['platform'] == 'maemo': # Maemo specific settings ui_preferences = ( # key, type, category, label, default ('tearoff_menus', 'bool', None, None, False), # Maemo can't have tearoff_menus ('toggle_on_ctrlspace', 'bool', None, None, True), # There is no ALT key on maemo devices ) # Load custom application icons as stock def load_zim_stock_icons(): '''Function to load zim custom stock icons for Gtk. Will load all icons found in the "pixmaps" folder with a stock name prefixed with "zim-", so "data/pixmaps/link.png" becomes the "zim-link" stock icon. Called directly when this module is loaded. ''' factory = gtk.IconFactory() factory.add_default() for dir in data_dirs(('pixmaps')): for file in dir.list('*.png'): # not all installs have svg support, so only check png for now.. name = 'zim-'+file[:-4] # e.g. checked-box.png -> zim-checked-box icon_theme = gtk.icon_theme_get_default() try: pixbuf = icon_theme.load_icon(name, 24, 0) except: pixbuf = gtk.gdk.pixbuf_new_from_file(str(dir+file)) try: set = gtk.IconSet(pixbuf) factory.add(name, set) except Exception: logger.exception('Got exception while loading application icons') load_zim_stock_icons() def schedule_on_idle(function, args=()): '''Helper function to schedule stuff that can be done later, it will be triggered on the gtk "idle" signal. @param function: function to call @param args: positional arguments ''' def callback(): function(*args) return False # delete signal gobject.idle_add(callback) class NoSuchFileError(Error): '''Exception for when a file or folder is not found that should exist. ''' description = _('The file or folder you specified does not exist.\nPlease check if you the path is correct.') # T: Error description for "no such file or folder" def __init__(self, path): '''Constructor @param path: the L{File} or L{Dir} object ''' self.msg = _('No such file or folder: %s') % path.path # T: Error message, %s will be the file path class ApplicationLookupError(Error): '''Exception raised when an application was not found''' pass class RLock(object): '''Re-entrant lock that keeps a stack count The lock will increase a counter each time L{increment()} is called and decrease the counter each time L{decrement()} is called. When the counter is non-zero the object will evaluate C{True}. This is used to e.g. handle recursive calls to the same handler while waiting for user input. Because of the counter the lock only is freed when the outer most wrapper calls L{decrement()}. ''' __slots__ = ('count',) def __init__(self): self.count = 0 def __nonzero__(self): return self.count > 0 def increment(self): '''Increase counter''' self.count += 1 def decrement(self): '''Decrease counter''' if self.count == 0: raise AssertionError, 'BUG: RLock count can not go below zero' self.count -= 1 class GtkInterface(NotebookInterface): '''Main class for the zim Gtk interface. This object wraps a single notebook and provides actions to manipulate and access this notebook. This class has quite some methods that are described as "menu actions". This means these methods directly implement the action that is triggered by a specific menu action. However they are also available for other classes to call them directly and are part of the public API. The GUI uses a few mechanisms for other classes to dynamically add elements. One is the use of the C{gtk.UIManager} class to populate the menubar and toolbar. This allows other parts of the application to define additional actions. See the methods L{add_actions()} and L{add_ui()} for wrappers around this functionality. A second mechanism is that for simple options other classes can register a preference to be shown in the PreferencesDialog. See the L{register_preferences()} method. B{NOTE:} the L{plugin} base class has it's own wrappers for these things. Plugin writers should look there first. @ivar preferences: L{ConfigDict} for global preferences, maps to the X{preferences.conf} config file. @ivar uistate: L{ConfigDict} for current state of the user interface, maps to the X{state.conf} config file per notebook. @ivar notebook: The L{Notebook} object @ivar page: The L{Page} object for the current page in the main window @ivar readonly: When C{True} the whole interface is read-only @ivar hideonclose: When C{True} the application will hide itself instead of closing when the main window is closed, typically used in combination with the background server process and the L{tray icon plugin} @ivar mainwindow: the L{MainWindow} object @ivar history: the L{History} object @ivar uimanager: the C{gtk.UIManager} (see the methods L{add_actions()} and L{add_ui()} for wrappers) @ivar preferences_register: a L{ListDict} with preferences to show in the preferences dialog, see L{register_preferences()} to add to more preferences @signal: C{open-page (L{Page}, L{Path})}: Emitted when opening a page, the Path is given as the 2nd argument so the source of the path can be checked - in particular when a path is opened through a history function this will be a L{HistoryPath} @signal: C{close-page (L{Page}, final)}: Emitted before closing a page, typically just before a new page is opened and before closing the application. If 'C{final}' is C{True} we expect this to be the final page closure before quiting the application. This it is only a hint, so do not destroy any ui components when 'C{final}' is set, but it can be used to decide to do some actions async or not. @signal: C{new-window (C{Window})}: Emitted when a new window is created, can be used as a hook by plugins @signal: C{read-only-changed ()}: Emitted when the ui changed from read-write to read-only or back @signal: C{quit ()}: Emitted when the application is about to quit @signal: C{start-index-update ()}: Emitted before running a index update @signal: C{end-index-update ()}: Emitted when an index update is finished ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'open-page': (gobject.SIGNAL_RUN_LAST, None, (object, object)), 'close-page': (gobject.SIGNAL_RUN_LAST, None, (object, bool)), 'new-window': (gobject.SIGNAL_RUN_LAST, None, (object,)), 'readonly-changed': (gobject.SIGNAL_RUN_LAST, None, ()), 'quit': (gobject.SIGNAL_RUN_LAST, None, ()), 'start-index-update': (gobject.SIGNAL_RUN_LAST, None, ()), 'end-index-update': (gobject.SIGNAL_RUN_LAST, None, ()), } ui_type = 'gtk' #: UI type - typically checked by plugins instead of class def __init__(self, notebook=None, page=None, fullscreen=False, geometry=None): '''Constructor @param notebook: a L{Notebook} object @param page: a L{Path} object @param fullscreen: if C{True} open fullscreen @param geometry: window geometry as string in format "C{WxH+X+Y}" ''' assert not (page and notebook is None), 'BUG: can not give page while notebook is None' self._finalize_ui = False # initalize this one early, before any call to load_plugin can happen NotebookInterface.__init__(self) self.preferences_register = ListDict() self.page = None self._path_context = None self.history = None self._autosave_lock = RLock() # used to prevent autosave triggering while we are # doing a (async) save, or when we have an error during # saving. self.readonly = False self.hideonclose = False self.windows = set() self.url_handlers = {} logger.debug('Gtk version is %s' % str(gtk.gtk_version)) logger.debug('Pygtk version is %s' % str(gtk.pygtk_version)) gtk_window_set_default_icon() self.uimanager = gtk.UIManager() self.uimanager.add_ui_from_string(''' ''') self.register_preferences('GtkInterface', ui_preferences) # Hidden setting to force the gtk bell off. Otherwise it # can bell every time you reach the begin or end of the text # buffer. Especially specific gtk version on windows. # See bug lp:546920 self.preferences['GtkInterface'].setdefault('gtk_bell', False) if not self.preferences['GtkInterface']['gtk_bell']: gtk.rc_parse_string('gtk-error-bell = 0') # Init UI self.mainwindow = MainWindow(self, fullscreen, geometry) self.add_actions(ui_actions, self) self.add_actions(ui_actions_window, self.mainwindow) self.add_toggle_actions(ui_toggle_actions_window, self.mainwindow) self.add_radio_actions(ui_pathbar_radio_actions, self.mainwindow, 'do_set_pathbar') self.add_radio_actions(ui_toolbar_style_radio_actions, self.mainwindow, 'do_set_toolbar_style') self.add_radio_actions(ui_toolbar_size_radio_actions, self.mainwindow, 'do_set_toolbar_size') if ui_environment['platform'] == 'maemo': # Customized menubar for maemo, specific for maemo version fname = 'menubar-' + ui_environment['maemo_version'] + '.xml' else: fname = 'menubar.xml' self.add_ui(data_file(fname).read(), self) if ui_environment['platform'] == 'maemo': # Hardware fullscreen key is F6 in N8xx devices self.mainwindow.connect('key-press-event', lambda o, event: event.keyval == gtk.keysyms.F6 and self.mainwindow.toggle_fullscreen()) self._custom_tool_ui_id = None self._custom_tool_actiongroup = None self._custom_tool_iconfactory = None self.load_custom_tools() self.do_preferences_changed() # Deal with commandline arguments for notebook and page if notebook: self.open_notebook(notebook) # If it fails here an error dialog is shown and main() # will prompt the notebook list if self.notebook and page: if isinstance(page, basestring): page = self.notebook.resolve_path(page) if not page is None: self.open_page(page) else: assert isinstance(page, Path) self.open_page(page) else: pass # Will check default in main() def load_plugin(self, name): plugin = NotebookInterface.load_plugin(self, name) if plugin and self._finalize_ui: plugin.finalize_ui(self) return plugin def main(self): '''Wrapper for C{gtk.main()}, runs main loop of the application. Does not return until program has ended. Also takes care of a number of initialization actions, like prompting the L{NotebookDialog} if needed and will show the main window. ''' if self.notebook is None: import zim.gui.notebookdialog notebook = zim.gui.notebookdialog.prompt_notebook() if notebook: self.open_notebook(notebook) else: # User canceled notebook dialog return if self.notebook.dir: os.chdir(self.notebook.dir.path) set_environ('PWD', self.notebook.dir.path) if self.page is None: path = self.history.get_current() if path: self.open_page(path) else: self.open_page_home() # We schedule the autosave on idle to try to make it impact # the performance of the application less. Of course using the # async interface also helps, but we need to account for cases # where asynchronous actions are not supported. def autosave(): page = self.mainwindow.pageview.get_page() if page.modified and not self._autosave_lock: self.save_page_async(page) def schedule_autosave(): schedule_on_idle(autosave) return True # keep ticking # older gobject version doesn't know about seconds self.preferences['GtkInterface'].setdefault('autosave_timeout', 10) timeout = self.preferences['GtkInterface']['autosave_timeout'] * 1000 # s -> ms self._autosave_timer = gobject.timeout_add(timeout, schedule_autosave) # FIXME make this more intelligent # Finalize plugin ui self._finalize_ui = True for plugin in self.plugins: plugin.finalize_ui(self) # Must happens before window.show_all() # so side panes are initialized when we set uistate # Check notebook (after loading plugins) self.check_notebook_needs_upgrade() # Update menus etc. self.uimanager.ensure_update() # Prevent flashing when the toolbar is after showing the window # and do this before connecting signal below for accelmap. # For maemo ensure all items are initialized before moving # them to the hildon menu ## HACK - should be in MainWindow, but needs to go after ensure_update() space = gtk.SeparatorToolItem() space.set_draw(False) space.set_expand(True) self.mainwindow.toolbar.insert(space, -1) from zim.gui.widgets import InputEntry entry = InputEntry(placeholder_text=_('Search')) if gtk.gtk_version >= (2, 16): entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_FIND) entry.set_icon_activatable(gtk.ENTRY_ICON_SECONDARY, True) entry.set_icon_tooltip_text(gtk.ENTRY_ICON_SECONDARY, _('Search Pages...')) # T: label in search entry inline_search = lambda e, *a: self.show_search(query=e.get_text() or None) entry.connect('activate', inline_search) entry.connect('icon-release', inline_search) entry.show() item = gtk.ToolItem() item.add(entry) self.mainwindow.toolbar.insert(item, -1) ## if ui_environment['platform'] == 'maemo': # Move the menu to the hildon menu # This is save for later updates of the menus (e.g. by plugins) # as long as the toplevel menus are not changed menu = gtk.Menu() for child in self.mainwindow.menubar.get_children(): child.reparent(menu) self.mainwindow.set_menu(menu) self.mainwindow.menubar.hide() # Localize the fullscreen button in the toolbar for i in range(self.mainwindow.toolbar.get_n_items()): self.fsbutton = None toolitem = self.mainwindow.toolbar.get_nth_item(i) if isinstance(toolitem, gtk.ToolButton): if toolitem.get_stock_id() == 'gtk-fullscreen': self.fsbutton = toolitem self.fsbutton.tap_and_hold_setup(menu) # attach app menu to fullscreen button for N900 break accelmap = config_file('accelmap').file logger.debug('Accelmap: %s', accelmap.path) if accelmap.exists(): gtk.accel_map_load(accelmap.path) def on_accel_map_changed(o, path, key, mod): logger.info('Accelerator changed for %s', path) gtk.accel_map_save(accelmap.path) gtk.accel_map_get().connect('changed', on_accel_map_changed) # if prefs are modified during init we should save them if self.preferences.modified: self.save_preferences() # And here we go! self.mainwindow.show_all() self.mainwindow.pageview.grab_focus() gtk.main() def present(self, page=None, fullscreen=None, geometry=None): '''Present the mainwindow. Typically used to bring back a the application after it was hidden. Also used for remote calls. @param page: a L{Path} object or page path as string @param fullscreen: if C{True} the window is shown fullscreen, if C{None} the previous state is restored @param geometry: the window geometry as string in format "C{WxH+X+Y}", if C{None} the previous state is restored ''' self.mainwindow.present() if page: if isinstance(page, basestring): page = Path(page) self.open_page(page) if geometry: self.mainwindow.parse_geometry(geometry) elif fullscreen: self.mainwindow.toggle_fullscreen(show=True) def toggle_present(self): '''Present main window if it is not on top, but hide if it is. Used by the L{trayicon plugin} to toggle visibility of the window. ''' if self.mainwindow.is_active(): self.mainwindow.hide() else: self.mainwindow.present() def hide(self): '''Hide the main window. Note that this is not the same as minimize, when minimized there is still an icon in the task bar, if hidden there is no visible trace of the application and it can not be accessed by the user anymore until L{present()} has been called. ''' self.mainwindow.hide() def close(self): '''Menu action for close. Will hide when L{hideonclose} is set, calls L{quit()} otherwise. ''' if self.hideonclose: self.hide() else: self.quit() def quit(self): '''Menu action for quit. @emits: quit ''' if not self.close_page(self.page, final=True): # Do not quit if page not saved return False self.emit('quit') if self.mainwindow.get_property('visible'): self.mainwindow.destroy() if gtk.main_level() > 0: gtk.main_quit() return True def add_actions(self, actions, handler, methodname=None): '''Add extra menu actions to the interface which can be used in the menubar and toolbar. Wrapper for C{gtk.ActionGroup.add_actions()}. Adding actions will not show them in the interface immediately. To achieve that you first need to load some layout definition using L{add_ui()}. This method assumes the actions are implemented by a "handler" object. The actions are store in the C{gtk.ActionGroup} in the "actiongroup" attribute of this object. This attribute is created and attached to the uimanager if it does not yet exist. @param actions: a list of action definitions. Actions are defined as a 6-tuple of : - the name of the action - a gtk stock id for the icon, or C{None} - the label - the accelerator key binding - a tooltip message - a boolean, if C{True} this action is can be used in a read-only interface Actions that define (sub-)menus are a special case, they are defined as a 3-tuple of the name, stock id and a lable. In this case the name must end with "_menu" See C{gtk.ActionGroup} documentation for more details. @param handler: object that implements these actions. Each action is mapped to an object method of the same name. @param methodname: name for a method on the handler object which will handle all actions. This overrules the default mapping of actions by action name. Used to implement groups of actions with a single handler method. ''' assert isinstance(actions[0], tuple), 'BUG: actions should be list of tupels' group = self.init_actiongroup(handler) group.add_actions([a[0:5] for a in actions]) self._connect_actions(actions, group, handler) def add_toggle_actions(self, actions, handler): '''Add extra menu actions to the interface which can be used in the menubar and toolbar. Wrapper for C{gtk.ActionGroup.add_toggle_actions()}. Differs from L{add_actions()} in the way actions are mapped to object methods, the name is prefixed with "do_". The reason for this is that we need some code to keep the state of toolbar and menubar widgets in sync with the internal state, while at the same time we want to be able to call the standard method name from other interface. So e.g. an action "foo" will trigger a method "C{do_foo()}" which should implement the logic. This allows also to have a public method "C{foo()}" which calls "C{action.activate()}" whic in turn triggers "C{do_foo()}" again. See L{zim.plugins.PluginClass.toggle_action()} for a convenience method to help implementing this. @param actions: list of action definitions. Actions are defined defined as a 7-tuple of : - the name of the action - a gtk stock id for the icon, or C{None} - the label - the accelerator key binding - a tooltip message - initial state C{True} or C{False} - a boolean, if C{True} this action is can be used in a read-only interface See C{gtk.ActionGroup} documentation for more details. @param handler: object that implements these actions. ''' assert isinstance(actions[0], tuple), 'BUG: actions should be list of tupels' group = self.init_actiongroup(handler) group.add_toggle_actions([a[0:5]+(None,)+(a[5],) for a in actions]) # insert 'None' for callback self._connect_actions(actions, group, handler, is_toggle=True) def add_radio_actions(self, actions, handler, methodname): '''Add extra menu actions to the interface which can be used in the menubar and toolbar. Wrapper for C{gtk.ActionGroup.add_radio_actions()}, defining a single group of radio actions. Of this group only one item can be active at the time. @param actions: a list of action definitions. Actions are defined as a 6-tuple of : - the name of the action - a gtk stock id for the icon, or C{None} - the label - the accelerator key binding - a tooltip message - the value to set on the radio See C{gtk.ActionGroup} documentation for more details. @param handler: object that implements these actions @param methodname: name for a method on the handler object which will handle all actions, this is mandatory for radio actions, they always have a single handler for the whole group. The handler gets the name of the selected radio as the first argument. ''' # A bit different from the other two methods since radioactions # come in mutual exclusive groups. Only need to connect to one # action to get signals from whole group. But need to pass on # the name of the active action assert isinstance(actions[0], tuple), 'BUG: actions should be list of tuples' assert hasattr(handler, methodname), 'No such method %s' % methodname group = self.init_actiongroup(handler) group.add_radio_actions(actions) method = getattr(handler, methodname) action = group.get_action(actions[0][0]) action.connect('changed', self._radio_action_handler, method) def init_actiongroup(self, handler): '''Initializes the actiongroup for a handler object if it does not already exist. The actiongroup is set in the "actiongroup" attribute of the object and inserted in the ui manager. @param handler: the handler object @returns: the actiongroup object ''' if not hasattr(handler, 'actiongroup') or handler.actiongroup is None: name = handler.__class__.__name__ handler.actiongroup = gtk.ActionGroup(name) self.uimanager.insert_action_group(handler.actiongroup, 0) return handler.actiongroup def remove_actiongroup(self, handler): '''Remove the actiongroup for a handler object and remove all actions from the ui manager. @param handler: the handler object ''' if hasattr(handler, 'actiongroup') and handler.actiongroup: self.uimanager.remove_action_group(handler.actiongroup) handler.actiongroup = None def _action_handler(self, action, method, *arg): name = action.get_name() logger.debug('Action: %s', name) try: method(*arg) except Exception, error: ErrorDialog(None, error).run() # error dialog also does logging automatically def _radio_action_handler(self, object, action, method): # radio action object is not active radio action self._action_handler(action, method, action.get_name()) def _connect_actions(self, actions, group, handler, is_toggle=False): for name, readonly in [(a[0], a[-1]) for a in actions if not a[0].endswith('_menu')]: action = group.get_action(name) action.zim_readonly = readonly if re.search('_alt\d$', name): # alternative key bindings name, _ = name.rsplit('_', 1) if is_toggle: name = 'do_' + name assert hasattr(handler, name), 'No method defined for action %s' % name method = getattr(handler, name) action.connect('activate', self._action_handler, method) if self.readonly and not action.zim_readonly: action.set_sensitive(False) def add_ui(self, xml, handler): '''Add a definition of the layout of the menubar and/or toolbar adding new menu items. Wrapper for C{gtk.UIManager.add_ui_from_string()}, see documentation there for more details on XML spec. @param xml: layout definition as string in XML format @param handler: handler object, this object is used to keep track of ui ID's so L{remove_ui()} can remove all ui elements of this handler at once @returns: the ui ID ''' id = self.uimanager.add_ui_from_string(xml) if hasattr(handler, '_ui_merge_ids') and handler._ui_merge_ids: handler._ui_merge_ids += (id,) else: handler._ui_merge_ids = (id,) return id def remove_ui(self, handler, id=None): '''Remove the ui definition(s) for a specific handler. @param handler: handler object @param id: if a ui ID is given, only that part is removed, else all ui definitions for this handler object are removed ''' if id: self.uimanager.remove_ui(id) if hasattr(handler, '_ui_merge_ids'): handler._ui_merge_ids = \ filter(lambda i: i != id, handler._ui_merge_ids) else: if hasattr(handler, '_ui_merge_ids'): for id in handler._ui_merge_ids: self.uimanager.remove_ui(id) handler._ui_merge_ids = None def populate_popup(self, name, menu, path_context=None): '''Populate a popup menu from a popup defined in the uimanager This effectively duplicated the menu items from a given popup as defined in the uimanager to a given menu. The reason to do this is to include a menu that is extendable for plugins etc. into an existing popup menu. (Note that changes to the menu as returned by uimanager.get_widget() are global.) @param name: the uimanager popup name, e.g. "toolbar_popup" or "page_popup" @param menu: a gtk.Menu to be populated with the menu items @param path_context: a L{Path} object in case this menu is about a page, will be used as the context for the various actions @raises ValueError: when 'name' does not exist ''' # ... so we have to do our own XML parsing here :( # but take advantage of nicely formatted line-based output ... xml = self.uimanager.get_ui() xml = [l.strip() for l in xml.splitlines()] # Get slice of XML start, end = None, None for i, line in enumerate(xml): if start is None: if line.startswith('' % name): start = i else: if line.startswith(''): end = i break if start is None or end is None: raise ValueError, 'No such popup in uimanager: %s' % name # Wrapper to set path context def wrapper(menuitem, action): self._path_context = path_context try: action.activate() except: self._path_context = None raise else: self._path_context = None # Parse items and add to menu seen_item = False # use to track empty parts for line in xml[start+1:end]: if line.startswith(' Path self.open_page(newpath) def autosave(o, p, *a): # Here we explicitly do not save async # and also explicitly no need for _autosave_lock page = self.mainwindow.pageview.get_page() if p == page and page.modified: self.save_page(page) NotebookInterface.do_open_notebook(self, notebook) self.history = History(notebook, self.uistate) self.on_notebook_properties_changed(notebook) notebook.connect('properties-changed', self.on_notebook_properties_changed) notebook.connect('delete-page', autosave) # before action notebook.connect('move-page', autosave) # before action notebook.connect('deleted-page', move_away) notebook.connect('moved-page', follow) # Start a lightweight background check of the index self.notebook.index.update_async() self.set_readonly(notebook.readonly) def check_notebook_needs_upgrade(self): '''Check whether the notebook needs to be upgraded and prompt the user to do so if this is the case. Interactive wrapper for L{Notebook.upgrade_notebook()}. ''' if not self.notebook.needs_upgrade: return ok = QuestionDialog(None, ( _('Upgrade Notebook?'), # T: Short question for question prompt _('This notebook was created by an older of version of zim.\n' 'Do you want to upgrade it to the latest version now?\n\n' 'Upgrading will take some time and may make various changes\n' 'to the notebook. In general it is a good idea to make a\n' 'backup before doing this.\n\n' 'If you choose not to upgrade now, some features\n' 'may not work as expected') # T: Explanation for question to upgrade notebook ) ).run() if not ok: return with ProgressBarDialog(self, _('Upgrading notebook')) as dialog: # T: Title of progressbar dialog self.notebook.index.ensure_update(callback=lambda p: dialog.pulse(p.name)) dialog.set_total(self.notebook.index.n_list_all_pages()) self.notebook.upgrade_notebook(callback=lambda p: dialog.pulse(p.name)) def on_notebook_properties_changed(self, notebook): has_doc_root = not notebook.document_root is None for action in ('open_document_root', 'open_document_folder'): action = self.actiongroup.get_action(action) action.set_sensitive(has_doc_root) def open_page(self, path=None): '''Method to open a page in the mainwindow, and menu action for the "jump to" menu item. @param path: a L{path} for the page to open, if C{None} we prompt the user with the L{OpenPageDialog}. If C{path} is a L{HistoryPath} we assume that this call is the result of a history action and the page is not again added to the history. @emits: open-page ''' assert self.notebook if path is None: # the dialog will call us in turn with an argument return OpenPageDialog(self).run() assert isinstance(path, Path) if isinstance(path, Page) and path.valid: page = path else: page = self.notebook.get_page(path) if self.page and id(self.page) == id(page): # Check ID to enable reload_page but catch all other # redundant calls. return elif self.page: if not self.close_page(self.page): raise AssertionError, 'Could not close page' # assert statement could be optimized away logger.info('Open page: %s (%s)', page, path) self.emit('open-page', page, path) def do_open_page(self, page, path): is_first_page = self.page is None self.page = page back = self.actiongroup.get_action('open_page_back') forward = self.actiongroup.get_action('open_page_forward') parent = self.actiongroup.get_action('open_page_parent') child = self.actiongroup.get_action('open_page_child') if isinstance(path, HistoryPath): historyrecord = path self.history.set_current(path) back.set_sensitive(not path.is_first) forward.set_sensitive(not path.is_last) else: self.history.append(path) historyrecord = self.history.get_current() back.set_sensitive(not is_first_page) forward.set_sensitive(False) parent.set_sensitive(len(page.namespace) > 0) child.set_sensitive(page.haschildren) def close_page(self, page=None, final=False): '''Close the page and try to save any changes in the page. @param page: the page to close, defaults to current page in main window @param final: hint if we believe this to be the last page before quitting the page @returns: C{True} if succesful, C{False} if page still has un-saved changes. @emits: close-page ''' if page is None: page = self.page self.emit('close-page', page, final) page._parsetree = None # XXX HACK to avoid caching parsetree - can be removed # once the pageview takes care of saving the page return not page.modified def do_close_page(self, page, final): if page.modified: self.save_page(page) # No async here -- for now current = self.history.get_current() if current == page: current.cursor = self.mainwindow.pageview.get_cursor_pos() current.scroll = self.mainwindow.pageview.get_scroll_pos() def save_uistate_cb(): if self.uistate.modified: self.uistate.write_async() # else ignore silently if self.uistate.modified and hasattr(self.uistate, 'write'): # during tests we may have a config dict without config file if final: self.uistate.write() else: # Delayed signal avoid queueing many of these in a # short time when going back and forward in the history if not hasattr(self.uistate, '_delayed_async_write'): self.uistate._delayed_async_write = \ DelayedCallback(2000, save_uistate_cb) # 2 sec self.uistate._delayed_async_write() def open_page_back(self): '''Menu action to open the previous page from the history @returns: C{True} if succesful ''' record = self.history.get_previous() if not record is None: self.open_page(record) return True else: return False def open_page_forward(self): '''Menu action to open the next page from the history @returns: C{True} if succesful ''' record = self.history.get_next() if not record is None: self.open_page(record) return True else: return False def open_page_parent(self): '''Menu action to open the parent page @returns: C{True} if succesful ''' namespace = self.page.namespace if namespace: self.open_page(Path(namespace)) return True else: return False def open_page_child(self): '''Menu action to open a child page. Either takes the last child from the history, or the first child. @returns: C{True} if succesful ''' if not self.page.haschildren: return False record = self.history.get_child(self.page) if not record is None: self.open_page(record) else: pages = list(self.notebook.index.list_pages(self.page)) self.open_page(pages[0]) return True def open_page_previous(self): '''Menu action to open the previous page from the index @returns: C{True} if succesful ''' path = self.notebook.index.get_previous(self.page) if not path is None: self.open_page(path) return True else: return False def open_page_next(self): '''Menu action to open the next page from the index @returns: C{True} if succesful ''' path = self.notebook.index.get_next(self.page) if not path is None: self.open_page(path) return True else: return False def open_page_home(self): '''Menu action to open the home page''' self.open_page(self.notebook.get_home_page()) def new_page(self): '''Menu action to create a new page, shows the L{NewPageDialog}, Difference with L{open_page()} is that the page is saved directly, so it exists and is stays visible if the user navigates away without first adding content. Though subtle this is expected behavior for users. ''' NewPageDialog(self, path=self._get_path_context()).run() def new_sub_page(self): '''Menu action to create a new page, shows the L{NewPageDialog}. Like L{new_page()} but forces a child page of the current page. ''' NewPageDialog(self, path=self._get_path_context(), subpage=True).run() def new_page_from_text(self, text, name=None, use_template=False, attachments=None, open_page=False): '''Create a new page with content. This method is intended mainly for remote calls. It is used for example by the L{quicknote plugin}. @param text: the content of the page (wiki format) @param name: the page name as string, if C{None} the first line of the text is used as the basename. If the page already exists a number is added to force a unique page name. @param open_page: if C{True} navigate to this page directly @param use_template: if C{True} the "new page" template is used @param attachments: a folder as C{Dir} object or C{string} (for remote calls). All files in this folder are imported as attachments for the new page. In the text these can be referred relatively. @returns: a L{Path} object for the new page ''' # The 'open_page' and 'attachments' arguments are a bit of a # hack for remote calls. They are needed because the remote # function doesn't know the exact page name we creates... # TODO: with new zim.ipc we can now return the page name and # get rid of this hack if not name: name = text.strip()[:30] if '\n' in name: name, _ = name.split('\n', 1) name = self.notebook.cleanup_pathname(name.replace(':', ''), purge=True) elif isinstance(name, Path): name = name.name name = self.notebook.cleanup_pathname(name, purge=True) else: name = self.notebook.cleanup_pathname(name, purge=True) path = self.notebook.resolve_path(name) page = self.notebook.get_new_page(path) if use_template: template = self.notebook.get_template(page) tree = template.process_to_parsetree(self.notebook, page) page.set_parsetree(tree) page.parse('wiki', text, append=True) # FIXME format hard coded else: page.parse('wiki', text) # FIXME format hard coded self.notebook.store_page(page) if attachments: if isinstance(attachments, basestring): attachments = Dir(attachments) self.import_attachments(page, attachments) if open_page: self.present(page) return Path(page.name) def import_attachments(self, path, dir): '''Import a set of files as attachments. All files in C{folder} will be imported in the attachment dir. Any existing files will be overwritten. @param path: a L{Path} object (or C{string} for remote call) @param dir: a L{Dir} object (or C{string} for remote call) ''' if isinstance(path, basestring): path = Path(path) if isinstance(dir, basestring): dir = Dir(dir) attachments = self.notebook.get_attachments_dir(path) for name in dir.list(): # FIXME could use list objects, or list_files() file = dir.file(name) if not file.isdir(): file.copyto(attachments) def append_text_to_page(self, name, text): '''Append text to an (existing) page. This method is intended mainly for remote calls. It is used for example by the L{quicknote plugin}. @param name: the page name @param text: the content of the page (wiki format) ''' if isinstance(name, Path): name = name.name path = self.notebook.resolve_path(name) page = self.notebook.get_page(path) page.parse('wiki', text, append=True) # FIXME format hard coded self.notebook.store_page(page) def open_new_window(self, page=None): '''Menu action to open a page in a secondary L{PageWindow} @param page: the page L{Path}, deafults to current selected ''' if page is None: page = self._get_path_context() PageWindow(self, page).show_all() def save_page(self, page=None): '''Menu action to save a page. Can result in a L{SavePageErrorDialog} when there is an error while saving a page. @param page: a L{Page} object, when C{None} the current page is saved @returns: C{True} when successful, C{False} when the page still has unsaved changes ''' page = self._save_page_check_page(page) if page is None: return ## HACK - otherwise we get a bug when saving a new page immediatly # hasattr assertions used to detect when the hack breaks assert hasattr(page, '_ui_object') if page._ui_object: assert hasattr(page._ui_object, '_showing_template') page._ui_object._showing_template = False ## logger.debug('Saving page: %s', page) try: self.notebook.store_page(page) except Exception, error: logger.exception('Failed to save page: %s', page.name) self._autosave_lock.increment() # We need this flag to prevent autosave trigger while we # are showing the SavePageErrorDialog SavePageErrorDialog(self, error, page).run() self._autosave_lock.decrement() return not page.modified def save_page_async(self, page=None): '''Save a page asynchronously Like L{save_page()} but asynchronously, used e.g. when auto saving. @param page: a L{Page} object, when C{None} the current page is saved ''' page = self._save_page_check_page(page) if page is None: return logger.debug('Saving page (async): %s', page) def callback(ok, error, exc_info, name): # This callback is called back here in the main thread. # We fetch the page again just to be sure in case of strange # edge cases. The SavePageErrorDialog will just take the # current state of the page, not the state that it had in # the async thread. This is done on purpose, current state # is what the user is concerned with anyway. #~ print '!!', ok, exc_info, name if exc_info: page = self.notebook.get_page(Path(name)) logger.error('Failed to save page: %s', page.name, exc_info=exc_info) SavePageErrorDialog(self, error, page).run() self._autosave_lock.decrement() self._autosave_lock.increment() # Prevent any new auto save to be scheduled while we are # still busy with this call. self.notebook.store_page_async(page, callback=callback, data=page.name) def _save_page_check_page(self, page): # Code shared between save_page() and save_page_async() if page is None: page = self.mainwindow.pageview.get_page() try: if self.readonly: raise AssertionError, 'BUG: can not save page when read-only' elif not page: raise AssertionError, 'BUG: no page loaded' elif page.readonly: raise AssertionError, 'BUG: can not save read-only page' except Exception, error: SavePageErrorDialog(self, error, page).run() return None else: return page def save_copy(self): '''Menu action to show a L{SaveCopyDialog}''' SaveCopyDialog(self).run() def show_export(self): '''Menu action to show an L{ExportDialog}''' from zim.gui.exportdialog import ExportDialog ExportDialog(self).run() def email_page(self): '''Menu action to open an email containing the current page. Encodes the current page as "mailto:" URI and calls L{open_url()} to start the preferred email client. ''' text = ''.join(self.page.dump(format='plain')) url = 'mailto:?subject=%s&body=%s' % ( url_encode(self.page.name, mode=URL_ENCODE_DATA), url_encode(text, mode=URL_ENCODE_DATA), ) self.open_url(url) def import_page(self): '''Menu action to show an L{ImportPageDialog}''' ImportPageDialog(self).run() def move_page(self, path=None): '''Menu action to show the L{MovePageDialog} @param path: a L{Path} object, or C{None} to move to current selected page ''' if path is None: path = self._get_path_context() MovePageDialog(self, path).run() def do_move_page(self, path, newpath, update_links): '''Callback for MovePageDialog and PageIndex for executing notebook.move_page but wrapping with all the proper exception dialogs. Returns boolean for success. ''' if path == self.page and self.page.modified \ and not self.save_page(self.page): raise AssertionError, 'Could not save page' # assert statement could be optimized away # FIXME - is this raise needed ? return self._wrap_move_page( lambda update_links, callback: self.notebook.move_page( path, newpath, update_links, callback), update_links ) def rename_page(self, path=None): '''Menu action to show the L{RenamePageDialog} @param path: a L{Path} object, or C{None} for the current selected page ''' if path is None: path = self._get_path_context() RenamePageDialog(self, path).run() def do_rename_page(self, path, newbasename, update_heading=True, update_links=True): '''Callback for RenamePageDialog for executing notebook.rename_page but wrapping with all the proper exception dialogs. Returns boolean for success. ''' if path == self.page and self.page.modified \ and not self.save_page(self.page): raise AssertionError, 'Could not save page' # assert statement could be optimized away # FIXME - is this raise needed ? return self._wrap_move_page( lambda update_links, callback: self.notebook.rename_page( path, newbasename, update_heading, update_links, callback), update_links ) def _wrap_move_page(self, func, update_links): if self.notebook.index.updating: # Ask regardless of update_links because it might very # well be that the dialog thinks there are no links # but they are simply not indexed yet cont = QuestionDialog(self, _('The index is still busy updating. Until this ' 'is finished links can not be updated correctly. ' 'Performing this action now could break links, ' 'do you want to continue anyway?' ) # T: question dialog text ).run() if cont: update_links = False else: return False dialog = ProgressBarDialog(self, _('Updating Links')) # T: Title of progressbar dialog callback = lambda p, **kwarg: dialog.pulse(p.name, **kwarg) try: with dialog: func(update_links, callback) except Exception, error: ErrorDialog(self, error).run() return False else: return True def delete_page(self, path=None): '''Delete a page by either trashing it, or permanent deletion after confirmation of a L{DeletePageDialog}. When trashing the update behavior depends on the "remove_links_on_delete" preference. @param path: a L{Path} object, or C{None} for the current selected page ''' if path is None: path = self._get_path_context() if not path: return update_links = self.preferences['GtkInterface']['remove_links_on_delete'] dialog = ProgressBarDialog(self, _('Removing Links')) # T: Title of progressbar dialog callback = lambda p, **kwarg: dialog.pulse(p.name, **kwarg) try: with dialog: self.notebook.trash_page(path, update_links, callback) except TrashNotSupportedError, error: logger.info('Trash not supported: %s', error.msg) DeletePageDialog(self, path).run() except TrashCancelledError, error: pass def show_properties(self): '''Menu action to show the L{PropertiesDialog}''' from zim.gui.propertiesdialog import PropertiesDialog PropertiesDialog(self).run() def show_search(self, query=None): '''Menu action to show the L{SearchDialog} @param query: the search query to show ''' from zim.gui.searchdialog import SearchDialog if query is None: query = self.mainwindow.pageview.get_selection() dialog = SearchDialog(self) dialog.show_all() if query is not None: dialog.search(query) def show_search_backlinks(self): '''Menu action to show the L{SearchDialog} with a query for backlinks ''' query = 'LinksTo: "%s"' % self.page.name self.show_search(query) def show_recent_changes(self): '''Menu action to show the L{RecentChangesDialog}''' from .recentchangesdialog import RecentChangesDialog dialog = RecentChangesDialog.unique(self, self) dialog.present() def copy_location(self): '''Menu action to copy the current page name to the clipboard''' Clipboard.set_pagelink(self.notebook, self.page) def show_templateeditor(self): '''Menu action to show the L{TemplateEditorDialog}''' from zim.gui.templateeditordialog import TemplateEditorDialog TemplateEditorDialog(self).run() def show_preferences(self): '''Menu action to show the L{PreferencesDialog}''' from zim.gui.preferencesdialog import PreferencesDialog PreferencesDialog(self).run() def do_preferences_changed(self): self.uimanager.set_add_tearoffs( self.preferences['GtkInterface']['tearoff_menus'] ) def reload_page(self): '''Menu action to reload the current page. Will first try to save any unsaved changes, then reload the page from disk. ''' if self.page.modified \ and not self.save_page(self.page): raise AssertionError, 'Could not save page' # assert statement could be optimized away self.notebook.flush_page_cache(self.page) self.open_page(self.notebook.get_page(self.page)) def attach_file(self, path=None): '''Menu action to show the L{AttachFileDialog} @param path: a L{Path} object, or C{None} for the current selected page ''' if path is None: path = self._get_path_context() AttachFileDialog(self, path).run() def do_attach_file(self, path, file, force_overwrite=False): '''Callback for AttachFileDialog and InsertImageDialog When 'force_overwrite' is False the user will be prompted in case the new file has the same name as an existing attachment. Returns the (new) filename or None when the action was canceled. ''' dir = self.notebook.get_attachments_dir(path) if dir is None: raise Error, '%s does not have an attachments dir' % path dest = dir.file(file.basename) if dest.exists() and not force_overwrite: dialog = PromptExistingFileDialog(self, dest) dest = dialog.run() if dest is None: return None # dialog was cancelled file.copyto(dest) return dest def show_clean_notebook(self): '''Menu action to show the L{CleanNotebookDialog}''' from zim.gui.cleannotebookdialog import CleanNotebookDialog CleanNotebookDialog(self).run() def open_dir(self, dir): '''Open a L{Dir} object and prompt to create it if it doesn't exist yet. @param dir: a L{Dir} object ''' if dir.exists(): self.open_file(dir) else: question = ( _('Create folder?'), # T: Heading in a question dialog for creating a folder _('The folder "%s" does not yet exist.\nDo you want to create it now?') % dir.basename) # T: Text in a question dialog for creating a folder, %s will be the folder base name create = QuestionDialog(self, question).run() if create: dir.touch() self.open_file(dir) def open_file(self, file, mimetype=None, callback=None): '''Open a L{File} or L{Dir} in the system file browser. @param file: a L{File} or L{Dir} object @param mimetype: optionally specify the mimetype to force a specific application to open this file @param callback: callback function to be passed on to L{Application.spawn()} (if the application supports a callback, otherwise it is ignored silently) @raises NoSuchFileError: if C{file} does not exist @raises ApplicationLookupError: if a specific mimetype was given, but no default application is known for this mimetype (will not use fallback in this case - fallback would ignore the specified mimetype) ''' logger.debug('open_file(%s, %s)', file, mimetype) assert isinstance(file, (File, Dir)) if isinstance(file, (File)) and file.isdir(): file = Dir(file.path) if not file.exists(): raise NoSuchFileError, file if isinstance(file, File): # File manager = ApplicationManager() if mimetype is None: entry = manager.get_default_application(file.get_mimetype()) else: entry = manager.get_default_application(mimetype) if entry is None: raise ApplicationLookupError, 'No Application found for: %s' % mimetype # Do not go to fallback, we can not force # mimetype for fallback if entry: self._open_with(entry, file, callback) else: self._open_with_filebrowser(file, callback) else: # Dir self._open_with_filebrowser(file, callback) def open_url(self, url): '''Open an URL (or URI) in the web browser or other relevant program. The application is determined based on the URL / URI scheme. Unkown schemes and "file://" URIs are opened with the webbrowser. @param url: the URL to open, e.g. "http://zim-wiki.org" or "mailto:someone@somewhere.org" ''' logger.debug('open_url(%s)', url) assert isinstance(url, basestring) if is_url_re.match(url): # Try custom handlers if is_url_re[1] in self.url_handlers: handled = self.url_handlers[is_url_re[1]](url) if handled: return else: pass # handled below elif is_win32_share_re.match(url): url = normalize_win32_share(url) if os.name == 'nt': return self._open_with_filebrowser(url) # else consider as a x-scheme-handler/smb type URI elif not is_uri_re.match(url): raise AssertionError, 'Not an URL: %s' % url # Default handlers if url.startswith('zim+'): # Notebook URL, these we handle ourselves self.open_notebook(url) elif url.startswith('file:/'): # Special case, force to browser (and not to open_file ... # even though the result may be the same if the browser is # dispatched through xdg-open, gnome-open, ...) self._open_with_webbrowser(url) elif url.startswith('outlook:') and hasattr(os, 'startfile'): # Special case for outlook folder paths on windows os.startfile(url) else: manager = ApplicationManager() type = zim.gui.applications.get_mimetype(url) logger.debug('Got type "%s" for "%s"', type, url) entry = manager.get_default_application(type) if entry: self._open_with(entry, url) elif url.startswith('mailto:'): self._open_with_emailclient(url) else: self._open_with_webbrowser(url) def _open_with_filebrowser(self, file, callback=None): # Fallback for files and folders, used by open_file() entry = ApplicationManager.get_fallback_filebrowser() self._open_with(entry, file, callback) def _open_with_emailclient(self, uri): # Fallback for "mailto:" URIs, used by open_url() entry = ApplicationManager.get_fallback_emailclient() self._open_with(entry, uri) def _open_with_webbrowser(self, url): # Fallback for other URLs and URIs, used by open_url() entry = ApplicationManager.get_fallback_webbrowser() self._open_with(entry, url) def _open_with(self, entry, uri, callback=None): def check_error(status): if status != 0: ErrorDialog(self, _('Could not open: %s') % uri).run() # T: error when external application fails if callback is None: callback = check_error try: entry.spawn((uri,), callback=callback) except NotImplementedError: entry.spawn((uri,)) # E.g. webbrowser module def open_attachments_folder(self): '''Menu action to open the attachment folder for the current page''' dir = self.notebook.get_attachments_dir(self.page) if dir is None: error = _('This page does not have an attachments folder') # T: Error message ErrorDialog(self, error).run() else: self.open_dir(dir) def open_notebook_folder(self): '''Menu action to open the notebook folder''' if self.notebook.dir: self.open_file(self.notebook.dir) elif self.notebook.file: self.open_file(self.notebook.file.dir) else: assert False, 'BUG: notebook has neither dir or file' def open_document_root(self): '''Menu action to open the document root folder''' dir = self.notebook.document_root if dir: self.open_dir(dir) def open_document_folder(self): '''Menu action to open a sub-foldel of the document root folder for the current page ''' dir = self.notebook.document_root if dir is None: return dirpath = encode_filename(self.page.name) dir = Dir([dir, dirpath]) self.open_dir(dir) def edit_page_source(self, page=None): '''Menu action to edit the page source in an external editor. See L{edit_file} for details. @param page: the L{Page} object, or C{None} for te current page ''' # This could also be defined as a custom tool, but defined here # because we want to determine the editor dynamically # We assume that the default app for a text file is a editor # and not e.g. a viewer or a browser. Of course users can still # define a custom tool for other editors. if not page: page = self.page if not hasattr(self.page, 'source'): ErrorDialog(self, 'This page does not have a source file').run() return if page.modified: ok = self.save_page(page) if not ok: ErrorDialog(self, 'Page has unsaved changes') return self.edit_file(self.page.source, istextfile=True) if page == self.page: self.reload_page() def edit_config_file(self, configfile): '''Edit a config file in an external editor. See L{edit_file()} for details. @param configfile: a L{ConfigFile} object ''' configfile.touch() self.edit_file(configfile.file, istextfile=True) def edit_file(self, file, istextfile=None, dialog=None): '''Edit a file with and external application. This method will show a dialog to block the interface while the external application is running. The dialog is closed automatically when the application exits _after_ modifying the file. If the file is unmodified the user needs to click the "Done" button in the dialog because we can not know if the application was really done or just forked to another process. @param file: a L{File} object @param istextfile: if C{True} the text editor is used, otherwise we ask the file browser for the correct application. When C{None} we check the mimetype of the file to determine if it is text or not. @param dialog: the dialog that is spawning this action ''' ## FIXME force using real text editor, even when file has not ## text mimetype. This now goes wrong when editing e.g. a html ## template when the editor is "xdg-open" on linux or default ## os.startfile() on windows... if not file.exists(): raise NoSuchFileError, file oldmtime = file.mtime() window = dialog or self dialog = MessageDialog(window, ( _('Editing file: %s') % file.basename, # T: main text for dialog for editing external files _('You are editing a file in an external application. You can close this dialog when you are done') # T: description for dialog for editing external files ) ) def check_close_dialog(status): if status != 0: dialog.destroy() ErrorDialog(window, _('Could not open: %s') % file.basename).run() # T: error when external application fails else: newmtime = file.mtime() if newmtime != oldmtime: dialog.destroy() if istextfile: try: self.open_file(file, mimetype='text/plain', callback=check_close_dialog) except ApplicationLookupError: app = AddApplicationDialog(window, 'text/plain').run() if app: # Try again self.open_file(file, mimetype='text/plain', callback=check_close_dialog) else: return # Dialog was cancelled, no default set, ... else: self.open_file(file, callback=check_close_dialog) dialog.run() def show_server_gui(self): '''Menu action to show the server interface from L{zim.gui.server}. Spawns a new zim instance for the server. ''' # TODO instead of spawn, include in this process ZimCmd(('--server', '--gui', self.notebook.uri)).spawn() def reload_index(self, flush=False): '''Check the notebook for changes and update the index. Shows an progressbar while updateing. @param flush: if C{True} the index is flushed and rebuild from scratch @returns: C{True} unless the user cancelled the update ''' self.emit('start-index-update') index = self.notebook.index index.stop_updating() if flush: index.flush() dialog = ProgressBarDialog(self, _('Updating index')) # T: Title of progressbar dialog with dialog: index.update(callback=lambda p: dialog.pulse(p.name)) self.emit('end-index-update') return not dialog.cancelled def manage_custom_tools(self): '''Menu action to show the L{CustomToolManagerDialog}''' from zim.gui.customtools import CustomToolManagerDialog CustomToolManagerDialog(self).run() self.load_custom_tools() def load_custom_tools(self): '''Load the custom tools of the L{CustomToolManager} in the menu bar. ''' manager = CustomToolManager() # Remove old actions if self._custom_tool_ui_id: self.uimanager.remove_ui(self._custom_tool_ui_id) if self._custom_tool_actiongroup: self.uimanager.remove_action_group(self._custom_tool_actiongroup) if self._custom_tool_iconfactory: self._custom_tool_iconfactory.remove_default() # Load new actions actions = [] factory = gtk.IconFactory() factory.add_default() for tool in manager: icon = tool.icon if '/' in icon or '\\' in icon: # Assume icon is a file path - add it to IconFactory icon = 'zim-custom-tool' + tool.key try: pixbuf = tool.get_pixbuf(gtk.ICON_SIZE_LARGE_TOOLBAR) set = gtk.IconSet(pixbuf=pixbuf) factory.add(icon, set) except Exception: logger.exception('Got exception while loading application icons') icon = None action = (tool.key, icon, tool.name, '', tool.comment, self._exec_custom_tool) actions.append(action) self._custom_tool_iconfactory = factory self._custom_tool_actiongroup = gtk.ActionGroup('custom_tools') self._custom_tool_actiongroup.add_actions(actions) menulines = ["\n" % tool.key for tool in manager] toollines = ["\n" % tool.key for tool in manager if tool.showintoolbar] textlines = ["\n" % tool.key for tool in manager if tool.showincontextmenu == 'Text'] pagelines = ["\n" % tool.key for tool in manager if tool.showincontextmenu == 'Page'] ui = """\ %s %s %s %s """ % ( ''.join(menulines), ''.join(toollines), ''.join(textlines), ''.join(pagelines) ) self.uimanager.insert_action_group(self._custom_tool_actiongroup, 0) self._custom_tool_ui_id = self.uimanager.add_ui_from_string(ui) def _exec_custom_tool(self, action): manager = CustomToolManager() tool = manager.get_tool(action.get_name()) logger.info('Execute custom tool %s', tool.name) args = (self.notebook, self.page, self.mainwindow.pageview) try: if tool.isreadonly: tool.spawn(args) else: tool.run(args) self.reload_page() self.notebook.index.update_async() # TODO instead of using run, use spawn and show dialog # with cancel button. Dialog blocks ui. except Exception, error: ErrorDialog(self, error).run() def show_help(self, page=None): '''Menu action to show the user manual. Will start a new zim instance showing the notebook with the manual. @param page: manual page to show (string) ''' if page: ZimCmd(('--manual', page)).spawn() else: ZimCmd(('--manual',)).spawn() def show_help_faq(self): '''Menu action to show the 'FAQ' page in the user manual''' self.show_help('FAQ') def show_help_keys(self): '''Menu action to show the 'Key Bindings' page in the user manual''' self.show_help('Help:Key Bindings') def show_help_bugs(self): '''Menu action to show the 'Bugs' page in the user manual''' self.show_help('Bugs') def show_about(self): '''Menu action to show the "about" dialog''' gtk.about_dialog_set_url_hook(lambda d, l: self.open_url(l)) gtk.about_dialog_set_email_hook(lambda d, l: self.open_url(l)) dialog = gtk.AboutDialog() try: # since gtk 2.12 dialog.set_program_name('Zim') except AttributeError: pass dialog.set_version(zim.__version__) dialog.set_comments(_('A desktop wiki')) # T: General description of zim itself file = data_file('zim.png') pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) dialog.set_logo(pixbuf) dialog.set_copyright(zim.__copyright__) dialog.set_license(zim.__license__) dialog.set_authors([zim.__author__]) dialog.set_translator_credits(_('translator-credits')) # T: This string needs to be translated with names of the translators for this language dialog.set_website(zim.__url__) dialog.run() dialog.destroy() # Need to register classes defining gobject signals gobject.type_register(GtkInterface) class ResourceOpener(object): def __init__(self, window): self.window = window def open_page(self, path, new_window=False): if new_window: self.window.ui.open_new_window(path) # XXX else: self.window.ui.open_page(path) # XXX def open_dir(self, dir): self.window.ui.open_dir(dir) def open_file(self, url): self.window.ui.open_file(url) def open_url(self, url): self.window.ui.open_url(url) class MainWindow(Window): '''This class implements the main window of the application. It contains the main L{PageView} and the side pane with a L{PageIndex}. Also includes the menubar, toolbar, L{PathBar}, statusbar etc. @ivar pageview: the L{PageView} object @ivar pageindex: the L{PageIndex} object @ivar pathbar: the L{PathBar} object @signal: C{fullscreen-changed ()}: emitted when switching to or from fullscreen state ''' # define signals we want to use - (closure type, return type and arg types) __gsignals__ = { 'fullscreen-changed': (gobject.SIGNAL_RUN_LAST, None, ()), } def __init__(self, ui, fullscreen=False, geometry=None): '''Constructor @param ui: the L{GtkInterFace} @param fullscreen: if C{True} the window is shown fullscreen, if C{None} the previous state is restored @param geometry: the window geometry as string in format "C{WxH+X+Y}", if C{None} the previous state is restored ''' Window.__init__(self) self.isfullscreen = False self.ui = ui ui.connect('open-page', self.on_open_page) ui.connect('close-page', self.on_close_page) ui.connect('preferences-changed', self.do_preferences_changed) self._block_toggle_panes = False self._sidepane_autoclose = False self._switch_focus_accelgroup = None # Catching this signal prevents the window to actually be destroyed # when the user tries to close it. The action for close should either # hide or destroy the window. def do_delete_event(*a): logger.debug('Action: close (delete-event)') self.hide() # look more responsive ui.close() return True # Do not destroy - let close() handle it self.connect('delete-event', do_delete_event) # setup the window layout from zim.gui.widgets import TOP, BOTTOM, TOP_PANE, LEFT_PANE # setup menubar and toolbar self.add_accel_group(ui.uimanager.get_accel_group()) self.menubar = ui.uimanager.get_widget('/menubar') self.toolbar = ui.uimanager.get_widget('/toolbar') self.toolbar.connect('popup-context-menu', self.do_toolbar_popup) self.add_bar(self.menubar, TOP) self.add_bar(self.toolbar, TOP) self.pageindex = PageIndex(ui) self.add_tab(_('Index'), self.pageindex, LEFT_PANE) # T: Label for pageindex tab self.pathbar = None self.pathbar_box = gtk.HBox() self.add_widget(self.pathbar_box, (TOP_PANE, TOP)) self.pageview = PageView(ui) self.pageview.view.connect_after( 'toggle-overwrite', self.do_textview_toggle_overwrite) self.add(self.pageview) # create statusbar hbox = gtk.HBox(spacing=0) self.add_bar(hbox, BOTTOM) self.statusbar = gtk.Statusbar() if ui_environment['platform'] == 'maemo': # Maemo windows aren't resizeable so it makes no sense to show the resize grip self.statusbar.set_has_resize_grip(False) self.statusbar.push(0, '') hbox.add(self.statusbar) def statusbar_element(string, size): frame = gtk.Frame() frame.set_shadow_type(gtk.SHADOW_IN) self.statusbar.pack_end(frame, False) label = gtk.Label(string) label.set_size_request(size, 10) label.set_alignment(0.1, 0.5) frame.add(label) return label # specify statusbar elements right-to-left self.statusbar_style_label = statusbar_element(' [% IF pages.previous -%] [ Prev ] [%- ELSE -%] [ Prev ] [%- END %] [% IF page.properties.type == 'namespace-index' -%] [ Index ] [%- ELSE -%] [% IF pages.index -%] [ Index ] [%- ELSE -%] [ Index ] [%- END %] [%- END %] [% IF pages.next -%] [ Next ] [%- ELSE -%] [ Next ] [%- END %]
    [% IF page.properties.type == 'namespace-index' -%]

    Document Index

    [%- ELSE -%]

    [% page.heading %]

    [%- END %] [% page.body %]
    Powered by Zim [% zim.version %] [% IF page.backlinks -%] Backlinks: [%- FOREACH link = page.backlinks -%] [% link.name %] [%- END -%] [%- ELSE -%] No backlinks to this page. [%- END %] zim-0.60/tests/data/templates/html/Default/0000775000175000017500000000000012140000463020477 5ustar jaapjaap00000000000000zim-0.60/tests/data/templates/html/Default/checked-box.png0000644000175000017500000000220111603161020023352 0ustar jaapjaap00000000000000PNG  IHDRw=sRGBbKGD pHYs 9 A \tIME #$ytEXtCommentCreated with GIMPWIDATHǭoE3񮍿 @#K78/pTP@\PWP[ڦR)$q썽p4i:73<#\gfLi?N}j1(Rbܷ4MZ&cd2oKkmV )%r?gO5J4MWV,j'i$E{c[% ANsml6CV\.on[|^j*n@AEhUTLzJ)O04Xߓ8y+4nc^RŁ~33+a ݏ089ͪKyQA4ޣZmYxfcf2O 7t;8y 9Z&v@!(ܘǟ"6M{2,J)0$".snT%]b}M0DJIV#Z?v `ƒ)yN ?4`4(+,unCE)8 @)O !nqxG.E Jr~{wv:6 JcqUٛv2J`(hܼmvX^Y!I zhw4 0WBk͹HӔb)dY,"c0\Ø~41pp+,`qqC'QiJ>?R c!aQ,z+Rxz$Izl&s0nY__'}#Gatί \qr9F^x FF ykoL/_@)E :W;8 T*1mgw`|bcwXmX^i"S5RJ7 D)IENDB`zim-0.60/tests/data/templates/html/Default/foo/0000775000175000017500000000000012140000463021262 5ustar jaapjaap00000000000000zim-0.60/tests/data/templates/html/Default/foo/bar.png0000644000175000017500000000001011603161020022521 0ustar jaapjaap00000000000000FOO BAR zim-0.60/tests/data/formats/0000775000175000017500000000000012140000463015624 5ustar jaapjaap00000000000000zim-0.60/tests/data/formats/README.txt0000664000175000017500000000046211721135010017325 0ustar jaapjaap00000000000000This folder contains an example page in various formats for testing the conversions from one format to another. In order to update the contents you typically make changes to "wiki.txt" and run update.sh to update the other files. MAKE SURE THE UPDATES ARE CORRECT by inspecting the diffs very carefully! zim-0.60/tests/data/formats/plain.txt0000664000175000017500000000536512061710641017511 0ustar jaapjaap00000000000000Head 1 ====== Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. head 2 ------ bold, italic and underline and verbatim and also strike through This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> "" Some sub- and superscript like x2 and H2O And some empty space here: ### head 3 foo links to page in the current namespace or parents :foo links to page in the root namespace +foo links to page in a subnamespace bar links to "foo" but display "bar" :foo:bar ./file.png file:///etc/passwd FooBar mailto:foo@bar.org wp?Test External links like http://nongnu.org and foo@bar.org are also supported [not:a:link] ./foobar.png ./foobar.png?height=50 Foo Bar my-image.png?href=Foo Foo Bar ./equation001.png?type=equation This equation has a source .tex file ./equation002.png?type=equation for this one it is missing {./Not/an/image.png} Tags: @foo @bar #### head 4 * item 1 * item 2 * item 3 * item a * item b * item 4 Indented list: * item 1 * item 2 * item 3 * item a * item b * item 4 TODO list: [ ] foo [*] bar [*] sub item 1 * Some normal bullet [*] sub item 2 [x] baz A numbered list: 1. foo 2. bar a. sub list b. here 3. hmmm Start with number other that 1/a/A C. foo D. bar 3. sub item start with 3 E. baz ##### head 5 some verbatim blocks: Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. def foo(self, bar, baz): '''Some doc string here @param bar: value for bar @param baz: value for baz @returns: foo ''' returen "foo" + bar % baz Internationalization -------------------- ### 中文 This section has a chinese heading Lines below are in right to left script: חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה aaa ==== This is not a header That's all ... zim-0.60/tests/data/formats/export.tex0000664000175000017500000001022012061710641017672 0ustar jaapjaap00000000000000\chapter{Head 1} Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \section{head 2} \textbf{bold}, \emph{italic} and \uline{underline} and \lstinline+verbatim+ and also \sout{strike through} This is not formatted: *bold*, /italic/ / * *\^{}\%\# @\# \$ \# !@)\_!)\_ \$ \textless{}\textgreater{} "" Some sub- and superscript like x$^{2}$ and H$_{2}$O And some empty space here: \subsection{head 3} \href{foo}{foo} links to page in the current namespace or parents \href{:foo}{:foo} links to page in the root namespace \href{+foo}{+foo} links to page in a subnamespace \href{foo}{bar} links to "foo" but display "bar" \href{:foo:bar}{:foo:bar} \href{./file.png}{./file.png} \href{file:///etc/passwd}{file:///etc/passwd} \href{Foo}{Foo}\href{Bar}{Bar} \href{mailto:foo@bar.org}{mailto:foo@bar.org} \href{http://en.wikipedia.org/wiki/Test}{wp?Test} External links like \href{http://nongnu.org}{http://nongnu.org} and \href{mailto:foo@bar.org}{foo@bar.org} are also supported [not:a:link] \includegraphics[]{./foobar.png} \includegraphics[height=0.520833in, keepaspectratio=true]{./foobar.png} \includegraphics[width=6.250000in, keepaspectratio=true]{../my-image.png} \href{Foo}{\includegraphics[]{my-image.png}} \href{:foo:bar}{\includegraphics[width=6.250000in, keepaspectratio=true]{../my-image.png}} \begin{math} \int \frac{1}{x} \, d x \end{math} This equation has a source .tex file \includegraphics[]{./equation002.png} for this one it is missing {./Not/an/image.png} Tags: @foo @bar \subsubsection{head 4} \begin{itemize} \item item 1 \item item 2 \item item 3 \begin{itemize} \item item a \item item b \end{itemize}\item item 4 \end{itemize} Indented list: \begin{itemize} \item item 1 \item item 2 \item item 3 \begin{itemize} \item item a \item item b \end{itemize}\item item 4 \end{itemize} TODO list: \begin{itemize} \item[\Square] foo \item[\CheckedBox] bar \begin{itemize} \item[\CheckedBox] sub item 1 \begin{itemize} \item Some normal bullet \end{itemize} \item[\CheckedBox] sub item 2 \end{itemize}\item[\XBox] baz \end{itemize} A numbered list: \begin{enumerate}[1] \item foo \item bar \begin{enumerate}[a] \item sub list \item here \end{enumerate}\item hmmm \end{enumerate} Start with number other that 1/a/A \begin{enumerate}[A] \setcounter{enumi}{2} \item foo \item bar \begin{enumerate}[1] \setcounter{enumi}{2} \item sub item start with 3 \end{enumerate}\item baz \end{enumerate} \paragraph{head 5} \emph{some verbatim blocks}: \begin{lstlisting} Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. \end{lstlisting} \begin{lstlisting} Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. \end{lstlisting} \begin{lstlisting} def foo(self, bar, baz): '''Some doc string here @param bar: value for bar @param baz: value for baz @returns: foo ''' returen "foo" + bar % baz \end{lstlisting} \section{Internationalization} \subsection{中文} This section has a chinese heading Lines below are in right to left script: חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה aaa ==== This is not a header That's all ... zim-0.60/tests/data/formats/equation001.tex0000664000175000017500000000003011741113046020415 0ustar jaapjaap00000000000000\int \frac{1}{x} \, d x zim-0.60/tests/data/formats/parsetree.xml0000664000175000017500000001055012061710640020350 0ustar jaapjaap00000000000000 Head 1

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    head 2

    bold, italic and underline and verbatim and also strike through

    This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> ""

    Some sub- and superscript like x2 and H2O

    And some empty space here:

    head 3

    foo links to page in the current namespace or parents :foo links to page in the root namespace +foo links to page in a subnamespace bar links to "foo" but display "bar"

    :foo:bar ./file.png file:///etc/passwd FooBar

    mailto:foo@bar.org wp?Test

    External links like http://nongnu.org and foo@bar.org are also supported

    [not:a:link]

    Foo Bar Foo Bar

    This equation has a source .tex file for this one it is missing

    {./Not/an/image.png}

    Tags: @foo @bar

    head 4

    • item 1
    • item 2
    • item 3
      • item a
      • item b
    • item 4

    Indented list:

    • item 1
    • item 2
    • item 3
      • item a
      • item b
    • item 4

    TODO list:

    • foo
    • bar
      • sub item 1
        • Some normal bullet
      • sub item 2
    • baz

    A numbered list:

    1. foo
    2. bar
      1. sub list
      2. here
    3. hmmm

    Start with number other that 1/a/A

    1. foo
    2. bar
      1. sub item start with 3
    3. baz

    head 5

    some verbatim blocks:

    Sing, O goddess, the rage of
    Achilles son of Peleus, that
    brought countless ills upon
    the Achaeans.
    
    Sing, O goddess, the rage of
    Achilles son of Peleus, that
    brought countless ills upon
    the Achaeans.
    
    def foo(self, bar, baz):
    	'''Some doc string here
    	@param bar: value for bar
    	@param baz: value for baz
    	@returns: foo
    	'''
    	returen "foo" + bar % baz
    
    Internationalization 中文

    This section has a chinese heading

    Lines below are in right to left script:

    חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה

    aaa

    ==== This is not a header

    That's all ...

    zim-0.60/tests/data/formats/update.sh0000775000175000017500000000070611767674365017510 0ustar jaapjaap00000000000000#!/bin/sh P='tests/data/formats' cat $P/wiki.txt | python -m zim.formats wiki > $P/parsetree.xml cat $P/wiki.txt | python -m zim.formats wiki plain $P > $P/plain.txt cat $P/wiki.txt | python -m zim.formats wiki html $P > $P/export.html cat $P/wiki.txt | python -m zim.formats wiki latex $P > $P/export.tex cat $P/wiki.txt | python -m zim.formats wiki markdown $P > $P/export.markdown cat $P/wiki.txt | python -m zim.formats wiki rst $P > $P/export.rst zim-0.60/tests/data/formats/export.markdown0000664000175000017500000000566112061710641020731 0ustar jaapjaap00000000000000Head 1 ====== Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. head 2 ------ **bold**, *italic* and __underline__ and ``verbatim`` and also ~~strike through~~ This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> "" Some sub- and superscript like x^2^ and H~2~O And some empty space here: ### head 3 [foo](foo) links to page in the current namespace or parents [:foo](:foo) links to page in the root namespace [+foo](+foo) links to page in a subnamespace [bar](foo) links to "foo" but display "bar" [:foo:bar](:foo:bar) [./file.png](./file.png) [Foo](Foo)[Bar](Bar) [wp?Test](http://en.wikipedia.org/wiki/Test) External links like and [foo@bar.org](mailto:foo@bar.org) are also supported [not:a:link] ![](./foobar.png) ![](./foobar.png) ![Foo Bar](../my-image.png) ![](my-image.png) ![Foo Bar](../my-image.png) ![](./equation001.png) This equation has a source .tex file ![](./equation002.png) for this one it is missing {./Not/an/image.png} Tags: @foo @bar #### head 4 * item 1 * item 2 * item 3 * item a * item b * item 4 Indented list: * item 1 * item 2 * item 3 * item a * item b * item 4 TODO list: * ☐ foo * ☑ bar * ☑ sub item 1 * Some normal bullet * ☑ sub item 2 * ☒ baz A numbered list: 1. foo 2. bar a. sub list b. here 3. hmmm Start with number other that 1/a/A C. foo D. bar 3. sub item start with 3 E. baz ##### head 5 *some verbatim blocks*: Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. def foo(self, bar, baz): '''Some doc string here @param bar: value for bar @param baz: value for baz @returns: foo ''' returen "foo" + bar % baz Internationalization -------------------- ### 中文 This section has a chinese heading Lines below are in right to left script: חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה aaa ==== This is not a header That's all ... zim-0.60/tests/data/formats/export.html0000664000175000017500000001200312061710641020037 0ustar jaapjaap00000000000000

    Head 1

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
    ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
    aliquip ex ea commodo consequat. Duis aute irure dolor in
    reprehenderit in voluptate velit esse cillum dolore eu fugiat
    nulla pariatur. Excepteur sint occaecat cupidatat non proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
    ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
    aliquip ex ea commodo consequat. Duis aute irure dolor in
    reprehenderit in voluptate velit esse cillum dolore eu fugiat
    nulla pariatur. Excepteur sint occaecat cupidatat non proident,
    sunt in culpa qui officia deserunt mollit anim id est laborum.

    head 2

    bold, italic and underline and verbatim
    and also strike through

    This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> ""

    Some sub- and superscript like x2 and H2O

    And some empty space here:

    head 3

    foo links to page in the current namespace or parents
    :foo links to page in the root namespace
    +foo links to page in a subnamespace
    bar links to "foo" but display "bar"

    :foo:bar ./file.png file:///etc/passwd
    FooBar

    mailto:foo@bar.org
    wp?Test

    External links like http://nongnu.org and foo@bar.org are also supported

    [not:a:link]



    Foo Bar

    Foo Bar

    This equation has a source .tex file
    for this one it is missing

    {./Not/an/image.png}

    Tags: @foo @bar

    head 4

    • item 1
    • item 2
    • item 3
      • item a
      • item b
    • item 4

    Indented list:

    • item 1
    • item 2
    • item 3
      • item a
      • item b
    • item 4

    TODO list:

    • foo
    • bar
      • sub item 1
        • Some normal bullet
      • sub item 2
    • baz

    A numbered list:

    1. foo
    2. bar
      1. sub list
      2. here
    3. hmmm

    Start with number other that 1/a/A

    1. foo
    2. bar
      1. sub item start with 3
    3. baz

    head 5

    some verbatim blocks:

    Sing, O goddess, the rage of
    Achilles son of Peleus, that
    brought countless ills upon
    the Achaeans.
    
    Sing, O goddess, the rage of
    Achilles son of Peleus, that
    brought countless ills upon
    the Achaeans.
    
    def foo(self, bar, baz):
    	'''Some doc string here
    	@param bar: value for bar
    	@param baz: value for baz
    	@returns: foo
    	'''
    	returen "foo" + bar % baz
    

    Internationalization

    中文

    This section has a chinese heading

    Lines below are in right to left script:

    חדו"א
    מד"ר
    מכניקת מוצקים 2
    A line in English, should be left aligned.
    דינמיקה

    aaa

    ====
    This is not a header

    That's all ...

    zim-0.60/tests/data/formats/wiki.txt0000664000175000017500000000570711741113046017351 0ustar jaapjaap00000000000000====== Head 1 ====== Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ===== head 2 ===== **bold**, //italic// and __underline__ and ''verbatim'' and also ~~strike through~~ This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> "" Some sub- and superscript like x^{2} and H_{2}O And some empty space here: ==== head 3 ==== [[foo]] links to page in the current namespace or parents [[:foo]] links to page in the root namespace [[+foo]] links to page in a subnamespace [[foo|bar]] links to "foo" but display "bar" [[:foo:bar]] [[./file.png]] file:///etc/passwd [[Foo]][[Bar]] mailto:foo@bar.org [[wp?Test]] External links like http://nongnu.org and foo@bar.org are also supported [not:a:link] {{./foobar.png}} {{./foobar.png?height=50}} {{../my-image.png?width=600|Foo Bar}} {{my-image.png?href=Foo}} {{../my-image.png?href=:foo:bar&width=600|Foo Bar}} {{./equation001.png?type=equation}} This equation has a source .tex file {{./equation002.png?type=equation}} for this one it is missing {./Not/an/image.png} Tags: @foo @bar === head 4 === * item 1 * item 2 * item 3 * item a * item b * item 4 Indented list: * item 1 * item 2 * item 3 * item a * item b * item 4 TODO list: [ ] foo [*] bar [*] sub item 1 * Some normal bullet [*] sub item 2 [x] baz A numbered list: 1. foo 2. bar a. sub list b. here 3. hmmm Start with number other that 1/a/A C. foo D. bar 3. sub item start with 3 E. baz == head 5 == //some verbatim blocks//: ''' Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. ''' ''' Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. ''' ''' def foo(self, bar, baz): '''Some doc string here @param bar: value for bar @param baz: value for baz @returns: foo ''' returen "foo" + bar % baz ''' ===== Internationalization ===== ==== 中文 ==== This section has a chinese heading Lines below are in right to left script: חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה aaa ==== This is not a header That's all ... zim-0.60/tests/data/formats/export.rst0000664000175000017500000000607512061710641017717 0ustar jaapjaap00000000000000Head 1 ====== Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. head 2 ------ **bold** , *italic* and underline and ``verbatim`` and also strike through This is not formatted: *bold*, /italic/ / * *^%#@#$#!@)_!)_ & <> "" Some sub- and superscript like x:sup:`2`\ and H:sub:`2`\ O And some empty space here: head 3 ^^^^^^ `foo `_ links to page in the current namespace or parents `:foo <:foo>`_ links to page in the root namespace `+foo <+foo>`_ links to page in a subnamespace `bar `_ links to "foo" but display "bar" `:foo:bar <:foo:bar>`_ `./file.png <./file.png>`_ `file:///etc/passwd `_ `Foo `_`Bar `_ `mailto:foo@bar.org `_ `wp?Test `_ External links like `http://nongnu.org `_ and `foo@bar.org `_ are also supported [not:a:link] .. image:: ./foobar.png .. image:: ./foobar.png .. image:: ../my-image.png .. image:: my-image.png .. image:: ../my-image.png .. image:: ./equation001.png This equation has a source .tex file .. image:: ./equation002.png for this one it is missing {./Not/an/image.png} Tags: @foo @bar head 4 """""" - item 1 - item 2 - item 3 - item a - item b - item 4 Indented list: - item 1 - item 2 - item 3 - item a - item b - item 4 TODO list: * ☐ foo * ☑ bar * ☑ sub item 1 - Some normal bullet * ☑ sub item 2 * ☒ baz A numbered list: 1. foo 2. bar a. sub list b. here 3. hmmm Start with number other that 1/a/A C. foo D. bar 3. sub item start with 3 E. baz head 5 """""" *some verbatim blocks* : :: Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. :: Sing, O goddess, the rage of Achilles son of Peleus, that brought countless ills upon the Achaeans. :: def foo(self, bar, baz): '''Some doc string here @param bar: value for bar @param baz: value for baz @returns: foo ''' returen "foo" + bar % baz Internationalization -------------------- 中文 ^^ This section has a chinese heading Lines below are in right to left script: חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה aaa ==== This is not a header That's all ... zim-0.60/tests/data/notebook-wiki.xml0000644000175000017500000001764611763211001017472 0ustar jaapjaap00000000000000 TEst 123 TODO: fix 1 !!! TODO: * fix 2 24/3/08 !! * fix 3 ! TODO: test 123 test !! * foo ! - TODO * bar ! - TODO * baz - TODO [[Test:Foo:BAR]] Try all kind of combos - see if the parser trips TODO: [ ] A [ ] B [ ] C [ ] D [ ] E FIXME: dus ~~FIXME:~~ foo [ ] Simple [ ] List [ ] List with [ ] Nested items [*] Some are done [x] Others not [ ] FOOOOO [ ] Bar [ ] And then there are @tags [ ] And due dates [ ] Date [d: 11/12] [ ] Date [d: 11/12/2012] [ ] TODO: BAR !!! TODO @home: [ ] Some more tasks !!! [ ] Foo ! [ ] Bar TODO: dus FIXME: jaja - TODO !! @FIXME Trash me! Trash me! Trash me! Content-Type: text/x-zim-wiki Wiki-Format: zim 0.26 ====== Foo Bar ====== This is a **test page** to see how parsing goes when ''we'' ''loop'', arbitrary //content// through our __parser__ The was pre formatted but is not anymore in versions >= 0.26 ''' This however should now be verbatim ''' ''' this too by the way ! ''' ($ROOT, $PAGE, @BACK, @FORW, $UNDO, $REDO); my (%tree_iter, $tree_loaded, $pane_visible); my (@undo_chars, $undo_lock, $save_lock, $overwrite_toggle); my %undo_steps = ( delete => 'insert', insert => 'delete', apply_tag => 'remove_tag', remove_tag => 'apply_tag' ); my $link_icon = Gtk2->CHECK_VERSION(2, 6, 0) ? 'gtk-connect' : 'gtk-convert'; # gtk-connect stock item was introduced in 2.6.0 my $DATA_DIR = find_data_dir(); my $ICON_FILE = File::Spec->catfile($DATA_DIR, qw/images zim64.png/); my %opts = ( 'read_only' => 0 ); for (@ARGV) { next unless /^-/; if (/^(--version|-v)$/) { print version(); exit; } elsif (/^--read-?o my $iter = $buffer->get_iter_at_mark($buffer->get_insert()); return parse_backspace($iter); } elsif ($val == $k_tab or $val == ord(' ')) { # Other WhiteSpace my $buffer = $self->get_buffer; my $iter = $buffer->get_iter_at_mark($buffer->get_insert()); my $string = ($val == $k_tab) ? "\t" : ' '; return parse_word($iter, $string); } #else { printf "key %x pressed\n", $val } # perldoc -m Gtk2::Gdk::Keysyms return 0; } ) unless $opts{read_only}; Glib::Timeout->add(5000, \&save_page) unless $opts{read_only}; # TODO also use this timer for maintaining an undo stack # ################# # some pre format dsfdf dfssdf sdfsdf sdf sdf *&^*&%*& ===== So ===== what do we need to type * to make * the parser * vomit * ??? dfsfds sdfd fdsfdsfdsfds {{foo.png}}{{bar.png}} {{foo.tex|foo.png}} fsdfds === fdsfds === 123 test sdffdsfds ====== Foo ====== # This page is used among others for testing export bar baz [[foo:bar]] [[http://foo.org/bar]] [[mailto:foo@bar.org]] [[foo@bar.org]] [[/foo/bar.pdf]] {{/foo/bar.pdf}} [[~/foo/bar.pdf]] {{~/foo/bar.pdf}} = FOO Bar = [[wIKi]] [[test:foo]] •• Search Me •• = Tags = This page contains @tags in all kind of@places like the @beginning of a line or its @end but also after @tabs i.e. within @verbatim blocks within [[foo:bar|Link @captions]] as well as * @enumerations Not to forget within == @Headings == and === Their last @word === And with a different @encoding It also tests which weird @s!gns (sees only "s") and @num6ers @wit#in (aka "wit") tags and tries hard to @cr@sh ("cr") the parser. Testing with whitespace in page name ====== Head1 ====== ===== Head 2 ===== Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ''' Some Verbatim here Indented and all: //foo// ''' ''' Also block-indentation of verbatim is possible. Even with additional per-line indentation ''' IMAGE: {{../my-image.png?width=600|Foo Bar}} LINKS: [[:foo:bar]] [[./file.png]] file:///etc/passwd LINKS: [[Foo]][[Bar]] IMAGELINK: {{my-image.png?href=Foo}} IMAGELINK: {{../my-image.png?href=:foo:bar&width=600|Foo Bar}} TAGS: @foo @bar Some indented paragraphs go here ... {{./equation003.png?type=equation}} Let's try these **bold**, //italic//, __underline__ and ~~strike~~ And some ''//verbatim//'' with an indent halfway the paragraph And don't forget these: *bold*, /italic/ / * *^%#@#$#!@)_!)_ A list * foo * ~~bar~~ * baz And an indented list * foo * ~~bar~~ * baz And a checkbox list [ ] item 1 [*] sub item 1 * Some normal bullet [x] sub item 2 [ ] sub item 3 [ ] item 2 [ ] item 3 [x] item FOOOOOO ! A numbered list: 1. foo 2. bar a. sub list b. here 3. hmmm ---- Some sub- and superscript like x^{2} and H_{2}O ==== This is not a header That's all ... Test 1 2 3 Test 1 2 3 Content-Type: text/x-zim-wiki Wiki-Format: zim 0.26 Creation-Date: ג', 07 אפר 2009 01:30:27 +0300 Modification-Date: ג', 07 אפר 2009 01:30:27 +0300 ====== Hello ====== Created שלישי 07 אפריל 2009 Content-Type: text/x-zim-wiki Wiki-Format: zim 0.26 Creation-Date: ג', 07 אפר 2009 13:08:18 +0300 Modification-Date: ג', 07 אפר 2009 13:10:08 +0300 ====== מדעי המחשב ====== Created שלישי 07 אפריל 2009 שפת תכנות אלגוריטמיים Content-Type: text/x-zim-wiki Wiki-Format: zim 0.26 Creation-Date: ג', 07 אפר 2009 13:08:06 +0300 Modification-Date: ג', 07 אפר 2009 13:09:28 +0300 ====== הנדסת מכונות ====== Created שלישי 07 אפריל 2009 חדו"א מד"ר מכניקת מוצקים 2 A line in English, should be left aligned. דינמיקה Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-05-10T01:02:12.859000 ====== 中文 ====== Created Monday 10 May 2010 this page title is chinese. Foo Bar ! [[Dus:Ja]] [[Bar]] Duss [[Linking:Foo:Bar]] [[Dus]] For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test For page.menu template variable test Subpages will be moved Non-mover Move me zim-0.60/tests/data/notebook.gjots0000644000175000017500000000043511544165551017062 0ustar jaapjaap00000000000000Some test file in gjots format By me \NewEntry Front page without title \NewEntry Pages \NewFolder \NewEntry Foo FooBaR! \NewEntry Bar Dusss \EndFolder \NewEntry Some toplevel page \NewEntry More Pages \NewFolder level1 \NewFolder level2 \NewEntry Hmmm dus \EndFolder \EndFolder zim-0.60/tests/data/byteordermark.txt0000664000175000017500000000001212132472704017571 0ustar jaapjaap00000000000000foobar zim-0.60/tests/fs.py0000664000175000017500000003443212132472704014244 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Test cases for the zim.fs module.''' from __future__ import with_statement import tests import os import time import zim.fs from zim.fs import * from zim.errors import Error def modify_file_mtime(path, func): '''Helper function to modify a file in such a way that mtime changed. ''' mtime = os.stat(path).st_mtime m = mtime i = 0 while m == mtime: time.sleep(1) func(path) m = os.stat(path).st_mtime i += 1 assert i < 5 #~ print '>>>', m, mtime class FilterOverWriteWarning(tests.LoggingFilter): logger = 'zim.fs' message = 'mtime check failed' class FilterFileMissingWarning(tests.LoggingFilter): logger = 'zim.fs' message = 'File missing:' class TestFS(tests.TestCase): def testFunctions(self): smb_urls = ( ('smb://MyHost.local/share/My%20Documents', r'\\MyHost.local\share\My Documents'), ) for url, share in smb_urls: if os.name == 'nt': self.assertEqual(normalize_win32_share(share), share) self.assertEqual(normalize_win32_share(url), share) else: self.assertEqual(normalize_win32_share(share), url) self.assertEqual(normalize_win32_share(url), url) self.assertTrue(isabs('/foo/bar')) self.assertTrue(isabs('~/foo/bar')) self.assertFalse(isabs('./bar')) self.assertEqual(joinpath('foo', 'bar'), os.sep.join(('foo', 'bar'))) self.assertEqual(cleanup_filename('foo&bar:dus\\foo.txt'), 'foo&bardusfoo.txt') def testFilePath(self): '''Test Path object''' path = FilePath(['foo', 'bar']) test = os.path.abspath( os.path.join('foo', 'bar') ) self.assertEqual(path.path, test) path = FilePath('/foo/bar') uri = 'file:///' + os.path.abspath('/foo/bar').replace('\\', '/').strip('/') self.assertEqual(path.uri, uri) self.assertEqual(FilePath('file:///foo/bar'), FilePath('/foo/bar')) self.assertEqual(FilePath('file:/foo/bar'), FilePath('/foo/bar')) self.assertEqual(FilePath('file://localhost/foo/bar'), FilePath('/foo/bar')) self.assertEqual(FilePath('file:///C:/foo/bar'), FilePath('/C:/foo/bar')) if os.name == 'nt': self.assertEqual(FilePath('file:///C:/foo/bar'), FilePath(r'C:\foo\bar')) path = FilePath('/foo//bar/baz/') drive, p = os.path.splitdrive(path.path) self.assertEqual(path.split(), [drive + os.sep + 'foo', 'bar', 'baz']) dirs = [] for d in path: dirs.append(d) wanted = map(lambda p: Dir(os.path.abspath(drive+p)), ['/foo', '/foo/bar', '/foo/bar/baz']) self.assertEqual(dirs, wanted) for path1, path2, common in ( ('/foo/bar/baz/', '/foo/dus', '/foo'), ('/foo/bar', '/dus/ja', '/'), ): self.assertEqual(FilePath(path1).commonparent(FilePath(path2)), Dir(common)) if os.name == 'nt': path1 = 'C:\foo\bar' path2 = 'D:\foo\bar\baz' self.assertEqual(FilePath(path1).commonparent(FilePath(path2)), None) for path1, path2, relpath in ( ('/foo/bar/baz', '/foo', 'bar/baz'), ): self.assertEqual(FilePath(path1).relpath(FilePath(path2)), relpath) self.assertRaises(AssertionError, FilePath('/foo/bar').relpath, FilePath('/dus/ja')) for path1, path2, relpath in ( ('/foo/bar', '/dus/ja/', '../../foo/bar'), ('/source/dir/foo/bar/dus.pdf', '/source/dir/foo', 'bar/dus.pdf'), ('/source/dir/foo/dus.pdf', '/source/dir/foo', 'dus.pdf'), ('/source/dir/dus.pdf', '/source/dir/foo', '../dus.pdf'), ): self.assertEqual(FilePath(path1).relpath(FilePath(path2), allowupward=True), relpath) if os.name == 'nt': path1 = 'C:\foo\bar' path2 = 'D:\foo\bar\baz' self.assertEqual(FilePath(path1).relpath(FilePath(path2), allowupward=True), None) self.assertEqual(FilePath('/foo') + 'bar', FilePath('/foo/bar')) path = FilePath('~/foo') self.assertNotEqual(path.path, '~/foo') self.assertEqual(path.user_path, '~/foo') self.assertEqual(path.serialize_zim_config(), '~/foo') path = FilePath('/foo') self.assertIsNotNone(path.path) self.assertIsNone(path.user_path) self.assertIsNotNone(path.serialize_zim_config()) # Test unicode compat string = u'\u0421\u0430\u0439\u0442\u043e\u0432\u044b\u0439' path = FilePath(string) self.assertTrue(path.path.endswith(string)) #~ self.assertRaises(Error, Path, string.encode('utf-8')) path = FilePath((string, 'foo')) self.assertTrue(path.path.endswith(os.sep.join((string, 'foo')))) #~ self.assertRaises(Error, Path, (string.encode('utf-8'), 'foo')) def testFileHandle(self): '''Test FileHandle object''' self.on_close_called = False tmpdir = self.create_tmp_dir('testFileHandle') fh = FileHandle( tmpdir+'/foo.txt', mode='w', on_close=self.on_close) fh.write('duss') fh.close() self.assertTrue(self.on_close_called) def on_close(self): self.on_close_called = True def testFile(self): '''Test File object''' tmpdir = self.create_tmp_dir('testFile') file = File(tmpdir+'/foo/bar/baz.txt') assert not file.exists() file.touch() self.assertTrue(os.path.isfile(tmpdir+'/foo/bar/baz.txt')) File(tmpdir+'/anotherfile.txt').touch() file.cleanup() self.assertTrue(os.path.isfile(tmpdir+'/anotherfile.txt')) self.assertTrue(os.path.isdir(tmpdir)) self.assertFalse(os.path.isfile(tmpdir+'/foo/bar/baz.txt')) self.assertFalse(os.path.isdir(tmpdir+'/foo')) file = File(tmpdir+'/bar.txt') file.writelines(['c\n', 'd\n']) self.assertEqual(file.readlines(), ['c\n', 'd\n']) # with error try: fh = file.open('w') fh.write('foo') raise IOError except IOError: del fh self.assertEqual(file.readlines(), ['c\n', 'd\n']) self.assertTrue(os.path.isfile(file.encodedpath+'.zim-new~')) # test recovery on windows if os.name == 'nt': new = file.encodedpath+'.zim-new~' orig = file.encodedpath+'.zim-orig~' bak = file.encodedpath+'.bak~' os.remove(file.encodedpath) # don't clean up folder open(new, 'w').write('NEW\n') open(orig, 'w').write('ORIG\n') self.assertTrue(file.exists()) self.assertEqual(file.read(), 'NEW\n') self.assertFalse(os.path.isfile(new)) self.assertFalse(os.path.isfile(orig)) self.assertTrue(os.path.isfile(file.encodedpath)) self.assertTrue(os.path.isfile(bak)) bak1 = file.encodedpath+'.bak1~' os.remove(file.encodedpath) # don't clean up folder open(orig, 'w').write('ORIG 1\n') self.assertFalse(file.exists()) self.assertRaises(FileNotFoundError, file.read) self.assertFalse(os.path.isfile(orig)) self.assertTrue(os.path.isfile(bak)) self.assertTrue(os.path.isfile(bak1)) # test read-only path = tmpdir+'/read-only-file.txt' open(path, 'w').write('test 123') os.chmod(path, 0444) file = File(path) self.assertRaises(FileWriteError, file.write, 'Overwritten!') os.chmod(path, 0644) # make it removable again # with windows line-ends file = open(tmpdir+'/newlines.txt', 'wb') # binary mode means no automatic newline conversions file.write('Some lines\r\nWith win32 newlines\r\n') file = File(tmpdir+'/newlines.txt') self.assertEqual(file.read(), 'Some lines\nWith win32 newlines\n') # test encoding error non_utf8_file = File('tests/data/non-utf8.txt') self.assertRaises(FileUnicodeError, non_utf8_file.read) # test byte order mark file = File('tests/data/byteordermark.txt') self.assertEqual(file.raw(), '\xef\xbb\xbffoobar\n') self.assertEqual(file.read(), 'foobar\n') self.assertEqual(file.readlines(), ['foobar\n']) # test compare & copyto file1 = File(tmpdir + '/foo.txt') file2 = File(tmpdir + '/bar.txt') file1.write('foo\nbar\n') file2.write('foo\nbar\n') self.assertTrue(file1.compare(file2)) file2.write('foo\nbar\nbaz\n') self.assertFalse(file1.compare(file2)) file2.copyto(file1) self.assertTrue(file1.compare(file2)) # rename is being used when testing Dir # test mimetype file = File('test.txt') self.assertFalse(file.isimage()) file = File('test.jpg') self.assertTrue(file.isimage()) file = File(tmpdir+'/foo/') self.assertFalse(file.isdir()) dir = Dir(tmpdir+'/foo/') dir.touch() self.assertTrue(file.isdir()) def testTmpFile(self): '''Test TmpFile object''' dir = get_tmpdir() file = TmpFile('foo.txt') self.assertTrue(file.ischild(dir)) # What else to test here ? def testDir(self): '''Test Dir object''' tmpdir = self.create_tmp_dir('testDir') dir = Dir(tmpdir+'/foo/bar') assert not dir.exists() file1 = dir.file('unique.txt') file1.touch() file2 = dir.new_file('unique.txt') file2.touch() file3 = dir.new_file('unique.txt') self.assertEqual(file1.basename, 'unique.txt') self.assertEqual(file2.basename, 'unique001.txt') self.assertEqual(file3.basename, 'unique002.txt') self.assertEqual(dir.list(), ['unique.txt', 'unique001.txt']) # we did not touch unique002.txt, so don't want to see it show up here file1.rename(dir.file('foo.txt')) self.assertEqual(file1.basename, 'unique.txt') # don't update the object ! self.assertEqual(dir.list(), ['foo.txt', 'unique001.txt']) file1 = dir.file('foo.txt') file1.rename(dir.subdir('foo').file('bar.txt')) self.assertEqual(dir.list(), ['foo', 'unique001.txt']) self.assertEqual(dir.subdir('foo').list(), ['bar.txt']) fdir = FilteredDir(dir) fdir.ignore('*.txt') self.assertEqual(fdir.list(), ['foo']) self.assertEqual(File((dir, 'foo.txt')), dir.file('foo.txt')) self.assertEqual(dir.file(File((dir, 'foo.txt'))), dir.file('foo.txt')) self.assertEqual(dir.file(FilePath((dir, 'foo.txt'))), dir.file('foo.txt')) self.assertEqual(dir.file(('foo.txt',)), dir.file('foo.txt')) self.assertRaises(PathLookupError, dir.file, File('/foo/bar.txt')) # not below dir self.assertEqual(dir.resolve_file('../foo.txt'), dir.dir.file('foo.txt')) self.assertEqual(dir.resolve_file(File('/foo/bar.txt')), File('/foo/bar.txt')) self.assertEqual(Dir((dir, 'bar')), dir.subdir('bar')) self.assertEqual(dir.subdir(Dir((dir, 'bar'))), dir.subdir('bar')) self.assertEqual(dir.subdir(FilePath((dir, 'bar'))), dir.subdir('bar')) self.assertEqual(dir.subdir(('bar',)), dir.subdir('bar')) self.assertRaises(PathLookupError, dir.subdir, Dir('/foo/bar')) # not below dir self.assertEqual(dir.resolve_dir('../bar'), dir.dir.subdir('bar')) self.assertEqual(dir.resolve_dir(Dir('/foo/bar')), Dir('/foo/bar')) self.assertRaises(OSError, dir.remove) # dir not empty self.assertTrue(dir.exists()) dir.cleanup() self.assertTrue(dir.exists()) dir.remove_children() self.assertEqual(dir.list(), []) self.assertTrue(dir.exists()) dir.remove() self.assertFalse(dir.exists()) self.assertEqual(dir.list(), []) # list non-existing dir # TODO skip if no gio available # TODO slow test #~ def testMonitor(self): #~ tmpdir = Dir(self.create_tmp_dir('testMonitor')) #~ # Monitor file #~ events = [] #~ def monitor(*args): #~ events.append(args) #~ file = tmpdir.file('foo') #~ file.connect('changed', monitor) #~ file.touch() #~ file.write('Foo') #~ # timeout ? #~ print '>>', events #~ # Monitor dir #~ tmpdir.connect('changed', monitor) #~ tmpdir.file('bar').touch() #~ # timeout ? #~ print '>>', events @tests.slowTest class TestFileOverwrite(tests.TestCase): def setUp(self): self.path = self.create_tmp_dir()+'/file.txt' def modify(self, func): modify_file_mtime(self.path, func) def runTest(self): '''Test file overwrite check''' # Check we can write without reading file = File(self.path, checkoverwrite=True) file.write('bar') self.assertEquals(file.read(), 'bar') # Check edge case where file goes missing after read or write os.remove(file.encodedpath) self.assertFalse(file.exists()) with FilterFileMissingWarning(): file.write('bar') self.assertEquals(file.read(), 'bar') # Check overwrite error when content changed self.modify(lambda p: open(p, 'w').write('XXX')) # modify mtime and content with FilterOverWriteWarning(): self.assertRaises(FileWriteError, file.write, 'foo') self.assertEquals(file.read(), 'XXX') # Check md5 check passes file = File(self.path, checkoverwrite=True) file.write('bar') self.modify(lambda p: open(p, 'w').write('bar')) # modify mtime but keep content the same with FilterOverWriteWarning(): file.write('foo') self.assertEquals(file.read(), 'foo') @tests.slowTest @tests.skipUnless(hasattr(os, 'symlink'), 'OS does not supprot symlinks') class TestSymlinks(tests.TestCase): def runTest(self): '''Test file operations are safe for symlinks''' # Set up a file structue with a symlink tmpdir = self.create_tmp_dir() targetdir = Dir(tmpdir + '/target') targetdir.file('foo.txt').touch() targetfile = File(tmpdir + '/target.txt') targetfile.write('foo\n') dir = Dir(tmpdir + '/data') file = dir.file('bar.txt') file.touch() os.symlink(targetdir.encodedpath, dir.encodedpath + '/link') os.symlink(targetfile.encodedpath, dir.encodedpath + '/link.txt') # Test transparent access to the linked data linkedfile = dir.file('link.txt') self.assertTrue(linkedfile.read(), 'foo\n') self.assertEqual(dir.list(), ['bar.txt', 'link', 'link.txt']) linkeddir = dir.subdir('link') self.assertEqual(linkeddir.list(), ['foo.txt']) # Test modifying a linked file linkedfile.write('bar\n') self.assertTrue(linkedfile.read(), 'bar\n') self.assertTrue(targetfile.read(), 'bar\n') linkedfile.rename(dir.file('renamed_link.txt')) self.assertEqual(dir.list(), ['bar.txt', 'link', 'renamed_link.txt']) linkedfile = dir.file('renamed_link.txt') linkedfile.write('foobar\n') self.assertTrue(linkedfile.read(), 'foobar\n') self.assertTrue(targetfile.read(), 'foobar\n') # Test removing the links (but not the data) linkedfile.remove() self.assertFalse(linkedfile.exists()) self.assertTrue(targetfile.exists()) self.assertTrue(targetfile.read(), 'foobar\n') dir.remove_children() self.assertEqual(dir.list(), []) self.assertTrue(targetdir.exists()) self.assertEqual(targetdir.list(), ['foo.txt']) @tests.slowTest @tests.skipUnless(zim.fs.gio, 'Trashing not supported, \'gio\' is missing') class TestTrash(tests.TestCase): def runTest(self): '''Test trashing files and folders''' root = Dir(self.create_tmp_dir()) file = root.file('test.txt') file.touch() self.assertTrue(file.exists()) self.assertTrue(file.trash()) self.assertFalse(file.exists()) dir = root.subdir('test') dir.touch() self.assertTrue(dir.exists()) self.assertTrue(dir.trash()) self.assertFalse(dir.exists()) # fails silent if file does not exist self.assertFalse(file.trash()) self.assertFalse(dir.trash()) # How can we cause gio to give an error and test that case ?? zim-0.60/tests/index.py0000644000175000017500000003667211710056337014752 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import tests import gtk import pango import os from zim.fs import Dir from zim.notebook import init_notebook, get_notebook, Notebook, Path, Link from zim.index import * from zim.formats import ParseTree from zim.gui.clipboard import Clipboard from zim.gui.pageindex import * class TestIndex(tests.TestCase): def setUp(self): # Note that in this test our index is not the default index # for the notebook. So any assumption from the notebook about # the index will be wrong. self.index = Index(dbfile=':memory:') self.notebook = tests.new_notebook() self.index.set_notebook(self.notebook) def runTest(self): '''Test indexing''' # This is one big test instead of seperate sub tests because in the # subclass we generate a file based notebook in setUp, and we do not # want to do that many times #~ print self.__class__.__name__ self.index.update() #~ print '\n==== DB ====' #~ cursor = self.index.db.cursor() #~ cursor.execute('select * from pages') #~ for row in cursor: #~ print row #~ cursor.execute('select * from links') #~ for row in cursor: #~ print row # paths / ids path = self.index.lookup_path(Path('Test:foo:bar')) self.assertTrue(isinstance(path, IndexPath)) path = self.index.lookup_id(path.id) self.assertTrue(isinstance(path, IndexPath)) self.assertEqual(path.name, 'Test:foo:bar') # pages pagelist = list(self.index.list_pages(None)) self.assertTrue(len(pagelist) > 0) pagelist = list(self.index.list_pages(Path('Test'))) self.assertTrue(len(pagelist) > 0) for page in pagelist: self.assertTrue(page.name.startswith('Test:')) self.assertTrue(page.name.count(':') == 1) pagelist = list(self.index.list_pages(Path('Linking'))) self.assertTrue(Path('Linking:Dus') in pagelist) pagelist = list(self.index.list_pages(Path('Some:Non:Existing:Path'))) self.assertTrue(len(pagelist) == 0) # links forwlist = list(self.index.list_links(Path('Test:foo:bar'))) backlist = list(self.index.list_links(Path('Test:foo:bar'), LINK_DIR_BACKWARD)) bothlist = list(self.index.list_links(Path('Test:foo:bar'), LINK_DIR_BOTH)) for l in forwlist, backlist, bothlist: self.assertTrue(len(l) > 0) for link in l: self.assertTrue(isinstance(link, Link)) self.assertTrue(isinstance(link.source, IndexPath)) self.assertTrue(isinstance(link.href, IndexPath)) self.assertTrue(len(forwlist) + len(backlist) == len(bothlist)) n = self.index.n_list_links(Path('Test:foo:bar'), LINK_DIR_BACKWARD) self.assertEqual(n, len(backlist)) # tags taglist = list(self.index.list_tags(Path('Test:tags'))) self.assertTrue(len(taglist) == 11) for tag in taglist: self.assertTrue(isinstance(tag, IndexTag)) tagnames = [t.name for t in taglist] aretags = ['tags', 'beginning', 'end', 'tabs', 'verbatim', 'enumerations', 'encoding', 's', 'num6ers', 'wit', 'cr'] nottags = ['places', 'links', 'captions', 'Headings', 'word'] for t in aretags: self.assertTrue(t in tagnames) for t in nottags: self.assertTrue(not t in tagnames) # cursor.row_count is not reliable - see docs def count_pages(db): c = db.cursor() c.execute('select id from pages') r = c.fetchall() return len(r) def dump_db(db): c = db.cursor() c.execute('select * from pages') text = '' for row in c: # HACK iterating of sqlite3.Row objects only supported for python 2.6 myrow = [] for i in range(len(row)): myrow.append(row[i]) text += ', '.join(map(str, myrow)) + '\n' return text # repeat update() to check if update is stable manifest = len(self.notebook.testdata_manifest) self.assertTrue(count_pages(self.index.db) >= manifest) origdb = dump_db(self.index.db) self.index.update() self.assertEqual(dump_db(self.index.db), origdb) # indexkey for path in (Path('Test'), Path('Test:foo')): indexpath = self.index.lookup_path(path) self.assertEqual(indexpath.contentkey, self.notebook.get_page_indexkey(path)) self.assertEqual(indexpath.childrenkey, self.notebook.get_pagelist_indexkey(path)) # other functions path = self.index.get_unique_path(Path('non-existing-path')) self.assertEqual(path, Path('non-existing-path')) path = self.index.get_unique_path(Path('Test:foo')) self.assertEqual(path, Path('Test:foo_1')) # get_previous / get_next page = list(self.index.list_pages(None))[0] seen = 0 while page: seen = max(seen, page.name.count(':')) page = self.index.get_next(page) self.assertTrue(seen >= 2) page = list(self.index.list_pages(None))[-1] seen = 0 while page: seen = max(seen, page.name.count(':')) page = self.index.get_previous(page) self.assertTrue(seen >= 2) # now go through the flush loop self.index.flush() self.assertEqual(count_pages(self.index.db), 1) self.index.update() self.assertEqual(dump_db(self.index.db), origdb) # now index only part of the tree - and repeat self.index.flush() self.assertEqual(count_pages(self.index.db), 1) self.index.update(Path('Test')) self.assertTrue(count_pages(self.index.db) > 2) partdb = dump_db(self.index.db) self.index.update(Path('Test')) self.assertEqual(dump_db(self.index.db), partdb) # Index whole tree again self.index.update() # Check cleanup path = Path('New:Nested:Path') self.index.touch(path) parent = self.index.lookup_path(path.parent) self.assertTrue(parent and parent.haschildren) self.index.delete(path) parent = self.index.lookup_path(path.parent) self.assertTrue(parent is None) # Check cleanup for links links = [link.href for link in self.index.list_links(Path('roundtrip'))] for p in ('foo:bar', 'Bar'): self.assertTrue(Path(p) in links) path = self.index.lookup_path(Path('foo:bar')) self.assertTrue(path) # Check for tag indexing tags = [tag.name for tag in self.index.list_tags(Path('roundtrip'))] for t in ('foo', 'bar'): self.assertTrue(t in tags) tagged = list(self.index.list_tagged_pages(t)) self.assertTrue(Path('roundtrip') in tagged) tree = ParseTree().fromstring(':foo:bar') page = self.notebook.get_page(Path('roundtrip')) page.set_parsetree(tree) self.notebook.store_page(page) path = self.index.lookup_path(Path('Bar')) self.assertTrue(path is None) path = self.index.lookup_path(Path('foo:bar')) self.assertTrue(path) self.notebook.delete_page(Path('roundtrip')) path = self.index.lookup_path(Path('foo:bar')) self.assertTrue(path is None) # Check get_page_index() to double check stable sorting def check_index(path): for i, child in enumerate(self.index.list_pages(path)): index = self.index.get_page_index(child) #~ print 'INDEX', i, child, '-->', index self.assertTrue(index == i, 'Index mismatch for %s' % child) if child.haschildren: check_index(child) # recurs check_index(Path(':')) @tests.slowTest class TestIndexFiles(TestIndex): # Like the test above, but now using a files backend def setUp(self): path = self.create_tmp_dir() self.notebook = tests.new_files_notebook(path) self.index = self.notebook.index def runTest(self): '''Test indexing files''' TestIndex.runTest(self) class TestPageTreeStore(tests.TestCase): def setUp(self): self.index = Index(dbfile=':memory:') self.notebook = tests.new_notebook() self.index.set_notebook(self.notebook) self.notebook.index.update() def runTest(self): '''Test PageTreeStore index interface''' # This is one big test instead of seperate sub tests because in the # subclass we generate a file based notebook in setUp, and we do not # want to do that many times. # Hooking up the treeview as well just to see if we get any errors # From the order the signals are generated. ui = MockUI() ui.notebook = self.notebook ui.page = Path('Test:foo') self.assertTrue(self.notebook.get_page(ui.page).exists()) treeview = PageTreeView(ui) treestore = PageTreeStore(self.index) self.assertEqual(treestore.get_flags(), 0) self.assertEqual(treestore.get_n_columns(), 7) treeview.set_model(treestore) self.index.update(callback=tests.gtk_process_events) tests.gtk_process_events() treeview = PageTreeView(ui) # just run hidden to check errors treeview.set_model(treestore) n = treestore.on_iter_n_children(None) self.assertTrue(n > 0) n = treestore.iter_n_children(None) self.assertTrue(n > 0) for i in range(treestore.get_n_columns()): self.assertTrue(not treestore.get_column_type(i) is None) # Quick check for basic methods iter = treestore.on_get_iter((0,)) self.assertTrue(isinstance(iter, PageTreeIter)) self.assertFalse(iter.indexpath.isroot) basename = treestore.on_get_value(iter, 0) self.assertTrue(len(basename) > 0) self.assertEqual(iter.treepath, (0,)) self.assertEqual(treestore.on_get_path(iter), (0,)) self.assertEqual(treestore.get_treepath(iter.indexpath), (0,)) self.assertEqual(treestore.get_treepath(Path(iter.indexpath.name)), (0,)) iter2 = treestore.on_iter_children(None) self.assertEqual(iter2.indexpath, iter.indexpath) self.assertTrue(treestore.on_get_iter((20,20,20,20,20)) is None) self.assertTrue(treestore.get_treepath(Path('nonexisting')) is None) self.assertRaises(ValueError, treestore.get_treepath, Path(':')) # Now walk through the whole notebook testing the API # with nested pages and stuff npages = 0 path = [] for page in self.notebook.walk(): #~ print '>>', page npages += 1 names = page.name.split(':') if len(names) > len(path): path.append(0) # always increment by one elif len(names) < len(path): while len(names) < len(path): path.pop() path[-1] += 1 else: path[-1] += 1 #~ print '>>', page, path iter = treestore.get_iter(tuple(path)) indexpath = treestore.get_indexpath(iter) #~ print '>>>', indexpath self.assertEqual(indexpath, page) self.assertEqual(treestore.get_value(iter, NAME_COL), page.basename) self.assertEqual(treestore.get_value(iter, PATH_COL), page) if page.hascontent or page.haschildren: self.assertEqual(treestore.get_value(iter, EMPTY_COL), False) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_NORMAL) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.NORMAL_COLOR) else: self.assertEqual(treestore.get_value(iter, EMPTY_COL), True) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_ITALIC) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.EMPTY_COLOR) self.assertEqual(treestore.get_path(iter), tuple(path)) if indexpath.haschildren: self.assertTrue(treestore.iter_has_child(iter)) child = treestore.iter_children(iter) self.assertTrue(not child is None) child = treestore.iter_nth_child(iter, 0) self.assertTrue(not child is None) parent = treestore.iter_parent(child) self.assertEqual( treestore.get_indexpath(parent), page) childpath = treestore.get_path(child) self.assertEqual( childpath, tuple(path) + (0,)) n = treestore.iter_n_children(iter) for i in range(1, n): child = treestore.iter_next(child) childpath = treestore.get_path(child) self.assertEqual( childpath, tuple(path) + (i,)) child = treestore.iter_next(child) self.assertTrue(child is None) else: self.assertTrue(not treestore.iter_has_child(iter)) child = treestore.iter_children(iter) self.assertTrue(child is None) child = treestore.iter_nth_child(iter, 0) self.assertTrue(child is None) self.assertTrue(npages > 10) # double check sanity of walk() method # Check if all the signals go OK treestore.disconnect_index() del treestore self.index.flush() treestore = PageTreeStore(self.index) treeview = PageTreeView(ui, treestore) self.index.update(callback=tests.gtk_process_events) # Try some TreeView methods path = Path('Test:foo') self.assertTrue(treeview.select_page(path)) self.assertEqual(treeview.get_selected_path(), path) treepath = treeview.get_model().get_treepath(path) self.assertTrue(not treepath is None) col = treeview.get_column(0) treeview.row_activated(treepath, col) #~ treeview.emit('popup-menu') treeview.emit('insert-link', path) treeview.emit('copy') # Check if all the signals go OK in delete for page in reversed(list(self.notebook.walk())): # delete bottom up self.notebook.delete_page(page) tests.gtk_process_events() @tests.slowTest class TestPageTreeStoreFiles(TestPageTreeStore): def setUp(self): path = self.create_tmp_dir() self.notebook = tests.new_files_notebook(path) self.index = self.notebook.index def runTest(self): '''Test PageTreeStore index interface with files index''' TestPageTreeStore.runTest(self) class TestPageTreeView(tests.TestCase): # This class is intended for testing the widget user interaction, # interaction with the store is already tested by having the # view attached in TestPageTreeStore def setUp(self): self.ui = tests.MockObject() self.ui.page = Path('Test') self.notebook = tests.new_notebook() self.ui.notebook = self.notebook self.model = PageTreeStore(self.notebook.index) self.treeview = PageTreeView(self.ui, self.model) def testContextMenu(self): menu = self.treeview.get_popup() # Check these do not cause errors - how to verify state ? tests.gtk_activate_menu_item(menu, _("Expand _All")) tests.gtk_activate_menu_item(menu, _("_Collapse All")) # Copy item tests.gtk_activate_menu_item(menu, 'gtk-copy') self.assertEqual(Clipboard.get_text(), 'Test') # Single click navigation, ... ? @tests.slowTest class TestSynchronization(tests.TestCase): def runTest(self): '''Test synchronization''' # Test if zim detects pages, that where created with another # zim instance and transfered to this instance with # dropbox or another file synchronization tool. # # The scenario is as follow: # 1) Page.txt is created in this instance # 2) Page/Subpage.txt is created in another instance # and copied into the notebook by the synchronization tool # 3) Zim runs a standard index update # Outcome should be that Page:Subpage shows up in the index # create notebook dir = Dir(self.create_tmp_dir()) init_notebook(dir, name='foo') notebook = get_notebook(dir) index = notebook.index index.update() # add page in this instance path = Path('Page') page = notebook.get_page(path) page.parse('wiki', 'nothing important') notebook.store_page(page) # check file exists self.assertTrue(dir.file('Page.txt').exists()) # check file is indexed self.assertTrue(page in list(index.list_all_pages())) # check attachment dir does not exist subdir = dir.subdir('Page') self.assertEqual(notebook.get_attachments_dir(page), subdir) self.assertFalse(subdir.exists()) for newfile, newpath in ( (subdir.file('NewSubpage.txt').path, Path('Page:NewSubpage')), (dir.file('Newtoplevel.txt').path, Path('Newtoplevel')), (dir.file('SomeDir/Dir/Newpage.txt').path, Path('SomeDir:Dir:Newpage')), ): # make sure ctime changed since last index import time time.sleep(2) # create new page without using zim classes self.assertFalse(os.path.isfile(newfile)) mydir = os.path.dirname(newfile) if not os.path.isdir(mydir): os.makedirs(mydir) fh = open(newfile, 'w') fh.write('Test 123\n') fh.close() self.assertTrue(os.path.isfile(newfile)) # simple index reload index.update() # check if the new page is found in the index self.assertTrue(newpath in list(index.list_all_pages())) class MockUI(tests.MockObject): page = None notebook = None zim-0.60/tests/search.py0000644000175000017500000001606212047232521015072 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Jaap Karssenberg import tests from zim.search import * from zim.notebook import Path class TestSearchRegex(tests.TestCase): def runTest(self): '''Test regex compilation for search terms''' regex_func = SearchSelection(None)._content_regex for word, regex in ( ('foo', r'\bfoo\b'), ('*foo', r'\b\S*foo\b'), ('foo*', r'\bfoo\S*\b'), ('*foo*', r'\b\S*foo\S*\b'), ('foo$', r'\bfoo\$'), ('foo bar', r'\bfoo\ bar\b'), ): #print '>>', word, regex self.assertEqual(regex_func(word), re.compile(regex, re.I | re.U)) text = 'foo foobar FooBar Foooo Foo!' regex = regex_func('foo') new, n = regex.subn('', text) self.assertEqual(n, 2) self.assertEqual(new, ' foobar FooBar Foooo !') text = 'foo foobar FooBar Foooo Foo!' regex = regex_func('foo*') new, n = regex.subn('', text) self.assertEqual(n, 5) class TestSearch(tests.TestCase): def setUp(self): self.notebook = tests.new_notebook() def callback_check(self, selection, path): self.assertIsInstance(selection, (SearchSelection, type(None))) self.assertIsInstance(path, (Path, type(None))) return True def runTest(self): '''Test search API''' self.notebook.index.update() results = SearchSelection(self.notebook) query = Query('foo bar') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [ QueryTerm('contentorname', 'foo'), QueryTerm('contentorname', 'bar') ] ) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(len(results) > 0) self.assertFalse(Path('TaskList:foo') in results) self.assertTrue(Path('Test:foo') in results) self.assertTrue(Path('Test:foo:bar') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('+TODO -bar') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [ QueryTerm('contentorname', 'TODO'), QueryTerm('contentorname', 'bar', inverse=True) ] ) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(len(results) > 0) self.assertTrue(Path('TaskList:foo') in results) self.assertFalse(Path('Test:foo') in results) self.assertFalse(Path('Test:foo:bar') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('TODO not bar') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [ QueryTerm('contentorname', 'TODO'), QueryTerm('contentorname', 'bar', inverse=True) ] ) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(len(results) > 0) self.assertTrue(Path('TaskList:foo') in results) self.assertFalse(Path('Test:foo') in results) self.assertFalse(Path('Test:foo:bar') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('TODO or bar') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertTrue(query.root[0].operator == OPERATOR_OR) self.assertEqual(query.root, [ [ QueryTerm('contentorname', 'TODO'), QueryTerm('contentorname', 'bar') ] ] ) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(len(results) > 0) self.assertTrue(Path('TaskList:foo') in results) self.assertTrue(Path('Test:foo') in results) self.assertTrue(Path('Test:foo:bar') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('ThisWordDoesNotExistingInTheTestNotebook') results.search(query, callback=self.callback_check) self.assertFalse(results) query = Query('LinksTo: "Linking:Foo:Bar"') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('linksto', 'Linking:Foo:Bar')]) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(Path('Linking:Dus:Ja') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('NOT LinksTo:"Linking:Foo:Bar"') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('linksto', 'Linking:Foo:Bar', True)]) results.search(query, callback=self.callback_check) #~ print results self.assertFalse(Path('Linking:Dus:Ja') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('LinksTo:"NonExistingNamespace:*"') results.search(query, callback=self.callback_check) self.assertFalse(results) query = Query('LinksFrom: "Linking:Dus:Ja"') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('linksfrom', 'Linking:Dus:Ja')]) query = Query('Links: "Linking:Dus:Ja"') # alias for LinksFrom self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('linksfrom', 'Linking:Dus:Ja')]) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(Path('Linking:Foo:Bar') in results) self.assertTrue(set(results.scores.keys()) == results) self.assertTrue(all(results.scores.values())) query = Query('LinksFrom:"NonExistingNamespace:*"') results.search(query, callback=self.callback_check) self.assertFalse(results) query = Query('Namespace: "TaskList" fix') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('namespace', 'TaskList'), QueryTerm('contentorname', 'fix')]) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(Path('TaskList:foo') in results) for text in ( 'Namespace: "Test:Foo Bar"', 'Namespace:"Test:Foo Bar"' ): # check if space in page name works - found bug for 2nd form query = Query(text) results.search(query, callback=self.callback_check) #~ print text, '>>' , results self.assertTrue(Path('Test:Foo Bar:Dus Ja Hmm') in results) query = Query('Namespace: "NonExistingNamespace"') results.search(query, callback=self.callback_check) #~ print results self.assertFalse(results) query = Query('Tag: tags') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('tag', 'tags')]) query = Query('@tags') self.assertTrue(query.root.operator == OPERATOR_AND) self.assertEqual(query.root, [QueryTerm('tag', 'tags')]) results.search(query, callback=self.callback_check) #~ print results self.assertTrue(Path('Test:tags') in results and len(results) == 2) # Tasklist:all is the second match query = Query('Tag: NonExistingTag') results.search(query, callback=self.callback_check) self.assertFalse(results) # TODO test ContentOrName versus Content # TODO test Name @tests.slowTest class TestSearchFiles(TestSearch): def setUp(self): path = self.create_tmp_dir() self.notebook = tests.new_files_notebook(path) def runTest(self): '''Test search API with file based notebook''' TestSearch.runTest(self) zim-0.60/tests/notebook.py0000644000175000017500000006246112053475233015457 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Test cases for the zim.notebook module.''' import tests import os from zim.fs import File, Dir from zim.config import config_file from zim.notebook import * from zim.index import * import zim.errors from zim.formats import ParseTree from zim import _get_default_or_only_notebook # private, but want to check it anyway @tests.slowTest class TestGetNotebook(tests.TestCase): def setUp(self): list = config_file('notebooks.list') file = list.file if file.exists(): file.remove() def runTest(self): root = Dir(self.create_tmp_dir(u'some_utf8_here_\u0421\u0430\u0439')) # Start empty - see this is no issue list = get_notebook_list() self.assertTrue(isinstance(list, NotebookInfoList)) self.assertTrue(len(list) == 0) nb, page = resolve_notebook('foo') self.assertTrue(nb is None) nb = _get_default_or_only_notebook() self.assertTrue(nb is None) # Non-existing dir dir = root.subdir('/notebook') nb, page = resolve_notebook(dir.path) self.assertEqual(nb, dir) # Now create it init_notebook(dir, name='foo') file = dir.file('notebook.zim') nb, page = resolve_notebook(dir.path) self.assertEqual(nb, dir) nb, page = resolve_notebook(file.uri) self.assertEqual(nb, dir) file = dir.file('foo/bar/baz.txt') file.touch() nb, page = resolve_notebook(file.path) self.assertEqual(nb, dir) self.assertEqual(page, Path('foo:bar:baz')) # And put it in the list and resolve it by name list = get_notebook_list() list.append(NotebookInfo(dir.uri, name='foo')) list.write() self.assertTrue(len(list) == 1) self.assertTrue(isinstance(list[0], NotebookInfo)) info = list.get_by_name('foo') self.assertEqual(info.uri, dir.uri) self.assertEqual(info.name, 'foo') newlist = get_notebook_list() # just to be sure re-laoding works.. info = newlist.get_by_name('foo') self.assertEqual(info.uri, dir.uri) self.assertEqual(info.name, 'foo') nb, page = resolve_notebook('foo') self.assertEqual(nb, dir) # Single notebook is automatically the default nb = _get_default_or_only_notebook() self.assertEqual(nb, dir.uri) # But not anymore after adding second notebook if os.name == 'nt': uri1 = 'file:///C:/foo/bar' else: uri1 = 'file:///foo/bar' list = get_notebook_list() list.append(NotebookInfo(uri1, interwiki='foobar')) # on purpose do not set name, should default to basename list.write() self.assertTrue(len(list) == 2) self.assertEqual(list[:], [NotebookInfo(dir.uri), NotebookInfo(uri1)]) nb, page = resolve_notebook('foo') self.assertEqual(nb, dir) self.assertTrue(isinstance(get_notebook(nb), Notebook)) nb, page = resolve_notebook('bar') # Check name defaults to dir basename self.assertEqual(nb, Dir(uri1)) self.assertIs(get_notebook(nb), None) # path should not exist nb, page = resolve_notebook('Bar') self.assertEqual(nb, Dir(uri1)) nb = _get_default_or_only_notebook() self.assertTrue(nb is None) list = get_notebook_list() list.set_default(uri1) list.write() nb = _get_default_or_only_notebook() self.assertEqual(nb, uri1) nb, p = resolve_notebook(nb) self.assertEqual(nb, Dir(uri1)) self.assertEqual(get_notebook(nb), None) # Check interwiki parsing self.assertEqual(interwiki_link('wp?Foo'), 'http://en.wikipedia.org/wiki/Foo') self.assertEqual(interwiki_link('foo?Foo'), 'zim+' + dir.uri + '?Foo') nb, page = resolve_notebook(dir.uri + '?Foo') self.assertEqual(nb, dir) self.assertEqual(page, Path('Foo')) self.assertEqual(interwiki_link('foobar?Foo'), 'zim+' + uri1 + '?Foo') # interwiki key self.assertEqual(interwiki_link('FooBar?Foo'), 'zim+' + uri1 + '?Foo') # interwiki key self.assertEqual(interwiki_link('bar?Foo'), 'zim+' + uri1 + '?Foo') # name self.assertEqual(interwiki_link('Bar?Foo'), 'zim+' + uri1 + '?Foo') # name # Check backward compatibility file = File('tests/data/notebook-list-old-format.list') list = NotebookInfoList(file) self.assertEqual(list[:], [ NotebookInfo(Dir(path).uri) for path in ('~/Notes', '/home/user/code/zim.debug', '/home/user/Foo Bar') ]) self.assertEqual(list.default, NotebookInfo(Dir('/home/user/code/zim.debug').uri) ) class TestNotebook(tests.TestCase): def setUp(self): path = self.get_tmp_name() self.notebook = tests.new_notebook(fakedir=path) def testAPI(self): '''Test various notebook methods''' # TODO now do the same with multiple stores self.assertEqual( self.notebook.get_store(':foo'), self.notebook._stores['']) self.assertTrue( isinstance(self.notebook.get_home_page(), Page)) page1 = self.notebook.get_page(Path('Tree:foo')) page2 = self.notebook.get_page(Path('Tree:foo')) self.assertTrue(page1.valid) self.assertTrue(id(page2) == id(page1)) # check usage of weakref self.notebook.flush_page_cache(Path('Tree:foo')) page3 = self.notebook.get_page(Path('Tree:foo')) self.assertTrue(id(page3) != id(page1)) self.assertFalse(page1.valid) page = self.notebook.get_page(Path('Test:foo')) text = page.dump('plain') newtext = ['Some new content\n'] assert newtext != text self.assertEqual(page.dump('plain'), text) page.parse('plain', newtext) self.assertEqual(page.dump('plain'), newtext) self.assertTrue(page.modified) re = self.notebook.revert_page(page) self.assertFalse(re) # no return value self.assertEqual(page.dump('plain'), text) # object reverted self.assertFalse(page.modified) self.notebook.flush_page_cache(page) page = self.notebook.get_page(page) # new object self.assertEqual(page.dump('plain'), text) page.parse('plain', newtext) self.assertEqual(page.dump('plain'), newtext) self.notebook.store_page(page) self.notebook.flush_page_cache(page) page = self.notebook.get_page(page) # new object self.assertEqual(page.dump('plain'), newtext) pages = list(self.notebook.get_pagelist(Path(':'))) self.assertTrue(len(pages) > 0) for page in pages: self.assertTrue(isinstance(page, Page)) index = set() for page in self.notebook.walk(): self.assertTrue(isinstance(page, Page)) index.add(page.name) self.assertTrue(index.issuperset(self.notebook.testdata_manifest)) def testManipulate(self): '''Test renaming, moving and deleting pages in the notebook''' # check test setup OK for path in (Path('Test:BAR'), Path('NewPage')): page = self.notebook.get_page(path) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) self.assertFalse(page.exists()) for path in (Path('Test:foo'), Path('TaskList')): page = self.notebook.get_page(path) self.assertTrue(page.haschildren or page.hascontent) self.assertTrue(page.exists()) # check errors self.assertRaises(PageExistsError, self.notebook.move_page, Path('Test:foo'), Path('TaskList')) self.notebook.index.update_async() self.assertTrue(self.notebook.index.updating) self.assertRaises(IndexBusyError, self.notebook.move_page, Path('Test:foo'), Path('Test:BAR')) self.notebook.index.ensure_update() # non-existing page - just check no errors here self.notebook.move_page(Path('NewPage'), Path('Test:NewPage')), self.notebook.index.ensure_update() # Test actual moving for oldpath, newpath in ( (Path('Test:foo'), Path('Test:BAR')), (Path('TaskList'), Path('NewPage:Foo:Bar:Baz')), ): page = self.notebook.get_page(oldpath) text = page.dump('wiki') self.assertTrue(page.haschildren) self.notebook.move_page(oldpath, newpath) self.notebook.index.ensure_update() # newpath should exist and look like the old one page = self.notebook.get_page(newpath) self.assertTrue(page.haschildren) text = [l.replace('[[foo:bar]]', '[[+bar]]') for l in text] # fix one updated link self.assertEqual(page.dump('wiki'), text) # oldpath should be deleted page = self.notebook.get_page(oldpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # Test moving a page below it's own namespace oldpath = Path('Test:Bar') newpath = Path('Test:Bar:newsubpage') page = self.notebook.get_page(oldpath) page.parse('wiki', 'Test 123') self.notebook.store_page(page) self.notebook.move_page(oldpath, newpath) self.notebook.index.ensure_update() page = self.notebook.get_page(newpath) self.assertEqual(page.dump('wiki'), ['Test 123\n']) page = self.notebook.get_page(oldpath) self.assertTrue(page.haschildren) self.assertFalse(page.hascontent) # Check delete and cleanup path = Path('AnotherNewPage:Foo:bar') page = self.notebook.get_page(path) page.parse('plain', 'foo bar\n') self.notebook.store_page(page) page = self.notebook.get_page(Path('SomePageWithLinks')) page.parse('wiki', '[[:AnotherNewPage:Foo:bar]]\n' '**bold** [[:AnotherNewPage]]\n' ) self.notebook.store_page(page) page = self.notebook.get_page(Path('AnotherNewPage')) self.assertTrue(page.haschildren) self.assertFalse(page.hascontent) nlinks = self.notebook.index.n_list_links_to_tree(page, LINK_DIR_BACKWARD) self.assertEqual(nlinks, 2) self.notebook.delete_page(Path('AnotherNewPage:Foo:bar')) page = self.notebook.get_page(path) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) self.assertRaises(ValueError, self.notebook.index.n_list_links_to_tree, page, LINK_DIR_BACKWARD) # if links are removed and placeholder is cleaned up the # page doesn't exist anymore in the index so we get this error page = self.notebook.get_page(Path('SomePageWithLinks')) content = page.dump('wiki') self.assertEqual(''.join(content), ':AnotherNewPage:Foo:bar\n' '**bold** [[:AnotherNewPage]]\n' ) self.notebook.delete_page(path) # now should fail silently page = self.notebook.get_page(Path('AnotherNewPage')) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) nlinks = self.notebook.index.n_list_links_to_tree(page, LINK_DIR_BACKWARD) self.assertEqual(nlinks, 1) self.notebook.delete_page(page) self.assertRaises(ValueError, self.notebook.index.n_list_links_to_tree, page, LINK_DIR_BACKWARD) # if links are removed and placeholder is cleaned up the # page doesn't exist anymore in the index so we get this error page = self.notebook.get_page(Path('SomePageWithLinks')) content = page.dump('wiki') self.assertEqual(''.join(content), ':AnotherNewPage:Foo:bar\n' '**bold** :AnotherNewPage\n' ) # Try trashing try: self.notebook.trash_page(Path('TrashMe')) except TrashNotSupportedError: print 'trashing not supported' #~ print '\n==== DB ====' #~ self.notebook.index.ensure_update() #~ cursor = self.notebook.index.db.cursor() #~ cursor.execute('select * from pages') #~ for row in cursor: #~ print row #~ cursor.execute('select * from links') #~ for row in cursor: #~ print row # Try rename page = self.notebook.get_page(Path('Test:wiki')) self.assertTrue(page.hascontent) copy = page # we now have a copy of the page object - this is an important # part of the test - see if caching of page objects doesn't bite self.notebook.index.ensure_update() self.notebook.rename_page(Path('Test:wiki'), 'foo') page = self.notebook.get_page(Path('Test:wiki')) self.assertFalse(page.hascontent) page = self.notebook.get_page(Path('Test:foo')) # If we get an error here because notebook resolves Test:Foo # probably the index did not clean up placeholders correctly self.assertTrue(page.hascontent) self.assertFalse(copy.valid) self.notebook.index.ensure_update() self.notebook.rename_page(Path('Test:foo'), 'Foo') page = self.notebook.get_page(Path('Test:foo')) self.assertFalse(page.hascontent) page = self.notebook.get_page(Path('Test:Foo')) self.assertTrue(page.hascontent) def testUpdateLinks(self): '''Test logic for updating links on move''' # creating relative paths for source, href, link in ( ('Foo:Bar', 'Foo:Bar', 'Bar'), ('Foo:Bar', 'Foo:Bar:Baz', '+Baz'), ('Foo:Bar:Baz', 'Foo:Dus', 'Foo:Dus'), ('Foo:Bar:Baz', 'Foo:Bar:Dus', 'Dus'), ('Foo:Bar', 'Dus:Ja', 'Dus:Ja'), ('Foo:Bar', 'Foo:Ja', 'Ja'), ('Foo:Bar:Baz', 'Foo:Bar', 'Bar'), ('Foo:Bar:Baz', 'Foo', 'Foo'), ('Foo:Bar:Baz', 'Bar', ':Bar'), # conflict with anchor ): #~ print '>', source, href, link self.assertEqual( self.notebook.relative_link(Path(source), Path(href)), link) # update the page that was moved itself # moving from Dus:Baz to foo:bar:Baz or renaming to Dus:Bar text = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[Baz:Ja]] # relative link that does not need change on move, but does on rename [[Ja]] # relative link that needs updating on move, but not on rename [[Ja|Grrr]] # relative link that needs updating on move, but not on rename - with name [[:foo:bar:Dus]] # Link that could be made relative, but isn't ''' wanted1 = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[Baz:Ja]] # relative link that does not need change on move, but does on rename [[Dus:Ja]] # relative link that needs updating on move, but not on rename [[Dus:Ja|Grrr]] # relative link that needs updating on move, but not on rename - with name [[:foo:bar:Dus]] # Link that could be made relative, but isn't ''' wanted2 = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[+Ja]] # relative link that does not need change on move, but does on rename [[Ja]] # relative link that needs updating on move, but not on rename [[Ja|Grrr]] # relative link that needs updating on move, but not on rename - with name [[:foo:bar:Dus]] # Link that could be made relative, but isn't ''' # "move" Dus:Baz -> foo:bar:Baz page = self.notebook.get_page(Path('foo:bar:Baz')) page.parse('wiki', text) self.notebook._update_links_from(page, Path('Dus:Baz'), page, Path('Dus:Baz')) self.assertEqual(u''.join(page.dump('wiki')), wanted1) print '--' # "rename" Dus:Baz -> Dus:Bar page = self.notebook.get_page(Path('Dus:Bar')) page.parse('wiki', text) self.notebook._update_links_from(page, Path('Dus:Baz'), page, Path('Dus:Baz')) self.assertEqual(u''.join(page.dump('wiki')), wanted2) # updating links to the page that was moved # moving from Dus:Baz to foo:bar:Baz or renaming to Dus:Bar - updating links in Dus:Ja text = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[Baz:Ja]] # relative link that needs updating [[Baz:Ja|Grr]] # relative link that needs updating - with name [[Dus:Foo]] # relative link that does not need updating [[:Dus:Baz]] # absolute link that needs updating [[:Dus:Baz:Hmm]] # absolute link that needs updating [[:Dus:Baz:Hmm:Ja]] # absolute link that needs updating ''' wanted1 = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[foo:bar:Baz:Ja]] # relative link that needs updating [[foo:bar:Baz:Ja|Grr]] # relative link that needs updating - with name [[Dus:Foo]] # relative link that does not need updating [[foo:bar:Baz]] # absolute link that needs updating [[foo:bar:Baz:Hmm]] # absolute link that needs updating [[foo:bar:Baz:Hmm:Ja]] # absolute link that needs updating ''' wanted2 = u'''\ http://foo.org # urls are untouched [[:Hmmm:OK]] # link way outside move [[Bar:Ja]] # relative link that needs updating [[Bar:Ja|Grr]] # relative link that needs updating - with name [[Dus:Foo]] # relative link that does not need updating [[Bar]] # absolute link that needs updating [[Bar:Hmm]] # absolute link that needs updating [[Bar:Hmm:Ja]] # absolute link that needs updating ''' page = self.notebook.get_page(Path('Dus:Ja')) page.parse('wiki', text) self.notebook._update_links_in_page(page, Path('Dus:Baz'), Path('foo:bar:Baz')) self.assertEqual(u''.join(page.dump('wiki')), wanted1) page = self.notebook.get_page(Path('Dus:Ja')) page.parse('wiki', text) self.notebook._update_links_in_page(page, Path('Dus:Baz'), Path('Dus:Bar')) self.assertEqual(u''.join(page.dump('wiki')), wanted2) # now test actual move on full notebook def links(source, href): #~ print '====' for link in self.notebook.index.list_links(source, LINK_DIR_FORWARD): #~ print 'FOUND LINK', link if link.href == href: return True else: return False path = Path('Linking:Dus:Ja') newpath = Path('Linking:Hmm:Ok') self.assertTrue(links(path, Path('Linking:Dus'))) self.assertTrue(links(path, Path('Linking:Foo:Bar'))) self.assertTrue(links(Path('Linking:Foo:Bar'), path)) self.assertFalse(links(newpath, Path('Linking:Dus'))) self.assertFalse(links(newpath, Path('Linking:Foo:Bar'))) self.assertFalse(links(Path('Linking:Foo:Bar'), newpath)) self.notebook.move_page(path, newpath, update_links=True) self.assertFalse(links(path, Path('Linking:Dus'))) self.assertFalse(links(path, Path('Linking:Foo:Bar'))) self.assertFalse(links(Path('Linking:Foo:Bar'), path)) self.assertTrue(links(newpath, Path('Linking:Dus'))) self.assertTrue(links(newpath, Path('Linking:Foo:Bar'))) self.assertTrue(links(Path('Linking:Foo:Bar'), newpath)) def testResolvePath(self): '''Test notebook.resolve_path()''' # cleaning absolute paths for name, wanted in ( ('foo:::bar', 'foo:bar'), ('::foo:bar:', 'foo:bar'), (':foo', 'foo'), (':Bar', 'Bar'), (':Foo (Bar)', 'Foo (Bar)'), # TODO more ambigous test cases ): self.assertEqual( self.notebook.resolve_path(name), Path(wanted) ) # resolving relative paths for name, ns, wanted in ( ('foo:bar', 'Test:xxx', 'Test:foo:bar'), ('test', 'Test:xxx', 'Test'), ('+test', 'Test:xxx', 'Test:xxx:test'), ('foo', 'Test:xxx', 'Test:foo'), ('+foo', 'Test:xxx', 'Test:xxx:foo'), ('Test', 'TaskList:bar', 'Test'), ('test:me', 'TaskList:bar', 'Test:me'), ): self.assertEqual( self.notebook.resolve_path(name, Path(ns)), Path(wanted) ) self.assertRaises(PageNameError, self.notebook.resolve_path, ':::') self.assertRaises(PageNameError, self.notebook.resolve_path, '/foo') self.assertRaises(PageNameError, self.notebook.resolve_path, ':foo:(bar)') def testResolveFile(self): '''Test notebook.resolve_file()''' path = Path('Foo:Bar') dir = self.notebook.dir self.notebook.config['Notebook']['document_root'] = './notebook_document_root' self.notebook.do_properties_changed() # parse config doc_root = self.notebook.document_root self.assertEqual(doc_root, dir.subdir('notebook_document_root')) for link, wanted, cleaned in ( ('~/test.txt', File('~/test.txt'), '~/test.txt'), (r'~\test.txt', File('~/test.txt'), '~/test.txt'), ('file:///test.txt', File('file:///test.txt'), None), ('file:/test.txt', File('file:///test.txt'), None), ('file://localhost/test.txt', File('file:///test.txt'), None), ('/test.txt', doc_root.file('test.txt'), '/test.txt'), ('../../notebook_document_root/test.txt', doc_root.file('test.txt'), '/test.txt'), ('./test.txt', dir.file('Foo/Bar/test.txt'), './test.txt'), (r'.\test.txt', dir.file('Foo/Bar/test.txt'), './test.txt'), ('../test.txt', dir.file('Foo/test.txt'), '../test.txt'), (r'..\test.txt', dir.file('Foo/test.txt'), '../test.txt'), ('../Bar/Baz/test.txt', dir.file('Foo/Bar/Baz/test.txt'), './Baz/test.txt'), (r'C:\foo\bar', File('file:///C:/foo/bar'), None), (r'Z:\foo\bar', File('file:///Z:/foo/bar'), None), ): #~ print link, '>>', self.notebook.resolve_file(link, path) self.assertEqual( self.notebook.resolve_file(link, path), wanted) self.assertEqual( self.notebook.relative_filepath(wanted, path), cleaned) # check relative path without Path self.assertEqual( self.notebook.relative_filepath(doc_root.file('foo.txt')), '/foo.txt') self.assertEqual( self.notebook.relative_filepath(dir.file('foo.txt')), './foo.txt') # def testResolveLink(self): # '''Test page.resolve_link()''' # page = self.notebook.get_page(':Test:foo') # for link, wanted in ( #~ (':foo:bar', ('page', ':foo:bar')), # ('foo:bar', ('page', ':Test:foo:bar')), # ('Test', ('page', ':Test')), # ('Test:non-existent', ('page', ':Test:non-existent')), # ('user@domain.com', ('mailto', 'mailto:user@domain.com')), # ('mailto:user@domain.com', ('mailto', 'mailto:user@domain.com')), # ('http://zim-wiki.org', ('http', 'http://zim-wiki.org')), # ('foo://zim-wiki.org', ('foo', 'foo://zim-wiki.org')), #~ ('file://'), #~ ('/foo/bar', ('file', '/foo/bar')), #~ ('man?test', ('man', 'test')), # ): self.assertEqual(self.notebook.resolve_link(link, page), wanted) #~ def testResolveName(self): #~ '''Test store.resolve_name().''' #~ print '\n'+'='*10+'\nSTORE: %s' % self.store #~ #~ # First make sure basic list function is working #~ def list_pages(name): #~ for page in self.store.get_pages(name): #~ yield page.basename #~ self.assertTrue('Test' in list_pages('')) #~ self.assertTrue('foo' in list_pages(':Test')) #~ self.assertTrue('bar' in list_pages(':Test:foo')) #~ self.assertFalse('Dus' in list_pages(':Test:foo')) #~ #~ # Now test the resolving algorithm - only testing low level #~ # function in store, so path "anchor" does not work, search #~ # is strictly right to left through the namespace, if any #~ for link, namespace, name in ( #~ ('BAR','Test:foo','Test:foo:bar'), #~ ('test',None,'Test'), #~ ('test','Test:foo:bar','Test'), #~ ('FOO:Dus','Test:foo:bar','Test:foo:Dus'), #~ # FIXME more ambigous test data #~ ): #~ print '-'*10+'\nLINK %s (%s)' % (link, namespace) #~ r = self.store.resolve_name(link, namespace=namespace) #~ print 'RESULT %s' % r #~ self.assertEqual(r, name) class TestPath(tests.TestCase): '''Test path object''' def generator(self, name): return Path(name) def runTest(self): '''Test Path object''' for name, namespace, basename in [ ('Test:foo', 'Test', 'foo'), ('Test', '', 'Test'), ]: path = self.generator(name) # test basic properties self.assertEqual(path.name, name) self.assertEqual(path.basename, basename) self.assertEqual(path.namespace, namespace) self.assertTrue(path.name in path.__repr__()) # TODO test operators on paths > < + - >= <= == != class TestPage(TestPath): '''Test page object''' def setUp(self): self.notebook = tests.new_notebook() def generator(self, name): return self.notebook.get_page(Path(name)) def testMain(self): '''Test Page object''' TestPath.runTest(self) tree = ParseTree().fromstring('''\ foo:bar bar @baz ''' ) page = Page(Path('Foo')) page.readonly = False page.set_parsetree(tree) links = list(page.get_links()) self.assertEqual(links, [ ('page', 'foo:bar', {}), ('page', 'bar', {}), ] ) tags = list(page.get_tags()) self.assertEqual(tags, [ ('@baz', {'name': 'baz'}), ]) self.assertEqual(page.get_parsetree().tostring(), tree.tostring()) # ensure we didn't change the tree # TODO test get / set parse tree with and without source tree = ParseTree().fromstring('') self.assertFalse(tree.hascontent) page.set_parsetree(tree) self.assertFalse(page.hascontent) def testShouldAutochangeHeading(self): page = Page(Path("Foo")) page.readonly = False tree = ParseTree().fromstring('') tree.set_heading("Foo") page.set_parsetree(tree) self.assertTrue(page.heading_matches_pagename()) tree.set_heading("Bar") page.set_parsetree(tree) self.assertFalse(page.heading_matches_pagename()) class TestIndexPage(tests.TestCase): def setUp(self): self.notebook = tests.new_notebook() self.notebook.index.update() def runTest(self): '''Test index page generation''' indexpage = IndexPage(self.notebook, Path(':')) tree = indexpage.get_parsetree() self.assertTrue(tree) links = [link[1] for link in indexpage.get_links()] self.assertTrue(len(links) > 1) #~ print links self.assertTrue('Test:foo' in links) class TestNewNotebook(tests.TestCase): def setUp(self): self.notebook = Notebook(index=Index(dbfile=':memory:')) self.notebook.add_store(Path(':'), 'memory') # Explicitly not run index.update() here def runTest(self): '''Try populating a notebook from scratch''' # Based on bug lp:511481 - should reproduce bug with updating links to child pages notebook = self.notebook index = self.notebook.index for name, text in ( ('page1', 'Foo bar\n'), ('page1:child', 'I have backlinks !\n'), ('page2', '[[page1:child]] !\n'), ('page3', 'Hmm\n'), ): path = Path(name) page = self.notebook.get_page(path) page.parse('wiki', text) notebook.store_page(page) for name, forw, backw in ( ('page1', 0, 0), ('page1:child', 0, 1), ('page2', 1, 0), ('page3', 0, 0), ('page3:page1', 0, 0), ('page3:page1:child', 0, 0), ): path = Path(name) #~ print path, \ #~ list(index.list_links(path, LINK_DIR_FORWARD)), \ #~ list(index.list_links(path, LINK_DIR_BACKWARD)) self.assertEqual( index.n_list_links(path, LINK_DIR_FORWARD), forw) self.assertEqual( index.n_list_links(path, LINK_DIR_BACKWARD), backw) notebook.move_page(Path('page1'), Path('page3:page1')) for name, forw, backw in ( ('page1', 0, 0), ('page1:child', 0, 0), ('page2', 1, 0), ('page3', 0, 0), ('page3:page1', 0, 0), ('page3:page1:child', 0, 1), ): path = Path(name) #~ print path, \ #~ list(index.list_links(path, LINK_DIR_FORWARD)), \ #~ list(index.list_links(path, LINK_DIR_BACKWARD)) self.assertEqual( index.n_list_links(path, LINK_DIR_FORWARD), forw) self.assertEqual( index.n_list_links(path, LINK_DIR_BACKWARD), backw) text = ''.join(notebook.get_page(Path('page3:page1:child')).dump('wiki')) self.assertEqual(text, 'I have backlinks !\n') zim-0.60/tests/tableofcontents.py0000644000175000017500000000241611710032724017014 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import tests from zim.plugins.tableofcontents import * @tests.slowTest class TestTableOfContents(tests.TestCase): def setUp(self): self.ui = tests.MockObject() self.ui.page = None self.ui.notebook = tests.new_notebook() def runTest(self): '''Test Tabel Of Contents plugin''' widget = ToCWidget(self.ui) def count(): # Count number of rows in TreeModel model = widget.treeview.get_model() rows = [] def c(model, path, iter): rows.append(model[iter]) model.foreach(c) return len(rows) page = self.ui.notebook.get_page(Path('Test:wiki')) widget.on_open_page(self.ui, page, page) self.assertTrue(count() > 2) widget.on_stored_page(self.ui.notebook, page) self.assertTrue(count() > 2) emptypage = tests.MockObject() widget.on_open_page(self.ui, emptypage, emptypage) self.assertTrue(count() == 0) widget.on_stored_page(self.ui.notebook, emptypage) self.assertTrue(count() == 0) for page in self.ui.notebook.walk(): widget.on_open_page(self.ui, page, page) widget.on_stored_page(self.ui.notebook, page) # TODO check selecting heading in actual PageView # especially test selecting a non-existing item to check we don't get infinite loop zim-0.60/tests/attachmentbrowser.py0000664000175000017500000000466611722765752017412 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import tests from zim.parsing import url_encode, URL_ENCODE_READABLE from zim.plugins.attachmentbrowser import * class ThumbnailManagerTest(tests.TestCase): def runTest(self): manager = ThumbnailManager(preferences={}) dir = Dir('./data/pixmaps') # Test API and functions #~ for file in dir.list_objects(): # TODO for filename in dir.list(): file = dir.file(filename) # Remove and assert thumbnail does not exist manager.remove_thumbnails(file) for size in (THUMB_SIZE_NORMAL, THUMB_SIZE_LARGE): thumbfile = manager.get_thumbnail_file(file, size) self.assertFalse(thumbfile.exists(), msg="File exists: %s" % thumbfile) # Get thumbnails - twice, first they don't exist, than they do for (size, pixels) in ( (THUMB_SIZE_NORMAL, 128), (THUMB_SIZE_LARGE, 256), (THUMB_SIZE_NORMAL, 128), (THUMB_SIZE_LARGE, 256), ): thumb = manager.get_thumbnail(file, size) self.assertIsInstance(thumb, gtk.gdk.Pixbuf) self.assertEqual(thumb.get_width(), pixels) self.assertEqual(thumb.get_height(), pixels) self.assertTrue(thumb.get_option('tEXt::Thumb::URI').startswith('file:///')) # Specific requirement of spec to use file:/// and not file://localhost/ self.assertEqual(thumb.get_option('tEXt::Thumb::URI'), url_encode(file.uri, URL_ENCODE_READABLE)) self.assertEqual(thumb.get_option('tEXt::Thumb::MTime'), str( int( file.mtime() ) )) thumbfile = manager.get_thumbnail_file(file, size) self.assertTrue(thumbfile.exists(), msg="Missing file: %s" % thumbfile) basename = hashlib.md5(file.uri).hexdigest() + '.png' self.assertEqual(thumbfile.basename, basename) # TODO assert permission on file is 0600 -- stat ? # TODO test detection of invalid thumbs # TODO test with utf-8 char in image name # Remove again and assert thumbnail does not exist #~ manager.remove_thumbnails(file) #~ for size in (THUMB_SIZE_NORMAL, THUMB_SIZE_LARGE): #~ thumbfile = manager.get_thumbnail_file(file, size) #~ self.assertFalse(thumbfile.exists(), msg="File exists: %s" % thumbfile) # Test ASync mode #~ wanted = set() #~ seen = {} #~ def callback(file, size, thumbnail): #~ seen[file] = thumbnail #~ for file in dir.list_objects(): #~ manager.get_thumbnail_async(file, THUMB_SIZE_NORMAL, callback) #while queue: # wait #~ for file in wanted: #~ assert file in seen zim-0.60/tests/imagegenerators.py0000644000175000017500000000772111751006340017002 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import tests from zim.fs import Dir from zim.plugins.equationeditor import * from zim.plugins.diagrameditor import * from zim.plugins.gnu_r_ploteditor import * from zim.plugins.gnuplot_ploteditor import * @tests.slowTest class TestGenerator(tests.TestCase): def _test_generator(self): # Check properties self.assertIsNotNone(self.generatorklass.type) self.assertIsNotNone(self.generatorklass.scriptname) self.assertIsNotNone(self.generatorklass.imagename) # Input OK generator = self.generatorklass() generator.cleanup() # ensure files did not yet exist imagefile, logfile = generator.generate_image(self.validinput) self.assertTrue(imagefile.exists()) if generator.uses_log_file: self.assertTrue(logfile.exists()) else: self.assertIsNone(logfile) # Cleanup generator.cleanup() self.assertFalse(imagefile.exists()) if generator.uses_log_file: self.assertFalse(logfile.exists()) # Input NOK generator = self.generatorklass() imagefile, logfile = generator.generate_image(self.invalidinput) self.assertIsNone(imagefile) if generator.uses_log_file: self.assertTrue(logfile.exists()) else: self.assertIsNone(logfile) # Dialog OK attachment_dir = Dir(self.create_tmp_dir()) dialog = self.dialogklass(MockUI(attachment_dir)) dialog.set_text(self.validinput) dialog.assert_response_ok() # Dialog NOK def ok_store(dialog): # Click OK in the "Store Anyway" question dialog dialog.do_response(gtk.RESPONSE_YES) with tests.DialogContext(ok_store): dialog = self.dialogklass(MockUI(attachment_dir)) dialog.set_text(self.invalidinput) dialog.assert_response_ok() # Check menu #~ plugin = self.pluginklass(MockUI()) #~ menu = gtk.Menu() #~ plugin.do_populate_popup(menu, buffer, iter, image) @tests.skipUnless(InsertEquationPlugin.check_dependencies_ok(), 'Missing dependencies') class TestEquationEditor(TestGenerator): def setUp(self): self.generatorklass = EquationGenerator self.dialogklass = InsertEquationDialog self.validinput = r''' c = \sqrt{ a^2 + b^2 } \int_{-\infty}^{\infty} \frac{1}{x} \, dx f(x) = \sum_{n = 0}^{\infty} \alpha_n x^n x_{1,2}=\frac{-b\pm\sqrt{\color{Red}b^2-4ac}}{2a} \hat a \bar b \vec c x' \dot{x} \ddot{x} ''' self.invalidinput = r'\int_{' def runTest(self): 'Test Equation Editor plugin' TestGenerator._test_generator(self) @tests.skipUnless(InsertDiagramPlugin.check_dependencies_ok(), 'Missing dependencies') class TestDiagramEditor(TestGenerator): def setUp(self): self.generatorklass = DiagramGenerator self.dialogklass = InsertDiagramDialog self.validinput = r''' digraph G { foo -> bar bar -> baz baz -> foo } ''' self.invalidinput = r'sdf sdfsdf sdf' def runTest(self): 'Test Diagram Editor plugin' TestGenerator._test_generator(self) @tests.skipUnless(InsertGNURPlotPlugin.check_dependencies_ok(), 'Missing dependencies') class TestGNURPlotEditor(TestGenerator): def setUp(self): self.generatorklass = GNURPlotGenerator self.dialogklass = InsertGNURPlotDialog self.validinput = r''' x = seq(-4,4,by=0.01) y = sin(x) + 1 plot(x,y,type='l') ''' self.invalidinput = r'sdf sdfsdf sdf' def runTest(self): 'Test GNU R Plot Editor plugin' TestGenerator._test_generator(self) @tests.skipUnless(InsertGNURPlotPlugin.check_dependencies_ok(), 'Missing dependencies') class TestGnuplotEditor(TestGenerator): def setUp(self): self.generatorklass = GnuplotGenerator self.dialogklass = InsertGnuplotDialog self.validinput = r'plot sin(x), cos(x)' self.invalidinput = r'sdf sdfsdf sdf' def runTest(self): 'Test Gnuplot Plot Editor plugin' TestGenerator._test_generator(self) class MockUI(tests.MockObject): def __init__(self, dir): self.notebook = tests.MockObject() self.notebook.mock_method('get_attachments_dir', dir) self.mainwindow = tests.MockObject() self.mainwindow.pageview = tests.MockObject() zim-0.60/tests/insertsymbol.py0000664000175000017500000000471212012764113016357 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg from __future__ import with_statement import tests from tests.pageview import setUpPageView, press, UndoStackManager from zim.config import ConfigDict from zim.plugins.insertsymbol import * ALPHA = unichr(945) EACUTE = unichr(201) ECIRC = unichr(202) EGRAVE = unichr(200) class TestInsertSymbolPlugin(tests.TestCase): def runTest(self): ui = MockUI() plugin = InsertSymbolPlugin(ui) plugin.finalize_ui(ui) pageview = ui.mainwindow.pageview textview = pageview.view buffer = textview.get_buffer() pageview.undostack = UndoStackManager(buffer) print '\n!! Two GtkWarnings expected here for gdk display !!' # Need a window to get the widget realized window = gtk.Window() window.add(pageview) pageview.realize() textview.realize() # insert on end-of-word with space press(textview, r'\alpha ') text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, ALPHA + ' ') # Check undo - first undo replace, then the insert space pageview.undo() text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, r'\alpha ') pageview.undo() text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, r'\alpha') # no trailing space # insert on end-of-word with ; buffer.clear() press(textview, r'\alpha;') text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, ALPHA) # no trailing space # no insert in code or pre section buffer.clear() pageview.toggle_format(VERBATIM) press(textview, r'\alpha ') text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, r'\alpha ') # no replace # test dialog def check_dialog(dialog): self.assertIsInstance(dialog, InsertSymbolDialog) dialog.iconview.item_activated((9,)) # path for 10th item in symbol list dialog.iconview.item_activated((10,)) # path for 11th item in symbol list dialog.iconview.item_activated((11,)) # path for 12th item in symbol list dialog.assert_response_ok() buffer.clear() with tests.DialogContext(check_dialog): plugin.insert_symbol() text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, EACUTE + ECIRC + EGRAVE) class MockUI(tests.MockObject): ui_type = 'gtk' def __init__(self): tests.MockObject.__init__(self) self.preferences = ConfigDict() self.uistate = ConfigDict() self.mainwindow = tests.MockObject() self.mainwindow.pageview = setUpPageView() self.windows = [] zim-0.60/tests/widgets.py0000644000175000017500000002123212111225223015257 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Jaap Karssenberg import tests from zim.fs import File, Dir from zim.notebook import Path from zim.gui.widgets import * class TestFunctions(tests.TestCase): def runTest(self): self.assertEqual(encode_markup_text(' &bar'), '<foo> &bar') self.assertEqual(decode_markup_text('<foo> &bar'), ' &bar') self.assertEqual(decode_markup_text('<foo> &bar'), ' &bar') class TestInputEntry(tests.TestCase): def runTest(self): '''Test InputEntry widget''' entry = InputEntry() self.assertTrue(entry.get_input_valid()) self.assertEqual(entry.get_text(), '') # test unicode nd whitespace entry.set_text(u'\u2022 foo ') text = entry.get_text() self.assertTrue(isinstance(text, unicode)) self.assertEqual(text, u'\u2022 foo') self.assertTrue(entry.get_input_valid()) # test set invalid + change entry.set_input_valid(False) self.assertFalse(entry.get_input_valid()) entry.set_text(u'foo bar') self.assertTrue(entry.get_input_valid()) # test invalid but now with allow_empty=False entry = InputEntry(allow_empty=False) self.assertFalse(entry.get_input_valid()) entry.set_text(u'foo bar') self.assertTrue(entry.get_input_valid()) entry.set_text(u'') self.assertFalse(entry.get_input_valid()) # and with a function entry = InputEntry(check_func=lambda text: text.startswith('a')) self.assertFalse(entry.get_input_valid()) entry.set_text(u'foo bar') self.assertFalse(entry.get_input_valid()) entry.set_text(u'aa foo bar') self.assertTrue(entry.get_input_valid()) entry.set_text(u'') self.assertFalse(entry.get_input_valid()) # and with placeholder text entry = InputEntry(allow_empty=False, placeholder_text='PLACEHOLDER') self.assertEqual(entry.get_text(), u'') self.assertFalse(entry.get_input_valid()) entry.set_text(u'foo bar') self.assertEqual(entry.get_text(), u'foo bar') self.assertTrue(entry.get_input_valid()) entry.set_text(u'') self.assertEqual(entry.get_text(), u'') self.assertFalse(entry.get_input_valid()) class TestFileEntry(tests.TestCase): def setUp(self): path = self.get_tmp_name() self.notebook = tests.new_notebook(fakedir=path) self.entry = FileEntry() def runTest(self): '''Test FileEntry widget''' path = Path('Foo:Bar') entry = self.entry entry.set_use_relative_paths(self.notebook, path) home = Dir('~') dir = self.notebook.dir for file, text in ( (home.file('zim-test.txt'), '~/zim-test.txt'), (dir.file('Foo/Bar/test.txt'), './test.txt'), (File('/test.txt'), File('/test.txt').path), # win32 save ): entry.set_file(file) self.assertEqual(entry.get_text(), text) self.assertEqual(entry.get_file(), file) self.notebook.config['Notebook']['document_root'] = './notebook_document_root' self.notebook.do_properties_changed() # parse config doc_root = self.notebook.document_root self.assertEqual(doc_root, dir.subdir('notebook_document_root')) for file, text in ( (home.file('zim-test.txt'), '~/zim-test.txt'), (dir.file('Foo/Bar/test.txt'), './test.txt'), (File('/test.txt'), File('/test.txt').uri), # win32 save (doc_root.file('test.txt'), '/test.txt'), ): entry.set_file(file) self.assertEqual(entry.get_text(), text) self.assertEqual(entry.get_file(), file) entry.set_use_relative_paths(self.notebook, None) for file, text in ( (home.file('zim-test.txt'), '~/zim-test.txt'), (dir.file('Foo/Bar/test.txt'), './Foo/Bar/test.txt'), (File('/test.txt'), File('/test.txt').uri), # win32 save (doc_root.file('test.txt'), '/test.txt'), ): entry.set_file(file) self.assertEqual(entry.get_text(), text) self.assertEqual(entry.get_file(), file) entry.set_use_relative_paths(notebook=None) for file, text in ( (home.file('zim-test.txt'), '~/zim-test.txt'), #~ (dir.file('Foo/Bar/test.txt'), './test.txt'), (File('/test.txt'), File('/test.txt').path), # win32 save ): entry.set_file(file) self.assertEqual(entry.get_text(), text) self.assertEqual(entry.get_file(), file) class TestPageEntry(tests.TestCase): entryklass = PageEntry def setUp(self): path = self.get_tmp_name() self.notebook = tests.new_notebook(fakedir=path) self.reference = Path('Test:foo') self.entry = self.entryklass(self.notebook, self.reference) def runTest(self): '''Test PageEntry widget''' entry = self.entry reference = self.reference entry.set_path(Path('Test')) self.assertEqual(entry.get_text(), ':Test') self.assertEqual(entry.get_path(), Path('Test')) entry.set_text('bar') self.assertEqual(entry.get_path(), Path('Bar')) # resolved due to placeholder entry.set_text('non existing') self.assertEqual(entry.get_path(), Path('Test:non existing')) entry.set_text('+bar') self.assertEqual(entry.get_path(), Path('Test:foo:bar')) entry.set_text(':bar') self.assertEqual(entry.get_path(), Path('Bar')) ## Test completion def get_completions(entry): completion = entry.get_completion() model = completion.get_model() return [r[0] for r in model] entry.set_text('+T') self.assertEqual(get_completions(entry), ['+bar']) entry.set_text(':T') completions = get_completions(entry) self.assertTrue(len(completions) > 5 and ':Test' in completions) entry.set_text('T') self.assertTrue(len(completions) > 5 and ':Test' in completions) # completion now has full notebook entry.set_text('Test:') self.assertEqual(get_completions(entry), ['Test:foo', 'Test:Foo Bar', 'Test:tags', 'Test:wiki']) class TestNamespaceEntry(TestPageEntry): entryklass = NamespaceEntry def runTest(self): '''Test NamespaceEntry widget''' entry = self.entry entry.set_text('') entry.do_focus_in_event(gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE)) self.assertTrue(entry.get_input_valid()) self.assertEqual(entry.get_text(), '') # No '' or something ! self.assertEqual(entry.get_path(), Path(':')) entry.do_focus_out_event(gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE)) self.assertTrue(entry.get_input_valid()) self.assertEqual(entry.get_text(), '') # No '' or something ! self.assertEqual(entry.get_path(), Path(':')) TestPageEntry.runTest(self) class TestLinkEntry(TestPageEntry, TestFileEntry): entryklass = LinkEntry def runTest(self): '''Test LinkEntry widget''' TestPageEntry.runTest(self) TestFileEntry.runTest(self) class TestInputForm(tests.TestCase): def runTest(self): '''Test InputForm widget''' inputs = [ ('foo', 'string', 'Foo'), ('bar', 'password', 'Bar'), ('check', 'bool', 'Check'), ('width', 'int', 'Width', (0, 10)), ('app', 'choice', 'Application', ['foo', 'bar', 'baz']), ('page', 'page', 'Page'), ('namespace', 'namespace', 'Namespace'), #~ ('link', 'link', 'Link'), ('file', 'file', 'File'), ('image', 'image', 'Image'), ('folder', 'dir', 'Folder') ] values1 = { 'foo': '', 'bar': 'dus', 'check': True, 'width': 1, 'app': 'foo', 'page': ':foo:bar:Baz', # explicit string input 'namespace': ':foo:bar:Baz', #~ 'link': '+Baz', 'file': '/foo/bar', 'image': '/foo/bar.png', 'folder': '/foo/bar', } values2 = { 'foo': 'tja', 'bar': 'hmm', 'check': False, 'width': 3, 'app': 'bar', 'page': Path(':Dus:Baz'), # explicit Path input 'namespace': Path(':Dus:Baz'), #~ 'link': ':Foo', 'file': '/foo/bar/baz', 'image': '/foo.png', 'folder': '/foo/bar/baz', } def assertEqual(U, V): self.assertEqual(set(U.keys()), set(V.keys())) for k, v in V.items(): if isinstance(U[k], Path) and isinstance(v, basestring): v = Path(v) elif isinstance(U[k], File) and isinstance(v, basestring): v = File(v) elif isinstance(U[k], Dir) and isinstance(v, basestring): v = Dir(v) self.assertEqual(U[k], v) notebook = tests.new_notebook() form = InputForm(inputs, values1, notebook=notebook) for input in inputs: name = input[0] self.assertTrue(form.widgets[name], 'Missing input "%s"' % name) assertEqual(form, values1) form.update(values2) assertEqual(form, values2) config = {} config.update(form) assertEqual(config, values2) form.show_all() form.focus_first() i = 0 while form.focus_next(): i += 1 self.assertEqual(i, 9) @tests.slowTest class TestFileDialog(tests.TestCase): def runTest(self): tmp_dir = self.create_tmp_dir() file = File((tmp_dir, 'test.txt')) file.write('test 123') self.assertTrue(file.exists()) dialog = FileDialog(None, 'Test') dialog.set_file(file) #~ myfile = dialog.get_file() #~ self.assertTrue(myfile) #~ self.assertTrue(myfile == file) #~ dialog.assert_response_ok() #~ self.assertTrue(dialog.result == file) # TODO select multiple # TODO select folder # TODO add filters zim-0.60/tests/pageview.py0000644000175000017500000016375712034020627015450 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import tests from zim.fs import File, Dir from zim.formats import wiki, ParseTree from zim.notebook import Path from zim.gui.pageview import * from zim.config import ConfigDict, ConfigDictFile, XDG_CONFIG_HOME from zim.gui.clipboard import Clipboard class FilterNoSuchImageWarning(tests.LoggingFilter): logger = 'zim.gui.pageview' message = 'No such image:' def new_parsetree_from_text(text): ## FIXME had to wrap my own here becase of stupid ## resolve_images - get rid of that tree = tests.new_parsetree_from_text(text) notebook = tests.new_notebook(fakedir='/foo') page = notebook.get_page(Path('Foo')) tree.resolve_images(notebook, page) return tree def setUpPageView(fakedir=None, notebook=None): '''Some bootstrap code to get an isolated PageView object''' ## TODO - should not be needed ## we can get rid of this when we refactor the actiongroup stuff ## to not register, by be called by the window PageView.actiongroup = tests.MockObject() # use class attribute to fake ui init PageView.actiongroup.mock_method('get_action', tests.MockObject()) PageView.actiongroup.mock_method('list_actions', []) if notebook is None: notebook = tests.new_notebook(fakedir) ui = MockUI() ui.notebook = notebook ui.page = None ui.uimanager = tests.MockObject() ui.uimanager.mock_method('get_accel_group', tests.MockObject()) ui.mainwindow = tests.MockObject() ui.mainwindow.statusbar_style_label = tests.MockObject() return PageView(ui) class TestCaseMixin(object): # Mixin class with extra test methods def assertBufferEquals(self, buffer, wanted): if not isinstance(wanted, basestring): wanted = tree.tostring() raw = '' in wanted tree = buffer.get_parsetree(raw=raw) self.assertEqual(tree.tostring(), wanted) def assertSelection(self, buffer, line, offset, string): self.assertCursorPosition(buffer, offset, line) bound = buffer.get_selection_bounds() self.assertTrue(bound) selection = bound[0].get_slice(bound[1]) self.assertEqual(selection, string) def assertCursorPosition(self, buffer, offset, line): #~ print 'CHECK', line, offset, text cursor = buffer.get_insert_iter() #~ print ' GOT', cursor.get_line(), cursor.get_line_offset() self.assertEqual(cursor.get_line(), line) self.assertEqual(cursor.get_line_offset(), offset) class TestTextBuffer(tests.TestCase, TestCaseMixin): def testVarious(self): '''Test serialization and interaction of the page view textbuffer''' wikitext = tests.WikiTestData.get('roundtrip') tree = new_parsetree_from_text(wikitext) buffer = TextBuffer() with FilterNoSuchImageWarning(): buffer.set_parsetree(tree) raw1 = buffer.get_parsetree(raw=True) result1 = buffer.get_parsetree() #~ print tree.tostring() #~ print result1.tostring() #~ self.assertEqual(result1.tostring(), tree.tostring()) ## HACK since above check to directly compare trees is broken, ## check in round about way that we have numbered list elements for elt in result1.findall('li'): if elt.attrib.get('bullet') == '1.': break else: assert False, 'Missing numbered list element' ## # Compare cooked tree after dumping back resulttext = u''.join(wiki.Dumper().dump(result1)) self.assertEqual(resulttext, wikitext) # Compare we are stable when loading raw tree again raw = raw1.tostring() with FilterNoSuchImageWarning(): buffer.set_parsetree(raw1) self.assertEqual(raw1.tostring(), raw) # If this fails, set_parsetree is modifying the tree raw2 = buffer.get_parsetree(raw=True) self.assertEqual(raw2.tostring(), raw) # Actual cooked roundtrip test # Compare we are stable when loading cooked tree again cooked = result1.tostring() with FilterNoSuchImageWarning(): buffer.set_parsetree(result1) self.assertEqual(result1.tostring(), cooked) # If this fails, set_parsetree is modifying the tree result2 = buffer.get_parsetree() self.assertEqual(result2.tostring(), cooked) # Actual cooked roundtrip test # Test 'raw' really preserves "errors" input = '''\ foobarbaz dus
    ja
    hmm foo bar dus
    ja
    hmm dus ja grrr
  • Foo
  • Bar
  • ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) self.assertFalse(buffer.get_modified()) rawtree = buffer.get_parsetree(raw=True) self.assertFalse(buffer.get_modified()) self.assertEqual(rawtree.tostring(), input) # Test errors are cleaned up correctly wanted = '''\ foo bar baz dus ja hmm foo bar dus ja hmm dus ja grrr
  • Foo
  • Bar
  • ''' tree = buffer.get_parsetree() self.assertFalse(buffer.get_modified()) self.assertEqual(tree.tostring(), wanted) # Test pasting some simple text buffer.set_parsetree(tree) # reset without errors input = '''\ Bold''' wanted = '''\ foo bar baz dus ja hmm foo bar dus ja hmm dus ja grrr
  • FooBold
  • BoldBar
  • ''' pastetree = tests.new_parsetree_from_xml(input) iter = buffer.get_iter_at_line(15) iter.forward_chars(5) # position after "* Foo" buffer.insert_parsetree(iter, pastetree, interactive=True) iter = buffer.get_iter_at_line(16) # position before bullet "* Bar" buffer.insert_parsetree(iter, pastetree, interactive=True) tree = buffer.get_parsetree() self.assertTrue(buffer.get_modified()) self.assertEqual(tree.tostring(), wanted) # Now paste list halfway and see result is OK # because of the bullets pasting should go to a new line # automatically input = '''\
  • Foo
  • Bar
  • ''' wanted = '''\ foo bar baz
  • Foo
  • Bar
  • dus ja hmm foo bar dus ja hmm dus ja grrr
  • FooBold
  • BoldBar
  • ''' pastetree = tests.new_parsetree_from_xml(input) iter = buffer.get_iter_at_line(4) iter.forward_chars(3) # position after "baz" buffer.insert_parsetree(iter, pastetree, interactive=True) tree = buffer.get_parsetree() self.assertTrue(buffer.get_modified()) self.assertEqual(tree.tostring(), wanted) # Test sanity for editing "errors" input = '''\
  • Box 1
  • Box 2
  • Box 3
  • ''' wanted = '''\
  • Box 1
  • foo Box 2
  • Box 3
  • ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) iter = buffer.get_iter_at_line(2) # iter *before* checkbox buffer.insert(iter, 'foo ') #print buffer.get_parsetree(raw=True).tostring() #print buffer.get_parsetree().tostring() tree = buffer.get_parsetree() self.assertEqual(tree.tostring(), wanted) # Strange bug let to second bullet disappearing in this case input = '''\
  • Box 1
  • Box 2
  • Box 3
  • ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) iter = buffer.get_iter_at_line(2) # iter before checkbox bound = iter.copy() bound.forward_char() buffer.select_range(iter, bound) buffer.toggle_textstyle('strike') #~ print buffer.get_parsetree(raw=True).tostring() #~ print buffer.get_parsetree().tostring() tree = buffer.get_parsetree() self.assertEqual(tree.tostring(), input) # Check how robust we are for placeholder utf8 character buffer = TextBuffer() buffer.insert_at_cursor(u'foo \uFFFC bar') wanted = '''\ foo bar''' tree = buffer.get_parsetree() self.assertEqual(tree.tostring(), wanted) # Test merge lines logic on delete input = '''\ Foo Bar
  • List item 0
  • List item 1
  • ''' wanted = '''\ FooBar List item 0
    List item 1
    ''' # Note: we don't insert extra newlines, but
  • assumes them tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) tree = buffer.get_parsetree() self.assertEqual(tree.tostring(), input) iter = buffer.get_iter_at_line(2) # before h2 bound = iter.copy() iter.backward_chars(2) # after h1 buffer.delete(iter, bound) iter = buffer.get_iter_at_line(2) # list item 0 bound = iter.copy() bound.forward_chars(2) # Behind bullet buffer.delete(iter, bound) iter = buffer.get_iter_at_line(4) # list item 1 bound = iter.copy() bound.forward_chars(2) # Behind bullet buffer.delete(iter, bound) #~ print buffer.get_parsetree().tostring() #~ print wanted tree = buffer.get_parsetree() self.assertEqual(tree.tostring(), wanted) # Exercize recursive checkbox lists input = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) # just a sanity check wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' buffer.toggle_checkbox(2, recursive=True) # Bar buffer.toggle_checkbox(3, recursive=True) # Bar 1 # After first click all children become checked # After second click one becomes xchecked buffer.place_cursor(buffer.get_iter_at_line(1)) # Foo buffer.toggle_checkbox_for_cursor_or_selection(XCHECKED_BOX) # Like on first list item line tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' start = buffer.get_iter_at_line(2) # Bar end = buffer.get_iter_at_line(6) # Bar 3 end.forward_to_line_end() buffer.select_range(start, end) buffer.toggle_checkbox_for_cursor_or_selection(CHECKED_BOX, recursive=True) # Like keypress would trigger while selection present tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # Test deleting checkbox and undo / redo does not mess up indenting etc undomanager = UndoStackManager(buffer) previous = wanted wanted = '''\ Dusss
  • Foo
  • Bar
  • Baz
  • Tja
    ''' start = buffer.get_iter_at_line(3) # Bar 1 end = buffer.get_iter_at_line(7) # Baz (before checkbox !) buffer.delete(start, end) tree = buffer.get_parsetree(raw=True) #~ print tree.tostring() #~ print wanted self.assertEqual(tree.tostring(), wanted) undomanager.undo() tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), previous) undomanager.redo() tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) def testReplace(self): # Check replacing a formatted word # word is deleted, but formatting should stay input = '''\ aaa bbb ccc ''' wanted = '''\ aaa eee ccc ''' tree = tests.new_parsetree_from_xml(input) buffer = TextBuffer() buffer.set_parsetree(tree) iter = buffer.get_iter_at_offset(7) # middle of "bbb" buffer.place_cursor(iter) buffer.select_word() with buffer.user_action: buffer.delete_selection(True, True) buffer.insert_interactive_at_cursor("eee", True) self.assertBufferEquals(buffer, wanted) def testSelectLink(self): input = '''\ aaa bbb ccc ''' tree = tests.new_parsetree_from_xml(input) buffer = TextBuffer() buffer.set_parsetree(tree) buffer.place_cursor(buffer.get_iter_at_offset(7)) # middle of link self.assertIsNone(buffer.get_has_link_selection()) data = buffer.select_link() self.assertEqual(data['href'], 'xxx') self.assertEqual(buffer.get_has_link_selection(), data) class TestUndoStackManager(tests.TestCase): def runTest(self): '''Test the undo/redo functionality''' buffer = TextBuffer() undomanager = UndoStackManager(buffer) wikitext = tests.WikiTestData.get('roundtrip') tree = new_parsetree_from_text(wikitext) with FilterNoSuchImageWarning(): buffer._insert_element_children(tree.getroot()) # Use private method to circumvent begin-insert-tree # signal etc. so we get undo stack for inserting # First test is to check we have a continuous undo stack after # inserting a parse tree. Nota bene, if this test fails, the # insert_parsetree() function is not strictly serial, which # probably breaks proper formatting e.g. when pasting a tree # half way in a line. #~ import pprint #~ undomanager.flush_insert() #~ def tostring(data): #~ if hasattr(data, 'tostring'): #~ return data.tostring()[39:] #~ else: #~ return data.get_property('name') i = 0 for group in undomanager.stack + [undomanager.group]: #~ pprint.pprint( #~ [(a[0], a[1], a[2], tostring(a[3])) for a in group] ) for action in group: self.assertEqual(action[1], i) # assert undo stack is continous i = action[2] self.assertTrue(len(undomanager.stack) > 10) # check we recorded something # Now we iterate through the tree to verify we get a proper # state at every step of the stack, then we redo to check we # get back what we had buffertree1 = buffer.get_parsetree(raw=True) while undomanager.undo(): _ = buffer.get_parsetree() # just check for no warnings emptytree = buffer.get_parsetree(raw=True) self.assertEqual(emptytree.tostring(), "\n") with FilterNoSuchImageWarning(): while undomanager.redo(): _ = buffer.get_parsetree() # just check for no warnings buffertree2 = buffer.get_parsetree(raw=True) self.assertEqual(buffertree2.tostring(), buffertree1.tostring()) while undomanager.undo(): continue emptytree = buffer.get_parsetree(raw=True) self.assertEqual(emptytree.tostring(), "\n") buffer.clear() self.assertTrue(len(undomanager.stack) == 0) undomanager.unblock() # Test merging for c in 'fooo barr baz': with buffer.user_action: buffer.insert_at_cursor(c) #~ import pprint #~ undomanager.flush_insert() #~ pprint.pprint(undomanager.stack) self.assertTrue(len(undomanager.stack) == 5) # 3 words, 2 spaces for group in undomanager.stack: self.assertTrue(len(group) == 1) # merge was sucessfull self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") for wanted in ( "\nfooo barr ", "\nfooo barr", "\nfooo ", "\nfooo", "\n" ): undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), wanted) while undomanager.redo(): continue self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") # test other actions iter = buffer.get_iter_at_offset(7) buffer.place_cursor(iter) buffer.select_word() buffer.toggle_textstyle('strong') self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") undomanager.redo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") start, end = map(buffer.get_iter_at_offset, (5, 10)) with buffer.user_action: buffer.delete(start, end) self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo baz") undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") undomanager.redo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo baz") # test folding undomanager.undo() undomanager.undo() undomanager.undo() undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr") with buffer.user_action: buffer.insert_at_cursor(' ') undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr") undomanager.undo() # here we undo fold of 4 undos above self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo baz") undomanager.undo() self.assertEqual(buffer.get_parsetree().tostring(), "\nfooo barr baz") class TestFind(tests.TestCase, TestCaseMixin): def testVarious(self): buffer = TextBuffer() finder = buffer.finder buffer.set_text('''\ FOO FooBar FOOBAR FooBaz Foo Bar foo Bar Baz Foo ''') buffer.place_cursor(buffer.get_start_iter()) # Check normal usage, case-insensitive for text in ('f', 'fo', 'foo', 'fo', 'f', 'F', 'Fo', 'Foo'): finder.find(text) self.assertSelection(buffer, 0, 0, text.upper()) finder.find('Grr') self.assertCursorPosition(buffer, 0, 0) finder.find('Foob') self.assertSelection(buffer, 0, 4, 'FooB') for line, offset, text in ( (0, 11, 'FOOB'), (1, 0, 'FooB'), (0, 4, 'FooB'), ): finder.find_next() self.assertSelection(buffer, line, offset, text) for line, offset, text in ( (1, 0, 'FooB'), (0, 11, 'FOOB'), (0, 4, 'FooB'), ): finder.find_previous() self.assertSelection(buffer, line, offset, text) # Case sensitive finder.find('Foo', FIND_CASE_SENSITIVE) self.assertSelection(buffer, 0, 4, 'Foo') for line, offset, text in ( (1, 0, 'Foo'), (1, 7, 'Foo'), (2, 12, 'Foo'), (0, 4, 'Foo'), ): finder.find_next() self.assertSelection(buffer, line, offset, text) # Whole word finder.find('Foo', FIND_WHOLE_WORD) self.assertSelection(buffer, 1, 7, 'Foo') for line, offset, text in ( (2, 0, 'foo'), (2, 12, 'Foo'), (0, 0, 'FOO'), (1, 7, 'Foo'), ): finder.find_next() self.assertSelection(buffer, line, offset, text) # Regular expression finder.find(r'Foo\s*Bar', FIND_REGEX | FIND_CASE_SENSITIVE) self.assertSelection(buffer, 1, 7, 'Foo Bar') finder.find_next() self.assertSelection(buffer, 0, 4, 'FooBar') # Highlight - just check it doesn't crash finder.set_highlight(True) finder.set_highlight(False) def testReplace(self): buffer = TextBuffer() finder = buffer.finder tree = tests.new_parsetree_from_xml('''\ FOO FooBar FOOBAR FooBaz Foo Bar foo Bar Baz Foo ''') buffer.set_parsetree(tree) finder.find('Foo(\w*)', FIND_REGEX) # not case sensitive! finder.find_next() self.assertSelection(buffer, 0, 4, 'FooBar') finder.replace('Dus') self.assertSelection(buffer, 0, 4, 'Dus') wanted = '''\ FOO Dus FOOBAR FooBaz Foo Bar foo Bar Baz Foo ''' self.assertBufferEquals(buffer, wanted) finder.replace_all('dus*\\1*') wanted = '''\ dus** Dus dus*BAR* dus*Baz* dus** Bar dus** Bar Baz dus** ''' self.assertBufferEquals(buffer, wanted) class TestLists(tests.TestCase, TestCaseMixin): def testBulletLists(self): '''Test interaction for lists''' buffer = TextBuffer() input = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) # just a sanity check undomanager = UndoStackManager(buffer) # check list initializes properly row, list = TextBufferList.new_from_line(buffer, 3) # Bar 1 self.assertEqual(list.firstline, 1) self.assertEqual(list.lastline, 7) self.assertEqual(row, 2) self.assertEqual(list, [ (1, 0, '*'), (2, 0, '*'), (3, 1, '*'), (4, 2, '*'), (5, 1, '*'), (6, 1, '*'), (7, 0, '*'), ] ) # Exercise indenting row, list = TextBufferList.new_from_line(buffer, 3) # Bar 1 self.assertFalse(list.can_indent(row)) self.assertFalse(list.indent(row)) row, list = TextBufferList.new_from_line(buffer, 2) # Bar self.assertTrue(list.can_indent(row)) self.assertTrue(list.indent(row)) self.assertFalse(list.can_indent(row)) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) row, list = TextBufferList.new_from_line(buffer, 7) # Baz self.assertFalse(list.can_unindent(row)) self.assertFalse(list.unindent(row)) row, list = TextBufferList.new_from_line(buffer, 3) # Bar 1 self.assertTrue(list.can_unindent(row)) self.assertTrue(list.unindent(row)) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) for line in (2, 5, 6): # Bar, Bar 2 & Bar 3 row, list = TextBufferList.new_from_line(buffer, line) self.assertTrue(list.can_unindent(row)) self.assertTrue(list.unindent(row)) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) # Test undo / redo for indenting and lists for i in range(3): self.assertTrue(undomanager.undo()) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) while undomanager.undo(): pass tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) while undomanager.redo(): pass tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) for i in range(3): self.assertTrue(undomanager.undo()) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # Exercize recursive checkbox lists input = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = tests.new_parsetree_from_xml(input) buffer.set_parsetree(tree) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) # just a sanity check undomanager = UndoStackManager(buffer) row, list = TextBufferList.new_from_line(buffer, 2) # Bar list.set_bullet(row, CHECKED_BOX) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) list.set_bullet(row, UNCHECKED_BOX) row = list.get_row_at_line(3) # Bar 1 list.set_bullet(row, XCHECKED_BOX) row = list.get_row_at_line(5) # Bar 2 list.set_bullet(row, UNCHECKED_BOX) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) row = list.get_row_at_line(5) # Bar 2 list.set_bullet(row, CHECKED_BOX) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) row = list.get_row_at_line(4) # Bar 1.1 list.set_bullet(row, UNCHECKED_BOX) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) wantedpre1 = wanted row = list.get_row_at_line(4) # Bar 1.1 list.set_bullet(row, CHECKED_BOX) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # Test indenting / unindenting the whole list wantedpre = wanted row = list.get_row_at_line(1) # Foo list.indent(row) wanted = '''\ Dusss
  • Foo
  • Bar
  • Bar 1
  • Bar 1.1
  • Bar 2
  • Bar 3
  • Baz
  • Tja
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) list.unindent(row) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wantedpre) # Test undo / redo for indenting and lists for xml in (wanted, wantedpre, wantedpre1): self.assertTrue(undomanager.undo()) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), xml) for xml in (wantedpre, wanted, wantedpre): self.assertTrue(undomanager.redo()) tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), xml) while undomanager.undo(): pass tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), input) while undomanager.redo(): pass tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wantedpre) def testNumberedLists(self): buffer = TextBuffer() # The rules for renumbering are: # # 1. If this is top of the list, number down # 2. Otherwise look at bullet above and number down from there # (this means whatever the user typed doesn't really matter) # 3. If above bullet is non-number bullet, replace the numbered # item with that bullet (for checkboxes always an open # checkbox is used.) # # Note that the bullet on the line we look also at does not have # to be a numbered bullet. The one above or below may still be # number. And vice versa input = '''\
  • A
  • B
  • C
  • D
  • E
  • ''' wanted = '''\
  • A
  • B
  • C
  • D
  • E
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(1) # top of list: A. self.assertBufferEquals(buffer, wanted) buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(2) # middle of list: 3. self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • D
  • E
  • ''' wanted = '''\
  • A
  • B
  • C
  • D
  • E
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(5) # after sub list: "*" self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • ''' wanted = '''\
  • A
  • B
  • C
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(2) # middle of list: B. self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • ''' wanted = '''\
  • A
  • B
  • C
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(2) # middle of list: B. self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • ''' wanted = '''\
  • A
  • B
  • C
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) buffer.renumber_list(2) # middle of list: B. self.assertBufferEquals(buffer, wanted) # Renumber behavior after changing indenting: # # 1. If this is now middle of a list (above item is same or # more indenting) look above and renumber # 2. If this is now top of a sublist (above item is lower # indent) look _below_ and copy bullet found there then # number down # 3. If this is the top of a new sublist (no item below) # switch bullet style (numbers vs letters) and reset count # 4. If this is the top of the list (no bullet above) don't # need to do anything # # ALSO look at previous level where item went missing, # look at above item at that level and number downward def indent(buffer, line): row, list = TextBufferList.new_from_line(buffer, line) list.indent(row) def unindent(buffer, line): row, list = TextBufferList.new_from_line(buffer, line) list.unindent(row) input = '''\
  • A
  • B
  • C
  • D
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' indent(buffer, 3) # new sub-list -- reset style and numbering self.assertBufferEquals(buffer, wanted) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' indent(buffer, 4) # add to existing sub list self.assertBufferEquals(buffer, wanted) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' indent(buffer, 2) # top of existing sub list self.assertBufferEquals(buffer, wanted) prev = wanted wanted = '''\
  • A
  • B
  • C
  • D
  • ''' indent(buffer, 4) # yet another new sub level self.assertBufferEquals(buffer, wanted) unindent(buffer, 4) self.assertBufferEquals(buffer, prev) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' unindent(buffer, 2) # renumber both levels self.assertBufferEquals(buffer, wanted) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' unindent(buffer, 4) self.assertBufferEquals(buffer, wanted) buffer.set_bullet(4, NUMBER_BULLET) self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) wanted = '''\
  • A
  • B
  • C
  • ''' indent(buffer, 3) self.assertBufferEquals(buffer, wanted) input = '''\
  • A
  • B
  • C
  • D
  • ''' buffer.set_parsetree(tests.new_parsetree_from_xml(input)) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' indent(buffer, 4) self.assertBufferEquals(buffer, wanted) wanted = '''\
  • A
  • B
  • C
  • D
  • ''' unindent(buffer, 2) self.assertBufferEquals(buffer, wanted) def press(widget, sequence): #~ print 'PRESS', sequence for key in sequence: event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) if isinstance(key, (int, long)): event.keyval = int(key) elif key == '\n': event.keyval = int( gtk.gdk.keyval_from_name('Return') ) elif key == '\t': event.keyval = int( gtk.gdk.keyval_from_name('Tab') ) else: event.keyval = int( gtk.gdk.unicode_to_keyval(ord(key)) ) if not isinstance(key, (int, long)): event.string = key #gtk.main_do_event(event) #assert widget.event(event) # Returns True if event was handled #while gtk.events_pending(): # gtk.main_iteration() widget.emit('key-press-event', event) class TestTextView(tests.TestCase, TestCaseMixin): def setUp(self): # Initialize default preferences from module self.preferences = {} for pref in ui_preferences: self.preferences[pref[0]] = pref[4] def testTyping(self): print '\n!! Two GtkWarnings expected here for gdk display !!' view = TextView(self.preferences) buffer = TextBuffer() view.set_buffer(buffer) undomanager = UndoStackManager(buffer) # Need a window to get the widget realized window = gtk.Window() window.add(view) view.realize() #~ window.show_all() #~ view.grab_focus() press(view, 'aaa\n') start, end = buffer.get_bounds() self.assertEqual(buffer.get_text(start, end), 'aaa\n') # Just checking test routines work # Test bullet & indenting logic press(view, '* foo') wanted = '''\ aaa
  • foo
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, '\n') wanted = '''\ aaa
  • foo
  • ''' tree = buffer.get_parsetree(raw=True) start, end = buffer.get_bounds() self.assertEqual(tree.tostring(), wanted) press(view, '\tduss') wanted = '''\ aaa
  • foo
  • duss
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, '\n') wanted = '''\ aaa
  • foo
  • duss
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, 'CamelCase\n') wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, '\n') wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # selection + * to toggle bullets start = buffer.get_iter_at_line(1) # before foo end = buffer.get_iter_at_line(4) # empty line ! buffer.select_range(start, end) press(view, '*') wanted = '''\ aaa foo
    duss CamelCase
    ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) start = buffer.get_iter_at_line(1) # before foo end = buffer.get_iter_at_line(4) # empty line ! buffer.select_range(start, end) press(view, '*') wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) iter = buffer.get_iter_at_line(1) iter.forward_to_line_end() # behind "foo" buffer.place_cursor(iter) press(view, '\n') # because foo has children, insert indent 1 instead of 0 wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # Test unindenting and test backspace can remove line end press(view, (KEYVALS_BACKSPACE[0],)) # unindent wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, (KEYVALS_LEFT_TAB[0],)) # Check does not fall through to Tab when indent fails tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) press(view, (KEYVALS_BACKSPACE[0],)) # delete bullet at once wanted = '''\ aaa
  • foo
  • duss
  • CamelCase
  • ''' tree = buffer.get_parsetree(raw=True) self.assertEqual(tree.tostring(), wanted) # TODO: this test case fails, even though it works when I try it interactively !? #~ press(view, (KEYVALS_BACKSPACE[0],)) # remove newline #~ wanted = '''\ #~ #~ aaa #~
  • foo
  • #~
  • duss
  • #~
  • CamelCase
  • #~ #~
    ''' #~ tree = buffer.get_parsetree(raw=True) #~ self.assertEqual(tree.tostring(), wanted) # TODO more unindenting ? # TODO checkboxes # TODO Auto formatting of various link types # TODO enter on link, before link, after link def testCopyPaste(self): dir = self.get_tmp_name('testCopyPaste') notebook = tests.new_notebook(fakedir=dir) page = notebook.get_page(Path('roundtrip')) parsetree = page.get_parsetree() buffer = TextBuffer(notebook, page) textview = TextView(self.preferences) textview.set_buffer(buffer) print '** HACK for cleaning up parsetree' def cleanup(parsetree): # FIXME - HACK - dump and parse as wiki first to work # around glitches in pageview parsetree dumper # main visibility when copy pasting bullet lists # Same hack in gui clipboard code from zim.notebook import Path, Page from zim.formats import get_format dumper = get_format('wiki').Dumper() text = ''.join( dumper.dump(parsetree) ).encode('utf-8') parser = get_format('wiki').Parser() parsetree = parser.parse(text) return parsetree #-- # paste Clipboard.set_parsetree(notebook, page, parsetree) with FilterNoSuchImageWarning(): textview.emit('paste-clipboard') result = buffer.get_parsetree() result = cleanup(result) self.assertEqual(result.tostring(), parsetree.tostring()) # paste replacing selection buffer.set_text('foo bar baz') buffer.select_range(*buffer.get_bounds()) # select all with FilterNoSuchImageWarning(): textview.emit('paste-clipboard') result = buffer.get_parsetree() result = cleanup(result) self.assertEqual(result.tostring(), parsetree.tostring()) # copy Clipboard.clear() self.assertIsNone(Clipboard.get_parsetree()) buffer.select_range(*buffer.get_bounds()) # select all textview.emit('copy-clipboard') result = Clipboard.get_parsetree(notebook, page) self.assertIsNotNone(result) result = cleanup(result) self.assertEqual(result.tostring(), parsetree.tostring()) # copy partial # line 33, offset 6 to 28 "try these **bold**, //italic//" in roundtrip page wanted_tree = "\ntry these bold, italic" wanted_text = "try these bold, italic" # no newline ! Clipboard.clear() self.assertIsNone(Clipboard.get_parsetree()) start = buffer.get_iter_at_line_offset(33, 6) end = buffer.get_iter_at_line_offset(33, 28) buffer.select_range(start, end) textview.emit('copy-clipboard') result = Clipboard.get_parsetree(notebook, page) self.assertIsNotNone(result) self.assertEqual(result.tostring(), wanted_tree) self.assertEqual(Clipboard.get_text(), wanted_text) # cut Clipboard.clear() self.assertIsNone(Clipboard.get_parsetree()) buffer.select_range(*buffer.get_bounds()) # select all textview.emit('cut-clipboard') result = Clipboard.get_parsetree(notebook, page) self.assertIsNotNone(result) result = cleanup(result) self.assertEqual(result.tostring(), parsetree.tostring()) self.assertEqual(buffer.get_text(*buffer.get_bounds()), '') # popup menu page = tests.new_page_from_text('Foo **Bar** Baz') dir = self.get_tmp_name('testCopyPaste') pageview = setUpPageView(fakedir=dir) pageview.set_page(page) def get_context_menu(): buffer = pageview.view.get_buffer() buffer.select_range(*buffer.get_bounds()) # select all return pageview.view.get_popup() def click(id): menu = get_context_menu() tests.gtk_activate_menu_item(menu, id) #~ tests.gtk_activate_menu_item(menu, 'gtk-copy') #~ self.assertEqual(Clipboard.get_text(), 'Test') #~ ## Looks like this item not initialized yet menu = get_context_menu() item = tests.gtk_get_menu_item(menu, _('Copy _As...')) copy_as_menu = item.get_submenu() tests.gtk_activate_menu_item(copy_as_menu, 'Wiki') self.assertEqual(Clipboard.get_text(), 'Foo **Bar** Baz') tree = Clipboard.get_parsetree(pageview.ui.notebook, page) self.assertEqual(tree.tostring(), '\nFoo Bar Baz') page = tests.new_page_from_text('[[bar]]') pageview.set_page(page) click(_('Copy _Link')) self.assertEqual(Clipboard.get_text(), 'Bar') tree = Clipboard.get_parsetree(pageview.ui.notebook, page) self.assertEqual(tree.tostring(), '\nBar') page = tests.new_page_from_text('[[~//bar.txt]]') # Extra '/' is in there to verify path gets parsed as File object pageview.set_page(page) click(_('Copy _Link')) self.assertEqual(Clipboard.get_text(), '~/bar.txt') tree = Clipboard.get_parsetree(pageview.ui.notebook, page) self.assertEqual(tree.tostring(), '\n~/bar.txt') # TODO: More popup stuff class TestPageView(tests.TestCase, TestCaseMixin): def testGetSelection(self): pageview = setUpPageView() buffer = pageview.view.get_buffer() buffer.set_text('''\ Foo bar Baz ''') iter = buffer.get_iter_at_offset(5) buffer.place_cursor(iter) self.assertEqual(pageview.get_word(), 'bar') self.assertEqual(pageview.get_selection(), 'bar') self.assertEqual(pageview.get_selection(format='wiki'), 'bar') def testAutoSelect(self): # This test indirectly tests select_word, select_line and strip_selection pageview = setUpPageView() buffer = pageview.view.get_buffer() buffer.set_text('''Test 123. foo\nline with spaces \n\n''') # select word (with / without previous selection) buffer.place_cursor(buffer.get_iter_at_offset(6)) pageview.autoselect() self.assertSelection(buffer, 0, 5, '123') pageview.autoselect() self.assertSelection(buffer, 0, 5, '123') # no change buffer.place_cursor(buffer.get_iter_at_offset(33)) pageview.autoselect() self.assertFalse(buffer.get_has_selection()) # middle of whitespace # select line (with / without previous selection) buffer.place_cursor(buffer.get_iter_at_offset(6)) pageview.autoselect() self.assertSelection(buffer, 0, 5, '123') pageview.autoselect(selectline=True) self.assertSelection(buffer, 0, 0, 'Test 123. foo') # extended pageview.autoselect(selectline=True) self.assertSelection(buffer, 0, 0, 'Test 123. foo') # no change buffer.place_cursor(buffer.get_iter_at_offset(6)) self.assertFalse(buffer.get_has_selection()) pageview.autoselect(selectline=True) self.assertSelection(buffer, 0, 0, 'Test 123. foo') # empty line buffer.place_cursor(buffer.get_iter_at_line(3)) self.assertFalse(buffer.get_has_selection()) pageview.autoselect(selectline=True) self.assertFalse(buffer.get_has_selection()) # existing selection needs stripping start = buffer.get_iter_at_offset(4) end = buffer.get_iter_at_offset(10) buffer.select_range(start, end) self.assertSelection(buffer, 0, 4, ' 123. ') pageview.autoselect() self.assertSelection(buffer, 0, 5, '123.') def testInsertLinks(self): pageview = setUpPageView() buffer = pageview.view.get_buffer() buffer.set_text('''Test 123\n''') buffer.place_cursor(buffer.get_end_iter()) pageview.insert_links((Path("foo"), File("/foo.txt"), "~/bar.txt")) wantedtext = 'Test 123\nfoo\n%s\n~/bar.txt\n' % File('/foo.txt').uri text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, wantedtext) buffer.place_cursor(buffer.get_iter_at_line(2)) buffer.select_line() pageview.insert_links(('http://cpan.org',)) wantedtext = 'Test 123\nfoo\n%s\n~/bar.txt\n' % 'http://cpan.org ' text = buffer.get_text(*buffer.get_bounds()) self.assertEqual(text, wantedtext) def testProfile(self): '''Test that style for a specific profile is applied.''' default_file = XDG_CONFIG_HOME.file('zim/style.conf') profile_file = XDG_CONFIG_HOME.file('zim/styles/testProfile.conf') # first test without profile pageview = setUpPageView() notebook = pageview.ui.notebook self.assertIsNone(notebook.profile) self.assertIsNone(pageview.style.profile) self.assertEqual(pageview.style.file.file, default_file) # create a new style based on the default one, changing some properties profile_file.remove() new_style = ConfigDictFile(profile_file) new_style['TextView']['indent'] = 50 new_style['TextView']['font'] = 'Sans 8' new_style['TextView']['linespacing'] = 10 new_style.write() # test the pageview with the profile notebook.save_properties(profile='testProfile') self.assertEqual(notebook.profile, 'testProfile') self.assertEqual(pageview.style.profile, 'testProfile') self.assertEqual(pageview.style.file.file, profile_file) self.assertEqual(pageview.style['TextView']['indent'], 50) self.assertEqual(pageview.style['TextView']['font'], 'Sans 8') self.assertEqual(pageview.style['TextView']['linespacing'], 10) # if we don't have a notebook, we shouldn't fail! pageview.ui.notebook = None pageview.on_preferences_changed(pageview.ui) # Now init a notebook with a profile from the start PageView.style = None # reset class attribute notebook = tests.new_notebook() self.assertIsNone(notebook.profile) notebook.save_properties(profile='testProfile') self.assertEqual(notebook.profile, 'testProfile') pageview = setUpPageView(notebook=notebook) self.assertEqual(pageview.style.profile, 'testProfile') self.assertEqual(pageview.style.file.file, profile_file) class TestPageviewDialogs(tests.TestCase): def testVarious(self): '''Test input/output of various pageview dialogs''' ## Insert Date dialog ui = MockUI() buffer = MockBuffer() ui.notebook.mock_method('suggest_link', Path(':suggested_link')) dialog = InsertDateDialog(ui, buffer) dialog.linkbutton.set_active(False) dialog.view.get_selection().select_path((0,)) dialog.assert_response_ok() self.assertEqual(buffer.mock_calls[-1][0], 'insert_at_cursor') dialog = InsertDateDialog(ui, buffer) dialog.linkbutton.set_active(True) dialog.view.get_selection().select_path((0,)) dialog.assert_response_ok() self.assertEqual(buffer.mock_calls[-1][0], 'insert_link_at_cursor') ## Insert Image dialog ui = MockUI() buffer = MockBuffer() file = File('data/zim.png') dialog = InsertImageDialog(ui, buffer, Path(':some_page'), file) self.assertTrue(dialog.filechooser.get_preview_widget_active()) #~ self.assertEqual(dialog.get_file(), file) #~ dialog.assert_response_ok() #~ self.assertEqual(buffer.mock_calls[-1][0], 'insert_image_at_cursor') ## Edit Image dialog ui = MockUI() file = File('data/zim.png') ui.notebook.mock_method('resolve_file', file) ui.notebook.mock_method('relative_filepath', './data/zim.png') buffer = TextBuffer() buffer.insert_image_at_cursor(file, '../MYPATH/./data/zim.png') dialog = EditImageDialog(ui, buffer, Path(':some_page')) self.assertEqual(dialog.form['width'], 48) self.assertEqual(dialog.form['height'], 48) dialog.form['width'] = 100 self.assertEqual(dialog.form['width'], 100) self.assertEqual(dialog.form['height'], 100) dialog.reset_dimensions() self.assertEqual(dialog.form['width'], 48) self.assertEqual(dialog.form['height'], 48) dialog.form['height'] = 24 self.assertEqual(dialog.form['width'], 24) self.assertEqual(dialog.form['height'], 24) dialog.assert_response_ok() iter = buffer.get_iter_at_offset(0) imagedata = buffer.get_image_data(iter) self.assertEqual(imagedata, { 'src': './data/zim.png', # preserve relative path '_src_file': file, 'height': 24, }) self.assertEqual(type(imagedata['height']).__name__, 'int') ## Insert text from file dialog ui = MockUI() buffer = MockBuffer() dialog = InsertTextFromFileDialog(ui, buffer) #~ dialog.set_file() #~ dialog.assert_response_ok() #~ self.assertEqual(buffer.mock_calls[-1][0], 'insert_parsetree_at_cursor') ## Find And Replace dialog ui = MockUI() textview = TextView({}) buffer = textview.get_buffer() buffer.set_text('''\ foo bar foooobar foo bar bazzz baz ''') dialog = FindAndReplaceDialog(ui, textview) dialog.find_entry.set_text('foo') dialog.replace_entry.set_text('dus') dialog.word_option_checkbox.set_active(True) dialog.replace() dialog.replace_all() self.assertEqual(buffer.get_text(*buffer.get_bounds()), '''\ dus bar foooobar dus bar bazzz baz ''') ## Word Count dialog pageview = tests.MockObject() pageview.view = textview pageview.ui = MockUI() dialog = WordCountDialog(pageview) dialog.destroy() # nothing to test really def testInsertLinkDialog(self): # Insert Link dialog ui = MockUI() ui.notebook.index = tests.MockObject() ui.notebook.index.mock_method('list_pages', []) ui.notebook.index.mock_method('walk', []) pageview = tests.MockObject() pageview.page = Path('Test:foo:bar') textview = TextView({}) pageview.view = textview dialog = InsertLinkDialog(ui, pageview) dialog.form.widgets['href'].set_text('Foo') dialog.assert_response_ok() buffer = textview.get_buffer() self.assertEqual(buffer.get_text(*buffer.get_bounds()), 'Foo') class MockUI(tests.MockObject): def __init__(self): tests.MockObject.__init__(self) self.mainwindow = None self.notebook = tests.MockObject() self.preferences = ConfigDict() self.page = Path('Test') def register_preferences(self, section, list): for p in list: key = p[0] default = p[4] self.preferences[section][key] = default class MockBuffer(tests.MockObject): pass zim-0.60/tests/utils.py0000664000175000017500000000154311705356100014765 0ustar jaapjaap00000000000000 import tests from copy import copy from zim.utils import * class TestNaturalSorting(tests.TestCase): def runTest(self): input = [ 'a', 'Aa', 'AA', # (these last 2 should be swapped due to case) '1.1 foo', '10.1.1 bar', '2.1 dus', '1.01 foo', 'foo2bar', 'foo10bar', 'foo01bar', ] wanted = [ '1.01 foo', '1.1 foo', '2.1 dus', '10.1.1 bar', 'a', 'AA', 'Aa', 'foo01bar', 'foo2bar', 'foo10bar', ] # TODO: add utf-8 test data and set matching locale result = natural_sorted(input) self.assertEqual(result, wanted) self.assertTrue(id(result) != id(input)) result = copy(input) natural_sort(result) self.assertEqual(result, wanted) input = [(1, 'b'), (2, 'a')] wanted = [(2, 'a'), (1, 'b')] result = natural_sorted(input, key=lambda t: t[1]) self.assertEqual(result, wanted) self.assertTrue(id(result) != id(input)) zim-0.60/tests/config.py0000664000175000017500000003343212062163674015105 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg from __future__ import with_statement import tests from tests import TestCase, LoggingFilter import os from zim.fs import File, Dir from zim.config import * from zim.notebook import Path import zim.config # Check result of lookup functions does not return files outside of # source to be tested -- just being paranoid here... # Note that this marshalling remains in place for any subsequent tests _cwd = Dir('.') def marshal_path_lookup(function): def marshalled_path_lookup(*arg, **kwarg): value = function(*arg, **kwarg) if isinstance(value, ConfigFile): p = value.file else: p = value if not p is None: assert isinstance(p, (File, Dir)), 'BUG: get %r' % p assert p.ischild(_cwd), "ERROR: \"%s\" not below \"%s\"" % (p, _cwd) return value return marshalled_path_lookup zim.config.data_file = marshal_path_lookup(zim.config.data_file) zim.config.data_dir = marshal_path_lookup(zim.config.data_dir) zim.config.config_file = marshal_path_lookup(zim.config.config_file) ## class FilterInvalidConfigWarning(LoggingFilter): logger = 'zim.config' message = 'Invalid config value' class TestDirsTestSetup(TestCase): def runTest(self): '''Test config environment setup of test''' zim.config.log_basedirs() for k, v in ( ('XDG_DATA_HOME', os.path.join(tests.TMPDIR, 'data_home')), ('XDG_CONFIG_HOME', os.path.join(tests.TMPDIR, 'config_home')), ('XDG_CACHE_HOME', os.path.join(tests.TMPDIR, 'cache_home')) ): self.assertEqual(getattr(zim.config, k), Dir(v)) for k, v in ( #~ ('XDG_DATA_DIRS', os.path.join(tests.TMPDIR, 'data_dir')), ('XDG_CONFIG_DIRS', os.path.join(tests.TMPDIR, 'config_dir')), ): self.assertEqual(getattr(zim.config, k), map(Dir, v.split(os.pathsep))) self.assertEqual( zim.config.XDG_DATA_DIRS[0], Dir(os.path.join(tests.TMPDIR, 'data_dir')) ) class TestDirsDefault(TestCase): def setUp(self): old_environ = {} for k in ( 'XDG_DATA_HOME', 'XDG_DATA_DIRS', 'XDG_CONFIG_HOME', 'XDG_CONFIG_DIRS', 'XDG_CACHE_HOME' ): if k in os.environ: old_environ[k] = os.environ[k] del os.environ[k] def restore_environ(): for k, v in old_environ.items(): os.environ[k] = v zim.config._set_basedirs() # refresh self.addCleanup(restore_environ) zim.config._set_basedirs() # refresh def testValid(self): '''Test config environment is valid''' for var in ( ZIM_DATA_DIR, # should always be set when running as test XDG_DATA_HOME, XDG_CONFIG_HOME, XDG_CACHE_HOME ): self.assertTrue(isinstance(var, Dir)) for var in ( XDG_DATA_DIRS, XDG_CONFIG_DIRS, ): self.assertTrue(isinstance(var, list) and isinstance(var[0], Dir)) self.assertEqual(ZIM_DATA_DIR, Dir('./data')) self.assertTrue(ZIM_DATA_DIR.file('zim.png').exists()) self.assertTrue(data_file('zim.png').exists()) self.assertTrue(data_dir('templates').exists()) self.assertEqual( list(data_dirs(('foo', 'bar'))), [d.subdir(['foo', 'bar']) for d in data_dirs()]) @tests.skipIf(os.name == 'nt', 'No standard defaults for windows') def testCorrect(self): '''Test default basedir paths''' for k, v in ( ('XDG_DATA_HOME', '~/.local/share'), ('XDG_CONFIG_HOME', '~/.config'), ('XDG_CACHE_HOME', '~/.cache') ): self.assertEqual(getattr(zim.config, k), Dir(v)) for k, v in ( ('XDG_DATA_DIRS', '/usr/share:/usr/local/share'), ('XDG_CONFIG_DIRS', '/etc/xdg'), ): self.assertEqual(getattr(zim.config, k), map(Dir, v.split(':'))) class TestDirsEnvironment(TestDirsDefault): def setUp(self): my_environ = { 'XDG_DATA_HOME': '/foo/data/home', 'XDG_DATA_DIRS': '/foo/data/dir1:/foo/data/dir2', 'XDG_CONFIG_HOME': '/foo/config/home', 'XDG_CONFIG_DIRS': '/foo/config/dir1:/foo/config/dir2', 'XDG_CACHE_HOME': '/foo/cache', } if os.name == 'nt': my_environ['XDG_DATA_DIRS'] = '/foo/data/dir1;/foo/data/dir2' my_environ['XDG_CONFIG_DIRS'] = '/foo/config/dir1;/foo/config/dir2' old_environ = dict((name, os.environ.get(name)) for name in my_environ) def restore_environ(): for k, v in old_environ.items(): if v: os.environ[k] = v zim.config._set_basedirs() # refresh self.addCleanup(restore_environ) os.environ.update(my_environ) zim.config._set_basedirs() # refresh def testCorrect(self): '''Test config environemnt with non-default basedir paths''' for k, v in ( ('XDG_DATA_HOME', '/foo/data/home'), ('XDG_CONFIG_HOME', '/foo/config/home'), ('XDG_CACHE_HOME', '/foo/cache') ): self.assertEqual(getattr(zim.config, k), Dir(v)) for k, v in ( ('XDG_DATA_DIRS', '/foo/data/dir1:/foo/data/dir2'), ('XDG_CONFIG_DIRS', '/foo/config/dir1:/foo/config/dir2'), ): self.assertEqual(getattr(zim.config, k), map(Dir, v.split(':'))) class TestConfigFile(TestCase): def testParsing(self): '''Test config file format''' file = XDG_CONFIG_HOME.file('zim/config_TestConfigFile.conf') if file.exists(): file.remove() assert not file.exists() conf = ConfigDictFile(file) conf['Foo']['xyz'] = 'foooooo' conf['Foo']['foobar'] = 0 conf['Foo']['test'] = True conf['Foo']['tja'] = (3, 4) conf['Bar']['hmmm'] = 'tja' conf['Bar']['check'] = 1.333 conf['Bar']['empty'] = '' conf['Bar']['none'] = None conf.write() text = u'''\ [Foo] xyz=foooooo foobar=0 test=True tja=[3,4] [Bar] hmmm=tja check=1.333 empty= none=None ''' self.assertEqual(file.read(), text) del conf conf = ConfigDictFile(file) self.assertFalse(conf.modified) self.assertEqual(conf, { 'Foo': { 'xyz': 'foooooo', 'foobar': 0, 'test': True, 'tja': [3, 4], }, 'Bar': { 'hmmm': 'tja', 'check': 1.333, 'empty': '', 'none': None } }) conf['Foo']['tja'] = (33, 44) self.assertTrue(conf.modified) # Check enforcing default type conf.set_modified(False) self.assertEqual(conf['Foo'].setdefault('foobar', 5), 0) self.assertEqual(conf['Bar'].setdefault('check', 3.14), 1.333) self.assertEqual(conf['Bar'].setdefault('check', None, float), 1.333) self.assertEqual(conf['Foo'].setdefault('tja', (3,4), value_is_coord), (33,44)) self.assertEqual(conf['Bar'].setdefault('hmmm', 'foo', set(('foo', 'tja'))), 'tja') self.assertFalse(conf.modified) conf['Foo']['tja'] = [33, 44] conf.set_modified(False) self.assertEqual(conf['Foo'].setdefault('tja', (3,4)), (33,44)) self.assertEqual(conf['Foo'].setdefault('tja', (3,4), tuple), (33,44)) self.assertFalse(conf.modified) conf['Foo']['tja'] = [33, 44] conf.set_modified(False) self.assertEqual(conf['Foo'].setdefault('tja', (3,4), allow_empty=True), (33,44)) self.assertFalse(conf.modified) conf.set_modified(False) with FilterInvalidConfigWarning(): self.assertEqual( conf['Bar'].setdefault('hmmm', 'foo', set(('foo', 'bar'))), 'foo') self.assertTrue(conf.modified) conf.set_modified(False) with FilterInvalidConfigWarning(): self.assertEqual(conf['Bar'].setdefault('check', 10, int), 10) self.assertTrue(conf.modified) conf['Bar']['string'] = '' conf.set_modified(False) with FilterInvalidConfigWarning(): self.assertEqual(conf['Bar'].setdefault('string', 'foo'), 'foo') self.assertTrue(conf.modified) conf['Bar']['string'] = '' conf.set_modified(False) self.assertEqual(conf['Bar'].setdefault('string', 'foo', allow_empty=True), '') self.assertFalse(conf.modified) conf['Bar']['string'] = '' conf.set_modified(False) self.assertEqual(conf['Bar'].setdefault('string', 'foo', check_class_allow_empty), '') self.assertFalse(conf.modified) conf['Bar']['string'] = 3 conf.set_modified(False) with FilterInvalidConfigWarning(): self.assertEqual(conf['Bar'].setdefault('string', 'foo', check_class_allow_empty), 'foo') self.assertTrue(conf.modified) def testLookup(self): '''Test lookup of config files''' home = XDG_CONFIG_HOME.file('zim/preferences.conf') default = XDG_CONFIG_DIRS[0].file('zim/preferences.conf') self.assertFalse(home.exists()) self.assertFalse(default.exists()) default.write('[TestData]\nfile=default\n') self.assertTrue(default.exists()) file = config_file('preferences.conf') defaults = list(file.default_files()) self.assertTrue(isinstance(file, ConfigFile)) self.assertEqual(file.file, home) self.assertEqual(defaults[0], default) dict = get_config('preferences.conf') self.assertTrue(isinstance(dict, ConfigDictFile)) self.assertEqual(dict.file, file) self.assertEqual(dict['TestData']['file'], 'default') home.write('[TestData]\nfile=home\n') self.assertTrue(home.exists()) dict = get_config('preferences.conf') self.assertTrue(isinstance(dict, ConfigDictFile)) self.assertEqual(dict['TestData']['file'], 'home') file = config_file('notebooks.list') self.assertTrue(isinstance(file, ConfigFile)) file = config_file('accelarators') self.assertTrue(isinstance(file, ConfigFile)) def testListDict(self): '''Test ListDict class''' keys = ['foo', 'bar', 'baz'] mydict = ListDict() self.assertFalse(mydict.modified) for k in keys: mydict[k] = 'dusss' self.assertTrue(mydict.modified) val = mydict.get('newkey') self.assertEqual(val, None) # get() does _not_ set the key if it doesn't exist val = mydict.setdefault('dus', 'ja') self.assertEqual(val, 'ja') val = mydict.setdefault('dus', 'hmm') self.assertEqual(val, 'ja') keys.append('dus') self.assertEquals(mydict.keys(), keys) self.assertEquals([k for k in mydict], keys) mykeys = [k for k, v in mydict.items()] self.assertEquals(mykeys, keys) myval = [v for k, v in mydict.items()] self.assertEquals(myval, ['dusss', 'dusss', 'dusss', 'ja']) val = mydict.pop('bar') self.assertEqual(val, 'dusss') self.assertEqual(mydict.keys(), ['foo', 'baz', 'dus']) mydict.update({'bar': 'barrr'}, tja='ja ja') self.assertEquals(mydict.items(), ( ('foo', 'dusss'), ('baz', 'dusss'), ('dus', 'ja'), ('bar', 'barrr'), ('tja', 'ja ja'), )) del mydict['tja'] self.assertEquals(mydict.items(), ( ('foo', 'dusss'), ('baz', 'dusss'), ('dus', 'ja'), ('bar', 'barrr'), )) mydict.update((('tja', 'ja ja'), ('baz', 'bazzz'))) self.assertEquals(mydict.items(), ( ('foo', 'dusss'), ('baz', 'bazzz'), ('dus', 'ja'), ('bar', 'barrr'), ('tja', 'ja ja'), )) newdict = mydict.copy() self.assertTrue(isinstance(newdict, ListDict)) self.assertEquals(newdict.items(), mydict.items()) mydict.set_order(('baz', 'bar', 'foo', 'boooo', 'dus')) self.assertEquals(mydict.items(), ( ('baz', 'bazzz'), ('bar', 'barrr'), ('foo', 'dusss'), ('dus', 'ja'), ('tja', 'ja ja'), )) self.assertTrue(isinstance(mydict.order, list)) def testChangeFile(self): '''Test changing the file used as datastore''' file = XDG_CONFIG_HOME.file('zim/config_TestConfigFile.conf') if file.exists(): file.remove() assert not file.exists() conf = ConfigDictFile(file) conf['Foo']['xyz'] = 'foooooo' conf['Bar']['empty'] = '' conf.write() text = u'''\ [Foo] xyz=foooooo [Bar] empty= ''' self.assertEqual(file.read(), text) file_new = XDG_CONFIG_HOME.file('zim/config_TestConfigFile2.conf') if file_new.exists(): file_new.remove() assert not file_new.exists() conf.change_file(file_new) file.remove() conf.write() assert not file.exists() self.assertEqual(file_new.read(), text) del conf file_new.remove() class TestHeaders(TestCase): def runTest(self): '''Test HeadersDict class''' # normal operation text='''\ Foobar: 123 More-Lines: test 1234 test Aaa: foobar ''' headers = HeadersDict(text) self.assertEqual(headers['Foobar'], '123') self.assertEqual(headers['More-Lines'], 'test\n1234\ntest') self.assertEqual(headers.dump(), text.splitlines(True)) moretext='''\ Foobar: 123 More-Lines: test 1234 test Aaa: foobar test 123 test 456 ''' lines = moretext.splitlines(True) headers = HeadersDict() headers.read(lines) self.assertEqual(headers.dump(), text.splitlines(True)) self.assertEqual(lines, ['test 123\n', 'test 456\n']) # error tolerance and case insensitivity text = '''\ more-lines: test 1234 test ''' self.assertRaises(HeaderParsingError, HeadersDict, text) text = '''\ fooo more-lines: test 1234 test ''' self.assertRaises(HeaderParsingError, HeadersDict, text) text = 'foo-bar: test\n\n\n' headers = HeadersDict(text) self.assertEqual(headers['Foo-Bar'], 'test') self.assertEqual(headers.dump(), ['Foo-Bar: test\n']) class TestUserDirs(TestCase): def setUp(self): XDG_CONFIG_HOME.file('user-dirs.dirs').write('''\ # This file is written by xdg-user-dirs-update # If you want to change or add directories, just edit the line you're # interested in. All local changes will be retained on the next run # Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped # homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an # absolute path. No other format is supported. # XDG_DESKTOP_DIR="$HOME/Desktop" XDG_DOWNLOAD_DIR="$HOME/Desktop" XDG_TEMPLATES_DIR="$HOME/Templates" XDG_PUBLICSHARE_DIR="$HOME/Public" XDG_DOCUMENTS_DIR="$HOME/Documents" XDG_MUSIC_DIR="$HOME/Music" XDG_PICTURES_DIR="$HOME/Pictures" XDG_VIDEOS_DIR="$HOME/Videos" ''') def runTest(self): '''Test config for user dirs''' dirs = user_dirs() self.assertEqual(dirs['XDG_DOCUMENTS_DIR'], Dir('~/Documents')) class TestHierarchicDict(TestCase): def runTest(self): '''Test HierarchicDict class''' dict = HierarchicDict() dict['foo']['key1'] = 'foo' self.assertEqual(dict['foo:bar:baz']['key1'], 'foo') self.assertEqual(dict['foo:bar:baz'].get('key1'), 'foo') self.assertEqual(dict['foo:bar:baz'].get('key7'), None) dict['foo:bar']['key1'] = 'bar' self.assertEqual(dict['foo:bar:baz']['key1'], 'bar') self.assertEqual(dict['foo']['key1'], 'foo') dict['foo:bar'].remove('key1') self.assertEqual(dict['foo:bar:baz']['key1'], 'foo') self.assertEqual(dict[Path('foo:bar:baz')]['key1'], 'foo') dict['']['key2'] = 'FOO' self.assertEqual(dict[Path('foo:bar:baz')]['key2'], 'FOO') zim-0.60/tests/plugins.py0000644000175000017500000000642312061674251015314 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import tests import os import zim.plugins import zim import zim.config from zim.fs import File assert len(zim.plugins.__path__) > 1 # test __path__ magic zim.plugins.__path__ = [os.path.abspath('./zim/plugins')] # set back default search path class testPlugins(tests.TestCase): def testListAll(self): '''Test loading plugins and meta data''' plugins = zim.plugins.list_plugins() self.assertTrue(len(plugins) > 10) self.assertTrue('spell' in plugins) self.assertTrue('linkmap' in plugins) # plugins listed here will be tested for is_profile_independent == True profile_independent = ['automount',] pluginindex = File('data/manual/Plugins.txt').read() seen = { 'name': set(), 'description': set(), 'help': set(), } for name in plugins: #~ print '>>', name plugin = zim.plugins.get_plugin(name) # test plugin info for key in ('name', 'description', 'author'): self.assertTrue( plugin.plugin_info.get(key), 'Plugin %s misses info field \'%s\'' % (name, key) ) for key in ('name', 'description', 'help'): self.assertIn(key, plugin.plugin_info, 'Plugin %s missing "%s"' % (name, key)) value = plugin.plugin_info[key] self.assertFalse( value in seen[key], 'Value for \'%s\' in %s seen before - copy-paste error ?' % (key, name) ) seen[key].add(value) # test manual page present and at least documents preferences page = plugin.plugin_info['help'] self.assertTrue(page.startswith('Plugins:'), 'Help page for %s not valid' % name) rellink = "+%s" % page[8:] self.assertIn(rellink, pluginindex, 'Missing links "%s" in manual/Plugins.txt' % rellink) file = File('data/manual/' + page.replace(':', '/').replace(' ', '_') + '.txt') self.assertTrue(file.exists(), 'Missing file: %s' % file) manual = file.read() for pref in plugin.plugin_preferences: label = pref[2] if '\n' in label: label, x = label.split('\n', 1) label = label.rstrip(',') self.assertIn(label, manual, 'Preference "%s" for %s plugin not documented in manual page' % (label, name)) # test dependencies data dep = plugin.check_dependencies() self.assertTrue(isinstance(dep,tuple)) check, dep = dep self.assertTrue(isinstance(check,bool)) self.assertTrue(isinstance(dep,list)) for i in range(len(dep)): self.assertTrue(isinstance(dep[i],tuple)) self.assertTrue(isinstance(dep[i][0],str)) self.assertTrue(isinstance(dep[i][1],bool)) self.assertTrue(isinstance(dep[i][2],bool)) # test is_profile_independent self.assertTrue(isinstance(plugin.is_profile_independent,bool)) if name in profile_independent: self.assertTrue(plugin.is_profile_independent) else: self.assertFalse(plugin.is_profile_independent) def testDefaulPlugins(self): '''Test loading default plugins''' # Note that we use parent interface class here, so plugins # will not really attach - just testing loading and prereq # checks are OK. notebook = tests.new_notebook() interface = zim.NotebookInterface(notebook) interface.uistate = zim.config.ConfigDict() interface.load_plugins() self.assertTrue(len(interface.plugins) > 3) # TODO: create a full GtkUI object and load & unload each plugin in turn zim-0.60/tests/package.py0000644000175000017500000002243012033354624015220 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Jaap Karssenberg # This module contains a number of meta test to check coding style # and packaging import tests import os import copy import re import inspect def zim_modules(): '''Get the all module in the zim source''' for file in tests.zim_pyfiles(): name = file[:-3].replace('/', '.') if os.name == 'nt': name = name.replace('\\', '.') if name.endswith('.__init__'): name = name[:-9] mod = __import__(name) for part in name.split('.')[1:]: mod = getattr(mod, part) yield name, mod class TestCompileAll(tests.TestCase): def runTest(self): '''Test if all modules compile''' for name, module in zim_modules(): #~ print '>>', name self.assertIsNotNone(module) class TestMetaData(tests.TestCase): def runTest(self): import zim revision = zim.get_zim_revision() # This call could fail if bazaar revision format changed self.assertTrue(isinstance(revision, basestring)) @tests.slowTest class TestNotebookUpgrade(tests.TestCase): def runTest(self): '''Test if included notebooks are up to date''' from zim.fs import Dir from zim.notebook import get_notebook for path in ('data/manual', 'HACKING'): notebook = get_notebook(Dir(path)) self.assertTrue(not notebook.needs_upgrade) class TestCoding(tests.TestCase): '''This test case enforces some coding style items''' def __init__(self, *a): self._code_files = [] tests.TestCase.__init__(self, *a) def list_code(self): '''Return all python files as text''' if not self._code_files: self._read_code() assert len(self._code_files) > 10 return copy.deepcopy(self._code_files) def _read_code(self): self._code_files = [] for root in ('zim', 'tests'): for dir, dirs, files in os.walk(root): for basename in files: if basename.endswith('.py'): file = dir.replace('\\', '/') + '/' + basename if file == 'tests/package.py': # skip ourselve continue #~ print 'READING', file fh = open(file) self._code_files.append((file, fh.read())) fh.close() def testWrongDependencies(self): '''Check clean dependencies''' #~ for klass in ('gobject', 'gtk', 'gio'): # TODO get rid of gobject as well allow_gtk = ('zim/gui/', 'zim/inc/', 'zim/plugins/', 'tests/') for klass in ('gtk', 'gio'): import_re = re.compile(r'^(import|from)\s+%s' % klass, re.M) # only match global imports - allow import in limitted scope for file, code in self.list_code(): if os.name == 'nt': file = file.replace('\\', '/') if any(map(file.startswith, allow_gtk)): continue # skip match = import_re.search(code) #~ if match: print '>>>', match.group(0) self.assertFalse(match, '%s imports %s, this is not allowed' % (file, klass)) def testWrongMethod(self): '''Check for a couple of constructs to be avoided''' for file, code in self.list_code(): self.assertFalse('gtk.Entry(' in code, '%s uses gtk.Entry - use zim.gui.widgets.InputEntry instead' % file) self.assertFalse('get_visible(' in code, '%s uses get_visible() - use get_property() instead' % file) self.assertFalse('set_visible(' in code, '%s uses set_visible() - use set_property() instead' % file) self.assertFalse('get_sensitive(' in code, '%s uses get_sensitive() - requires Gtk >= 2.18 - use set_property() instead' % file) #~ self.assertFalse('connect_object(' in code, '%s uses connect_object() - use connect() instead to prevent reference leaking' % file) self.assertFalse('gtk.HPaned(' in code, '%s uses gtk.HPaned - use zim.gui.widgets.HPaned instead' % file) self.assertFalse('gtk.VPaned(' in code, '%s uses gtk.VPaned - use zim.gui.widgets.VPaned instead' % file) if not file.endswith('widgets.py'): self.assertFalse('gtk.ScrolledWindow(' in code, '%s uses gtk.ScrolledWindow - use zim.gui.widgets.ScrolledWindow instead' % file) if not file.endswith('clipboard.py'): self.assertFalse('gtk.Clipboard(' in code, '%s uses gtk.Clipboard - use zim.gui.clipboard.Clipboard instead' % file) if not file.endswith('config.py'): self.assertFalse('os.environ\[' in code, '%s uses os.environ - use zim.config.get_environ() instead' % file) def testImportFuture(self): '''Check python 2.5 compatibility''' for file, code in self.list_code(): import_seen = False suspect = False for line in code.splitlines(): line = line.strip() if line.startswith('from __future__ ') \ and 'with_statement' in line.split(): import_seen = True elif line.startswith('with') and line.endswith(':'): suspect = True #~ if suspect: print file, 'uses "with" statement' if suspect and not import_seen: # Need real parsing to avoid false positives import tokenize import StringIO for token in tokenize.generate_tokens(StringIO.StringIO(code).readline): if token[0] == tokenize.NAME and token[1] == 'with': lineno = token[2][0] line = token[-1] self.assertTrue(import_seen, '%s missing with_statement import from __future__ ("with" seen on line %i):\n%s' % (file, lineno, line)) def testIndenting(self): # FIXME need real parser to be more robust for comments, multi-line strings etc. # for now we just check lines after a line ending with ":" # assume python itself warns us for changes in the middle of a block white = re.compile(r'^(\s*)') for file, code in self.list_code(): if file.startswith('zim/inc/'): continue lineno = 0 start_block = False for line in code.splitlines(): lineno += 1 text = line.strip() def_line = text.startswith('def ') or text.startswith('class ') if start_block or def_line: m = white.match(line) indent = str(m.groups(1)) self.assertFalse(' ' in indent, 'Indenting should use tabs - file: %s line %s' % (file, lineno)) start_block = def_line and line.rstrip().endswith(':') class TestDocumentation(tests.TestCase): def runTest(self): for modname, mod in zim_modules(): self.assertDocumentationOK(mod, modname) for name, obj in self.walk_code(mod, modname): if not '.inc.' in name: self.assertDocumentationOK(obj, name) def walk_code(self, obj, objname): # Yield classes, methods, and functions top down for name, member in inspect.getmembers(obj): if name == '__class__': continue name = objname + '.' + name if inspect.isclass(member): if member.__module__ != objname: continue # skip imported class yield name, member for child in self.walk_code(member, name): # recurs yield child elif inspect.isfunction(member) \ or inspect.ismethod(member): yield name, member def assertDocumentationOK(self, obj, name): #~ print 'CHECK docs for', name doc = inspect.getdoc(obj) if not doc: return # For now do not bitch about missing docs.. # Check fields fields = self.parseFields(doc, name) if not fields: return # Check call signature for functions if inspect.isfunction(obj) \ or inspect.ismethod(obj): # For now we do not complain about missing docs, just mismatches documented = set( fields.get('param', {}).keys() + fields.get('keyword', {}).keys() ) if documented: (args, varargs, keywords, defaults) = inspect.getargspec(obj) defined = set(args) if args and args[0] in ('self', 'klass'): defined.discard(args[0]) if varargs: defined.add(varargs) if keywords: defined.add(keywords) self.assertEqual(documented, defined, msg='Mismatch in documented parameters for %s\n' 'Declared: %s\nDocumented: %s' % (name, tuple(defined), tuple(documented)) ) # TODO can we also check whether doc should define @returns ?? # Check signature for @signal if 'signal' in fields: for spec in fields['signal']: # e.g. "C{open-page (L{Page}, L{Path})}: Emitted when opening" if not re.match('^C\{[\w-]+ \(.*?\)\}:', spec): self.fail('Signal description in %s does not follow templates\n' 'Is: %s\nShould be like "C{signal-name (arg1, arg2)}: description"' % (name, spec) ) known_fields = { # keys are known fields, if values is True, a param is # required for the first ":" 'param': True, 'type': True, 'keyword': True, 'returns': False, 'rtype': False, 'raises': True, 'cvar': True, 'ivar': True, 'todo': False, 'note': False, 'newfield': True, } collect_fields = ('signal',) def parseFields(self, doc, name): # Parse files same as epydoc - and check them on the fly fields = {} for line in doc.splitlines(): m = re.match('@(\w+)\s*(.*?):', line) if m: line = line[m.end():].strip() field, arg = m.group(1), m.group(2) if field in self.known_fields: if self.known_fields[field]: if not arg: self.fail('Doc for %s is missing argument for @%s' % (name, field)) else: if not field in fields: fields[field] = {} fields[field][arg] = line # special case - learn new fields if field == 'newfield': self.known_fields[arg] = False elif field in self.collect_fields: if not field in fields: fields[field] = [] fields[field].append(line) else: fields[field] = line else: self.fail('Doc for %s has unknown field @%s' % (name, field)) elif re.match('@(\w+)', line): self.fail('Syntax error in docs for %s\nMissing \':\' in "%s"' % (name, line)) else: pass return fields zim-0.60/tests/export.py0000644000175000017500000001623212132472704015151 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import tests import os from zim.fs import _md5, File, Dir from zim.config import data_file, ConfigDict from zim.notebook import Path, Notebook, init_notebook, \ interwiki_link, get_notebook_list, NotebookInfo from zim.exporter import Exporter, StaticLinker from zim.applications import Application # TODO add check that attachments are copied correctly def md5(f): return _md5(f.raw()) class TestLinker(tests.TestCase): def runTest(self): '''Test proper linking of files in export''' notebook = tests.new_notebook(fakedir='/source/dir/') linker = StaticLinker('html', notebook) linker.set_usebase(True) # normally set by html format module linker.set_path(Path('foo:bar')) # normally set by exporter linker.set_base(Dir('/source/dir/foo')) # normally set by exporter self.assertEqual(linker.link_page('+dus'), './bar/dus.html') self.assertEqual(linker.link_page('dus'), './dus.html') self.assertEqual(linker.link_file('./dus.pdf'), './bar/dus.pdf') self.assertEqual(linker.link_file('../dus.pdf'), './dus.pdf') self.assertEqual(linker.link_file('../../dus.pdf'), '../dus.pdf') ## setup environment for interwiki link if os.name == 'nt': uri = 'file:///C:/foo' else: uri = 'file:///foo' list = get_notebook_list() list.append(NotebookInfo(uri, interwiki='foo')) list.write() ## href = interwiki_link('foo?Ideas:Task List') self.assertIsNotNone(href) self.assertEqual(linker.link('foo?Ideas:Task List'), uri + '/Ideas/Task_List.txt') @tests.slowTest class TestExport(tests.TestCase): options = {'format': 'html', 'template': 'Default'} def setUp(self): self.dir = Dir(self.create_tmp_dir('exported_files')) def export(self): notebook = tests.new_notebook(fakedir='/foo/bar') exporter = Exporter(notebook, **self.options) exporter.export_all(self.dir) def runTest(self): '''Test export notebook to html''' self.export() file = self.dir.file('Test/foo.html') self.assertTrue(file.exists()) text = file.read() self.assertTrue('' in text, 'template used') self.assertTrue('

    Foo

    ' in text) for icon in ('checked-box',): #'unchecked-box', 'xchecked-box'): # Default template doesn't have its own checkboxes self.assertTrue(self.dir.file('_resources/%s.png' % icon).exists()) self.assertEqual( md5(self.dir.file('_resources/%s.png' % icon)), md5(data_file('pixmaps/%s.png' % icon)) ) @tests.slowTest class TestExportTemplateResources(TestExport): data = './tests/data/templates/' options = { 'format': 'html', 'template': './tests/data/templates/html/Default.html' } def runTest(self): pass # should not run, block just in case def testExportResources(self): '''Test export notebook to html with template resources''' self.export() file = self.dir.file('Test/foo.html') self.assertTrue(file.exists()) text = file.read() self.assertTrue('src="../_resources/foo/bar.png"' in text) self.assertTrue(self.dir.file('_resources/foo/bar.png').exists()) for icon in ('checked-box',): #'unchecked-box', 'xchecked-box'): # Template has its own checkboxes self.assertTrue(self.dir.file('_resources/%s.png' % icon).exists()) self.assertNotEqual( md5(self.dir.file('_resources/%s.png' % icon)), md5(data_file('pixmaps/%s.png' % icon)) ) def testListTemplates(self): '''Assert list templates still works with resource folders present''' import shutil from zim.config import XDG_DATA_HOME from zim.templates import list_templates, get_template # Make sure our template with resources is first in line datahome = XDG_DATA_HOME.subdir('zim/templates/') assert not datahome.exists() shutil.copytree(self.data, datahome.path) for name, basename in list_templates('html'): if name == 'Default': self.assertEqual(basename, 'Default.html') template = get_template('html', 'Default') self.assertEqual(template.file, datahome.file('html/Default.html').path) self.assertEqual(template.resources_dir, datahome.subdir('html/Default')) self.assertTrue(template.resources_dir.exists()) class TestExportFullOptions(TestExport): options = {'format': 'html', 'template': 'Default', 'index_page': 'index', 'document_root_url': 'http://foo.org/'} def runTest(self): '''Test export notebook to html with all options''' TestExport.runTest(self) file = self.dir.file('index.html') self.assertTrue(file.exists()) indexcontent = file.read() self.assertTrue('foo' in indexcontent) class TestExportCommandLine(TestExportFullOptions): def export(self): dir = Dir(self.create_tmp_dir('source_files')) init_notebook(dir) notebook = Notebook(dir=dir) for name, text in tests.WikiTestData: page = notebook.get_page(Path(name)) page.parse('wiki', text) notebook.store_page(page) file = dir.file('Test/foo.txt') self.assertTrue(file.exists()) zim = Application(('./zim.py', '--export', '--template=Default', dir.path, '--output', self.dir.path, '--index-page', 'index')) zim.run() def runTest(self): '''Test export notebook to html from commandline''' TestExportFullOptions.runTest(self) # TODO test export single page from command line @tests.slowTest class TestExportDialog(tests.TestCase): def runTest(self): '''Test ExportDialog''' from zim.gui.exportdialog import ExportDialog dir = Dir(self.create_tmp_dir()) notebook = tests.new_notebook(fakedir='/foo/bar') ui = tests.MockObject() ui.notebook = notebook ui.page = Path('foo') ui.mainwindow = None ui.uistate = ConfigDict() ## Test export all pages dialog = ExportDialog(ui) dialog.set_page(0) page = dialog.get_page() page.form['selection'] = 'all' dialog.next_page() page = dialog.get_page() page.form['format'] = 'HTML' page.form['template'] = 'Print' dialog.next_page() page = dialog.get_page() page.form['folder'] = dir page.form['index'] = 'INDEX_PAGE' dialog.assert_response_ok() file = dir.file('Test/foo.html') self.assertTrue(file.exists()) text = file.read() self.assertTrue('' in text, 'template used') self.assertTrue('

    Foo

    ' in text) #~ print dialog.uistate self.assertEqual(dialog.uistate, ui.uistate['ExportDialog']) self.assertIsInstance(dialog.uistate['output_folder'], Dir) ## Test export single page dialog = ExportDialog(ui) dialog.set_page(0) page = dialog.get_page() page.form['selection'] = 'page' page.form['page'] = 'Test:foo' dialog.next_page() page = dialog.get_page() page.form['format'] = 'HTML' page.form['template'] = 'Print' dialog.next_page() page = dialog.get_page() page.form['file'] = dir.file('SINGLE_FILE_EXPORT.html').path dialog.assert_response_ok() file = dir.file('SINGLE_FILE_EXPORT.html') self.assertTrue(file.exists()) text = file.read() self.assertTrue('' in text, 'template used') self.assertTrue('

    Foo

    ' in text) #~ print dialog.uistate self.assertEqual(dialog.uistate, ui.uistate['ExportDialog']) self.assertIsInstance(dialog.uistate['output_file'], File) self.assertIsInstance(dialog.uistate['output_folder'], Dir) # Keep this in state as well zim-0.60/tests/__init__.py0000644000175000017500000003575412132472704015401 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Zim test suite''' import os import sys import tempfile import shutil import logging import gettext import xml.etree.cElementTree as etree import types import glob if sys.version_info < (2, 7, 0): try: import unittest2 as unittest from unittest2 import skip, skipIf, skipUnless except ImportError: print >>sys.stderr, '''\ For python versions < 2.7 the 'unittest2' module is needed to run the test suite. On Ubuntu or Debian install package 'python-unittest2'. ''' sys.exit(1) else: import unittest from unittest import skip, skipIf, skipUnless __unittest = 1 # needed to get stack trace OK for class TestCase gettext.install('zim', unicode=True, names=('_', 'gettext', 'ngettext')) FAST_TEST = False #: determines whether we skip slow tests or not # This list also determines the order in which tests will executed __all__ = [ 'package', 'translations', 'utils', 'errors', 'signals', 'fs', 'config', 'applications', 'async', 'parsing', 'formats', 'templates', 'stores', 'index', 'notebook', 'history', 'main', 'plugins', 'export', 'www', 'search', 'widgets', 'gui', 'pageview', 'clipboard', 'calendar', 'printtobrowser', 'versioncontrol', 'inlinecalculator', 'tasklist', 'tags', 'imagegenerators', 'tableofcontents', 'quicknote', 'attachmentbrowser', 'insertsymbol', 'ipc' ] # when a test is missing from the list that should be detected for file in glob.glob(os.path.dirname(__file__) + '/*.py'): name = os.path.basename(file)[:-3] if name != '__init__' and not name in __all__: raise AssertionError, 'Test missing in __all__: %s' % name # get our own tmpdir TMPDIR = os.path.abspath('./tests/tmp') # Wanted to use tempfile.get_tempdir here to put everything in # e.g. /tmp/zim but since /tmp is often mounted as special file # system this conflicts with thrash support. For writing in source # dir we have conflict with bazaar controls, this is worked around # by a config mode switch in the bazaar backend of the version # control plugin if os.name == 'nt': TMPDIR = unicode(TMPDIR) else: TMPDIR = TMPDIR.encode(sys.getfilesystemencoding()) def load_tests(loader, tests, pattern): '''Load all test cases and return a unittest.TestSuite object. The parameters 'tests' and 'pattern' are ignored. ''' suite = unittest.TestSuite() for name in ['tests.'+name for name in __all__ ]: test = loader.loadTestsFromName(name) suite.addTest(test) return suite def _setUpEnvironment(): '''Method to be run once before test suite starts''' # In fact to be loaded before loading some of the zim modules # like zim.config and any that export constants from it system_data_dirs = os.environ.get('XDG_DATA_DIRS') os.environ.update({ 'ZIM_TEST_RUNNING': 'True', 'ZIM_TEST_ROOT': os.getcwd(), 'TMP': TMPDIR, 'XDG_DATA_HOME': os.path.join(TMPDIR, 'data_home'), 'XDG_DATA_DIRS': os.path.join(TMPDIR, 'data_dir'), 'XDG_CONFIG_HOME': os.path.join(TMPDIR, 'config_home'), 'XDG_CONFIG_DIRS': os.path.join(TMPDIR, 'config_dir'), 'XDG_CACHE_HOME': os.path.join(TMPDIR, 'cache_home') }) if os.path.isdir(TMPDIR): shutil.rmtree(TMPDIR) os.makedirs(TMPDIR) hicolor = os.environ['XDG_DATA_DIRS'] + '/icons/hicolor' os.makedirs(hicolor) if system_data_dirs: # Need these since gtk pixbuf loaders are in /usr/share in # some setups, and this parameter is used to find them os.environ['XDG_DATA_DIRS'] = os.pathsep.join( (os.environ['XDG_DATA_DIRS'], system_data_dirs) ) if os.environ.get('ZIM_TEST_RUNNING') != 'True': # Do this when loaded, but not re-do in sub processes # (doing so will kill e.g. the ipc test...) _setUpEnvironment() _zim_pyfiles = [] def zim_pyfiles(): '''Returns a list with file paths for all the zim python files''' if not _zim_pyfiles: for d, dirs, files in os.walk('zim'): _zim_pyfiles.extend([d+'/'+f for f in files if f.endswith('.py')]) _zim_pyfiles.sort() for file in _zim_pyfiles: yield file # shallow copy def slowTest(obj): '''Decorator for slow tests Tests wrapped with this decorator are ignored when you run C{test.py --fast}. You can either wrap whole test classes:: @tests.slowTest class MyTest(tests.TestCase): ... or individual test functions:: class MyTest(tests.TestCase): @tests.slowTest def testFoo(self): ... def testBar(self): ... ''' if FAST_TEST: wrapper = skip('Slow test') return wrapper(obj) else: return obj class TestCase(unittest.TestCase): '''Base class for test cases''' maxDiff = None def assertEqual(self, first, second, msg=None): ## HACK to work around bug in unittest - it does not consider ## string and unicode to be of the same type and thus does not ## show diffs ## TODO file bug report for this if type(first) in (str, unicode) \ and type(second) in (str, unicode): self.assertMultiLineEqual(second, first, msg) ## HACK switch arguments here, otherwise order of ## diff is wrong (assuming first is what we got and second ## is the reference) else: unittest.TestCase.assertEqual(self, first, second, msg) def create_tmp_dir(self, name=None): '''Returns a path to a tmp dir where tests can write data. The dir is removed and recreated empty every time this function is called with the same name from the same class. ''' path = self._get_tmp_name(name) if os.path.exists(path): shutil.rmtree(path) assert not os.path.exists(path) # make real sure os.makedirs(path) assert os.path.exists(path) # make real sure return path def get_tmp_name(self, name=None): '''Returns the same path as L{create_tmp_dir()} but without touching it. This method will raise an exception when a file or dir exists of the same name. ''' path = self._get_tmp_name(name) assert not os.path.exists(path), 'This path should not exist: %s' % path return path def _get_tmp_name(self, name): if name: assert not os.path.sep in name, 'Don\'t use this method to get sub folders or files' name = self.__class__.__name__ + '_' + name else: name = self.__class__.__name__ if os.name == 'nt': name = unicode(name) else: name = name.encode(sys.getfilesystemencoding()) return os.path.join(TMPDIR, name) class LoggingFilter(object): '''Base class for logging filters that can be used as a context using the "with" keyword. To subclass it you only need to set the logger to be used and (the begin of) the message to filter. Alternatively you can call L{wrap_test()} from test C{setUp}. This will start the filter and make sure it is cleanep up again. ''' logger = None message = None def __init__(self, logger=None, message=None): if logger: self.logger = logger if message: self.message = message self.loggerobj = logging.getLogger(self.logger) def __enter__(self): self.loggerobj.addFilter(self) def __exit__(self, *a): self.loggerobj.removeFilter(self) def filter(self, record): msg = record.getMessage() if isinstance(self.message, tuple): return not any(msg.startswith(m) for m in self.message) else: return not msg.startswith(self.message) def wrap_test(self, test): self.__enter__() test.addCleanup(self.__exit__) class DialogContext(object): '''Context manager to catch dialogs being opened Inteded to be used like this:: def myCustomTest(dialog): self.assertTrue(isinstance(dialog, CustomDialogClass)) # ... dialog.assert_response_ok() with DialogContext( myCustomTest, SomeOtherDialogClass ): gui.show_dialogs() In this example the first dialog that is run by C{gui.show_dialogs()} is checked by the function C{myCustomTest()} while the second dialog just needs to be of class C{SomeOtherDialogClass} and will then be closed with C{assert_response_ok()} by the context manager. This context only works for dialogs derived from zim's Dialog class as it uses a special hook in L{zim.gui.widgets}. ''' def __init__(self, *definitions): '''Constructor @param definitions: list of either classes or methods ''' self.stack = list(definitions) self.old_test_mode = None def __enter__(self): import zim.gui.widgets self.old_test_mode = zim.gui.widgets.TEST_MODE self.old_callback = zim.gui.widgets.TEST_MODE_RUN_CB zim.gui.widgets.TEST_MODE = True zim.gui.widgets.TEST_MODE_RUN_CB = self._callback def _callback(self, dialog): #~ print '>>>', dialog if not self.stack: raise AssertionError, 'Unexpected dialog run: %s' % dialog handler = self.stack.pop(0) if isinstance(handler, (type, types.ClassType)): # is a class if not isinstance(dialog, handler): raise AssertionError, 'Expected dialog of class %s, but got %s instead' % (handler, dialog.__class__) dialog.assert_response_ok() else: # assume a function handler(dialog) def __exit__(self, *error): #~ print 'ERROR', error import zim.gui.widgets zim.gui.widgets.TEST_MODE = self.old_test_mode zim.gui.widgets.TEST_MODE_RUN_CB = self.old_callback has_error = bool([e for e in error if e is not None]) if self.stack and not has_error: raise AssertionError, '%i expected dialog(s) not run' % len(self.stack) return False # Raise any errors again outside context class TestData(object): '''Wrapper for a set of test data in tests/data''' def __init__(self, format): assert format == 'wiki', 'TODO: add other formats' root = os.environ['ZIM_TEST_ROOT'] tree = etree.ElementTree(file=root+'/tests/data/notebook-wiki.xml') test_data = [] for node in tree.getiterator(tag='page'): name = node.attrib['name'] text = unicode(node.text.lstrip('\n')) test_data.append((name, text)) self._test_data = tuple(test_data) def __iter__(self): '''Yield the test data as 2 tuple (pagename, text)''' for name, text in self._test_data: yield name, text # shallow copy def get(self, pagename): '''Return text for a specific pagename''' for n, text in self._test_data: if n == pagename: return text assert False, 'Could not find data for page: %s' % pagename WikiTestData = TestData('wiki') #: singleton to be used by various tests def _expand_manifest(names): '''Build a set of all pages names and all namespaces that need to exist to host those page names. ''' manifest = set() for name in names: manifest.add(name) while name.rfind(':') > 0: i = name.rfind(':') name = name[:i] manifest.add(name) return manifest def new_parsetree(): '''Returns a new ParseTree object for testing Uses data from L{WikiTestData}, page C{roundtrip} ''' import zim.formats.wiki parser = zim.formats.wiki.Parser() text = WikiTestData.get('roundtrip') tree = parser.parse(text) return tree def new_parsetree_from_text(text, format='wiki'): import zim.formats parser = zim.formats.get_format(format).Parser() return parser.parse(text) def new_parsetree_from_xml(xml): # For some reason this does not work with cElementTree.XMLBuilder ... from xml.etree.ElementTree import XMLTreeBuilder from zim.formats import ParseTree builder = XMLTreeBuilder() builder.feed(xml) root = builder.close() return ParseTree(root) def new_page(): from zim.notebook import Path, Page page = Page(Path('roundtrip')) page.readonly = False page.set_parsetree(new_parsetree()) return page def new_page_from_text(text, format='wiki'): from zim.notebook import Path, Page page = Page(Path('Test')) page.readonly = False page.set_parsetree(new_parsetree_from_text(text, format)) return page def new_notebook(fakedir=None): '''Returns a new Notebook object with all data in memory Uses data from L{WikiTestData} @param fakedir: optional parameter to set the 'dir' attribute for the notebook and the main store which allows you to resolve file paths etc. It will not automatically touch the dir (hence it being 'fake'). ''' from zim.fs import Dir from zim.notebook import Notebook, Path from zim.index import Index notebook = Notebook(index=Index(dbfile=':memory:')) store = notebook.add_store(Path(':'), 'memory') manifest = [] for name, text in WikiTestData: manifest.append(name) store.set_node(Path(name), text) notebook.testdata_manifest = _expand_manifest(manifest) notebook.index.update() if fakedir: dir = Dir(fakedir) notebook.dir = dir store.dir = dir return notebook def new_files_notebook(dir): '''Returns a new Notebook object with a file store Uses data from L{WikiTestData} @param path: a folder path, e.g. created by L{TestCase.create_tmp_dir()} ''' from zim.fs import Dir from zim.notebook import init_notebook, Notebook, Path from zim.index import Index dir = Dir(dir) init_notebook(dir) notebook = Notebook(dir=dir) store = notebook.get_store(':') manifest = [] for name, text in WikiTestData: manifest.append(name) page = store.get_page(Path(name)) page.parse('wiki', text) store.store_page(page) notebook.testdata_manifest = _expand_manifest(manifest) notebook.index.update() return notebook class Counter(object): '''Object that is callable as a function and keeps count how often it was called. ''' def __init__(self, value=None): '''Constructor @param value: the value to return when called as a function ''' self.value = value self.count = 0 def __call__(self, *arg, **kwarg): self.count += 1 return self.value class MockObjectBase(object): '''Base class for mock objects. Mock methods can be installed with L{mock_method()}. All method calls to mock methods are logged, so they can be inspected. The attribute C{mock_calls} has a list of tuples with mock methods and arguments in order they have been called. ''' def __init__(self): self.mock_calls = [] def mock_method(self, name, return_value): '''Installs a mock method with a given name that returns a given value. ''' def my_mock_method(*arg, **kwarg): call = [name] + list(arg) if kwarg: call.append(kwarg) self.mock_calls.append(tuple(call)) return return_value setattr(self, name, my_mock_method) return my_mock_method class MockObject(MockObjectBase): '''Simple subclass of L{MockObjectBase} that automatically mocks a method which returns C{None} for any non-existing attribute. Attributes that are not methods need to be initialized explicitly. ''' def __getattr__(self, name): '''Automatically mock methods''' return self.mock_method(name, None) def gtk_process_events(*a): '''Method to simulate a few iterations of the gtk main loop''' import gtk while gtk.events_pending(): gtk.main_iteration(block=False) return True # continue def gtk_get_menu_item(menu, id): '''Get a menu item from a C{gtk.Menu} @param menu: a C{gtk.Menu} @param id: either the menu item label or the stock id @returns: a C{gtk.MenuItem} or C{None} ''' items = menu.get_children() ids = [i.get_property('label') for i in items] # gtk.ImageMenuItems that have a stock id happen to use the # 'label' property to store it... assert id in ids, \ 'Menu item "%s" not found, we got:\n' % id \ + ''.join('- %s \n' % i for i in ids) i = ids.index(id) return items[i] def gtk_activate_menu_item(menu, id): '''Trigger the 'click' action an a menu item @param menu: a C{gtk.Menu} @param id: either the menu item label or the stock id ''' item = gtk_get_menu_item(menu, id) item.activate() zim-0.60/tests/history.py0000664000175000017500000002356411751004563015341 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import tests import copy import zim.history from zim.history import History, HistoryPath, RecentPath from zim.notebook import Path from zim.config import ConfigDict class TestHistory(tests.TestCase): def setUp(self): zim.history.MAX_HISTORY = 100 self.notebook = tests.new_notebook() self.pages = [self.notebook.get_page(Path(name)) for name in self.notebook.testdata_manifest] def assertCurrentEquals(self, history, path): current = history.get_current() self.assertTrue(isinstance(current, HistoryPath)) self.assertEqual(current.name, path.name) def assertHistoryEquals(self, history, pages): self._checkPaths(history.get_history(), pages, HistoryPath) def assertRecentEquals(self, history, pages): self._checkPaths(history.get_recent(), pages, RecentPath) def _checkPaths(self, paths, wanted, klass): paths = list(paths) paths.reverse() self.assertTrue(any(isinstance(p, klass) for p in paths), 'All should have klass: %s' % klass) self.assertEqual([p.name for p in paths], [p.name for p in wanted]) def testState(self): history = History(self.notebook) for page in self.pages: history.append(page) self.assertHistoryEquals(history, self.pages) path = history.get_current() self.assertEqual(history.get_state(path), (None, None)) path.cursor = 42 self.assertEqual(history.get_state(path), (42, None)) def testLinear(self): '''Walk back and forth through the history''' history = History(self.notebook) self.assertTrue(history.get_current() is None) for page in self.pages: history.append(page) self.assertHistoryEquals(history, self.pages) self.assertCurrentEquals(history, self.pages[-1]) pages = list(history.get_history()) self.assertEqual(pages[0], history.get_current()) self.assertEqual(len(pages), len(self.pages)) self.assertEqual(pages[0].cursor, None) # Newly appended pages should not have the cursor # set - pageview has logic to do the right thing when # no cursor is set. Setting default e.g. 0 will # overrule this logic. # walk backwards for i in range(2, len(self.pages)+1): prev = history.get_previous() self.assertFalse(prev is None) self.assertEqual(prev.name, self.pages[-i].name) self.assertFalse(prev.is_last) history.set_current(prev) self.assertCurrentEquals(history, self.pages[0]) self.assertTrue(history.get_previous() is None) self.assertTrue(prev.is_first) self.assertHistoryEquals(history, self.pages) # walk forward for i in range(1, len(self.pages)): next = history.get_next() self.assertFalse(next is None) self.assertEqual(next.name, self.pages[i].name) self.assertFalse(next.is_first) history.set_current(next) self.assertCurrentEquals(history, self.pages[-1]) self.assertTrue(history.get_next() is None) self.assertTrue(history.get_current().is_last) self.assertHistoryEquals(history, self.pages) # Add page multiple times current = history.get_current() path = Path(current.name) for j in range(5): history.append(path) self.assertHistoryEquals(history, self.pages) # history does not store duplicates self.assertEquals(history.get_current(), current) # Test dropping forward stack historylist = list(history.get_history()) path1 = historylist[10] path2 = historylist[0] history.set_current(path1) self.assertEquals(history.get_current(), path1) # rewind self.assertHistoryEquals(history, self.pages) # no change history.append(path2) # new path - drop forward stack i = len(pages) - 10 wanted = self.pages[:i] + [path2] self.assertHistoryEquals(history, wanted) # Test max entries default_max_history = zim.history.MAX_HISTORY zim.history.MAX_HISTORY = 3 for page in self.pages: history.append(page) zim.history.MAX_HISTORY = default_max_history self.assertHistoryEquals(history, self.pages[-3:]) def testUnique(self): '''Get recent pages from history''' default_max_recent = zim.history.MAX_RECENT zim.history.MAX_RECENT = len(self.pages) + 1 history = History(self.notebook) for page in self.pages: history.append(page) self.assertHistoryEquals(history, self.pages) unique = list(history.get_recent()) self.assertEqual(unique[0], history.get_current()) self.assertEqual(len(unique), len(self.pages)) for page in self.pages: history.append(page) self.assertHistoryEquals(history, 2 * self.pages) unique = list(history.get_recent()) self.assertEqual(unique[0], history.get_current()) self.assertEqual(len(unique), len(self.pages)) unique = set([page.name for page in unique]) # collapse doubles self.assertEqual(len(unique), len(self.pages)) zim.history.MAX_RECENT = 3 history = History(self.notebook) for page in self.pages: history.append(page) zim.history.MAX_RECENT = default_max_recent self.assertHistoryEquals(history, self.pages) unique = list(history.get_recent()) self.assertEqual(unique[0], history.get_current()) self.assertEqual(len(unique), 3) def testChildren(self): '''Test getting namespace from history''' history = History(self.notebook) for name in ('Test:wiki', 'Test:foo:bar', 'Test:foo', 'TaskList:bar'): page = self.notebook.get_page(Path(name)) history.append(page) self.assertEqual(history.get_child(Path('Test')), Path('Test:foo')) self.assertEqual(history.get_grandchild(Path('Test')), Path('Test:foo:bar')) self.assertEqual(history.get_child(Path('NonExistent')), None) self.assertEqual(history.get_grandchild(Path('NonExistent')), None) history.append(self.notebook.get_page(Path('Test:wiki'))) self.assertEqual(history.get_child(Path('Test')), Path('Test:wiki')) self.assertEqual(history.get_grandchild(Path('Test')), Path('Test:wiki')) page = self.notebook.get_page(Path('Some:deep:nested:page')) history.append(page) self.assertEqual(history.get_child(Path('Some')), Path('Some:deep')) self.assertEqual(history.get_grandchild(Path('Some')), Path('Some:deep:nested:page')) def testMovePage(self): '''Test history is updated for moved pages''' history = History(self.notebook) for page in self.pages: history.append(page) self.assertIn(Path('Test:wiki'), list(history.get_history())) history._on_page_moved(self.notebook, Path('Test'), Path('New'), False) self.assertNotIn(Path('Test:wiki'), list(history.get_history())) self.assertIn(Path('New:wiki'), list(history.get_history())) history._on_page_moved(self.notebook, Path('New'), Path('Test'), False) self.assertNotIn(Path('New:wiki'), list(history.get_history())) self.assertIn(Path('Test:wiki'), list(history.get_history())) self.assertHistoryEquals(history, self.pages) def testDeletedNotInUnique(self): '''Test if deleted pages and their children show up in unique history list''' zim.history.MAX_RECENT = len(self.pages) + 1 history = History(self.notebook) for page in self.pages: history.append(page) for page in self.pages: history.append(page) self.assertHistoryEquals(history, 2 * self.pages) uniques = list(history.get_recent()) self.assertEqual(len(uniques), len(self.pages)) page = history.get_current() history._on_page_deleted(self.notebook, page) uniques = list(history.get_recent()) self.assertTrue(len(uniques) < len(self.pages)) i = len(uniques) history.set_current(page) uniques = list(history.get_recent()) self.assertEqual(len(uniques), i + 1) # Not same as len(self.pages) because of deleted children for page in self.pages: history._on_page_deleted(self.notebook, page) uniques = list(history.get_recent()) self.assertEqual(len(uniques), 0) self.assertEqual( len(list(history.get_history())), 2 * len(self.pages) ) for page in history.get_history(): history.set_current(page) uniques = list(history.get_recent()) self.assertEqual(len(uniques), len(self.pages)) def testSerialize(self): '''Test parsing the history from the state file''' uistate = ConfigDict() history = History(self.notebook, uistate) for page in self.pages: history.append(page) self.assertHistoryEquals(history, self.pages) self.assertCurrentEquals(history, self.pages[-1]) # rewind 2 for i in range(2): prev = history.get_previous() history.set_current(prev) # check state #~ import pprint #~ pprint.pprint(uistate) self.assertHistoryEquals(history, uistate['History']['list']) self.assertRecentEquals(history, uistate['History']['recent']) self.assertEqual(uistate['History']['current'], len(self.pages) - 3) # clone uistate by text lines = uistate.dump() newuistate = ConfigDict() newuistate.parse(lines) # check new state self.assertHistoryEquals(history, [Path(t[0]) for t in newuistate['History']['list']]) self.assertRecentEquals(history, [Path(t[0]) for t in newuistate['History']['recent']]) self.assertEqual(newuistate['History']['current'], len(self.pages) - 3) # and compare resulting history object newhistory = History(self.notebook, newuistate) self.assertEqual(list(newhistory.get_history()), list(history.get_history())) self.assertEqual(list(newhistory.get_recent()), list(history.get_recent())) self.assertEqual(newhistory.get_current(), history.get_current()) # Check recent is initialized if needed newuistate = ConfigDict() newuistate.parse(lines) newuistate['History'].pop('recent') newhistory = History(self.notebook, newuistate) self.assertEqual(list(newhistory.get_history()), list(history.get_history())) self.assertEqual(list(newhistory.get_recent()), list(history.get_recent())) self.assertEqual(newhistory.get_current(), history.get_current()) def testRobustness(self): '''Test history can deal with garbage data''' uistate = ConfigDict() uistate['list'] = 'FOOOO' uistate['recent'] = [["BARRRR", 0]] uistate['cursor'] = 'Not an integer' history = History(self.notebook, uistate) self.assertEqual(list(history.get_history()), []) self.assertEqual(list(history.get_recent()), []) self.assertIsNone(history.get_current()) zim-0.60/tests/www.py0000644000175000017500000001122312132472704014447 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import tests import sys import os from cStringIO import StringIO import logging import wsgiref.validate import wsgiref.handlers from zim.fs import File from zim.www import WWWInterface # TODO how to test fetching from a socket while mainloop is running ? class Filter404(tests.LoggingFilter): logger = 'zim.www' message = '404 Not Found' @tests.slowTest class TestWWWInterface(tests.TestCase): def assertResponseWellFormed(self, response, expectbody=True): body = response.splitlines() header = [] while body: line = body.pop(0) if line == '': break else: header.append(line) self.assertTrue(header[0].startswith('HTTP/1.0 ')) self.assertTrue(len([l for l in header if l.startswith('Content-Type: ')]) == 1, 'Content-Type header present') self.assertTrue(len([l for l in header if l.startswith('Date: ')]) == 1, 'Date header present') if expectbody: text = '\n'.join(body) self.assertTrue(text and not text.isspace(), 'Repsonse has a body') return header, body def assertResponseOK(self, response, expectbody=True): header, body = self.assertResponseWellFormed(response, expectbody) self.assertEqual(header[0], 'HTTP/1.0 200 OK') self.assertTrue('Content-Type: text/html; charset="utf-8"' in header) return header, body def setUp(self): self.template = None self.file_not_found_paths = ['/Test', '/nonexistingpage.html', '/nonexisting/'] self.file_found_paths = ['/favicon.ico', '/+resources/checked-box.png'] def runTest(self): 'Test WWW interface' notebook = tests.new_notebook() notebook.index.update() interface = WWWInterface(notebook, template=self.template) validator = wsgiref.validate.validator(interface) def call(command, path): environ = { 'REQUEST_METHOD': command, 'SCRIPT_NAME': '', 'PATH_INFO': path, 'QUERY_STRING': '', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '80', 'SERVER_PROTOCOL': '1.0' } rfile = StringIO('') wfile = StringIO() handler = wsgiref.handlers.SimpleHandler(rfile, wfile, sys.stderr, environ) if os.name == 'nt': # HACK: on windows we have no file system encoding, # but use unicode instead for os API. # However wsgiref.validate fails on unicode param # in environmnet. for k, v in handler.os_environ.items(): if isinstance(v, unicode): handler.os_environ[k] = v.encode('utf-8') handler.run(validator) #~ print '>>>>\n', wfile.getvalue(), '<<<<' return wfile.getvalue() # index for path in ('/', '/Test/'): response = call('HEAD', path) self.assertResponseOK(response, expectbody=False) response = call('GET', path) #~ print '>'*80, '\n', response, '<'*80 self.assertResponseOK(response) self.assertTrue('
  • foo
  • ' in response) # page response = call('GET', '/Test/foo.html') self.assertResponseOK(response) self.assertTrue('

    Foo

    ' in response) # page not found with Filter404(): for path in self.file_not_found_paths: response = call('GET', path) header, body = self.assertResponseWellFormed(response) self.assertEqual(header[0], 'HTTP/1.0 404 Not Found') # favicon and other files for path in self.file_found_paths: response = call('GET', path) header, body = self.assertResponseWellFormed(response) self.assertEqual(header[0], 'HTTP/1.0 200 OK') #~ class TestWWWInterfaceTemplate(TestWWWInterface): #~ #~ def assertResponseOK(self, response, expectbody=True): #~ header, body = TestWWWInterface.assertResponseOK(self, response, expectbody) #~ if expectbody: #~ self.assertTrue('' in body, 'Template is used') #~ #~ def setUp(self): #~ TestWWWInterface.setUp(self) #~ self.template = 'Default' #~ self.file_not_found_paths.append('/+resources/foo/bar.png') #~ #~ def runTest(self): #~ 'Test WWW interface with a template.' #~ TestWWWInterface.runTest(self) class TestWWWInterfaceTemplateResources(TestWWWInterface): def assertResponseOK(self, response, expectbody=True): header, body = TestWWWInterface.assertResponseOK(self, response, expectbody) if expectbody: self.assertTrue('' in body, 'Template is used') self.assertTrue('src="/%2Bresrouces/foo/bar.png"' ''.join(body), 'Template is used') def setUp(self): TestWWWInterface.setUp(self) self.file = File('tests/data/templates/html/Default.html') self.template = self.file.path self.file_found_paths.append('/+resources/foo/bar.png') def runTest(self): 'Test WWW interface with a template with resources.' TestWWWInterface.runTest(self) zim-0.60/tests/gui.py0000664000175000017500000006473212053474517014434 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import tests import os import gtk from zim.errors import Error from zim.notebook import get_notebook_list, Path, Page, NotebookInfo from zim.formats import ParseTree from zim.fs import File, Dir from zim.config import config_file from zim.gui.clipboard import Clipboard import zim.gui def setupGtkInterface(test, klass=None): '''Setup a new GtkInterface object for testing. Will have test notebook, and default preferences. @param test: the test that wants to use this ui object @param klass: the klass to use, defaults to L{GtkInterface}, but could be partially mocked subclass ''' if klass is None: klass = zim.gui.GtkInterface # start filtering filter = FilterNoSuchImageWarning() filter.wrap_test(test) # flush preferences preferences = config_file('preferences.conf') preferences.file.remove() # create interface object with new notebook dirpath = test.get_tmp_name() notebook = tests.new_notebook(fakedir=dirpath) path = Path('Test:foo:bar') ui = klass(notebook=notebook, page=path) # finalize plugins for plugin in ui.plugins: plugin.finalize_ui(ui) ui.mainwindow.init_uistate() return ui @tests.slowTest class TestDialogs(tests.TestCase): def setUp(self): path = self.create_tmp_dir() self.ui = MockUI('Test:foo:bar', fakedir=path) def testOpenPageDialog(self): '''Test OpenPageDialog dialog (Jump To...)''' for name, path in ( (':foo', ':foo'), ('foo', ':Test:foo'), ('baz', ':Test:foo:baz'), ('+baz', ':Test:foo:bar:baz'), ): dialog = zim.gui.OpenPageDialog(self.ui) dialog.form.widgets['page'].set_text(name) dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('open_page', Path(path))) def testNewPageDialog(self): '''Test NewPageDialog''' self.ui.mainwindow = tests.MockObject() self.ui.mainwindow.pageview = tests.MockObject() for name, path in ( (':new', ':new'), ('foo:new', ':Test:foo:new'), ('new', ':Test:foo:new'), ('+new', ':Test:foo:bar:new'), ): dialog = zim.gui.NewPageDialog(self.ui) dialog.form.widgets['page'].set_text(name) dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('save_page',)) self.assertEqual(self.ui.mock_calls[-2], ('open_page', Path(path))) page = self.ui.notebook.get_page(Path(path)) self.assertTrue(page.exists()) page.modified = False # HACK so we can clean up self.ui.notebook.delete_page(page) for name, path in ( (':new', ':Test:foo:bar:new'), ('foo:new', ':Test:foo:bar:foo:new'), ('new', ':Test:foo:bar:new'), ('+new', ':Test:foo:bar:new'), ): dialog = zim.gui.NewPageDialog(self.ui, subpage=True) dialog.form.widgets['page'].set_text(name) dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('save_page',)) self.assertEqual(self.ui.mock_calls[-2], ('open_page', Path(path))) page = self.ui.notebook.get_page(Path(path)) self.assertTrue(page.exists()) page.modified = False # HACK so we can clean up self.ui.notebook.delete_page(page) dialog = zim.gui.NewPageDialog(self.ui) dialog.form.widgets['page'].set_text(':Test:foo') self.assertRaises(Error, dialog.assert_response_ok) def testSaveCopyDialog(self): '''Test SaveCopyDialog''' tmp_dir = self.create_tmp_dir('testSaveCopyDialog') file = File((tmp_dir, 'save_copy.txt')) self.assertFalse(file.exists()) dialog = zim.gui.SaveCopyDialog(self.ui) dialog.set_file(file) #~ dialog.assert_response_ok() #~ self.assertTrue(file.exists()) def testImportPageDialog(self): '''Test ImportPageDialog''' tmp_dir = self.create_tmp_dir('testImportPageDialog') file = File((tmp_dir, 'import_page.txt')) file.write('test 123\n') self.assertTrue(file.exists()) dialog = zim.gui.ImportPageDialog(self.ui) dialog.set_file(file) #~ dialog.assert_response_ok() #~ self.assertEqual(self.ui.mock_calls[-1], ('open_page', Path(':import_page'))) #~ self.assertTrue(self.ui.notebook.get_page(':import_page').exists()) def testMovePageDialog(self): '''Test MovePageDialog''' # Can't test much here except for the call to do_move_page self.ui.mock_method('do_move_page', True) dialog = zim.gui.MovePageDialog(self.ui, path=Path('Test:foo:bar')) self.assertTrue(dialog.form['update']) self.assertTrue(dialog.form.widgets['update'].get_property('sensitive')) dialog.form['parent'] = Path('New') dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('do_move_page', Path('Test:foo:bar'), Path('New:bar'), True)) dialog = zim.gui.MovePageDialog(self.ui, path=Path('New:bar')) self.assertFalse(dialog.form['update']) self.assertFalse(dialog.form.widgets['update'].get_property('sensitive')) dialog.form['parent'] = Path('foo') dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('do_move_page', Path('New:bar'), Path('foo:bar'), False)) def testRenamePageDialog(self): '''Test RenamePageDialog''' # Can't test much here except for the call to do_rename_page self.ui.mock_method('do_rename_page', True) dialog = zim.gui.RenamePageDialog(self.ui, path=Path('Test:foo:bar')) self.assertTrue(dialog.form['update']) self.assertTrue(dialog.form.widgets['update'].get_property('sensitive')) self.assertFalse(dialog.form['head']) # There is no heading self.assertTrue(dialog.form.widgets['head'].get_property('sensitive')) dialog.form['name'] = 'New' dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('do_rename_page', Path('Test:foo:bar'), 'New', False, True)) dialog = zim.gui.RenamePageDialog(self.ui, path=Path('New:bar')) self.assertFalse(dialog.form['update']) self.assertFalse(dialog.form.widgets['update'].get_property('sensitive')) self.assertFalse(dialog.form['head']) self.assertFalse(dialog.form.widgets['head'].get_property('sensitive')) dialog.form['name'] = 'New' dialog.assert_response_ok() self.assertEqual(self.ui.mock_calls[-1], ('do_rename_page', Path('New:bar'), 'New', False, False)) def testRenamePageDialogWithHeadingChanges(self): '''Test RenamePageDialog's heading auto-change option depending on whether we have a changed heading or not. ''' tree = ParseTree().fromstring('') tree.set_heading("bar") self.ui.page = Page(Path("Test:foo:bar"), parsetree=tree) self.ui.notebook.get_page = lambda path: self.ui.page dialog = zim.gui.RenamePageDialog(self.ui, path=Path("Test:foo:bar")) self.assertTrue(dialog.form['head']) tree.set_heading("different") dialog = zim.gui.RenamePageDialog(self.ui, path=Path("Test:foo:bar")) self.assertFalse(dialog.form['head']) def testDeletePageDialog(self): '''Test DeletePageDialog''' # just check inputs are OK - skip output dialog = zim.gui.DeletePageDialog(self.ui, path=Path('Test:foo:bar')) self.assertTrue(dialog.links_checkbox.get_active()) self.assertTrue(dialog.links_checkbox.get_property('sensitive')) dialog = zim.gui.DeletePageDialog(self.ui, path=Path('New')) self.assertFalse(dialog.links_checkbox.get_active()) self.assertFalse(dialog.links_checkbox.get_property('sensitive')) dialog.assert_response_ok() def testAttachFileDialog(self): '''Test AttachFileDialog''' tmp_dir = self.create_tmp_dir('testAttachFileDialog') file = File((tmp_dir, 'file_to_be_attached')) file.write('Test 1 2 3\n') newfile = File((tmp_dir, 'attachments', 'Test', 'foo', 'file_to_be_attached')) self.assertTrue(file.exists()) self.assertFalse(newfile.exists()) dialog = zim.gui.AttachFileDialog(self.ui, path=Path('Test:foo')) dialog.set_file(file) #~ dialog.assert_response_ok() #~ self.assertTrue(file.exists()) # No move or delete happened #~ self.assertTrue(newfile.exists()) #~ self.assertTrue(newfile.compare(file)) def testSearchDialog(self): '''Test SearchDialog''' from zim.gui.searchdialog import SearchDialog self.ui.notebook = tests.new_notebook() dialog = SearchDialog(self.ui) dialog.query_entry.set_text('Foo') dialog.query_entry.activate() model = dialog.results_treeview.get_model() self.assertTrue(len(model) > 3) self.ui.mainwindow = tests.MockObject() self.ui.mainwindow.pageview = tests.MockObject() col = dialog.results_treeview.get_column(0) dialog.results_treeview.row_activated((0,), col) def testCustomToolDialog(self): '''Test CustomTool dialogs''' from zim.gui.customtools import CustomToolManagerDialog from zim.gui.customtools import EditCustomToolDialog ## CustomToolManager dialog dialog = CustomToolManagerDialog(self.ui) properties = { 'Name': 'Foo', 'Comment': 'Test Foo', 'X-Zim-ExecTool': 'foo %u', 'X-Zim-ReadOnly': False, 'X-Zim-ShowInToolBar': False, } dialog.manager.create(**properties) dialog.listview.refresh() dialog.destroy() ## Edit custom tool dialog dialog = EditCustomToolDialog(self.ui) input = { 'Name': 'Foo', 'Comment': 'Test Foo', 'X-Zim-ExecTool': 'foo %u', 'X-Zim-ReadOnly': False, 'X-Zim-ShowInToolBar': False, } dialog.form.update(input) output = dialog.assert_response_ok() input['Icon'] = None self.assertEqual(output, input) def testPropertiesDialog(self): '''Test PropertiesDialog''' from zim.gui.propertiesdialog import PropertiesDialog self.ui.readonly = True dialog = PropertiesDialog(self.ui) dialog.assert_response_ok() from zim.config import ConfigDictFile notebook = self.ui.notebook file = notebook.dir.file('notebook.zim') notebook.config = ConfigDictFile(file) self.ui.readonly = False config1 = { 'name': 'Notebook Foo', 'interwiki': '', 'home': 'Home', 'icon': './icon.png', 'document_root': File('/foo').path, # win32 save test 'shared': False, 'profile': '', } config2 = { 'name': 'Notebook Bar', 'interwiki': 'FooBar', 'home': 'HomeSweetHome', 'icon': './picture.png', 'document_root': File('/bar').path, # win32 save test 'shared': True, 'profile': 'foo', } notebook.save_properties(**config1) self.assertEqual(notebook.config['Notebook'], config1) dialog = PropertiesDialog(self.ui) dialog.assert_response_ok() self.assertEqual(notebook.config['Notebook'], config1) self.assertEqual(notebook.name, config1['name']) self.assertEqual(notebook.get_home_page(), Path(config1['home'])) self.assertEqual(notebook.icon, notebook.dir.file(config1['icon']).path) self.assertEqual(notebook.document_root, Dir(config1['document_root'])) dialog = PropertiesDialog(self.ui) dialog.form.update(config2) dialog.assert_response_ok() self.assertEqual(notebook.config['Notebook'], config2) self.assertEqual(notebook.name, config2['name']) self.assertEqual(notebook.get_home_page(), Path(config2['home'])) self.assertEqual(notebook.icon, notebook.dir.file(config2['icon']).path) self.assertEqual(notebook.document_root, Dir(config2['document_root'])) def testPreferencesDialog(self): '''Test PreferencesDialog''' from zim.gui.preferencesdialog import PreferencesDialog, PluginConfigureDialog import zim.gui.pageview gui = zim.gui.GtkInterface() gui.register_preferences('GtkInterface', zim.gui.ui_preferences) gui.register_preferences('PageView', zim.gui.pageview.ui_preferences) with FilterFailedToLoadPlugin(): # may miss dependencies for e.g. versioncontrol gui.load_plugins() self.ui.preferences_register = gui.preferences_register self.ui.preferences = gui.preferences self.ui.plugins = gui.plugins ## Test get/set simple value self.assertEquals(self.ui.preferences['GtkInterface']['toggle_on_ctrlspace'], False) dialog = PreferencesDialog(self.ui) self.assertEquals(dialog.forms['Interface']['toggle_on_ctrlspace'], False) dialog.assert_response_ok() self.assertEquals(self.ui.preferences['GtkInterface']['toggle_on_ctrlspace'], False) dialog = PreferencesDialog(self.ui) dialog.forms['Interface']['toggle_on_ctrlspace'] = True dialog.assert_response_ok() self.assertEquals(self.ui.preferences['GtkInterface']['toggle_on_ctrlspace'], True) ## Test font button zim.gui.pageview.PageView.style['TextView']['font'] = 'Sans 12' dialog = PreferencesDialog(self.ui) self.assertEquals(dialog.forms['Interface']['use_custom_font'], True) dialog.assert_response_ok() self.assertEqual(zim.gui.pageview.PageView.style['TextView']['font'], 'Sans 12') self.assertFalse(any(['use_custom_font' in d for d in self.ui.preferences.values()])) zim.gui.pageview.PageView.style['TextView']['font'] = 'Sans 12' dialog = PreferencesDialog(self.ui) self.assertEquals(dialog.forms['Interface']['use_custom_font'], True) dialog.forms['Interface']['use_custom_font'] = False dialog.assert_response_ok() self.assertEqual(zim.gui.pageview.PageView.style['TextView']['font'], None) self.assertFalse(any(['use_custom_font' in d for d in self.ui.preferences.values()])) ## Plugin Config dialog from zim.plugins import get_plugin klass = get_plugin('calendar') pref_dialog = PreferencesDialog(self.ui) dialog = PluginConfigureDialog(pref_dialog, klass) dialog.assert_response_ok() def testTemplateEditorDialog(self): from zim.gui.templateeditordialog import TemplateEditorDialog dialog = TemplateEditorDialog(self.ui) # TODO what to test here ?? dialog.assert_response_ok() # Test for ExportDialog can be found in test/export.py # Test for NotebookDialog is in separate class below class FilterNoSuchImageWarning(tests.LoggingFilter): logger = 'zim.gui.pageview' message = 'No such image:' class FilterFailedToLoadPlugin(tests.LoggingFilter): logger = 'zim' message = 'Failed to load plugin' @tests.slowTest class TestGtkInterface(tests.TestCase): def setUp(self): with FilterFailedToLoadPlugin(): # may miss dependencies for e.g. versioncontrol self.ui = setupGtkInterface(self) def tearDown(self): self.ui.close() def testInitialization(self): '''Test Gtk interface initialization''' # start without notebook should not complain ui = zim.gui.GtkInterface() # now take ui with notebook ui = self.ui # test read only (starts readonly because notebook has no dir or file) self.assertTrue(ui.readonly) ui.set_readonly(False) self.assertFalse(ui.readonly) ui.set_readonly(True) self.assertTrue(ui.readonly) # TODO more tests for readonly pages etc. # test populating menus menu = gtk.Menu() ui.populate_popup('page_popup', menu) items = menu.get_children() self.assertGreater(len(items), 3) # open notebook (so the default plugins are loaded) nb = ui.notebook ui.notebook = None ui.open_notebook(nb) # remove plugins self.assertGreaterEqual(len(ui.plugins), 3) # default plugins without dependencies plugins = [p.plugin_key for p in ui.plugins] for name in plugins: ui.unload_plugin(name) self.assertEqual(len(ui.plugins), 0) # and add them again for name in plugins: ui.load_plugin(name) self.assertGreaterEqual(len(ui.plugins), 3) # default plugins without dependencies # check registering an URL handler func = tests.Counter(True) ui.register_url_handler('foo', func) ui.open_url('foo://bar') self.assertTrue(func.count == 1) ui.unregister_url_handler(func) def testMainWindow(self): '''Test main window''' path = Path('Test:foo:bar') window = self.ui.mainwindow self.assertTrue(window.uistate['show_menubar']) window.toggle_menubar() self.assertFalse(window.uistate['show_menubar']) window.toggle_menubar() self.assertTrue(window.uistate['show_menubar']) self.assertTrue(window.uistate['show_toolbar']) window.toggle_toolbar() self.assertFalse(window.uistate['show_toolbar']) window.toggle_toolbar() self.assertTrue(window.uistate['show_toolbar']) self.assertTrue(window.uistate['show_statusbar']) window.toggle_statusbar() self.assertFalse(window.uistate['show_statusbar']) window.toggle_statusbar() self.assertTrue(window.uistate['show_statusbar']) self.assertTrue(window.uistate['left_pane'][0]) window.toggle_panes() self.assertFalse(window.uistate['left_pane'][0]) window.toggle_panes() self.assertTrue(window.uistate['left_pane'][0]) # note: focus starts at sidepane due to toggle_panes above self.assertEqual(window.get_focus(), window.pageindex.treeview) self.assertEqual(window.get_selected_path(), path) window.toggle_sidepane_focus() self.assertEqual(window.get_focus(), window.pageview.view) self.assertEqual(window.get_selected_path(), path) window.toggle_sidepane_focus() self.assertEqual(window.get_focus(), window.pageindex.treeview) # TODO also check this with "show_sidepane" off self.assertEqual(window.uistate['pathbar_type'], zim.gui.PATHBAR_RECENT) for style in ( zim.gui.PATHBAR_NONE, zim.gui.PATHBAR_HISTORY, zim.gui.PATHBAR_PATH, zim.gui.PATHBAR_RECENT, ): window.set_pathbar(style) self.assertEqual(window.uistate['pathbar_type'], style) # TODO specific test for pathbar to exercize history, add / move / remove pages etc. # note: no default style here - system default unknown for style in ( zim.gui.TOOLBAR_ICONS_AND_TEXT, zim.gui.TOOLBAR_ICONS_ONLY, zim.gui.TOOLBAR_TEXT_ONLY, ): window.set_toolbar_style(style) self.assertEqual(window.uistate['toolbar_style'], style) # note: no default style here - system default unknown for size in ( zim.gui.TOOLBAR_ICONS_LARGE, zim.gui.TOOLBAR_ICONS_SMALL, zim.gui.TOOLBAR_ICONS_TINY, ): window.set_toolbar_size(size) self.assertEqual(window.uistate['toolbar_size'], size) # FIXME: test fails because "readonly" not active because notebook was already readonly, so action never activatable #~ self.assertTrue(ui.readonly) #~ self.assertTrue(window.uistate['readonly']) #~ window.toggle_readonly() #~ self.assertFalse(ui.readonly) #~ self.assertFalse(window.uistate['readonly']) #~ window.toggle_readonly() #~ self.assertTrue(ui.readonly) #~ self.assertTrue(window.uistate['readonly']) def testNavigation(self): '''Test navigating the notebook with gtk interface''' # build up some history history = ( Path('Test:foo:bar'), Path('Test:'), Path('Test:foo:'), Path('Test:foo:bar'), ) for path in history: self.ui.open_page(path) self.assertEqual(self.ui.page, path) # check forward & backward for path in reversed(history[:-1]): self.assertTrue(self.ui.open_page_back()) self.assertEqual(self.ui.page, path) self.assertFalse(self.ui.open_page_back()) for path in history[1:]: self.assertTrue(self.ui.open_page_forward()) self.assertEqual(self.ui.page, path) self.assertFalse(self.ui.open_page_forward()) # check upward and downward for path in (Path('Test:foo:'), Path('Test:')): self.assertTrue(self.ui.open_page_parent()) self.assertEqual(self.ui.page, path) self.assertFalse(self.ui.open_page_parent()) for path in (Path('Test:foo:'), Path('Test:foo:bar')): self.assertTrue(self.ui.open_page_child()) self.assertEqual(self.ui.page, path) self.assertFalse(self.ui.open_page_child()) # previous and next self.assertTrue(self.ui.open_page_previous()) self.assertTrue(self.ui.open_page_next()) self.assertEqual(self.ui.page, Path('Test:foo:bar')) def testSave(self): '''Test saving a page from the interface''' self.ui.set_readonly(False) self.ui.open_page(Path('Non-exsiting:page')) self.assertFalse(self.ui.page.exists()) self.assertTrue(self.ui.page.get_parsetree() is None) self.assertTrue(self.ui.mainwindow.pageview._showing_template) # check HACK self.ui.save_page() self.assertFalse(self.ui.page.get_parsetree() is None) def testPageMove(self): oldpath, newpath = Path('Movers:Stator:Mover'), Path('Movers:Mover') # Open page and process message queue to sync tree view indexpath = self.ui.notebook.index.lookup_path(oldpath) self.ui.open_page(indexpath) while gtk.events_pending(): gtk.main_iteration(False) # Test actual moving page = self.ui.notebook.get_page(oldpath) text = page.dump('wiki') self.ui.notebook.index.ensure_update() self.ui.notebook.move_page(oldpath, newpath) self.ui.notebook.index.ensure_update() # newpath should exist and look like the old one page = self.ui.notebook.get_page(newpath) self.assertEqual(page.dump('wiki'), text) # oldpath should be deleted page = self.ui.notebook.get_page(oldpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # TODO notebook manipulation (new (sub)page, rename, delete ..) # merge with tests for dialogs (?) def testClipboard(self): self.ui.copy_location() self.assertEqual(Clipboard.get_text(), 'Test:foo:bar') @tests.slowTest class TestClickLink(tests.TestCase): '''Test to check pageview and GtkInterface play together nicely when a link is clicked ''' def setUp(self): class MyMock(zim.gui.GtkInterface, tests.MockObjectBase): def __init__(self, *arg, **kwarg): zim.gui.GtkInterface.__init__(self, *arg, **kwarg) tests.MockObjectBase.__init__(self) for method in ( 'open_notebook', 'open_page', 'open_file', '_open_with_emailclient', '_open_with_webbrowser', '_open_with_filebrowser', '_open_with', ): self.mock_method(method, None) with FilterFailedToLoadPlugin(): # may miss dependencies for e.g. versioncontrol self.ui = setupGtkInterface(self, klass=MyMock) def tearDown(self): self.ui.close() def runTest(self): self.assertRaises(AssertionError, self.ui.open_url, 'foo@bar.com') # this is not a URI, "mailto:foo@bar.com" is # Note: same list of test uris is testing in tests.parsing as well for href, type in ( ('zim+file://foo/bar?dus.txt', 'notebook'), ('file:///foo/bar', 'file'), ('http://foo/bar', 'http'), ('http://192.168.168.100', 'http'), ('file+ssh://foo/bar', 'file+ssh'), ('mailto:foo@bar.com', 'mailto'), ('mailto:foo.com', 'page'), ('foo@bar.com', 'mailto'), ('mailto:foo//bar@bar.com', 'mailto'), # is this a valid mailto uri ? ('mid:foo@bar.org', 'mid'), ('cid:foo@bar.org', 'cid'), ('./foo/bar', 'file'), ('/foo/bar', 'file'), ('~/foo', 'file'), ('C:\\foo', 'file'), ('wp?foo', 'interwiki'), ('http://foo?bar', 'http'), ('\\\\host\\foo\\bar', 'smb'), ('foo', 'page'), ('foo:bar', 'page'), ): #~ print ">> LINK %s (%s)" % (href, type) #~ self.ui.open_url(href) self.ui.mainwindow.pageview.do_link_clicked({'href': href}) msg = "Clicked: \"%s\" resulted in: \"%s\"" % (href, self.ui.mock_calls[-1]) if type == 'notebook': self.assertTrue(self.ui.mock_calls[-1][0] == 'open_notebook', msg=msg) elif type == 'page': self.assertTrue(self.ui.mock_calls[-1][0] == 'open_page', msg=msg) elif type == 'file': self.assertTrue(self.ui.mock_calls[-1][0] == 'open_file', msg=msg) elif type == 'mailto': self.assertTrue(self.ui.mock_calls[-1][0] in ('_open_with_emailclient', '_open_with'), msg=msg) elif type == 'smb' and os.name == 'nt': self.assertTrue(self.ui.mock_calls[-1][0] == '_open_with_filebrowser', msg=msg) else: self.assertTrue(self.ui.mock_calls[-1][0] in ('_open_with_webbrowser', '_open_with'), msg=msg) self.ui.mock_calls = [] # reset # Some more tests that may not be covered above for href, type in ( ('zim+file://foo/bar?dus.txt', 'notebook'), ('file:///foo/bar', 'file'), ('mailto:foo@bar.com', 'mailto'), ): #~ print ">> OPEN_URL %s (%s)" % (href, type) self.ui.open_url(href) msg = "open_url('%s')\nResulted in: %s" % (href, self.ui.mock_calls[-1]) if type == 'notebook': self.assertTrue(self.ui.mock_calls[-1][0] == 'open_notebook', msg=msg) elif type == 'file': self.assertTrue(self.ui.mock_calls[-1][0] == '_open_with_webbrowser', msg=msg) elif type == 'mailto': self.assertTrue(self.ui.mock_calls[-1][0] in ('_open_with_emailclient', '_open_with'), msg=msg) self.ui.mock_calls = [] # reset # TODO test plugin with custom handler @tests.slowTest class TestNotebookDialog(tests.TestCase): def setUp(self): list = config_file('notebooks.list') file = list.file if file.exists(): file.remove() def runTest(self): from zim.gui.notebookdialog import prompt_notebook, \ AddNotebookDialog, NotebookDialog tmpdir = self.create_tmp_dir() dir1 = Dir(tmpdir + '/mynotebook1') dir2 = Dir(tmpdir + '/mynotebook2') # First time we get directly the AddNotebookDialog def doAddNotebook(dialog): self.assertTrue(isinstance(dialog, AddNotebookDialog)) dialog.form['name'] = 'Foo' dialog.form['folder'] = dir1.path dialog.assert_response_ok() with tests.DialogContext(doAddNotebook): self.assertEqual(prompt_notebook(), dir1.uri) # Second time we get the list def testNotebookDialog(dialog): self.assertTrue(isinstance(dialog, NotebookDialog)) selection = dialog.treeview.get_selection() selection.select_path((0,)) # select first and only notebook dialog.assert_response_ok() with tests.DialogContext(testNotebookDialog): self.assertEqual(prompt_notebook(), dir1.uri) # Third time we add a notebook and set the default def doAddNotebook(dialog): self.assertTrue(isinstance(dialog, AddNotebookDialog)) dialog.form['name'] = 'Bar' dialog.form['folder'] = dir2.path dialog.assert_response_ok() def testAddNotebook(dialog): self.assertTrue(isinstance(dialog, NotebookDialog)) with tests.DialogContext(doAddNotebook): dialog.do_add_notebook() dialog.combobox.set_active(0) selection = dialog.treeview.get_selection() selection.select_path((1,)) # select newly added notebook dialog.assert_response_ok() with tests.DialogContext(testAddNotebook): self.assertEqual(prompt_notebook(), dir2.uri) # Check the notebook exists and the notebook list looks like it should for dir in (dir1, dir2): self.assertTrue(dir.exists()) self.assertTrue(dir.file('notebook.zim').exists()) list = get_notebook_list() self.assertTrue(len(list) == 2) self.assertEqual(list[0], NotebookInfo(dir1.uri, name='Foo')) self.assertEqual(list[1], NotebookInfo(dir2.uri, name='Bar')) self.assertEqual(list.default, NotebookInfo(dir1.uri, name='Foo')) # Now unset the default and again check the notebook list def unsetDefault(dialog): self.assertTrue(isinstance(dialog, NotebookDialog)) dialog.combobox.set_active(-1) selection = dialog.treeview.get_selection() selection.select_path((1,)) # select newly added notebook dialog.assert_response_ok() with tests.DialogContext(unsetDefault): self.assertEqual(prompt_notebook(), dir2.uri) list = get_notebook_list() self.assertTrue(len(list) == 2) self.assertTrue(list.default is None) class MockUI(tests.MockObject): def __init__(self, page=None, fakedir=None): tests.MockObject.__init__(self) self.tmp_dir = self.create_tmp_dir() if page and not isinstance(page, Path): self.page = Path(page) else: self.page = page self.mainwindow = None self.notebook = tests.new_notebook(fakedir=fakedir) zim-0.60/tests/async.py0000644000175000017500000000252612001575156014746 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2010 Jaap Karssenberg '''Test cases for the zim.async module.''' from __future__ import with_statement import tests import time from zim.async import * from zim.signals import DelayedCallback from zim.fs import File class TestAsync(tests.TestCase): def testAPI(self): '''Test API for async operations''' def somefunction(text): return "foo " + text lock = AsyncLock() with lock: operation = AsyncOperation(somefunction, ('bar',)) operation.start() value = operation.wait() self.assertEqual(value, 'foo bar') @tests.slowTest def testFS(self): '''Test async FS operations''' self.path = self.create_tmp_dir('testFS')+'/file.txt' file = File(self.path) op1 = file.write_async('foo bar 1\n') op2 = file.write_async('foo bar 2\n') op1.wait() op2.wait() self.assertEqual(file.read(), 'foo bar 2\n') class Counter(object): def __init__(self): self.i = 0 def count(self): self.i += 1 @tests.slowTest class TestDelayedCallback(tests.TestCase): def runTest(self): counter = Counter() callback = DelayedCallback(500, lambda o: counter.count()) for i in range(3): callback('foo') for i in range(10): time.sleep(1) tests.gtk_process_events() if callback.timer_id is None: break self.assertEqual(counter.i, 1) zim-0.60/tests/printtobrowser.py0000644000175000017500000000146012132472704016730 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import tests import zim.plugins from zim.notebook import Path from zim.config import ConfigDict @tests.slowTest class TestPrintToBrowser(tests.TestCase): def runTest(self): 'Test PrintToBrowser plugin' ui = StubUI() pluginklass = zim.plugins.get_plugin('printtobrowser') plugin = pluginklass(ui) file = plugin.print_to_file(ui.page) self.assertTrue(file.exists()) content = file.read() self.assertTrue('

    Foo

    ' in content) class StubUI(object): ui_type = 'stub' def __init__(self): self.notebook = tests.new_notebook() self.page = self.notebook.get_page(Path('Test:foo')) self.preferences = ConfigDict() self.uistate = ConfigDict() def connect(*a): pass def connect_after(*a): pass zim-0.60/tests/main.py0000664000175000017500000002160412012764113014550 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg '''Test cases for the base zim module.''' from __future__ import with_statement import tests from zim import NotebookInterface from zim.config import XDG_CONFIG_HOME, ConfigFile, ConfigDictFile, config_file, get_config class FilterFailedToLoadPlugin(tests.LoggingFilter): logger = 'zim' message = 'Failed to load plugin' class TestProfiles(tests.TestCase): def setUp(self): path = self.get_tmp_name() self.nb = tests.new_notebook(fakedir=path) self.assertIsNone(self.nb.profile) with FilterFailedToLoadPlugin(): self.ui = NotebookInterface(self.nb) configfile = self.ui.preferences.file configfile.file.remove() # just in case def tearDown(self): configfile = self.ui.preferences.file configfile.file.remove() def profile_file(self, name): return XDG_CONFIG_HOME.file('zim/profiles/%s.conf' % name.lower()) def save_profile(self, name, preferences): file = self.profile_file(name) file.remove() self.assertFalse(file.exists()) with FilterFailedToLoadPlugin(): ui = NotebookInterface() # use defaults set in this object ui.preferences.change_file(file) for section in preferences: ui.preferences[section].update(preferences[section]) ui.preferences.write() self.assertTrue(file.exists()) def testProfilePreferences(self): '''Test the profile is used and its preferences applied''' # set up a test profile self.save_profile('TestProfile', { 'General': { 'plugins': ['calendar'] }, 'CalendarPlugin': { 'embedded': True, 'granularity': 'Week', 'namespace': 'TestProfile', } }) # set the profile name in the notebook, open it, and # check that the profile was applied self.nb.config['Notebook']['profile'] = 'TestProfile' # include some caps self.assertEqual(self.nb.profile, 'TestProfile') with FilterFailedToLoadPlugin(): ui = NotebookInterface(self.nb) self.assertEqual(ui.preferences.file.basename, 'testprofile.conf') self.assertEqual(len(ui.plugins), 1) self.assertEqual( ui.preferences['General']['plugins'][0], 'calendar') self.assertTrue(ui.preferences['CalendarPlugin']['embedded']) self.assertEqual( ui.preferences['CalendarPlugin']['granularity'], 'Week') self.assertEqual( ui.preferences['CalendarPlugin']['namespace'], 'TestProfile') def testNewProfile(self): '''Test that current preferences are used if the profile doesn't exist ''' # Make sure the profile does not exist file = self.profile_file('NewProfile') file.remove() self.assertFalse(file.exists()) # Save default self.ui.preferences.write() default = self.ui.preferences.file self.assertTrue(default.file.exists()) # change the profile name, and reload the profile # check that default got copied to new profile self.nb.save_properties(profile='NewProfile') self.assertEqual(self.nb.profile, 'NewProfile') self.assertIsInstance(self.ui.preferences.file, ConfigFile) self.assertEqual(self.ui.preferences.file.file, file) self.assertNotEqual(self.ui.preferences.file.file, default) self.ui.preferences.write() # ensure the preferences are saved self.assertEqual(file.read(), default.read()) def testReloadingPlugins(self): '''Test correct plugins are kept when changing profile''' # Ensure some plugins are loaded, including a independent one n_default_plugins = len(self.ui.plugins) self.ui.load_plugin('automount') self.ui.preferences.write() # create a profile just with some of the same plugins, but also # a new one -- so we can test merging names = self.ui.preferences['General']['plugins'] self.assertEqual(len(names), n_default_plugins + 1) self.assertNotIn('tableofcontents', names) profile_plugins = [names[0], names[2], 'tableofcontents'] self.assertNotIn('automount', profile_plugins) self.save_profile('ReloadingPlugins', { 'General': { 'plugins': profile_plugins, }, 'AutomountPlugin': { 'test': 'from_profile', }, 'CalendarPlugin': { 'test': 'from_profile', }, }) # Touch settings for independent plugin automount = self.ui.get_plugin('automount') calendar = self.ui.get_plugin('calendar') automount.preferences['test'] = 'default' calendar.preferences['test'] = 'default' # load the new profile and check that all plugins but the one # we kept were unloaded pre = set(p.plugin_key for p in self.ui.plugins) self.assertEqual(pre, set(names)) self.nb.save_properties(profile='ReloadingPlugins') names = self.ui.preferences['General']['plugins'] post = set(p.plugin_key for p in self.ui.plugins) self.assertNotEqual(post, pre) self.assertEqual(post, set(names)) self.assertEqual(post, set(profile_plugins + ['automount'])) # Check independent plugin settings were copied as well # but other settings were not copied automount = self.ui.get_plugin('automount') calendar = self.ui.get_plugin('calendar') self.assertEqual(automount.preferences['test'], 'default') self.assertEqual(calendar.preferences['test'], 'from_profile') # Now switch back self.nb.save_properties(profile='') self.assertIsNone(self.nb.profile) names = self.ui.preferences['General']['plugins'] reset = set(p.plugin_key for p in self.ui.plugins) self.assertEqual(reset, set(names)) self.assertEqual(reset, pre) def testSyncingIndependentPluginConfig(self): # Make sure independent plugin not in default config names = self.ui.preferences['General']['plugins'] self.assertNotIn('automount', names) self.assertFalse(self.ui.preferences['AutomountPlugin']) # Save default calendar = self.ui.get_plugin('calendar') calendar.preferences['test'] = 'old' self.ui.preferences.write() self.assertTrue(self.ui.preferences.file.file.exists()) # Switch profile self.nb.save_properties(profile='TestSyncing') # Add independent plugin, touch config and save self.ui.load_plugin('automount') automount = self.ui.get_plugin('automount') calendar = self.ui.get_plugin('calendar') automount.preferences['test'] = 'new' calendar.preferences['test'] = 'new' self.ui.save_preferences() # Ensure default config also has new config - but not all # is overwritten default = get_config('preferences.conf') self.assertIn('automount', default['General']['plugins']) self.assertEqual(default['AutomountPlugin']['test'], 'new') self.assertEqual(default['CalendarPlugin']['test'], 'old') class FailingPluginFilter(tests.LoggingFilter): logger = 'zim' message = 'Failed to load plugin' class TestLoadingPlugins(tests.TestCase): def setUp(self): path = self.get_tmp_name() self.nb = tests.new_notebook(fakedir=path) with FilterFailedToLoadPlugin(): self.ui = NotebookInterface(self.nb) self.plugin_conf = self.ui.preferences['General']['plugins'] def tearDown(self): configfile = self.ui.preferences.file configfile.file.remove() def testLoadPlugin(self): self.assertNotIn('automount', self.plugin_conf) plugins = self.plugin_conf[:] obj = self.ui.load_plugin('automount') self.assertEqual(obj.plugin_key, 'automount') self.assertIn(obj, self.ui.plugins) self.assertTrue(self.plugin_conf, plugins + ['automount']) self.assertEqual(obj, self.ui.get_plugin('automount')) def testLoadFailingPlugin(self): names = self.plugin_conf[:] objs = self.ui.plugins[:] with FailingPluginFilter(): self.assertIsNone( self.ui.load_plugin('nonexistingplugin') ) self.assertEqual(self.plugin_conf, names) self.assertEqual(self.ui.plugins, objs) self.assertIsNone(self.ui.get_plugin('nonexistingplugin')) def testInitPlugin(self): self.plugin_conf.append('automount') names = self.plugin_conf[:] self.ui.preferences.write() with FilterFailedToLoadPlugin(): myui = NotebookInterface() # no notebook yet - only independent plugins are loaded self.assertEqual(len(myui.plugins), 1) self.assertEqual(myui.plugins[0].plugin_key, 'automount') myui.open_notebook(self.nb) # now the rest is loaded as well self.assertEqual(len(myui.plugins), len(names)) def testInitFailingPlugin(self): names = self.plugin_conf[:] objs = self.ui.plugins[:] self.plugin_conf.append('nonexistingplugin') self.ui.preferences.set_modified(False) self.assertFalse(self.ui.preferences.modified) with FailingPluginFilter(): self.ui.load_plugins() self.assertEqual(self.plugin_conf, names) self.assertEqual(self.ui.plugins, objs) self.assertTrue(self.ui.preferences.modified) def testUnloadPlugin(self): plugin = self.ui.plugins[0] self.assertIn(plugin, self.ui.plugins) self.assertIn(plugin.plugin_key, self.plugin_conf) self.ui.unload_plugin(plugin) self.assertNotIn(plugin, self.ui.plugins) self.assertNotIn(plugin.plugin_key, self.plugin_conf) def testUnloadPluginByName(self): plugin = self.ui.plugins[0] self.assertIn(plugin, self.ui.plugins) self.assertIn(plugin.plugin_key, self.plugin_conf) self.ui.unload_plugin(plugin.plugin_key) self.assertNotIn(plugin, self.ui.plugins) self.assertNotIn(plugin.plugin_key, self.plugin_conf) zim-0.60/tests/stores.py0000644000175000017500000003162611670224205015150 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Test cases for basic stores modules.''' from __future__ import with_statement import tests import os import time from zim.fs import File, Dir, FileWriteError from zim.errors import TrashNotSupportedError from zim.notebook import Notebook, Path, LookupError, PageExistsError import zim.stores from zim.formats import ParseTree def walk(store, namespace=None): if namespace == None: namespace = Path(':') for page in store.get_pagelist(namespace): yield namespace, page if page.haschildren: for parent, child in walk(store, page): # recurs yield parent, child def ascii_page_tree(store, namespace=None, level=0): '''Returns an ascii page tree. Used for debugging the test''' if namespace is None: namespace = store.namespace if namespace.isroot: basename = '' else: basename = namespace.basename text = ' '*level + basename + '\n' level += 1 for page in store.get_pagelist(namespace): if page.haschildren: text += ascii_page_tree(store, page, level) # recurs else: text += ' '*level + page.basename + '\n' return text class FilterOverWriteWarning(tests.LoggingFilter): logger = 'zim.fs' message = 'mtime check failed' class TestUtils(tests.TestCase): def testFilenameEncodeing(self): '''Test mapping page names to filenames''' import zim.fs realencoding = zim.fs.ENCODING try: zim.fs.ENCODING = 'utf-8' pagename = u'utf8:\u03b1\u03b2\u03b3' filename = zim.stores.encode_filename(pagename) self.assertEqual(filename, u'utf8/\u03b1\u03b2\u03b3') roundtrip = zim.stores.decode_filename(filename) self.assertEqual(roundtrip, pagename) zim.fs.ENCODING = 'ascii' pagename = u'utf8:\u03b1\u03b2\u03b3' filename = zim.stores.encode_filename(pagename) self.assertEqual(filename, u'utf8/%CE%B1%CE%B2%CE%B3') roundtrip = zim.stores.decode_filename(filename) self.assertEqual(roundtrip, pagename) zim.fs.ENCODING = 'gb2312' pagename = u'utf8:\u2022:\u4e2d\u6587:foo' # u2022 can not be encoded in gb2312 filename = zim.stores.encode_filename(pagename) self.assertEqual(filename, u'utf8/%E2%80%A2/\u4e2d\u6587/foo') roundtrip = zim.stores.decode_filename(filename) self.assertEqual(roundtrip, pagename) except Exception: zim.fs.ENCODING = realencoding raise else: zim.fs.ENCODING = realencoding # try roundtrip with actual current encoding pagename = u'utf8:\u03b1\u03b2\u03b3:\u2022:\u4e2d\u6587:foo' filename = zim.stores.encode_filename(pagename) roundtrip = zim.stores.decode_filename(filename) self.assertEqual(roundtrip, pagename) class TestReadOnlyStore(object): # This class does not inherit from TestCase itself as it is used # as a mixin for TestCase classes below but isn't a test case # in itself def normalize_index(self): '''Make sure the index conains namespaces for all page names''' pages = self.index.copy() for name in pages: parts = name.split(':') parts.pop() while parts: self.index.add(':'.join(parts)) parts.pop() def testIndex(self): '''Test we get a proper index for the memory store''' names = set() for parent, page in walk(self.store): self.assertTrue(len(page.name) > 0) self.assertTrue(len(page.basename) > 0) self.assertTrue(page.namespace == parent.name) names.add( page.name ) #~ import pprint #~ pprint.pprint(self.index) #~ pprint.pprint(names) self.assertTrue(u'utf8:\u03b1\u03b2\u03b3' in names) # Check usage of unicode self.assertEqual(names, self.index) class TestStoresMemory(TestReadOnlyStore, tests.TestCase): '''Test the store.memory module''' def setUp(self): klass = zim.stores.get_store('memory') self.store = klass(path=Path(':'), notebook=Notebook()) self.index = set() for name, text in tests.WikiTestData: self.store.set_node(Path(name), text) self.index.add(name) self.normalize_index() def testManipulate(self): '''Test moving and deleting pages in the memory store''' # Check we can get / store a page page = self.store.get_page(Path('Test:foo')) self.assertTrue(page.get_parsetree()) self.assertTrue('Foo' in ''.join(page.dump('plain'))) self.assertFalse(page.modified) wikitext = tests.WikiTestData.get('roundtrip') page.parse('wiki', wikitext) self.assertTrue(page.modified) self.store.store_page(page) self.assertFalse(page.modified) self.assertEqual(''.join(page.dump('wiki')), wikitext) page = self.store.get_page(Path('Test:foo')) self.assertEqual(''.join(page.dump('wiki')), wikitext) page = self.store.get_page(Path('Test:foo')) text = page.dump('plain') newtext = ['Some new content\n'] assert newtext != text self.assertEqual(page.dump('plain'), text) page.parse('plain', newtext) self.assertEqual(page.dump('plain'), newtext) self.assertTrue(page.modified) re = self.store.revert_page(page) self.assertFalse(re) # no return value self.assertEqual(page.dump('plain'), text) # object reverted self.assertFalse(page.modified) # no longer modified page = self.store.get_page(page) # new object self.assertEqual(page.dump('plain'), text) page.parse('plain', newtext) self.assertEqual(page.dump('plain'), newtext) self.store.store_page(page) page = self.store.get_page(page) # new object self.assertEqual(page.dump('plain'), newtext) # check revert page triggers ui object page._ui_object = tests.MockObject() self.store.revert_page(page) self.assertEqual(page._ui_object.mock_calls[-1][0], 'set_parsetree') if hasattr(page, 'source') and isinstance(page.source, File): # check revert also works when the actual file changed # (and not trigger mtime check failure) from tests.fs import modify_file_mtime, FilterOverWriteWarning page = self.store.get_page(Path('Test:foo')) text = page.dump('plain') newtext = ['Foo bar baz\n'] othertext = ['Dus ja\n'] assert newtext != text assert othertext != text page.parse('plain', newtext) modify_file_mtime(page.source.path, lambda p: open(p, 'w').writelines(othertext)) with FilterOverWriteWarning(): self.assertRaises(FileWriteError, self.store.store_page, page) self.store.revert_page(page) self.assertEqual(page.dump('plain'), othertext) page.parse('plain', newtext) self.store.store_page(page) page = self.store.get_page(page) # new object self.assertEqual(page.dump('plain'), newtext) # check test setup OK for path in (Path('Test:BAR'), Path('NewPage')): page = self.store.get_page(path) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # check errors self.assertRaises(LookupError, self.store.move_page, Path('NewPage'), Path('Test:BAR')) self.assertRaises(PageExistsError, self.store.move_page, Path('Test:foo'), Path('TaskList')) for oldpath, newpath in ( (Path('Test:foo'), Path('Test:BAR')), (Path('TaskList'), Path('NewPage:Foo:Bar:Baz')), ): page = self.store.get_page(oldpath) text = page.dump('wiki') self.assertTrue(page.haschildren) #~ print ascii_page_tree(self.store) self.store.move_page(oldpath, newpath) #~ print ascii_page_tree(self.store) # newpath should exist and look like the old one page = self.store.get_page(newpath) self.assertTrue(page.haschildren) self.assertEqual(page.dump('wiki'), text) # oldpath should be deleted page = self.store.get_page(oldpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # let's delete the newpath again page = self.store.get_page(newpath) self.assertTrue(self.store.delete_page(page)) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) page = self.store.get_page(newpath) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # delete again should silently fail self.assertFalse(self.store.delete_page(newpath)) # check cleaning up works OK page = self.store.get_page(Path('NewPage')) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) # check case-sensitive move self.store.move_page(Path('utf8'), Path('UTF8')) page = self.store.get_page(Path('utf8')) # self.assertFalse(page.haschildren) - fails on case-insensitive FS self.assertFalse(Path('utf8') in list(self.store.get_pagelist(Path(':')))) self.assertTrue(Path('UTF8') in list(self.store.get_pagelist(Path(':')))) newpage = self.store.get_page(Path('UTF8')) self.assertTrue(newpage.haschildren) self.assertFalse(newpage == page) # TODO here we only move dir case insensitive - also test file # check hascontents page = self.store.get_page(Path('NewPage')) tree = ParseTree().fromstring('') self.assertFalse(tree.hascontent) page.set_parsetree(tree) self.assertFalse(page.hascontent) self.store.store_page(page) page = self.store.get_page(Path('NewPage')) self.assertFalse(page.hascontent) # check trashing trashing = True try: page = self.store.get_page(Path('TrashMe')) self.assertTrue(page.haschildren) self.assertTrue(page.hascontent) self.store.trash_page(page) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) page = self.store.get_page(Path('TrashMe')) self.assertFalse(page.haschildren) self.assertFalse(page.hascontent) except TrashNotSupportedError: trashing = False print '(trashing not supported for this store)' self.assertTrue(page.haschildren) self.assertTrue(page.hascontent) page = self.store.get_page(Path('TrashMe')) self.assertTrue(page.haschildren) self.assertTrue(page.hascontent) page = self.store.get_page(Path('NonExistingPage')) if trashing: # fail silently for non-existing page self.assertFalse(self.store.trash_page(page)) else: # check error consistent self.assertRaises(TrashNotSupportedError, self.store.trash_page, page) class TextXMLStore(TestReadOnlyStore, tests.TestCase): xml = u'''\
    Fooo! Foooo Barrr Fooo barrr bazzz Utf8 content here
    ''' def setUp(self): buffer = StubFile(self.xml) klass = zim.stores.get_store('xml') self.store = klass(path=Path(':'), notebook=Notebook(), file=buffer) self.index = set(['Foo', 'Foo:Bar', 'Baz', u'utf8:\u03b1\u03b2\u03b3']) self.normalize_index() def testIndex(self): '''Test we get a proper index for the XML store''' TestReadOnlyStore.testIndex(self) def testContent(self): page = self.store.get_page(Path('Foo:Bar')) self.assertEqual(page.dump(format='wiki'), ['Foooo Barrr\n']) ref = self.xml.replace("'", '"') self.assertEqual(''.join(self.store.dump()), ref) @tests.slowTest class TestFiles(TestStoresMemory): '''Test the store.files module''' def setUp(self): TestStoresMemory.setUp(self) tmpdir = self.create_tmp_dir(u'_some_utf8_here_\u0421\u0430\u0439') self.dir = Dir([tmpdir, 'store-files']) self.mem = self.store klass = zim.stores.get_store('files') self.store = klass(path=Path(':'), notebook=Notebook(), dir=self.dir) for parent, page in walk(self.mem): if page.hascontent: mypage = self.store.get_page(page) mypage.set_parsetree(page.get_parsetree()) self.store.store_page(mypage) def modify(self, path, func): mtime = os.stat(path).st_mtime m = mtime i = 0 while m == mtime: time.sleep(1) func(path) m = os.stat(path).st_mtime i += 1 assert i < 5 #~ print '>>>', m, mtime def testIndex(self): '''Test we get a proper index for files store''' TestStoresMemory.testIndex(self) def testManipulate(self): '''Test moving and deleting pages in the files store''' TestStoresMemory.testManipulate(self) # test overwrite check page = self.store.get_page(Path('Test:overwrite')) page.parse('plain', 'BARRR') self.store.store_page(page) self.assertTrue('BARRR' in ''.join(page.dump('plain'))) self.modify(page.source.path, lambda p: open(p, 'w').write('bar')) with FilterOverWriteWarning(): self.assertRaises(FileWriteError, self.store.store_page, page) # test headers page = self.store.get_page(Path('Test:New')) page.parse('plain', 'Foo Bar') self.store.store_page(page) self.assertEqual(page.properties['Content-Type'], 'text/x-zim-wiki') self.assertEqual(page.properties['Wiki-Format'], 'zim 0.4') self.assertTrue('Creation-Date' in page.properties) firstline = page.source.readlines()[0] self.assertEqual(firstline, 'Content-Type: text/x-zim-wiki\n') # test moving page into itself oldpath = Path('Test:New') newpath = Path('Test:New:NewSub') self.store.move_page(oldpath, newpath) page = self.store.get_page(newpath) self.assertEqual(page.dump('plain'), ['Foo Bar\n']) class StubFile(File): def __init__(self, text): self.text = text def read(self): return self.text def readlines(self): return self.text.splitlines(True) def write(self, *a): assert False def writelines(self, *a): assert False def open(self, *a): assert False def exists(self): return len(self.text) > 0 zim-0.60/tests/tags.py0000644000175000017500000002704411705402431014564 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2011 Jaap Karssenberg import tests import gtk import pango from zim.index import Index, IndexPath, IndexTag from zim.notebook import Path from zim.gui.pageindex import FGCOLOR_COL, \ EMPTY_COL, NAME_COL, PATH_COL, STYLE_COL # Explicitly don't import * from pageindex, make clear what we re-use from zim.config import ListDict from zim.plugins.tags import * @tests.slowTest class TestTaggedPageTreeStore(tests.TestCase): def setUp(self): self.storeclass = TaggedPageTreeStore self.viewclass = TagsPageTreeView self.notebook = tests.new_notebook() self.index = self.notebook.index def runTest(self): '''Test TaggedPageTreeStore index interface''' # This is one big test instead of seperate sub tests because in the # subclass we generate a file based notebook in setUp, and we do not # want to do that many times. # Hooking up the treeview as well just to see if we get any errors # From the order the signals are generated. ui = MockUI() ui.notebook = self.notebook ui.page = Path('Test:foo') self.assertTrue(self.notebook.get_page(ui.page).exists()) treestore = self.storeclass(self.index) self.assertEqual(treestore.get_flags(), 0) self.assertEqual(treestore.get_n_columns(), 7) treeview = self.viewclass(ui, treestore) model = treeview.get_model() if isinstance(model, gtk.TreeModelFilter): model = model.get_model() # look inside filtered model self.assertEqual(model, treestore) self.assertEqual(treestore.get_flags(), 0) self.assertEqual(treestore.get_n_columns(), 7) self.index.update(callback=tests.gtk_process_events) tests.gtk_process_events() #~ treeview = PageTreeView(None) # just run hidden to check errors #~ treeview.set_model(treestore) n = treestore.on_iter_n_children(None) self.assertTrue(n > 0) n = treestore.iter_n_children(None) self.assertTrue(n > 0) for i in range(treestore.get_n_columns()): self.assertTrue(not treestore.get_column_type(i) is None) # Quick check for basic methods iter = treestore.on_get_iter((0,)) self.assertTrue(isinstance(iter, (PageTreeIter, PageTreeTagIter))) if self.storeclass is TaggedPageTreeStore: self.assertTrue(isinstance(iter, PageTreeIter)) self.assertTrue(isinstance(iter.indexpath, IndexPath)) self.assertFalse(iter.indexpath.isroot) else: self.assertTrue(isinstance(iter, PageTreeTagIter)) self.assertTrue(isinstance(iter.indextag, IndexTag)) basename = treestore.on_get_value(iter, 0) self.assertTrue(len(basename) > 0) self.assertEqual(iter.treepath, (0,)) self.assertEqual(treestore.on_get_path(iter), (0,)) if self.storeclass is TaggedPageTreeStore: self.assertEqual(treestore.get_treepath(iter.indexpath), (0,)) self.assertEqual(treestore.get_treepath(Path(iter.indexpath.name)), (0,)) else: self.assertEqual(treestore.get_treepath(iter.indextag), (0,)) iter2 = treestore.on_iter_children(None) if self.storeclass is TaggedPageTreeStore: self.assertEqual(iter2.indexpath, iter.indexpath) else: self.assertEqual(iter2.indextag, iter.indextag) self.assertTrue(treestore.on_get_iter((20,20,20,20,20)) is None) self.assertTrue(treestore.get_treepath(Path('nonexisting')) is None) self.assertRaises(ValueError, treestore.get_treepath, Path(':')) # Now walk through the whole tree testing the API nitems = 0 path = (0,) prevpath = None while path: #~ print 'PATH', path assert path != prevpath, 'Prevent infinite loop' nitems += 1 prevpath = path iter = treestore.get_iter(path) self.assertEqual(treestore.get_path(iter), tuple(path)) if isinstance(treestore.on_get_iter(path), PageTreeIter): self._check_indexpath_iter(treestore, iter, path) else: self._check_indextag_iter(treestore, iter, path) # Determine how to continue if treestore.iter_has_child(iter): path = path + (0,) else: path = path[:-1] + (path[-1]+1,) # increase last member while path: try: treestore.get_iter(path) except ValueError: path = path[:-1] if len(path): path = path[:-1] + (path[-1]+1,) # increase last member else: break self.assertTrue(nitems > 10) # double check sanity of loop # Check if all the signals go OK treestore.disconnect_index() del treestore self.index.flush() treestore = self.storeclass(self.index) treeview = TagsPageTreeView(ui, treestore) self.index.update(callback=tests.gtk_process_events) # Try some TreeView methods path = Path('Test:foo') self.assertTrue(treeview.select_page(path)) self.assertEqual(treeview.get_selected_path(), path) treepath = treeview.get_model().get_treepath(path) self.assertTrue(not treepath is None) col = treeview.get_column(0) treeview.row_activated(treepath, col) #~ treeview.emit('popup-menu') treeview.emit('insert-link', path) treeview.emit('copy') # Check if all the signals go OK in delete for page in reversed(list(self.notebook.walk())): # delete bottom up self.notebook.delete_page(page) tests.gtk_process_events() def _check_indexpath_iter(self, treestore, iter, path): # checks specific for nodes that map to IndexPath object indexpath = treestore.get_indexpath(iter) self.assertTrue(path in treestore.get_treepaths(indexpath)) page = self.notebook.get_page(indexpath) self.assertEqual(treestore.get_value(iter, NAME_COL), page.basename) self.assertEqual(treestore.get_value(iter, PATH_COL), page) if page.hascontent or page.haschildren: self.assertEqual(treestore.get_value(iter, EMPTY_COL), False) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_NORMAL) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.NORMAL_COLOR) else: self.assertEqual(treestore.get_value(iter, EMPTY_COL), True) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_ITALIC) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.EMPTY_COLOR) self._check_iter_children(treestore, iter, path, indexpath.haschildren) def _check_indextag_iter(self, treestore, iter, path): # checks specific for nodes that map to IndexTag object self.assertTrue(treestore.get_indexpath(iter) is None) indextag = treestore.get_indextag(iter) self.assertTrue(path in treestore.get_treepaths(indextag)) self.assertEqual(treestore.get_value(iter, NAME_COL), indextag.name) self.assertEqual(treestore.get_value(iter, PATH_COL), indextag) if indextag == treestore.untagged: self.assertEqual(treestore.get_value(iter, EMPTY_COL), True) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_ITALIC) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.EMPTY_COLOR) else: self.assertEqual(treestore.get_value(iter, EMPTY_COL), False) self.assertEqual(treestore.get_value(iter, STYLE_COL), pango.STYLE_NORMAL) self.assertEqual(treestore.get_value(iter, FGCOLOR_COL), treestore.NORMAL_COLOR) if indextag == treestore.untagged: haschildren = self.index.n_list_untagged_root_pages() > 0 else: haschildren = self.index.n_list_tagged_pages(indextag) > 0 self._check_iter_children(treestore, iter, path, haschildren) def _check_iter_children(self, treestore, iter, path, haschildren): # Check API for children is consistent if haschildren: self.assertTrue(treestore.iter_has_child(iter)) child = treestore.iter_children(iter) self.assertTrue(not child is None) child = treestore.iter_nth_child(iter, 0) self.assertTrue(not child is None) parent = treestore.iter_parent(child) self.assertEqual(treestore.get_path(parent), path) childpath = treestore.get_path(child) self.assertEqual( childpath, tuple(path) + (0,)) n = treestore.iter_n_children(iter) for i in range(1, n): child = treestore.iter_next(child) childpath = treestore.get_path(child) self.assertEqual( childpath, tuple(path) + (i,)) child = treestore.iter_next(child) self.assertTrue(child is None) else: self.assertTrue(not treestore.iter_has_child(iter)) child = treestore.iter_children(iter) self.assertTrue(child is None) child = treestore.iter_nth_child(iter, 0) self.assertTrue(child is None) @tests.slowTest class TestTagsPageTreeStore(TestTaggedPageTreeStore): def setUp(self): TestTaggedPageTreeStore.setUp(self) self.storeclass = TagsPageTreeStore self.viewclass = TagsPageTreeView def runTest(self): '''Test TagsPageTreeStore index interface''' TestTaggedPageTreeStore.runTest(self) @tests.slowTest class TestTagPluginWidget(tests.TestCase): def runTest(self): ui = MockUI() ui.notebook = tests.new_notebook() plugin = tests.MockObject() plugin.ui = ui plugin.uistate = ListDict() widget = TagsPluginWidget(plugin) # Excersize all model switches and check we still have a sane state widget.toggle_treeview() widget.toggle_treeview() path = Path('Test:foo') treepath = widget.treeview.get_model().get_treepath(path) self.assertTrue(not treepath is None) widget.disconnect_model() widget.reload_model() path = Path('Test:foo') treepath = widget.treeview.get_model().get_treepath(path) self.assertTrue(not treepath is None) # Check signals #~ widget.treeview.emit('popup-menu') widget.treeview.emit('insert-link', path) # Check tag filtering cloud = widget.tagcloud self.assertEqual(cloud.get_tag_filter(), None) tag = None for button in cloud.get_children(): if button.indextag.name == 'tags': tag = button.indextag button.clicked() break else: raise AssertionError, 'No button for @tags ?' selected, filtered = cloud.get_tag_filter() self.assertEqual(selected, [tag]) self.assertTrue(len(filtered) > 3) self.assertTrue(tag in filtered) self.assertTrue(not widget.treeview._tag_filter is None) # check filtering in treestore tagfilter = (selected, filtered) selected = frozenset(selected) filtered = frozenset(filtered) def toplevel(model): iter = model.get_iter_first() assert not iter is None while not iter is None: yield iter iter = model.iter_next(iter) def childiter(model, iter): iter = model.iter_children(iter) assert not iter is None while not iter is None: yield iter iter = model.iter_next(iter) self.assertEqual(plugin.uistate['treeview'], 'tagged') filteredmodel = widget.treeview.get_model() for iter in toplevel(filteredmodel): path = filteredmodel.get_indexpath(iter) self.assertTrue(not path is None) tags = list(ui.notebook.index.list_tags(path)) tags = frozenset(tags) self.assertTrue(selected.issubset(tags)) # Needs to contains selected tags self.assertTrue(tags.issubset(filtered)) # All other tags should be in the filter selection treepaths = filteredmodel.get_treepaths(path) self.assertTrue(filteredmodel.get_path(iter) in treepaths) widget.toggle_treeview() self.assertEqual(plugin.uistate['treeview'], 'tags') filteredmodel = widget.treeview.get_model() for iter in toplevel(filteredmodel): self.assertEqual(filteredmodel.get_indexpath(iter), None) # toplevel has tags, not pages tag = filteredmodel[iter][PATH_COL] self.assertTrue(tag in filtered) for iter in childiter(filteredmodel, iter): path = filteredmodel.get_indexpath(iter) self.assertTrue(not path is None) tags = list(ui.notebook.index.list_tags(path)) tags = frozenset(tags) self.assertTrue(selected.issubset(tags)) # Needs to contains selected tags self.assertTrue(tags.issubset(filtered)) # All other tags should be in the filter selection treepaths = filteredmodel.get_treepaths(path) self.assertTrue(filteredmodel.get_path(iter) in treepaths) class MockUI(tests.MockObject): page = None notebook = None zim-0.60/tests/formats.py0000644000175000017500000004307012053474517015311 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008-2012 Jaap Karssenberg '''Test cases for the zim.formats module.''' from __future__ import with_statement import tests from zim.formats import * from zim.fs import File from zim.notebook import Path, Link from zim.parsing import link_type from zim.templates import Template if not ElementTreeModule.__name__.endswith('cElementTree'): print 'WARNING: using ElementTree instead of cElementTree' wikitext = tests.WikiTestData.get('roundtrip') class TestFormatMixin(object): '''Mixin for testing formats, uses data in C{tests/data/formats/}''' reference_xml = File('tests/data/formats/parsetree.xml').read().rstrip('\n') reference_data = { 'wiki': 'wiki.txt', 'plain': 'plain.txt', 'html': 'export.html', 'latex': 'export.tex', 'markdown': 'export.markdown', 'reST': 'export.rst', } def testFormatInfo(self): for key in ('name', 'desc', 'mimetype', 'extension'): self.assertIsInstance(self.format.info[key], basestring, msg='Invalid key "%s" in format info' % key) for key in ('native', 'import', 'export'): self.assertIsInstance(self.format.info[key], bool, msg='Invalid key "%s" in format info' % key) if self.format.info['native'] or self.format.info['import']: self.assertTrue(hasattr(self.format, 'Parser')) if self.format.info['native'] or self.format.info['export']: self.assertTrue(hasattr(self.format, 'Dumper')) def getReferenceData(self): '''Returns reference data from C{tests/data/formats/} for the format being tested. ''' name = self.format.info['name'] assert name in self.reference_data, 'No reference data for format "%s"' % name path = 'tests/data/formats/' + self.reference_data[name] text = File(path).read() # No absolute paths ended up in reference pwd = Dir('.') self.assertFalse(pwd.path in text, 'Absolute path ended up in reference') self.assertFalse(pwd.user_path in text, 'Absolute path ended up in reference') return text def testFormat(self): '''Test if formats supports full syntax Uses data in C{tests/data/formats} as reference data. ''' # Dumper wanted = self.getReferenceData() reftree = tests.new_parsetree_from_xml(self.reference_xml) linker = StubLinker() linker.set_base(Dir('tests/data/formats')) dumper = self.format.Dumper(linker=linker) result = ''.join(dumper.dump(reftree)) #~ print '\n' + '>'*80 + '\n' + result + '\n' + '<'*80 + '\n' self.assertMultiLineEqual(result, wanted) self.assertNoTextMissing(result, reftree) # partial dumper parttree = tests.new_parsetree_from_xml("\ntry these bold, italic") result = ''.join(dumper.dump(parttree)) #~ print ">>>%s<<<" % result self.assertFalse(result.endswith('\n')) # partial should not end with "\n" # Parser if not hasattr(self.format, 'Parser'): return input = wanted parser = self.format.Parser() result = parser.parse(input) if self.format.info['native']: self.assertMultiLineEqual(result.tostring(), self.reference_xml) else: self.assertTrue(len(result.tostring().splitlines()) > 10) # Quick check that we got back *something* string = ''.join(dumper.dump(result)) # now we may have loss of formatting, but text should all be there #~ print '\n' + '>'*80 + '\n' + string + '\n' + '<'*80 + '\n' self.assertNoTextMissing(string, reftree) _nonalpha_re = re.compile('\W') def assertNoTextMissing(self, text, tree): '''Assert that no plain text from C{tree} is missing in C{text} intended to make sure that even for lossy formats all information is preserved. ''' # TODO how to handle objects ?? assert isinstance(text, basestring) offset = 0 for elt in tree.iter(): if elt.tag == 'img': elttext = (elt.tail) # img text is optional else: elttext = (elt.text, elt.tail) for wanted in elttext: if not wanted: continue wanted = self._nonalpha_re.sub(' ', wanted) # Non-alpha chars may be replaced with escapes # so no way to hard test them if wanted.isspace(): continue for piece in wanted.strip().split(): #~ print "| >>%s<< @ offset %i" % (piece, offset) try: start = text.index(piece, offset) except ValueError: self.fail('Could not find text piece "%s" in text after offset %i\n>>>%s<<<' % (piece, offset, text[offset:offset+100])) else: offset = start + len(piece) class TestListFormats(tests.TestCase): def runTest(self): for desc in list_formats(EXPORT_FORMAT): name = canonical_name(desc) format = get_format(name) self.assertTrue(format.info['export']) for desc in list_formats(TEXT_FORMAT): name = canonical_name(desc) format = get_format(name) self.assertTrue(format.info['export']) self.assertTrue(format.info['mimetype'].startswith('text/')) class TestParseTree(tests.TestCase): def setUp(self): self.xml = '''\ Head 1 Head 2 Head 3 Head 4 Head 5 Head 6 Head 7 Head 8 ''' def teststring(self): '''Test ParseTree.fromstring() and .tostring()''' tree = ParseTree() r = tree.fromstring(self.xml) self.assertEqual(id(r), id(tree)) # check return value e = tree.getroot() self.assertEqual(e.tag, 'zim-tree') # check content text = tree.tostring() self.assertEqual(text, self.xml) def testcleanup_headings(self): '''Test ParseTree.cleanup_headings()''' tree = ParseTree().fromstring(self.xml) wanted = '''\ Head 1 Head 2 Head 3 Head 4 Head 5 Head 6 Head 7 Head 8 ''' tree.cleanup_headings(offset=1, max=4) text = tree.tostring() self.assertEqual(text, wanted) def testGetHeading(self): '''Test that ParseTree.get_heading() returns the first header's text. ''' tree = ParseTree().fromstring(self.xml) self.assertEqual(tree.get_heading(), "Head 1") def testSetHeading(self): '''Test ParseTree.set_heading()''' tree = ParseTree().fromstring(self.xml) tree.set_heading('Foo') wanted = '''\ Foo Head 2 Head 3 Head 4 Head 5 Head 6 Head 7 Head 8 ''' text = tree.tostring() self.assertEqual(text, wanted) def testExtend(self): tree1 = ParseTree().fromstring(self.xml) tree2 = ParseTree().fromstring(self.xml) tree = tree1 + tree2 wanted = '''\ Head 1 Head 2 Head 3 Head 4 Head 5 Head 6 Head 7 Head 8 Head 1 Head 2 Head 3 Head 4 Head 5 Head 6 Head 7 Head 8 ''' text = tree.tostring() self.assertEqual(text, wanted) def testGetEndsWithNewline(self): for xml, newline in ( ('foo', False), ('foo', False), ('foo\n', True), ('foo\n', True), ('foo\n', False), ('
  • foo
  • ', True), ('
  • foo
  • ', True), ('
  • foo
  • ', True), ): tree = ParseTree().fromstring(xml) self.assertEqual(tree.get_ends_with_newline(), newline) class TestTextFormat(tests.TestCase, TestFormatMixin): def setUp(self): self.format = get_format('plain') class TestWikiFormat(TestTextFormat): def setUp(self): self.format = get_format('wiki') notebook = tests.new_notebook() self.page = notebook.get_page(Path('Foo')) #~ def testHeaders(self): #~ text = '''\ #~ Content-Type: text/x-zim-wiki #~ Wiki-Format: zim 0.26 #~ Creation-Date: Unkown #~ Modification-Date: Wed, 06 Aug 2008 22:17:29 +0200 #~ #~ foo bar #~ ''' #~ tree = self.format.Parser().parse(text) #~ print '>>>\n'+tostring(tree)+'\n<<<\n' #~ self.assertEquals(tree.getroot().attrib['Content-Type'], 'text/x-zim-wiki') #~ output = self.format.Dumper().dump(tree) #~ self.assertEqual(output, text.splitlines(True)) def testUnicodeBullet(self): '''Test support for unicode bullets in source''' input = u'''\ A list • foo • bar • baz ''' text = u'''\ A list * foo * bar * baz ''' tree = self.format.Parser().parse(input) output = self.format.Dumper().dump(tree) self.assertEqual(output, text.splitlines(True)) def testLink(self): '''Test iterator function for link''' # + check for bugs in link encoding text = '[[FooBar]] [[Foo|]] [[|Foo]]' tree = self.format.Parser().parse(text) for i, tag in enumerate(tree.getiterator('link')): self.assertTrue(tag.text) self.assertTrue(tag.attrib.get('href')) link = Link(self.page, **tag.attrib) self.assertEqual(tag.attrib['href'], link.href) done = True self.assertEqual(i, 2) def testBackward(self): '''Test backward compatibility for wiki format''' input = u'''\ test 1 2 3 Some Verbatim block here .... test 4 5 6 ''' wanted = u'''\ test 1 2 3 \''' Some Verbatim block here .... \''' test 4 5 6 ''' xml = '''\

    test 1 2 3

    	Some Verbatim block
    	here ....
    

    test 4 5 6

    ''' t = self.format.Parser(version='Unknown').parse(input) self.assertEqual(t.tostring(), xml) output = self.format.Dumper().dump(t) self.assertEqual(output, wanted.splitlines(True)) def testList(self): def check(text, xml, wanted=None): if wanted is None: wanted = text tree = self.format.Parser().parse(text) #~ print '>>>\n' + tree.tostring() + '\n<<<' self.assertEqual(tree.tostring(), xml) lines = self.format.Dumper().dump(tree) result = ''.join(lines) #~ print '>>>\n' + result + '<<<' self.assertEqual(result, wanted) # Bullet list (unordered list) text = '''\ * foo * bar * sub list * here * hmmm ''' xml = '''\

    • foo
    • bar
      • sub list
      • here
    • hmmm

    ''' check(text, xml) # Numbered list (ordered list) text = '''\ 1. foo 2. bar a. sub list b. here 3. hmmm ''' xml = '''\

    1. foo
    2. bar
      1. sub list
      2. here
    3. hmmm

    ''' check(text, xml) text = '''\ A. foo B. bar C. hmmm ''' xml = '''\

    1. foo
    2. bar
    3. hmmm

    ''' check(text, xml) text = '''\ 10. foo 11. bar 12. hmmm ''' xml = '''\

    1. foo
    2. bar
    3. hmmm

    ''' check(text, xml) # Inconsistent lists # ( If first item is number, make all items numbered in sequence # Otherwise numers will be turned into bullets ) text = '''\ 1. foo 4. bar * hmmm a. dus ''' xml = '''\

    1. foo
    2. bar
    3. hmmm
    4. dus

    ''' wanted = '''\ 1. foo 2. bar 3. hmmm 4. dus ''' check(text, xml, wanted) text = '''\ * foo 4. bar a. hmmm * dus ''' xml = '''\

    • foo
    • bar
    • hmmm
    • dus

    ''' wanted = '''\ * foo * bar * hmmm * dus ''' check(text, xml, wanted) # Mixed sub-list text = '''\ * foo * bar 1. sub list 2. here * hmmm ''' xml = '''\

    • foo
    • bar
      1. sub list
      2. here
    • hmmm

    ''' check(text, xml) # Indented list text = '''\ * foo * bar 1. sub list 2. here * hmmm ''' xml = '''\

    • foo
    • bar
      1. sub list
      2. here
    • hmmm

    ''' check(text, xml) # Double indent sub-list ? text = '''\ * foo * bar 1. sub list 2. here * hmmm ''' xml = '''\

    • foo
    • bar
        1. sub list
        2. here
    • hmmm

    ''' check(text, xml) # This is not a list text = '''\ foo. dus ja. 1.3 ''' xml = '''\

    foo. dus ja. 1.3

    ''' check(text, xml) def testIndent(self): # Test some odditied pageview can give us xml = '''\
    foo
    bar
    sub list
    here
    hmmm
    ''' wanted = '''\ foo bar sub list here hmmm ''' tree = ParseTree() tree.fromstring(xml) text = ''.join( self.format.Dumper().dump(tree) ) self.assertEqual(text, wanted) class TestHtmlFormat(tests.TestCase, TestFormatMixin): def setUp(self): self.format = get_format('html') notebook = tests.new_notebook() self.page = notebook.get_page(Path('Foo')) def testEncoding(self): '''Test HTML encoding''' page = Element('zim-tree') para = SubElement(page, 'p') para.text = '"foo" & "bar"' tree = ParseTree(page) html = self.format.Dumper(linker=StubLinker()).dump(tree) self.assertEqual(html, ['

    \n', '<foo>"foo" & "bar"</foo>

    \n'] ) # TODO add test using http://validator.w3.org class TestMarkdownFormat(tests.TestCase, TestFormatMixin): def setUp(self): self.format = get_format('markdown') class TestRstFormat(tests.TestCase, TestFormatMixin): def setUp(self): self.format = get_format('rst') class LatexLoggingFilter(tests.LoggingFilter): logger = 'zim.formats.latex' message = ('No document type set in template', 'Could not find latex equation') class TestLatexFormat(tests.TestCase, TestFormatMixin): def setUp(self): self.format = get_format('latex') def testFormat(self): with LatexLoggingFilter(): TestFormatMixin.testFormat(self) def testFormatReference(self): # Double check reference did not get broken in updating text = self.getReferenceData() # Inlined equation is there self.assertFalse('equation001.png' in text, 'This equation should be inlined') self.assertTrue(r'\begin{math}' in text) self.assertTrue(r'\end{math}' in text) def testEncode(self): '''test the escaping of certain characters''' format = get_format('latex') input = r'\foo $ % ^ \% bar < >' wanted = r'$\backslash$foo \$ \% \^{} $\backslash$\% bar \textless{} \textgreater{}' self.assertEqual(format.tex_encode(input), wanted) def testExport(self): '''test the export of a wiki page to latex''' with LatexLoggingFilter(): format = get_format('LaTeX') testpage = tests.WikiTestData.get('Test:wiki') tree = get_format('wiki').Parser().parse(testpage) output = format.Dumper(linker=StubLinker()).dump(tree) #~ print '>>>\n' + ''.join(output) + '<<<' self.assertTrue('\chapter{Foo Bar}\n' in output) # Test template_options.document_type input = r''' [% options.document_type = 'book' -%] \title{[% page.basename %]} \begin{document} \maketitle \tableofcontents [% page.body %] \end{document} ''' wanted = r''' \title{FooBar} \begin{document} \maketitle \tableofcontents \textbf{foo bar !} \chapter{Heading 2} duss \end{document} ''' notebook = tests.new_notebook() page = notebook.get_page(Path('FooBar')) page.parse('wiki', '''\ ====== Page Heading ====== **foo bar !** ===== Heading 2 ===== duss ''') template = Template(input, 'latex', linker=StubLinker()) result = template.process(notebook, page) self.assertEqual(''.join(result), wanted) class TestParseTreeBuilder(tests.TestCase): def runTest(self): '''Test ParseTreeBuilder class''' # - Test \n before and after h / p / pre # - Test break line into lines input = '''\ foobarbaz dus
    ja
    hmm foo bar dus ja hmm dus ja grrr foo bar .
    ''' wanted = '''\ foo bar baz dus
    ja
    
    hmm foo bar dus ja hmm dus ja grrr foo bar .
    ''' # For some reason this does not work with cElementTree.XMLBuilder ... from xml.etree.ElementTree import XMLTreeBuilder builder = XMLTreeBuilder(target=ParseTreeBuilder()) builder.feed(input) root = builder.close() tree = ParseTree(root) self.assertEqual(tree.tostring(), wanted) zim-0.60/tests/translations.py0000644000175000017500000001005711672172726016361 0ustar jaapjaap00000000000000 import re from glob import glob from tests import TestCase class TestTranslations(TestCase): def runTest(self, verbose=False): '''Sanity check translation files''' pot_creation_date = None for file in ['translations/zim.pot'] + glob('translations/*.po'): if verbose: print 'Checking %s' % file t = TranslationFile(file) if file == 'translations/zim.pot': pot_creation_date = t.headers['POT-Creation-Date'] else: if not t.headers['POT-Creation-Date'] == pot_creation_date: print 'WARNING: Translation not based on up to date template: %s' % file self.assertTrue(t.nplural > 0, 'Missing number of plurals: %s' % file) t.assertValid() class TranslationMessage(object): @property def nplural(self): return len(self.msgstr) def __init__(self, lineno, text): self.lineno = lineno self.msgid = None self.msgid_plural = None self.msgstr = [] self.comment = '' text = text.replace('"\n"', '') for line in text.splitlines(): if line.startswith('#'): self.comment += line else: type, msg = line.split(' ', 1) if type == 'msgid': self.msgid = msg elif type == 'msgid_plural': self.msgid_plural = msg elif type.startswith('msgstr'): self.msgstr.append(msg) else: raise AssertionError, \ 'Could not parse line: %s %s' % (type, msg) assert self.msgid, 'No msgid found' assert self.msgstr, 'No msgstr found' _format_string_re = re.compile('%(?:\(\w+\))?\w') # match "%s", "%d" etc. but also "%(foo)s" - but not just "%" def check_nplural(self, nplural): if self.msgid_plural and self.msgstr[0] != '""': return self.nplural == nplural else: return True def check_format_strings(self): '''Check format strings in msgid_plural and msgstr''' if 'strftime' in self.comment: return True # strftime format string wanted = sorted( self._format_string_re.findall(self.msgid) ) if not wanted: return True # no string format used for msg in [self.msgid_plural] + self.msgstr: if msg and not msg == '""': got = sorted( self._format_string_re.findall(msg) ) if not got == wanted: return False else: return True class TranslationFile(object): def __init__(self, file): self.file = file self.messages = [] buffer = [] lineno = 0 msgidlineno = 0 def flush(): if not buffer \ or all(line.startswith('#') for line in buffer): return try: text = ''.join(buffer) message = TranslationMessage(msgidlineno, text) self.messages.append(message) except AssertionError, error: raise AssertionError, \ 'Error while parsing %s msgid on line %i\n' % (self.file, msgidlineno) + error.message for line in open(file): lineno += 1 if not line or line.isspace(): flush() buffer = [] else: if line.startswith('msgid '): msgidlineno = lineno buffer.append(line) else: flush() plural_forms = self.headers['Plural-Forms'] m = re.search(r'nplurals=(\d+);', plural_forms) if m: self.nplural = int( m.group(1) ) else: self.nplural = None @property def headers(self): message = self.get('""') lines = message.msgstr[0].strip().strip('"').split('\\n') headers = {} for line in lines: if not line: continue k, v = line.strip('"').replace('\\n', '').split(': ', 1) headers[k] = v return headers def get(self, msgid): for message in self.messages: if message.msgid == msgid: return message else: return None def assertValid(self): for message in self.messages: if self.nplural and not message.check_nplural(self.nplural): raise AssertionError, \ 'Number of plural forms NOK in %s msgid on line %i\n' % (self.file, message.lineno) + message.msgid if not message.check_format_strings(): raise AssertionError, \ 'Error with format strings in %s msgid on line %i\n' % (self.file, message.lineno) + message.msgid if __name__ == '__main__': TestTranslations().runTest(verbose=True) zim-0.60/tests/clipboard.py0000664000175000017500000001457612012764113015575 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg #~ from __future__ import with_statement import tests import gtk import zim.formats from zim.gui.clipboard import * def get_clipboard_contents(format): '''Convenience function to get data from clipboard''' myclipboard = gtk.Clipboard() selection = myclipboard.wait_for_contents(format) return selection.data def set_clipboard_uris(*uris): '''Convenience function to put a file on the clipboard''' myclipboard = gtk.Clipboard() targets = [('text/uri-list', 0, 0)] def my_get_data(clipboard, selectiondata, id, file): selectiondata.set_uris(uris) def my_clear_data(*a): pass myclipboard.set_with_data(targets, my_get_data, my_clear_data, file) def set_clipboard_image(file): '''Convenience function to put image data on the clipboard''' myclipboard = gtk.Clipboard() targets = [('image/png', 0, 0)] def my_get_data(clipboard, selectiondata, id, file): pixbuf = gtk.gdk.pixbuf_new_from_file(file.path) selectiondata.set_pixbuf(pixbuf) def my_clear_data(*a): pass myclipboard.set_with_data(targets, my_get_data, my_clear_data, file) class TestClipboard(tests.TestCase): def setUp(self): path = self.get_tmp_name() self.notebook = tests.new_notebook(fakedir=path) def testCopyPasteText(self): text = u'test **123** \u2022' # text with non-ascii character Clipboard.set_text(text) result = Clipboard.get_text() self.assertEqual(result, text) self.assertTrue(isinstance(result, unicode)) def testCopyPasteFromParseTree(self): # parsetree -> parsetree for pagename in ('Test:wiki', 'roundtrip'): page = self.notebook.get_page(Path(pagename)) parsetree = page.get_parsetree() Clipboard.set_parsetree(self.notebook, page, parsetree) newtree = Clipboard.get_parsetree(self.notebook) self.assertEqual(newtree.tostring(), parsetree.tostring()) # setup parsetree input = 'some **bold** text\n' parser = zim.formats.get_format('wiki').Parser() parsetree = parser.parse(input) Clipboard.set_parsetree(self.notebook, page, parsetree) # parsetree -> text (plain & wiki preference) # Note that pasting partial text (without newline) is tested # in the pageview test. wanted = 'some bold text\n' text = Clipboard.get_text() self.assertEqual(text, wanted) Clipboard.set_parsetree(self.notebook, page, parsetree, format='wiki') wanted = 'some **bold** text\n' text = Clipboard.get_text() self.assertEqual(text, wanted) # parsetree -> html (unix & windows) wanted = '''\

    some bold text

    ''' self.assertEqual(get_clipboard_contents('text/html'), wanted) wanted = '''\ Version:1.0\r StartHTML:000000185\r EndHTML:000000527\r StartFragment:000000450\r EndFragment:000000495\r StartSelection:000000450\r EndSelection:000000495\r SourceURL:zim://copy-pase-buffer\r

    some bold text

    ''' self.assertEqual(get_clipboard_contents('HTML Format'), wanted) # Test clear Clipboard.clear() self.assertTrue(Clipboard.get_parsetree() is None) def testCopyPasteToParseTree(self): # text -> tree wanted = '''\nsome string''' Clipboard.set_text('some string') newtree = Clipboard.get_parsetree(self.notebook) self.assertEqual(newtree.tostring(), wanted) # file link -> tree page = self.notebook.get_page(Path('Test:wiki')) file = File('/foo/bar/baz.txt') set_clipboard_uris(file.uri) tree = Clipboard.get_parsetree(self.notebook, page) link = tree.find('link') rel_path = link.get('href') self.assertEqual(self.notebook.resolve_file(rel_path, page), file) file = File('./data/zim.png') # image file set_clipboard_uris(file.uri) tree = Clipboard.get_parsetree(self.notebook, page) img = tree.find('img') file_obj = img.get('_src_file') self.assertEqual(file_obj, file) rel_path = img.get('src') self.assertEqual(self.notebook.resolve_file(rel_path, page), file) # uri list (could also be file list) -> tree set_clipboard_uris('http://cpan.org', 'ftp://foo@test.org', 'user@mail.com') tree = Clipboard.get_parsetree(self.notebook, page) links = tree.findall('link') hrefs = [e.attrib['href'] for e in links] self.assertEqual(hrefs, ['http://cpan.org', 'ftp://foo@test.org', 'user@mail.com']) # image data -> tree page = self.notebook.get_page(Path('Test:wiki')) file = File('./data/zim.png') set_clipboard_image(file) tree = Clipboard.get_parsetree(self.notebook, page) img = tree.find('img') file_obj = img.get('_src_file') self.assertFalse(file_obj == file) self.assertTrue(file_obj.exists()) self.assertTrue(file_obj.isimage()) self.assertTrue(file_obj.path.endswith('.png')) rel_path = img.get('src') self.assertEqual(self.notebook.resolve_file(rel_path, page), file_obj) def testCopyPastePageLink(self): # pagelink -> uri list page = self.notebook.get_page(Path('Test:wiki')) Clipboard.set_pagelink(self.notebook, page) data = get_clipboard_contents(INTERNAL_PAGELIST_TARGET_NAME) self.assertEqual(data, 'Test:wiki\r\n') data = get_clipboard_contents(PAGELIST_TARGET_NAME) self.assertEqual(data, 'Unnamed Notebook?Test:wiki\r\n') # pagelink -> parsetree wanted = '''\n+wiki''' newtree = Clipboard.get_parsetree(self.notebook, Path('Test')) self.assertEqual(newtree.tostring(), wanted) # pagelink -> text text = Clipboard.get_text() self.assertEqual(text, 'Test:wiki') #~ def testCopyPasteFile(self): #~ assert False #~ def testCopyPasteUrl(self): #~ assert False # ClipboardManager.set_store # ClipboardStore read / write / list # ClipboardItem get / set / make permanent / drop # # Manager should be able to do paste-as, switching from plain text to wiki # Distinguishe between cut and copied items # # LP #XXX: selection gone from clipboard when leaving page # # HTML -> parsetree (need import) zim-0.60/tests/applications.py0000644000175000017500000003107012020170157016304 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg from __future__ import with_statement import tests import os import sys import gtk from zim.gui.applications import * from zim.notebook import Path from zim.fs import Dir, TmpFile def replace(l, old, new): l = list(l) while old in l: i = l.index(old) l[i] = new return tuple(l) class TestApplications(tests.TestCase): def testParseExec(self): '''Test parsing of .desktop Exec strings''' entry = DesktopEntryDict() entry['Desktop Entry']['Name'] = 'Foo' for app, args, wanted in ( # Test cases should be compliant with spec ('foo %f', (), ('foo',)), ('foo %f %i', (), ('foo',)), # no icon set ('foo %f %k', (), ('foo', '')), # no source set ('foo %f %c', (), ('foo', 'Foo')), ('foo', ('bar',), ('foo', 'bar')), ('foo', ('bar baz',), ('foo', 'bar baz')), ('foo "hmm ja"', ('bar',), ('foo', 'hmm ja', 'bar')), ('foo %f', ('bar baz',), ('foo', 'bar baz')), ('foo %F', ('bar baz',), ('foo', 'bar baz')), ('foo %u', ('bar baz',), ('foo', 'bar baz')), ('foo %U', ('bar baz',), ('foo', 'bar baz')), ('foo %F', ('bar', 'baz'), ('foo', 'bar', 'baz')), ('foo %F hmm', ('bar', 'baz'), ('foo', 'bar', 'baz', 'hmm')), ('foo %U', ('bar', 'baz'), ('foo', 'bar', 'baz')), ('foo %U hmm', ('bar', 'baz'), ('foo', 'bar', 'baz', 'hmm')), ('foo %f', (File('/foo/bar'),), ('foo', '/foo/bar')), ('foo %u', (File('/foo/bar'),), ('foo', 'file:///foo/bar')), ('foo %F', (File('/foo/bar'),), ('foo', '/foo/bar')), ('foo %U', (File('/foo/bar'),), ('foo', 'file:///foo/bar')), ): if os.name == 'nt': wanted = replace(wanted, '/foo/bar', r'C:\foo\bar') wanted = replace(wanted, 'file:///foo/bar', r'file:///C:/foo/bar') #print app, args entry['Desktop Entry']['Exec'] = app result = entry.parse_exec(args) self.assertEqual(result, wanted) entry['Desktop Entry']['Icon'] = 'xxx' entry.file = File('/foo.desktop') for app, args, wanted in ( # Test cases should be compliant with spec ('foo %f %i', (), ('foo', '--icon', 'xxx')), ('foo %f %k', (), ('foo', '/foo.desktop')), ('foo %f %c', (), ('foo', 'Foo')), ): if os.name == 'nt': wanted = replace(wanted, '/foo.desktop', r'C:\foo.desktop') #print app, args entry['Desktop Entry']['Exec'] = app result = entry.parse_exec(args) self.assertEqual(result, wanted) def testPythonCmd(self): app = Application('foo.py') cwd, argv = app._checkargs(None, ()) exe = argv[0].decode(zim.fs.ENCODING) cmd = argv[1].decode(zim.fs.ENCODING) self.assertEqual(exe, sys.executable) self.assertEqual(cmd, 'foo.py') from zim import ZimCmd, ZIM_EXECUTABLE app = ZimCmd() self.assertIsInstance(app, Application) cwd, argv = app._checkargs(None, ()) exe = argv[0].decode(zim.fs.ENCODING) cmd = argv[1].decode(zim.fs.ENCODING) self.assertEqual(exe, sys.executable) self.assertEqual(cmd, ZIM_EXECUTABLE) # TODO fully test _decode_value # test e.g. values with '"' or '\t' in a string # see that json.loads does what it is supposed to do @tests.slowTest class TestApplicationManager(tests.TestCase): def testGetMimeType(self): for obj, mimetype in ( (File('README.txt'), 'text/plain'), ('README.txt', 'text/plain'), ('ssh://host', 'x-scheme-handler/ssh'), ('http://host', 'x-scheme-handler/http'), ('README.html', 'text/html'), ('mailto:foo@bar.org', 'x-scheme-handler/mailto'), ): self.assertEqual(get_mimetype(obj), mimetype) def testGetSetApplications(self): # Typically a system will have multiple programs installed for # text/plain and text/html, but do not rely on them for # testing, so create our own first to test. #~ print XDG_DATA_HOME, XDG_DATA_DIRS manager = ApplicationManager() ## Test Create & Get entry_text = manager.create('text/plain', 'Test_Entry_Text', 'test_text 123', NoDisplay=False) entry_html = manager.create('text/html', 'Test_Entry_HTML', 'test_html %u', NoDisplay=False) entry_url = manager.create('x-scheme-handler/ssh', 'Test_Entry_SSH', 'test_ssh %u', NoDisplay=False) for entry in (entry_text, entry_html, entry_url): self.assertTrue(entry.file.exists()) self.assertEqual(manager.get_application(entry.key), entry) self.assertFalse(entry['Desktop Entry']['NoDisplay']) ## Test Set & Get Default defaults = XDG_DATA_HOME.file('applications/defaults.list') self.assertFalse(defaults.exists()) default = manager.get_default_application('text/plain') self.assertIsInstance(default, (None.__class__, DesktopEntryFile)) # system default or None manager.set_default_application('text/plain', entry_html) # create manager.set_default_application('text/plain', entry_text) # update self.assertTrue(defaults.exists()) self.assertEqual(defaults.read(), '[Default Applications]\n' 'text/plain=test_entry_text-usercreated.desktop\n' ) self.assertEqual(manager.get_default_application('text/plain'), entry_text) manager.set_default_application('text/plain', None) self.assertEqual(defaults.read(), '[Default Applications]\n' ) self.assertNotEqual(manager.get_default_application('text/plain'), entry_text) ## Test listing #~ print manager.list_applications('text/plain') applications = manager.list_applications('text/plain') self.assertGreaterEqual(len(applications), 1) self.assertIn(entry_text, applications) #~ print manager.list_applications('text/html') for mimetype in ('text/html', 'x-scheme-handler/http'): applications = manager.list_applications(mimetype) self.assertGreaterEqual(len(applications), 1) self.assertIn(entry_html, applications) #~ print manager.list_applications('text/plain') applications = manager.list_applications('x-scheme-handler/ssh') self.assertGreaterEqual(len(applications), 1) self.assertIn(entry_url, applications) ## Increase coverage self.assertIsInstance(manager.get_application('webbrowser'), WebBrowser) self.assertIsInstance(manager.get_application('startfile'), StartFile) self.assertIsNone(manager.get_application('non_existing_application')) @tests.slowTest class TestCustomTools(tests.TestCase): def testManager(self): '''Test CustomToolManager API''' # initialize the list manager = CustomToolManager() self.assertEqual(list(manager), []) self.assertEqual(list(manager.names), []) # add a tool properties = { 'Name': 'Foo', 'Comment': 'Test 1 2 3', 'Icon': '', 'X-Zim-ExecTool': 'foo %t "quoted"', 'X-Zim-ReadOnly': False, 'X-Zim-ShowInToolBar': True, } tool = manager.create(**properties) self.assertEqual(list(manager), [tool]) self.assertEqual(list(manager.names), ['foo-usercreated']) self.assertTrue(tool.isvalid) self.assertEqual(tool.name, 'Foo') self.assertEqual(tool.comment, 'Test 1 2 3') self.assertFalse(tool.isreadonly) self.assertTrue(tool.showintoolbar) self.assertTrue(tool.get_pixbuf(gtk.ICON_SIZE_MENU)) self.assertEqual(tool.showincontextmenu, 'Text') # Auto generated # test file saved correctly #~ from pprint import pprint #~ pprint(tool) lines = tool.dump() self.assertTrue(len(lines) > 5) lines = tool.file.readlines() self.assertTrue(len(lines) > 5) # refresh list manager = CustomToolManager() self.assertEqual(list(manager), [tool]) self.assertEqual(list(manager.names), ['foo-usercreated']) # add a second tool tool1 = tool properties = { 'Name': 'Foo', 'Comment': 'Test 1 2 3', 'Icon': None, 'X-Zim-ExecTool': 'foo %f', 'X-Zim-ReadOnly': False, 'X-Zim-ShowInToolBar': True, } tool = manager.create(**properties) self.assertEqual(list(manager), [tool1, tool]) self.assertEqual(list(manager.names), ['foo-usercreated', 'foo-usercreated-1']) self.assertTrue(tool.isvalid) self.assertEqual(tool.name, 'Foo') self.assertEqual(tool.comment, 'Test 1 2 3') self.assertFalse(tool.isreadonly) self.assertTrue(tool.showintoolbar) self.assertTrue(tool.get_pixbuf(gtk.ICON_SIZE_MENU)) self.assertEqual(tool.showincontextmenu, 'Page') # Auto generated # switch order i = manager.index(tool) self.assertTrue(i == 1) manager.reorder(tool, 0) i = manager.index(tool) self.assertTrue(i == 0) self.assertEqual(list(manager.names), ['foo-usercreated-1', 'foo-usercreated']) # delete file = tool1.file self.assertTrue(file.exists()) manager.delete(tool1) self.assertEqual(list(manager.names), ['foo-usercreated-1']) self.assertFalse(file.exists()) def testParseExec(self): '''Test parsing of custom tool Exec strings''' # %f for source file as tmp file current page # %d for attachment directory # %s for real source file (if any) # %n for notebook location (file or directory) # %D for document root # %t for selected text or word under cursor # %T for selected text or word under cursor with wiki format path = self.get_tmp_name() notebook = tests.new_notebook(fakedir=path) page = notebook.get_page(Path('Test:Foo')) pageview = StubPageView() args = (notebook, page, pageview) tmpfile = TmpFile('tmp-page-source.txt').path dir = notebook.dir tool = CustomToolDict() tool.update( { 'Name': 'Test', 'Description': 'Test 1 2 3', 'X-Zim-ExecTool': 'foo', } ) for cmd, wanted in ( ('foo %f', ('foo', tmpfile)), ('foo %d', ('foo', dir.subdir('Test/Foo').path)), ('foo %s', ('foo', '')), # no file source ('foo %n', ('foo', dir.path)), ('foo %D', ('foo', '')), # no document root ('foo %t', ('foo', 'FooBar')), ('foo %T', ('foo', '**FooBar**')), ): #~ print '>>>', cmd tool['Desktop Entry']['X-Zim-ExecTool'] = cmd self.assertEqual(tool.parse_exec(args), wanted) class TestOpenWithMenu(tests.TestCase): def runTest(self): # Create some custom entries - should NOT appear in menu manager = ApplicationManager() entry_text = manager.create('text/plain', 'Test_Entry_Text', 'test_text 123') entry_url = manager.create('x-scheme-handler/ssh', 'Test_Entry_SSH', 'test_ssh %u') for entry in (entry_text, entry_url): self.assertTrue(entry.file.exists()) self.assertEqual(manager.get_application(entry.key), entry) self.assertTrue(entry['Desktop Entry']['NoDisplay']) # do not show custom items in menus # Mock main ui object ui = tests.MockObject() ui.windows = [] # Check menu for obj, mimetype, test_entry in ( (File('README.txt'), 'text/plain', entry_text), ('ssh://host', 'x-scheme-handler/ssh', entry_url), ): manager.set_default_application(mimetype, test_entry) menu = OpenWithMenu(ui, obj) self.assertEqual(menu.mimetype, mimetype) for item in menu.get_children(): if hasattr(item, 'entry'): self.assertFalse(item.entry['Desktop Entry'].get('NoDisplay', False), msg='Entry %s should not be in menu' % item.entry) def test_configure_applications_dialog(dialog): self.assertIsInstance(dialog, CustomizeOpenWithDialog) # test default displays as set above active = dialog.default_combo.get_active() self.assertEqual(active, test_entry) self.assertEqual( manager.get_default_application(mimetype).key, test_entry.key ) # test changing to system default and back last = len(dialog.default_combo.get_model()) - 1 dialog.default_combo.set_active(last) active = dialog.default_combo.get_active() self.assertIsInstance(active, SystemDefault) default = manager.get_default_application(mimetype) self.assertTrue(default is None or default.key != test_entry.key) dialog.default_combo.set_active(0) active = dialog.default_combo.get_active() self.assertEqual(active, test_entry) self.assertEqual( manager.get_default_application(mimetype).key, test_entry.key ) # trigger new app dialog and check new default set dialog.on_add_application(None) active = dialog.default_combo.get_active() self.assertEqual(active.name, 'Test New App Dialog') self.assertEqual( manager.get_default_application(mimetype).key, active.key ) def test_new_app_dialog(dialog): self.assertIsInstance(dialog, AddApplicationDialog) dialog.form['name'] = 'Test New App Dialog' dialog.form['exec'] = 'Test 123' dialog.form['default'] = True entry = dialog.assert_response_ok() self.assertTrue(entry.file.exists()) self.assertTrue(entry.nodisplay) # implied by default = True manager = ApplicationManager() self.assertEqual(manager.get_default_application(mimetype), entry) with tests.DialogContext( test_configure_applications_dialog, test_new_app_dialog ): tests.gtk_activate_menu_item(menu, menu.CUSTOMIZE) class StubPageView(object): def get_selection(self, format=None): return None def get_word(self, format=None): if format: return '**FooBar**' else: return 'FooBar' zim-0.60/tests/templates.py0000644000175000017500000002063012061712134015616 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg '''Test cases for the zim.templates module.''' import tests import os import zim from zim.errors import Error from zim.templates import * from zim.templates import GenericTemplate, \ TemplateParam, TemplateDict, TemplateFunction, PageProxy from zim.notebook import Notebook, Path import zim.formats from zim.parsing import link_type class TestTemplateParam(tests.TestCase): def runTest(self): param = TemplateParam('xxx.yyy.zzz') self.assertEquals(param.path, ['xxx', 'yyy']) self.assertEquals(param.key, 'zzz') self.assertRaises(Error, TemplateParam, '_settings.foo') self.assertRaises(Error, TemplateParam, 'xxx._yyy.zzz') self.assertRaises(Error, TemplateParam, 'xxx.y-y.zzz') class TestTemplateDict(tests.TestCase): def runTest(self): data = {'foo': {'bar': {'baz': '123'}}, 'xyz':'check'} dict = TemplateDict(data) param = TemplateParam('foo.bar.baz') self.assertEquals(dict[param], '123') dict[param] = 'FOO' self.assertEquals(dict[param], 'FOO') self.assertEquals(data['foo']['bar']['baz'], '123') class TestGenericTemplate(tests.TestCase): # def setUp(self): # self.template = ... def testSyntax(self): '''Test Template processing simple statements without page''' input = ''' [%- SET test = "foo" -%] [%- SET true = "true" -%] [%- SET false = "" -%] --- [% test %] [% some_none_existing_parameter %] [% upper('foo') %] --- [% IF true %]OK[% ELSE %]NOK[% END %] [% IF false -%] OK [%- ELSE -%] NOK [%- END %] --- [% FOREACH name = [ 'foo', 'bar', 'baz' ] -%] NAME = [% GET name %] [% END -%] --- [% numbers = ['1', '2', '3'] -%] [% FOREACH n IN numbers %][% n %]...[% END %] --- ''' wantedresult = u'''\ --- foo FOO --- OK NOK --- NAME = foo NAME = bar NAME = baz --- 1...2...3... --- ''' tmpl = GenericTemplate(input) #~ import pprint #~ pprint.pprint( tmpl.tokens ) dict = { 'upper': TemplateFunction(lambda d, *a: a[0].upper()) } result = tmpl.process(dict) #~ print test.getvalue() self.assertEqual(result, wantedresult.splitlines(True)) def testRaise(self): '''Test Template invalid syntax raises TemplateError''' input = 'foo[% ELSE %]bar' self.assertRaises(TemplateSyntaxError, GenericTemplate, input) input = 'foo[% FOREACH foo = ("1", "2", "3") %]bar' self.assertRaises(TemplateSyntaxError, GenericTemplate, input) input = 'foo[% `echo /etc/passwd` %]bar' self.assertRaises(TemplateSyntaxError, GenericTemplate, input) input = 'foo[% duss("ja") %]bar' templ = GenericTemplate(input) self.assertRaises(TemplateProcessError, templ.process, {}) class TestTemplateSet(tests.TestCase): def runTest(self): '''Load all shipped templates for syntax check''' for dir, dirs, files in os.walk('./data/templates'): format = os.path.basename(dir) if format == 'templates': continue # skip top level dir files = [f for f in files if not f.startswith('.') and not '~' in f] files.sort() self.assertTrue(len(files) > 0) templates = list_templates(format) self.assertEqual([t[1] for t in templates], files) for file in files: file = os.path.join(dir, file) input = open(file).readlines() if format == 'plugins': tmpl = GenericTemplate(input) else: tmpl = Template(input, format) # Syntax errors will be raised during init # TODO parameter check for these templates # ... run them with raise instead of param = None class TestPageProxy(tests.TestCase): def runTest(self): notebook = tests.new_notebook() page = notebook.get_page(Path('FooBar')) page.parse('wiki', '''\ ====== Page Heading ====== **foo bar !** ''') self.assertTrue(len(page.dump('html', linker=StubLinker())) > 0) proxy = PageProxy(Notebook(), page, zim.formats.get_format('html'), StubLinker(), {}) self.assertEqual(proxy.name, page.name) self.assertEqual(proxy.namespace, page.namespace) self.assertEqual(proxy.basename, page.basename) self.assertTrue(isinstance(proxy.properties, dict)) self.assertTrue(len(proxy.body) > 0) # TODO add othermethods class TestTemplate(tests.TestCase): def runTest(self): input = u'''\ Version [% zim.version %] [% page.title %] Created [% page.properties['Creation-Date'] %]

    [% notebook.name %]: [% page.name %]

    [% page.heading %]

    [% options.foo = "bar" %] [%- page.body -%] Option: [% options.foo %] ''' wantedresult = u'''\ Version %s Page Heading Created TODAY

    Unnamed Notebook: FooBar

    Page Heading

    foo bar !

    Option: bar ''' % zim.__version__ notebook = tests.new_notebook() page = notebook.get_page(Path('FooBar')) page.parse('wiki', '''\ ====== Page Heading ====== **foo bar !** ''') page.properties['Creation-Date'] = 'TODAY' self.assertTrue(len(page.dump('html', linker=StubLinker())) > 0) template = Template(input, 'html', linker=StubLinker()) result = template.process(notebook, page) self.assertEqual(''.join(result), wantedresult) self.assertEqual(template.template_options['foo'], 'bar') # Check new page template notebook = tests.new_notebook() page = notebook.get_page(Path('Some New None existing page')) template = notebook.get_template(page) tree = template.process_to_parsetree(notebook, page) # No linker ! self.assertEqual(tree.find('h').text, u'Some New None existing page') class TestTemplatePageIndexFuntion(tests.TestCase): def runTest(self): # pageindex(root, collapse, ignore_empty) self.maxDiff = None data = ( ('Parent:Daughter', u"[% pageindex('Parent') %]", '''\ '''), ('Parent:Daughter:SomeOne', u"[% pageindex('Parent') %]", '''\ '''), ('Parent:Daughter:SomeOne', u"[% pageindex('Parent', FALSE, FALSE) %]", '''\ '''), ) notebook = tests.new_notebook() for path, input, wantedresult in data: page = notebook.get_page(Path(path)) result = Template(input, 'html', linker=StubLinker()).process(notebook, page) self.assertEqual(result, wantedresult.splitlines(True)) class StubLinker(object): def set_usebase(self, usebase): pass def set_path(self, path): pass def link(self, link): return '%s://%s' % (link_type(link), link) def img(self, src): return 'img://' + src def icon(self, name): return 'icon://' + name zim-0.60/tests/ipc.py0000664000175000017500000000677512031651104014407 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2012 Jaap Karssenberg import tests import os import sys import signal import gobject import zim.ipc from zim.ipc import * from zim.fs import File, get_tmpdir from zim.notebook import NotebookInfo, Path, Page from zim.stores.files import FileStorePage @tests.slowTest class TestIPC(tests.TestCase): def setUp(self): self.OLD_SERVER_ADDRESS = zim.ipc.SERVER_ADDRESS self.OLD_AUTHKEY_FILE = zim.ipc.AUTHKEY_FILE zim.ipc.SERVER_ADDRESS += '-test-%i' % os.getpid() zim.ipc.AUTHKEY_FILE = get_tmpdir().file('zim-server-authkey-test-%i' % os.getpid()) zim.ZIM_EXECUTABLE = './zim.py' def tearDown(self): stop_server_if_running() zim.ipc.SERVER_ADDRESS = self.OLD_SERVER_ADDRESS zim.ipc.AUTHKEY_FILE = self.OLD_AUTHKEY_FILE def runTest(self): # Test setting up the server start_server_if_not_running() server = ServerProxy() ack = server.ping() self.assertEqual(ack[0], 'ACK') start_server_if_not_running() # Should do nothing.. server = ServerProxy() self.assertEqual(server.ping(), ack) # ack has pid, so we know still same server process # Test adding a child and interact with it child = server.get_proxy(RemoteObject('tests.ipc.ChildClass', 'file:///foo')) ack = child.ping() self.assertEqual(ack[0], 'CHILD') child = server.get_proxy(RemoteObject('tests.ipc.ChildClass', 'file:///foo')) # should not vivicate again, verify by pid in ack self.assertEqual(child.ping(), ack) # Error handling self.assertRaises(ValueError, child.error) # Add a second child child2 = server.get_proxy(RemoteObject('tests.ipc.ChildClass', 'file:///bar')) # should not vivicate again, verify by pid in ack self.assertNotEqual(child2.ping(), ack) children = server.list_objects() children.sort(key=lambda c: c.id) self.assertEqual(children, [ RemoteObject('tests.ipc.ChildClass', 'file:///bar'), RemoteObject('tests.ipc.ChildClass', 'file:///foo') ]) # Test API for notebooks server._notebookklass = 'tests.ipc.ChildClass' # HACK to test convenience methods self.assertEqual(server.list_notebooks(), ['file:///bar', 'file:///foo']) proxy = server.get_notebook('file:///foo') self.assertEqual(child.ping(), ack) # Test these are serializable for obj in ( File('file:///test'), NotebookInfo('file:///test'), Path('foo'), Page(Path('foo')), FileStorePage(Path('foo'), File('file:///test'), File('file:///test'), format='wiki'), ): #~ print ">>> %r" % obj re = proxy.echo(obj) self.assertEqual(re, obj) # send a signal n = child.get_n_signals() server.emit('notebook-list-changed') self.assertEqual(child.get_n_signals(), n+1) # Wrap up server.quit() class ChildClass(object): # Mock client for the daemon to run. It doesn't do much except # telling you it's ID by touching a file. def __init__(self, id): self.id = id self.n_signals = 0 def main(self): zim.ipc.SERVER_CONTEXT._notebookklass = 'tests.ipc.ChildClass' # HACK to test convenience methods ServerProxy().connect('notebook-list-changed', self) gobject.MainLoop().run() def quit(self): gobject.MainLoop().quit() os._exit(0) # just to be sure def ping(self): return ('CHILD', os.getpid()) def echo(self, value): return value def error(self): raise ValueError, 'Test Error' def on_notebook_list_changed(self): notebooks = ServerProxy().list_notebooks() assert len(notebooks) > 0, 'list_notebooks() returned: %s' % notebooks self.n_signals += 1 def get_n_signals(self): return self.n_signals zim-0.60/tests/inlinecalculator.py0000644000175000017500000000370011573234406017157 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg import tests import zim.plugins from zim.config import ConfigDict @tests.slowTest class TestPrintToBrowser(tests.TestCase): def runTest(self): 'Test InlineCalculator plugin' ui = StubUI() pluginklass = zim.plugins.get_plugin('inlinecalculator') plugin = pluginklass(ui) for text, wanted in ( ('3 + 4 =', '3 + 4 = 7'), ('3 + 4 = 1', '3 + 4 = 7'), ('3 + 4 = 1 ', '3 + 4 = 7 '), ('10 / 3 =', '10 / 3 = 3.33333333333'), # divide integers to float ! ('milage: 3 + 4 =', 'milage: 3 + 4 = 7'), ('3 + 4 = 7 + 0.5 = ', '3 + 4 = 7 + 0.5 = 7.5'), ('''\ 5.5 4.3 3.1 --- + ''', '''\ 5.5 4.3 3.1 --- + 12.9 ''' ), ): result = plugin.process_text(text) self.assertEqual(result, wanted) # Tests from clac.py self test for test in '''\ 1+2 == 3 sqrt(-1) == j -2*asin(-1) == pi abs(sin(pi)) < 1e-9 abs(1-cos(0)) < 1e-9 round( 3.1 + -4.8j) == (3-5j) ceil( 3.1 + -4.8j) == (4-4j) abs( 3-4j) == 5 degrees(pi) == 180 radians(180) == pi abs( exp(j*pi) + 1 ) < 1e-9 # pow(1.2,3.4) == 1.2**3.4 ldexp(1.2,3) == 1.2 * 2 ** 3 modf(1.2)[1] == 1 log(81,3) == 4 gcd(6,8) == 2 lcm(6,8) == 24 angle( exp( j*pi ) ) == pi # log(-1)**2 == -1*pow(pi,2) round( degrees(phase( e**(2j)))) == 115 # sum( [ round(42 * exp(j*2*x*pi/4)) for x in range(4)] ) == 0 oct(8) == '010' 0x42-042-42 == -10 # 1k == 1024 # 1m == 2**20 # 1g == 2**30 2**10-1 == 1023 # 2**1k == 2**1024 '''.splitlines(): if test.startswith('#'): continue #~ print 'TESTING:', test self.assertTrue(plugin.safe_eval(test)) self.assertRaises(Exception, plugin.process_text, 'open("/etc/passwd")') # global self.assertRaises(Exception, plugin.process_text, 'self') # local class StubUI(object): ui_type = 'stub' def __init__(self): self.notebook = tests.new_notebook() self.preferences = ConfigDict() self.uistate = ConfigDict() def connect(*a): pass def connect_after(*a): pass zim-0.60/tools/0000775000175000017500000000000012140000463013236 5ustar jaapjaap00000000000000zim-0.60/tools/extract_translator_comments.py0000755000175000017500000000324611544165551021467 0ustar jaapjaap00000000000000#!/usr/bin/python import re source_files = {} comment_re = re.compile(r'\s+#\s+T:\s+(.+)\s*$') def get_file(file): if not file in source_files: #~ print 'Extracting comments from', file source_files[file] = open(file).readlines() source_files[file].append('') return source_files[file] def extract_comment(file, line): lines = get_file(file) line -= 1 # list is 0 based match = comment_re.search(lines[line]) if match: # comment on same line return match.group(1) else: # search next line(s) for a comment i = line+1 while i < len(lines): if '_(' in lines[i] or 'gettext(' in lines[i]: break else: match = comment_re.search(lines[i]) if match: return match.group(1) i += 1 return None def extract_comments(sources): sources = [s.split(':') for s in sources] comments = [] for file, line in sources: comment = extract_comment(file, int(line)) if comment and comment not in comments: comments.append(comment) if comments: return ' | \n'.join(['#. '+c for c in comments])+'\n' else: print 'No translator comment for:' for file, line in sources: print '\t%s line %s' % (file, line) return '' def add_comments(file): messages = open(file).readlines() fh = open(file, 'w') while messages: line = messages.pop(0) if line.startswith('#: '): lines = [line] sources = line[3:].strip().split() while messages[0].startswith('#: '): line = messages.pop(0) lines.append(line) sources += line[3:].strip().split() fh.write(extract_comments(sources)) fh.writelines(lines) elif line.startswith('#. '): pass else: fh.write(line) if __name__ == '__main__': add_comments('translations/zim.pot') zim-0.60/tools/replace_in_all_files.py0000755000175000017500000000141611544165551017747 0ustar jaapjaap00000000000000#!/usr/bin/python '''Tool to replace a string in a whole bunch of files''' import os import sys def replace_in_dir(root, old, new): total = 0 for dir, dirs, files in os.walk(root): for subdir in dirs[:]: if subdir.startswith('.'): dirs.remove(subdir) for file in files: total += replace_in_file(dir+'/'+file, old, new) print '%i total in %s' % (total, root) def replace_in_file(file, old, new): fh = open(file) content = fh.read() fh.close() i = content.count(old) if i > 0: print '%i in %s' % (i, file) content = content.replace(old, new) fh = open(file, 'w') fh.write(content) fh.close() return i if __name__ == '__main__': if len(sys.argv) == 4: replace_in_dir(*sys.argv[1:]) else: print 'Usage: replace.py dir oldstring newstring' zim-0.60/tools/list_TODO_FIXME_tags.sh0000755000175000017500000000017511544165551017365 0ustar jaapjaap00000000000000#!/bin/sh grep -Rc FIXME\\\|TODO zim tests | \ grep \\.py: | \ perl -pe 's/^(.*):(.*)/$2 $1/' | \ sort -n | \ grep -v ^0 zim-0.60/tools/extract_dependencies.py0000755000175000017500000000127511544165551020017 0ustar jaapjaap00000000000000#!/usr/bin/python import os def extract_deps(file): #~ print 'Extracting from %s' % file deps = set() for line in open(file).readlines(): line = line.strip() if line.startswith('import') or line.startswith('from'): words = line.split() if words[0] == 'import' or (words[0] == 'from' and words[2] == 'import'): deps.add(words[1]) return deps def main(): deps = set() deps.update( extract_deps('zim.py') ) for dir, dirs, files in os.walk('zim/'): for file in filter(lambda f: f.endswith('.py'), files): deps.update( extract_deps(dir+'/'+file) ) deps = [d for d in deps if not d.startswith('zim')] deps.sort() for d in deps: print d if __name__ == '__main__': main() zim-0.60/tools/generate_test_notebook.py0000755000175000017500000000172111544165551020364 0ustar jaapjaap00000000000000#!/usr/bin/python import sys import os if len(sys.argv) != 4: print 'Usage: %s directory with depth' % sys.argv[0] sys.exit(1) root, width, depth = sys.argv[1:] width = int(width) depth = int(depth) assert not os.path.exists(root), 'Need new directory' name = 'some_page_%i_%i' content = '''\ Content-Type: text/x-zim-wiki Wiki-Format: zim 0.26 ====== Some Page ====== //Some test data// Foooo Bar! TODO: insert random links here ''' content += ('la la laaa'*20 + '\n') * 10 def populate_level(path, j): path += os.path.sep os.mkdir(path) d = 1 for i in range(width): myname = name % (j, i) file = path + myname + '.txt' print '>', file fh = open(file, 'w') fh.write(content) fh.close() if j < depth: d += populate_level(path + myname, j+1) return d d = populate_level(root, 0) f = d * width print 'Total %i files %i directories' % (f, d) print 'Done' zim-0.60/tools/xdot_tree.py0000755000175000017500000000173011544165551015630 0ustar jaapjaap00000000000000#!/usr/bin/python import gtk import sys sys.path.insert(0, '.') from class_tree import * from zim._lib import xdot class Graph(object): def __init__(self, dir): self.dir = dir def get_dotcode(self): text = self._code_for_module(self.dir) return 'digraph G { \n' \ 'graph [rankdir=LR]' \ 'node [shape=box fontsize=14]' \ '%s }' % text def _code_for_module(self, module): text = '"%s" [shape=ellips]' % module.name for item in module.items(): if isinstance(item, basestring): text += '\n"%s"' % item text +='\n"%s" -> "%s"' % (module.name, item) else: text += self._code_for_module(item) # recurs text +='\n"%s" -> "%s"' % (module.name, item.name) return text if __name__ == '__main__': graph = Graph(ModuleDir('./zim')) window = xdot.DotWindow() window.connect('destroy', lambda o: gtk.main_quit()) #print graph.get_dotcode() window.set_dotcode(graph.get_dotcode()) window.show_all() gtk.main() zim-0.60/tools/internationalizer.py0000755000175000017500000001341611544165551017400 0ustar jaapjaap00000000000000#!/usr/bin/python import gtk import tokenize import token import re def match_ignore(string): if string.startswith("'''"): return True # ignore docstring etc. string = string.strip('\'"') if not re.search(r'[a-zA-Z]', string): return True # ignore without any letter elif len(string) < 3: return True # ignore 'w' etc. elif re.match(r'^$', string): return True # ignore open / close XML tags elif string.startswith('zim.'): return True # module names elif string.startswith('BUG'): return True # assertion (?) elif string.startswith('TODO'): return True # assertion (?) return False ignore_functions = ('setdefault', 'connect', 'connect_after', 'connect_object', 'get_property', 'emit', 'info', 'debug', 'warn', 'exception', 'get_action') class Internationalizer(gtk.Window): def __init__(self): #~ def __init__(self, dir): gtk.Window.__init__(self) self.set_title('Internationalizer') self.set_default_size(500, 500) #~ self.dir = dir vbox = gtk.VBox() self.add(vbox) self.status_label = gtk.Label() vbox.pack_start(self.status_label, False) hbox = gtk.HBox() vbox.add(hbox) scrollwindow = gtk.ScrolledWindow() hbox.add(scrollwindow) self.textview = gtk.TextView() self.textview.set_left_margin(12) self.textview.set_right_margin(5) scrollwindow.add(self.textview) bbox = gtk.HButtonBox() vbox.pack_start(bbox, False) savebutton = gtk.Button(stock='gtk-save') savebutton.connect_object('clicked', self.__class__.save_file, self) bbox.add(savebutton) reloadbutton = gtk.Button(stock='gtk-refresh') reloadbutton.connect_object('clicked', self.__class__.reload_file, self) bbox.add(reloadbutton) nextbutton = gtk.Button(stock='gtk-forward') nextbutton.connect_object('clicked', self.__class__.next_tag, self) bbox.add(nextbutton) applybutton = gtk.Button(stock='gtk-apply') applybutton.connect_object('clicked', self.__class__.apply_mark, self) bbox.add(applybutton) def open_file(self, file): if self.textview.get_buffer().get_modified(): self.save_file() self.file = file buffer = gtk.TextBuffer() print 'Reading %s' % self.file buffer.set_text(open(self.file).read()) self.textview.set_buffer(buffer) buffer.create_tag('translated', background='green') buffer.create_tag('untranslated', background='red') buffer.create_tag('notsure', background='orange') translated, untranslated, notsure = self.tokenize() self.status_label.set_text( "%i translated, %i untranslated, %i not sure" % (len(translated), len(untranslated), len(notsure)) ) def get_iter(coord): row, col = coord row -= 1 iter = buffer.get_iter_at_line(row) iter.forward_chars(col) return iter for start, end in translated: start, end = map(get_iter, (start, end)) buffer.apply_tag_by_name('translated', start, end) for start, end in untranslated: start, end = map(get_iter, (start, end)) buffer.apply_tag_by_name('untranslated', start, end) for start, end in notsure: start, end = map(get_iter, (start, end)) buffer.apply_tag_by_name('notsure', start, end) buffer.place_cursor(buffer.get_iter_at_offset(0)) def tokenize(self): translated = [] untranslated = [] notsure = [] tokens = tokenize.generate_tokens(open(self.file).readline) reset = lambda: {'funcname': None, 'isfunc': False, 'iskey': False} state = reset() for type, string, start, end, line in tokens: if type == token.STRING: if state['isfunc'] and state['funcname'] == '_': translated.append((start, end)) elif state['iskey'] or \ (state['isfunc'] and state['funcname'] in ignore_functions) or \ match_ignore(string): notsure.append((start, end)) else: untranslated.append((start, end)) state = reset() elif type == token.NAME: state = reset() state['funcname'] = string elif type == token.OP and string == '(': state['iskey'] = False state['isfunc'] = True elif type == token.OP and string == '[': state['isfunc'] = False state['iskey'] = True else: state = reset() return translated, untranslated, notsure def save_file(self): buffer = self.textview.get_buffer() content = buffer.get_text(*buffer.get_bounds()) print 'Writing %s' % self.file open(self.file, 'w').write(content) def reload_file(self): self.open_file(self.file) def next_tag(self): '''Select the next untranslated string''' buffer = self.textview.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_insert()) tag = buffer.get_tag_table().lookup('untranslated') iter.forward_to_tag_toggle(tag) if not iter.begins_tag(tag): iter.forward_to_tag_toggle(tag) bound = iter.copy() bound.forward_to_tag_toggle(tag) buffer.select_range(iter, bound) self.textview.scroll_mark_onscreen(buffer.get_selection_bound()) self.textview.scroll_mark_onscreen(buffer.get_insert()) def apply_mark(self): '''Wrap current selected string in "_( .. )"''' buffer = self.textview.get_buffer() bounds = buffer.get_selection_bounds() if bounds: start, end = bounds else: iter = buffer.get_iter_at_mark(buffer.get_insert()) for tag in 'untranslated', 'notsure': tag = buffer.get_tag_table().lookup(tag) if iter.has_tag(tag): iter.backward_to_tag_toggle(tag) bound = iter.copy() bound.forward_to_tag_toggle(tag) start, end = iter, bound break else: return buffer.remove_all_tags(start, end) buffer.apply_tag_by_name('translated', start, end) start, end = start.get_offset(), end.get_offset() if start > end: start, end = end, start buffer.insert(buffer.get_iter_at_offset(end), ')') buffer.insert(buffer.get_iter_at_offset(start), '_(') self.next_tag() if __name__ == '__main__': import sys app = Internationalizer() app.open_file(sys.argv[1]) app.show_all() app.connect('destroy', lambda o: gtk.main_quit()) gtk.main() zim-0.60/tools/test_website.py0000755000175000017500000000061111544165551016331 0ustar jaapjaap00000000000000#!/usr/bin/python import os import subprocess from BaseHTTPServer import HTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler subprocess.call('./tools/build_website.sh') os.chdir('./html') try: server = HTTPServer(('', 8080), SimpleHTTPRequestHandler) print 'server started at http://localhost:8080' server.serve_forever() except KeyboardInterrupt: server.socket.close() zim-0.60/tools/clean.py0000755000175000017500000000136211544165551014716 0ustar jaapjaap00000000000000#!/usr/bin/python '''Tool to cleanup the source directory''' import os import sys import shutil from subprocess import Popen, PIPE def main(remove=False): pipe = Popen('bzr ls --ignored', shell=True, stdout=PIPE).stdout print 'rm *.pyc' for line in pipe.readlines(): file = line.strip() if os.path.isfile(file): if not file.endswith('.pyc'): print 'rm %s' % file if remove: os.remove(file) elif os.path.isdir(file): print 'rmtree %s' % file if remove: shutil.rmtree(file) pipe.close() if __name__ == '__main__': warning = '\n### This is a test run, use --force to really delete\n' if len(sys.argv) == 2 and sys.argv[1] == '--force': main(remove=True) else: print warning main(remove=False) print warning zim-0.60/tools/build_website.sh0000755000175000017500000000275411544165551016445 0ustar jaapjaap00000000000000#!/bin/sh rm -fr './html' ./zim.py --export ./website/pages/ -V \ --template ./website/template.html \ --output ./html/ \ --root-url / ./zim.py --export ./data/manual/ -V \ --template ./website/template.html \ --output ./html/manual/ \ --root-url / cp -R website/files/* html/ # HACKs to include raw HTML perl -i -pe 's{INSERT_SCREENCAST_HERE}{}' html/screenshots.html perl -i -pe 's{INSERT_PAYPAL_BUTTON_HERE}{
    }' html/contribute.html perl -i -pe 's{http://www.zim-wiki.org/wiki/doku.php%3Fid%3D}{http://www.zim-wiki.org/wiki/doku.php?id=}' html/contribute.html zim-0.60/tools/package_test_data.py0000755000175000017500000000251211544165551017255 0ustar jaapjaap00000000000000#!/usr/bin/python import sys sys.path.insert(0, '.') from zim.fs import * from zim.notebook import Path import zim.stores.files import zim.stores.xml def walk(store, path): for page in store.get_pagelist(path): yield page for child in walk(store, page): yield child def package(dir, file): if file.exists(): file.remove() fh = file.open('w') fh.write('\n') fh.write('\n') fh.write('\n') source = zim.stores.files.Store(None, Path(':'), dir=dir) for page in walk(source, Path(':')): if not page.hascontent: continue text = page.source.read() text = text.replace('&', '&') text = text.replace('<', '<') text = text.replace('>', '>') fh.write('\n' % page.name) fh.write(text) fh.write('\n') fh.write('\n') fh.close() def extract(file, dir): if dir.exists(): raise Exception, 'dir exists alread' assert False, 'TODO' if __name__ == '__main__': if len(sys.argv) == 4 and sys.argv[1] == '--package': package(Dir(sys.argv[2]), File(sys.argv[3])) elif len(sys.argv) == 4 and sys.argv[1] == '--extract': extract(File(sys.argv[2]), Dir(sys.argv[3])) else: print 'usage: %s --package DIR FILE\n' \ ' %s --extract FILE DIR' % (sys.argv[0], sys.argv[0]) zim-0.60/tools/import-launchpad-translations.py0000755000175000017500000000427711635111437021625 0ustar jaapjaap00000000000000#!/usr/bin/python import sys import tarfile import re MIN_TRANLATIONS = 300 def count_messages(file): return count('msgid', file) + 1 # The +1 is for the first message, which is empty and translates # with all meta data def count_translations(file): return count('msgstr', file) def count(prefix, file): count = 0 l = len(prefix) check_multiline = False # track multiline messages for line in file: if line.startswith(prefix): string = line[l:].strip().strip('"') if string: count +=1 check_multiline = False else: check_multiline = True # Can still be start of multiline block .. elif check_multiline \ and line.startswith('"'): count += 1 check_multiline = False else: check_multiline = False return count def get_lang(name): match = re.search(r'(^|[-/])(\w+).po$', name) assert match, 'Could not parse LANG from %s !?' % name return match.group(2) def import_translations_from(archive): tfile = tarfile.open(archive, 'r:gz') names = tfile.getnames() #~ print names potfiles = [n for n in names if n.endswith('.pot')] assert len(potfiles) == 1, 'Multiple template files in this archive !?' total = count_messages(tfile.extractfile(potfiles[0])) print '%i messages in catalogue' % total pofiles = [] for name in [n for n in names if n.endswith('.po')]: lang = get_lang(name) file = tfile.extractfile(name).readlines() n = count_translations(file) pofiles.append((n, lang, file)) files = [] for n, lang, file in pofiles: perc = float(n) / total * 100 if n >= MIN_TRANLATIONS: status = 'OK' files.append(('translations/%s.po' % lang, file)) else: status = '' print '%-6s %i translated (%i%%) %s' % (lang, n, perc, status) for path, file in files: print 'Writing %s' % path open(path, 'w').writelines(file) print '\nPlease check `bzr st` for newly added translations and update CHANGELOG' print 'You need to run `./setup.py build_trans` to use the newly imported po files' if __name__ == '__main__': assert len(sys.argv) == 2 and sys.argv[1].endswith('.tar.gz') import_translations_from(sys.argv[1]) import sys sys.path.insert(0, '.') from tests.translations import TestTranslations TestTranslations().runTest(verbose=True) zim-0.60/tools/dump_clipboard.py0000755000175000017500000000126711544165551016624 0ustar jaapjaap00000000000000#!/usr/bin/python '''Interactively dumps clipboard contents to stdout''' import gtk import sys clipboard = gtk.Clipboard() targets = clipboard.wait_for_targets() print "="*80 print "Enter a number to see a specific target, or to exit" print "Available targets:" for i in range(len(targets)): print i, targets[i] line = sys.stdin.readline().strip() while line: target = targets[int(line)] print '>>>>', target selection = clipboard.wait_for_contents(target) if selection: text = selection.get_text() if not text is None: print '== Text:', text else: print '== Data:', selection.data else: print '== No contents' print '<<<<' line = sys.stdin.readline().strip() zim-0.60/tools/xgettext.sh0000755000175000017500000000026611544165551015474 0ustar jaapjaap00000000000000echo 'Extracting translatable strings ...' find zim -name '*.py' | sort | xgettext -f - -o translations/zim.pot echo 'Extracting comments ...' ./tools/extract_translator_comments.py zim-0.60/tools/class_tree.py0000755000175000017500000000334511544165551015763 0ustar jaapjaap00000000000000#!/usr/bin/python import os class TextTree(object): def tostring(self, object): strings = self.tostrings(object) return ''.join(strings) def tostrings(self, object): strings = [object.name + '\n'] def add_item(item, ps1, ps2): if isinstance(item, basestring): strings.append(ps1 + item + '\n') else: substrings = self.tostrings(item) # recurs strings.append(ps1 + substrings.pop(0)) strings.extend([ps2 + s for s in substrings]) items = object.items() if items: for i in range(len(items)-1): add_item(items[i], '|-- ', '| ') add_item(items[-1], '`-- ', ' ') return strings class ModuleFile(object): def __init__(self, file): assert os.path.isfile(file), 'Could not find file: %s' % file self.file = file self.name = os.path.basename(file)[:-3] self.classes = [] for line in open(self.file): line = line.strip() if line.startswith('class') and line.endswith(':'): self.classes.append(line[5:-1].strip()) def items(self): return self.classes[:] class ModuleDir(ModuleFile): def __init__(self, dir): assert os.path.isdir(dir), 'Could not find dir: %s' % dir ModuleFile.__init__(self, dir+'/__init__.py') self.dir = dir self.name = os.path.basename(dir) self.modules = [] paths = [dir+'/'+p for p in os.listdir(dir) if not p.startswith('_')] for file in [f for f in paths if f.endswith('.py')]: self.modules.append(ModuleFile(file)) for subdir in [d for d in paths if os.path.isdir(d)]: self.modules.append(ModuleDir(subdir)) self.modules.sort(key=lambda m: m.name) def items(self): items = ModuleFile.items(self) items.extend(self.modules) return items if __name__ == '__main__': dir = ModuleDir('./zim') print TextTree().tostring(dir) zim-0.60/CHANGELOG.txt0000644000175000017500000005314712137752105014153 0ustar jaapjaap00000000000000===== Changes for zim ===== Jaap Karssenberg This branch is the Python rewrite and starts with version 0.42. Earlier version numbers for zim correspond to the Perl branch. === 0.60 - Tue 30 Apr 2013 === * In this release the required python version is changed from 2.5 to 2.6 ! * Added a Recent Changes dialog and a Recent Changes pathbar option * Added search entry to toolbar * Added function to attachment browser plugin to zoom icon size * Added new template by Robert Welch * Critical bug fix for using templates that have a resources folder * Fix for week number in Journal plugin page template (again) * Fix for focus switching with distraction free editing plugin * Fix for handling BOM character at start of file * Fixed quicknote dialog to ask for confirmation on discard * Fix to allow calling executables that do not end in .exe on windows * Fix for various typos in the manual by Stéphane Aulery * Removed custom zim.www.Server class in favor of standard library version * New translations for Korean and Norwegian Bokmal === 0.59 - Wed 23 Jan 2012 === * Critical bug fix in pageview serialization * Fix for inheritance of tags in tasklist - Epinull * Fix for customtools dialog - Epinull * Fix for week number in Journal plugin page template === 0.58 - Sat 15 Dec 2012 === * Added new plugin for distraction free fullscreen mode * Added options to limit tasklist plugin to certain namespaces - Pierre-Antoine Champin * Added option to tasklist plugin to flag non-actionable tasks by a special tag * Added prompt for filename for Insert New File action * Added template option to list attachments in export * Added class attributes to links in HTML output * Added two more commandline options to quicknote plugin * Made sidepanes more compact by embedding close buttons in widgets * Critical fix for restarting zim after a crash (cleaning up socket) * Bug fix for search queries with quoted arguments * Bug fix for use of tags in the tasklist plugin * Bug fix for wiki format to be more robust for bad links * Bug fix for latex format to not use file URIs in \includegraphics{} * Bug fix for including latex equations in latex export * Bug fix list behavior checkboxes and numbered lists * Fix first day of week locale for calendar plugin - based on patch by Leopold Schabel * Fix for handling "file:/" and "file://" URIs in links - see manual for details * Fix for windows to not open consoles for each external application - klo uo * Fix for windows to put config files under %APPDATA% - klo uo * Fix to have "update heading" toggle in rename dialog more intelligent - Virgil Dupras * Fix to make template errors report relevant error dialogs * Fix for search and replace whitespace in pageview * Various small fixes === 0.57 - Mon 8 Oct 2012 === * Ported zim background process to use the multiprocessing module - this fixes app-indicator issues under Ubuntu Unity - adds support for quicknote and other plugins on Windows * Reworked application framework and "open with" dialog, now also allows to set applications per URL scheme * New plugin for using GNU Lilypond to render music scores - Shoban Preeth * New Zeitgeist plugin - Marcel Stimberg * Added template method to iterate days of the week for a calendar page * Added pythonic syntax to access dicts to template modules * Added tasklist option to take into account a Mon-Fri work week * Fixed start of week and week number first week of the year for calendar plugin * Added "untagged" category to task list * Fixed strike out TODO label showing up in task list * Added template editor dialog * Added support for "forward" and "back" mouse buttons * Added support for exporting to ReST - Yao-Po Wang * Added new option to create and insert new attachments based on file template * Added an argument to the quicknote plugin to import attachments * Added icons per mimetype to the attachmentbrowser * Added statusbar button for attachment browser * Added monitors to watch attachment folder for updates * Fix drag&drop on non-existing folder in attachment browser * Fix drag&drop for attachment folder on windows * Made location of plugin widgets in side panes configurable and reworked key bindings for accessing side panes and toggling them * Made tags plugin to revert to standard index if no tag is selected * Page completion now matches anywhere in the basename -- patch by Mat * Patch to use sourceview in imagegenerator dialog - Kevin Chabowski * Fix for insert symbol dialog to insert without typing a space * Made image data pasted as bmp convert to png to make it more compact * Critical bug fix for version control plugin * Critical bug fix for xml.etree.TreeBuilder API for python 2.7.3 * Bug fix for exceptions in index - Fabian Moser * Bug fix for interwiki links * On windows fix for bug when home folder or user name contain non-ascii characters * Fixed help manual opens in compiled windows version * Fixed locale support on windows * Added translations for Brazilian Portuguese and Romanian === 0.56 - Mon 2 Apr 2012 === * Merged support for Git and Mercurial version control backends - Damien Accorsi & John Drinkwater * Merged plugin for "ditaa" diagrams - YPWang * Merged patch for different configuration profiles, allowing per notebook configuration of plugins, font etc. - Mariano Draghi * Added drag & drop support for the Attachment Browser plugin * Made sidepane and tagcloud remember state * Fixed critical bug for opening email adresses without "mailto:" prefix * Fixed bug where context menu for page index applied to the current page instead of the selected page * Added a Serbian translation === 0.55 - Tue 28 Feb 2012 === * Numbered lists are now supported * The index now has "natural" sorting, so "9" goes before "10" * Added new plugin to show a Table Of Contents per page, and allows modifying the outline * Added Markdown (with pandoc extensions) as an export format * New context menu item "move text" for refactoring text to a new page * Tasklist now supports a "next:" keyword to indicate dependencies, and it can hide tasks that are not yet actionable * Made zim taskbar icons and trayicon overloadable in theme - Andrei * Fixed behavior of Recent Pages pathbar in cases where part of the history is dropped * Fixed behavior of the Search dialog, it no longer hangs and also allows cancelling the search * Fixed bug where replacing a word (e.g spell correction) could drop formatting * Fixed behavior of case-sensitive rename on a case-insensitive file system (windows) === 0.54 - Thu 22 Dec 2011 === Bug fix release with minor feature enhancements * Added mono icons for the Ubuntu Unity panel * Tasklist plugin now supports hierarchic nested tasks * Added "automount" plugin to automatically mount notebook folders * Interwiki lookup now goes over all urls.list files in the path * Fixed bug that prevented clicking links in read-only mode * Fixed bug for parsing relative paths to parent pages e.g. in drag and drop * Fixed bug causing the index to jump with every page selection * Fixed bug causing the icon for custom tools to be missing in the toolbar * Fixed bug for drag and drop of files on windows * Fixed bug causing task list to reset when page is saved * Fixed autocomplete for page entry in quicknote * Fixed error in "you found a bug" error dialogs :S * Fixed issue in test suite for loading pixbufs * Added translation for Galician === 0.53 - Mon 19 Sep 2011 === * Cosmetic updates to entry widgets, the page index, the insert date dialog, and the tasklist dialog * Updated the find function to properly switch focus and highlight current match even when text does not have focus - Oliver Joos * Added function to remember the position of the main window across sessions and the position of dialog within a session - Oliver Joos * Added "interwiki keyword" to give shorthand for linking notebooks - Jiří Janoušek * Added template function to create a page index - Jiří Janoušek * Added support to include additional files with a template - Jiří Janoušek * Added preference for always setting the cursor position based on history or not * Added feature so images now can have a link target as well - Jiří Janoušek * Refactored index to do much less database commit actions, resulting in performance gain on slow storage media * Added "print to browser" button in the tasklist dialog * Added "--search" commandline option * Added feature for calendar plugin to use one page per week, month, or year instead of one page per day - Jose Orlando Pereira * Added feature to have implicit deadline for tasks defined on a calendar page - Jose Orlando Pereira * Added new plugin for evaluating inline arithmetic expressions - Patricio Paez * Added support for plugins to have optional dependencies - John Drinkwater * Added hook so plugins can register handlers for specific URL schemes * Upgraded test suite to unittest support shipped with python 2.7 * Increased test coverage for main window, dialogs, and image generator plugins * Many small typo fixes and code cleanup - Oliver Joos * Extensive updates for the developer API documentation - now using epydoc * Made file paths in config file relative to home dir where possible in order to facilitate portable version (e.g. home dir mapped to USB drive) * Build code updated to build new windows installer and support for portable install - Brendan Kidwell * Fixed build process to hardcode platform on build time (maemo version) * Fixed bug in notebook list, causing compiled version to be unable to set a default notebook (windows version) * Fixed bug with copy-pasting and drag-n-drop using relative paths * Fixed bug allowing to click checkboxes in read-only mode * Fixed several possible exceptions when moving pages * Fixed execution of python scripts on windows - Chris Liechti * Fix to preserve file attributes (like mtime) when copying attachments - Oliver Joos * Fixed path of checkbox images in html export - Jiří Janoušek * Fix for indexing error in scenario with external syncing (e.g. dropbox) * Fix for latex output to use "\textless{}" and "\textgreater{}" * Fixed Maemo window class, and python 2.5 compatibility - Miguel Angel Alvarez * Fixed unicode usage in template module - Jiří Janoušek * Fixed error handling for errors from bzr in versioncontrol plugin * Fixed error handling for errors due to non-utf-8 encoded text in pages === 0.52 - Thu 28 Apr 2011 === Bug fix release * Fixed a critical bug in the "Add Notebook" prompt for the first notebook on a fresh install and two minor bugs with the ntoebook list - Jiří Janoušek === 0.51 - Tue 19 Apr 2011 === * Fixed critical bug with resizing images - Stefan Muthers * Fixed bug preventing resizing of text entries in dialogs * Fixed bug disabling auto-completion for page names in dialogs * Fix so cancelling the preferences dialog will also reset plugins - Lisa Vitolo * Fix to switch sensitivity of items in the Edit menu on cursor position - Konstantin Baierer * Fix to handle case where document_root is inside notebook folder - Jiří Janoušek * Fixed support for interwiki links in export * Fixed "Link Map" plugin to actually support clicking on page names in the map * Fixed copy pasting to use plain text by default for external applications added preference to revert to old behavior * Disable keybinding due to conflicts with internationalization added hidden preference to get it back if desired * Added support for organizing pages by tags - Fabian Moser * Added feature to zoom font size of the page view on + / - - Konstantin Baierer * Added support for system Trash (using gio if available) * Added Calendar widget to the "Insert Date" dialog * Added plugin to sort selected lines - NorfCran * Added plugin for GNUplot plots - Alessandro Magni === 0.50 - Mon 14 Feb 2011 === Maintenance release with many bug fixes. Biggest change is the refactoring of input forms and dialogs, but this is not very visible to the user. * Added custom tool option to get wiki formatted text * Added option to Task List plugin to mix page name elements with tags * Added style config for linespacing * Cursor is now only set from history when page is accessed through history * Updated latex export for verbatim blocks and underline format * Added basic framework for plugins to add widgets to the main window * Notebook list now shows folder path and icon - Stefan Muthers * Folder last inserted image is now remembered - Stefan Muthers * Preview is now shown when selecting icons files - Stefan Muthers * Image paths are now made relative when pasting image an file - Jiří Janoušek * Image data is now accepted on the clipboard directly - Stefan Muthers * Added overview of files to be deleted to Delete Page dialog to avoid acidental deletes * Added traceback log to "You found a bug" error dialog * Fixed critical bug for windows where zim tries to write log file to a non-existing folder * Fixed critical bug where text below the page title goes missing on rename * Fixed behavior when attaching files, will no longer automatically overwrite existing file, prompt user instead - Stefan Muthers * Fixed bug when opening notebooks through an inter-wiki link * Fixed support for month and year pages in Calendar namespace * Fixed support for wiki syntax in Quick Note dialog when inserting in page * Fixed bug in Task List plugin where it did not parse checkbox lists with a label above it as documented in the manual * Fixed bug with custom template in export dialog - Jiří Janoušek * Fixed bug with style config for tab size * Fixed many more smaller bugs * Rewrote logic for indented text and bullet lists, fixes remaining glitches in indent rendering and now allow formatting per bullet type * Refactored part of the Attachment Browser plugin, no longer depends on Image Magick for thumbnailing and added action buttons * Refactored code for input forms and decoupled from Dialog class * Refactore History class to use proper Path objects * Added significants amount of test coverage for dialog and other interface elements * Package description of zim was rewritten to be more readable * Added translation for Danish === 0.49 - Tue 2 Nov 2010 === * Added experimental Attachment Browser plugin - by Thorsten Hackbarth * Added Inline Calculator plugin * Made file writing logic on windows more robust to avoid conflicts * Fixed bug with unicode characters in notebook path * Fixed 'shared' property for notebooks * Patch to update history when pages are deleted or moved - by Yelve Yakut * Patch backporting per-user site-packages dir for python 2.5 - by Jiří Janoušek * Fix for bug with spaces in links in exported HTML - by Jiří Janoušek * Fixed bug forcing empty lines after an indented section * Patch for indenting in verbatim paragraphs - by Fabian Moser * Fixed bug with unicode handling for file paths * Added names for pageindex and pageview widgets for use in gtkrc * Patch to jump to task within page - by Thomas Liebertraut * Added option for setting custom applications in the preferences * Fixed printtobrowser plugin to use proper preference for web browser * Added default application /usr/bin/open for Mac * Imporved behavior of 'Edit Source' * Added checkbox to quicknote dialog to open the new page or not * Added support for outlook:// urls and special cased mid: and cid: uris * Added translations for Hungarian, Italian and Slovak === 0.48 - Thu 22 Jul 2010 === * Added support for sub- and superscript format - by Michael Mulqueen * Updated the export dialog to an Assistant interface * Renamed "Create Note" plugin to "Quick Note" * Improved the "Quick Note" plugin to support appending to pages and support templates * Fixed webserver to be available from remote hosts and to support files and attachments * Merged support for Maemo platform with fixes for zim on a small screen - by Miguel Angel Alvarez * Updated zim icon and artwork * Several fixes for latex export - by Johannes Reinhardt * Fixed inconsistency in formatting buttons for selections * Fixed bug that prevented adding custom tools without icon * Fixed bug with deleting directories on windows * Added translations for Catalan, Croatian and Slovak === 0.47 - Sun 6 Jun 2010 === Big release with lots of new functionality but also many bug fixes * Significant performance improvements for the page index widget * Task list plugin now uses the index database to store tasks, this makes opening the dialog much faster. Also the dialog is updated on synchronous as soon as changes in the current page are saved. * Added support for "TODO" and "FIXME" tags in task list plugin, as a special case headers above checkbox lists are supported as well * Added "create note" dialog to quickly paste text into any zim notebook, it is available from the trayicon menu and can be called by a commandline switch * Support added for new "app-indicator" trayicon for Ubuntu 10.4 * Added support to start trayicon by a commandline switch * Option added to reformat wiki text on the fly (Johannes Reinhardt) * Attach file dialog can now handle multiple files at once (Johannes Reinhardt) * Layout for linkmap improved by switching to the 'fdp' renderer * Added new plugin "Insert Symbols" for inserting e.g. unicode characters * Added new plugin to insert and edit plots using GNU R (Lee Braiden) * Added scripts needed to build a windows installer and fixed various issues relating to proper operation of zim when compiled as windows executable * Added option to delete links when deleting a page or placeholder * Added option to "move" placeholder by updating links * Fixed bug with interwiki links to other notebooks * Fixed various bugs due to unicode file names on windows and non-utf8 filesystems on other platforms * Fixed bug with non-utf8 unicode in urls * Fixed bugs with calendar plugin when embedded in side pane * Fixed support for icons for custom tools * Fixed bug with indented verbatim blocks (Fabian Moser) * Added translation for Traditional Chinese === 0.46 - Wed 24 Mar 2010 === Bug fix release * Fixed critical bug preventing the creation of new pages. === 0.45 - Tue 23 Mar 2010 === This release adds several new features as well as many bug fixes. * Added possiblility to add external applications to the menu as "custom tools" * Added Latex as export format - patch by Johannes Reinhardt * Improved dependency checks for plugins - patch by Johannes Reinhardt * Improved application responsiveness by using threading for asynchronous i/o * Fixed memory leak in the index pane for large notebooks * Fixed drag-n-drop support for images * Fixed index, previous and next pages in export templates * Fixed backlinks in export templates * Improved fallback for determining mimetype without XDG support * Added translations for Hebrew, Japanese and Turkish === 0.44 - Wed 17 Feb 2010 === This release adds improved query syntax for search and several bug fixes * Implemented more advanced search syntax - see manual for details * Implemented recursive checkbox usage and recursive indenting bullet lists * Merged "Insert Link" and "Insert External Link" dialogs * Added options to insert attached images and attach inserted images * Support for recognizing image attachment on windows * Fixed bug for lower case drive letters in windows paths * Fixed bug with non-date links in the calendar namespace * Fixed bug with invalid page names during move page * Fixed bugs with unicode in search, find, task list tags, auto-linking pages and in url encoding * Several fixes in behavior of the page index widget * Added translations for Russian and Swedish === 0.43 - Sun 17 Jan 2010 === This is a bug fix release with fixes for most important issues found in 0.42 * Added update method for data format for older notebooks * Fixed bug with duplicates showing in the index * Fixed bug with indexing on first time opening a notebook * Fixed bug with format toggle buttons in the toolbar * Fixed bug with permissions for files created by zim * Fixed bug with selection for remove_link * Fixed bug with default path for document_root * Fixed bug with updating links to children of moved pages * Added strict check for illegal characters in page names * Improved PageEntry to highlight illegal page names * Improved user interaction for Edit Link and Insert Link dialogs * Trigger Find when a page is opened from the Search dialog * Allow selecting multiple tags in Task List plugin * Allow negative queries in Task List, like "not @waiting" * Checkbox icons are now included in export * Fixed import of simplejson for pyton 2.5 specific * Translations added for: English (United Kingdom), Greek and Polish === 0.42 - Sun 10 Jan 2010 === This is the first release after a complete re-write of zim in python. Functionality should be more or less similar to Perl branch version 0.28, but details may vary. Additional issues addressed in this release: * Moving a page also moves sub-pages and attachments * Deleting a page also deletes sub-pages and attachments * After deleting a page the user is moved away from that page * Wrapped lines in bullet lists are indented properly * Better desktop integration using the default webbrowser and email client * Added a web-based interface to read zim notebooks * Task List now supports tags * Distinguishing between "move page" and "rename page" * Menu actions like "Rename Page (F2)" now follow the focus and work in the side pane as well * Page title can be updated automatically when moving a page * "Link" action behaves more like inserting an object instead of applying formatting * File links are now inserted showing only the basename of the file * Dialogs spawned from another dialog will pop over it * Dialogs remember their window size * Allow user to quit individual notebooks even when the tray icon is in effect * Check for pages that are changed offline now employs MD5 sum to be more robust Translations available for: Dutch, Estonian, Czech, French, German, Korean, Ukrainian, Simplified Chinese and Spanish zim-0.60/zim.py0000755000175000017500000000456112132472704013272 0ustar jaapjaap00000000000000#!/usr/bin/python import sys import logging import os # Check if we run the correct python version try: version_info = sys.version_info assert version_info >= (2, 6) assert version_info < (3, 0) except: print >> sys.stderr, 'ERROR: zim needs python >= 2.6 (but < 3.0)' sys.exit(1) # Win32: must setup log file or it tries to write to $PROGRAMFILES # See http://www.py2exe.org/index.cgi/StderrLog if os.name == "nt" and sys.argv[0].endswith('.exe'): import tempfile dir = tempfile.gettempdir() if not os.path.isdir(dir): os.makedirs(dir) err_stream = open(dir + "\\zim.log", "w") sys.stdout = err_stream sys.stderr = err_stream # Preliminary initialization of logging because modules can throw warnings at import logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') # Init locale for windows (before loading gettext library) if os.name == "nt" and not os.environ.get('LANG'): import locale lang, enc = locale.getdefaultlocale() os.environ['LANG'] = lang + '.' + enc logging.info('Locale set to: %s', os.environ['LANG']) # Coverage support - triggered by the test suite #~ if True: #~ print 'Start coverage !' #~ import atexit #~ import coverage #~ cov = coverage.coverage(data_suffix=True, auto_data=True) #~ cov.start() #~ atexit.register(cov.stop) # Try importing our modules try: import zim import zim.config except ImportError: sys.excepthook(*sys.exc_info()) print >>sys.stderr, 'ERROR: Could not find python module files in path:' print >>sys.stderr, ' '.join(map(str, sys.path)) print >>sys.stderr, '\nTry setting PYTHONPATH' sys.exit(1) # Check if we can find our data files try: icon = zim.config.data_file('zim.png') assert not icon is None except: print >>sys.stderr, 'ERROR: Could not find data files in path:' print >>sys.stderr, ' '.join(map(str, zim.config.data_dirs())) print >>sys.stderr, '\nTry setting XDG_DATA_DIRS' sys.exit(1) # Run the application and handle some exceptions try: encoding = sys.getfilesystemencoding() # not 100% sure this is correct argv = [arg.decode(encoding) for arg in sys.argv] zim.main(argv) except zim.GetoptError, err: print >>sys.stderr, sys.argv[0]+':', err sys.exit(1) except zim.UsageError, err: print >>sys.stderr, err.msg sys.exit(1) except KeyboardInterrupt: # e.g. C while --server print >>sys.stderr, 'Interrupt' sys.exit(1) else: sys.exit(0) zim-0.60/msgfmt.py0000644000175000017500000001411211572405060013754 0ustar jaapjaap00000000000000# -*- coding: iso-8859-1 -*- # Written by Martin v. Lwis # Plural forms support added by alexander smishlajev """ Generate binary message catalog from textual translation description. This program converts a textual Uniforum-style message catalog (.po file) into a binary GNU catalog (.mo file). This is essentially the same function as the GNU msgfmt program, however, it is a simpler implementation. Usage: msgfmt.py [OPTIONS] filename.po Options: -o file --output-file=file Specify the output file to write to. If omitted, output will go to a file named filename.mo (based off the input file name). -h --help Print this message and exit. -V --version Display version information and exit. """ import sys import os import getopt import struct import array __version__ = "1.1" MESSAGES = {} def usage (ecode, msg=''): """ Print usage and msg and exit with given code. """ print >> sys.stderr, __doc__ if msg: print >> sys.stderr, msg sys.exit(ecode) def add (msgid, transtr, fuzzy): """ Add a non-fuzzy translation to the dictionary. """ global MESSAGES if not fuzzy and transtr and not transtr.startswith('\0'): MESSAGES[msgid] = transtr def generate (): """ Return the generated output. """ global MESSAGES keys = MESSAGES.keys() # the keys are sorted in the .mo file keys.sort() offsets = [] ids = strs = '' for _id in keys: # For each string, we need size and file offset. Each string is NUL # terminated; the NUL does not count into the size. offsets.append((len(ids), len(_id), len(strs), len(MESSAGES[_id]))) ids += _id + '\0' strs += MESSAGES[_id] + '\0' # The header is 7 32-bit unsigned integers. We don't use hash tables, so # the keys start right after the index tables. # translated string. keystart = 7*4+16*len(keys) # and the values start after the keys valuestart = keystart + len(ids) koffsets = [] voffsets = [] # The string table first has the list of keys, then the list of values. # Each entry has first the size of the string, then the file offset. for o1, l1, o2, l2 in offsets: koffsets += [l1, o1+keystart] voffsets += [l2, o2+valuestart] offsets = koffsets + voffsets output = struct.pack("Iiiiiii", 0x950412deL, # Magic 0, # Version len(keys), # # of entries 7*4, # start of key index 7*4+len(keys)*8, # start of value index 0, 0) # size and offset of hash table output += array.array("i", offsets).tostring() output += ids output += strs return output def make (filename, outfile): ID = 1 STR = 2 global MESSAGES MESSAGES = {} # Compute .mo name from .po name and arguments if filename.endswith('.po'): infile = filename else: infile = filename + '.po' if outfile is None: outfile = os.path.splitext(infile)[0] + '.mo' try: lines = open(infile).readlines() except IOError, msg: print >> sys.stderr, msg sys.exit(1) section = None fuzzy = 0 # Parse the catalog msgid = msgstr = '' lno = 0 for l in lines: lno += 1 # If we get a comment line after a msgstr, this is a new entry if l[0] == '#' and section == STR: add(msgid, msgstr, fuzzy) section = None fuzzy = 0 # Record a fuzzy mark if l[:2] == '#,' and (l.find('fuzzy') >= 0): fuzzy = 1 # Skip comments if l[0] == '#': continue # Start of msgid_plural section, separate from singular form with \0 if l.startswith('msgid_plural'): msgid += '\0' l = l[12:] # Now we are in a msgid section, output previous section elif l.startswith('msgid'): if section == STR: add(msgid, msgstr, fuzzy) section = ID l = l[5:] msgid = msgstr = '' # Now we are in a msgstr section elif l.startswith('msgstr'): section = STR l = l[6:] # Check for plural forms if l.startswith('['): # Separate plural forms with \0 if not l.startswith('[0]'): msgstr += '\0' # Ignore the index - must come in sequence l = l[l.index(']') + 1:] # Skip empty lines l = l.strip() if not l: continue # XXX: Does this always follow Python escape semantics? l = eval(l) if section == ID: msgid += l elif section == STR: msgstr += l else: print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \ 'before:' print >> sys.stderr, l sys.exit(1) # Add last entry if section == STR: add(msgid, msgstr, fuzzy) # Compute output output = generate() try: open(outfile,"wb").write(output) except IOError,msg: print >> sys.stderr, msg def main (): try: opts, args = getopt.getopt(sys.argv[1:], 'hVo:', ['help', 'version', 'output-file=']) except getopt.error, msg: usage(1, msg) outfile = None # parse options for opt, arg in opts: if opt in ('-h', '--help'): usage(0) elif opt in ('-V', '--version'): print >> sys.stderr, "msgfmt.py", __version__ sys.exit(0) elif opt in ('-o', '--output-file'): outfile = arg # do it if not args: print >> sys.stderr, 'No input file given' print >> sys.stderr, "Try `msgfmt --help' for more information." return for filename in args: make(filename, outfile) if __name__ == '__main__': main() zim-0.60/contrib/0000775000175000017500000000000012140000463013536 5ustar jaapjaap00000000000000zim-0.60/contrib/zim2trac.py0000644000175000017500000001153311544165551015665 0ustar jaapjaap00000000000000# -*- coding: utf-8 -*- # Copyright 2009 Pablo Angulo '''Script to export zim wiki pages to trac / mediawiki To use it, call python trac2zim.py notebook output_folder prefix where prefix is a string you put before each wiki page name. It will fill output_folder with plain text files ready to be loaded with trac-admin: trac-admin /path/to/project wiki load output_folder zim links like [[:Software:note taking:zim|zim]] are flattened to wiki entries like [Software_note_taking_zim zim]. ''' import re import sys import os #buscaCabeceras=re.compile('(={1:5})([^=]*)(={1:5})') def flatten(linkName): '''Changes a zim link, possibly with categories, to a trac link it also removes accents and other spanish special characters ''' #remove final ':' character and name=linkName[:-1] if linkName[-1]==':' else linkName return removeSpecialChars(name.replace(':','_').replace(' ','_')) def removeSpecialChars(s): '''certain trac installation reported problems with special chars other trac systems loaded all files without problem the problem is only for file names and wiki pages names, not for content ''' return s.replace('á','a').replace('é','e').replace('í','i').replace('ó','o').replace('ú','u').replace('ñ','n').replace('Á','A').replace('É','E').replace('Í','I').replace('Ó','O').replace('Ú','U').replace('Ñ','ñ') cabecera=re.compile("(={1,6})([^=\/]+?)(={1,6})") inlineVerbatim=re.compile("''([^']+?)''") #~ multilineVerbatim=re.compile("\n[\t](.+?)\n") negrita=re.compile('\*\*([^\*]+?)\*\*') italic=re.compile('\/\/([^\/\n\]]+?)\/\/') bracketedURL=re.compile('\[\[(http:\/\/[^\|]+)\|([^\|]+?)\]\]') #TODO: separar links relativos y absolutos simpleRelLink=re.compile('\[\[([^:][^\|]+?)\]\]') namedRelLink=re.compile('\[\[([^:][^\|]+?)\|([^\|]+?)\]\]') simpleAbsLink=re.compile('\[\[:([^\|]+?)\]\]') namedAbsLink=re.compile('\[\[:([^\|]+?)\|([^\|]+?)\]\]') images=re.compile('([^\{])\{\{\/(.+?)\}\}') def translate(nota,prefix1,prefix2): '''Takes a note in zim format and returns a note in trac format ''' #duplicate all line breaks nota=nota.replace('\n','\n\n') # Headings mm=cabecera.search(nota) lista=[] lastIndex=0 while mm: lista.append(nota[lastIndex:mm.start()]) gg=mm.groups() iguales=len(gg[0]) lista.append("="*(7-iguales)+gg[1]+"="*(7-iguales)) lastIndex=mm.end() mm=cabecera.search(nota,lastIndex) lista.append(nota[lastIndex:]) nota=''.join(lista) #inlineVerbatim nota=inlineVerbatim.sub("{{{\\1}}}",nota) #multiline verbatim #TODO #bold nota=negrita.sub("'''\\1'''",nota) #italic nota=italic.sub("''\\1''",nota) #bracketedURL nota = bracketedURL.sub("[\\1 \\2]",nota) #~ #simple links #~ nota=simpleLink.sub("[wiki:\\1]",nota) #~ #named links #~ nota=namedLink.sub("[wiki:\\1 \\2]",nota) #simple relative links mm=simpleRelLink.search(nota) lista=[] lastIndex=0 while mm: lista.append(nota[lastIndex:mm.start()]) gg0=mm.groups()[0] lista.append("[wiki:"+prefix1+prefix2+flatten(gg0)+" "+gg0+"]") lastIndex=mm.end() mm=simpleRelLink.search(nota,lastIndex) lista.append(nota[lastIndex:]) nota=''.join(lista) mm=simpleAbsLink.search(nota) lista=[] lastIndex=0 while mm: lista.append(nota[lastIndex:mm.start()]) gg0=mm.groups()[0] lista.append("[wiki:"+prefix1+flatten(gg0)+" "+gg0+"]") lastIndex=mm.end() mm=simpleAbsLink.search(nota,lastIndex) lista.append(nota[lastIndex:]) nota=''.join(lista) #named relativelinks mm=namedRelLink.search(nota) lista=[] lastIndex=0 while mm: lista.append(nota[lastIndex:mm.start()]) gg=mm.groups() lista.append("[wiki:"+prefix1+prefix2+flatten(gg[0])+" "+gg[1]+"]") lastIndex=mm.end() mm=namedRelLink.search(nota,lastIndex) lista.append(nota[lastIndex:]) nota=''.join(lista) #named absolute links mm=namedAbsLink.search(nota) lista=[] lastIndex=0 while mm: lista.append(nota[lastIndex:mm.start()]) gg=mm.groups() lista.append("[wiki:"+prefix1+flatten(gg[0])+" "+gg[1]+"]") lastIndex=mm.end() mm=namedAbsLink.search(nota,lastIndex) lista.append(nota[lastIndex:]) nota=''.join(lista) #lists nota=nota.replace('\n* ','\n * ') #images nota=images.sub("\\1[[Image(\\2)]]",nota) return nota def processPath(pathin,pathout,prefix1,prefix2=''): for archivo in os.listdir(pathin): fullPath=os.path.join(pathin,archivo) if archivo[-3:]=='txt': fichero=open(fullPath,mode='r') nota=fichero.read() fichero.close() nota_out=translate(nota,prefix1,prefix2) #~ nameout= prefix+"_"+archivo[:-4] if prefix else archivo[:-4] fichero=open(os.path.join(pathout,prefix1+prefix2+removeSpecialChars(archivo[:-4])),mode='w') fichero.write(nota_out) fichero.close() elif os.path.isdir(fullPath): print pathin,archivo,fullPath processPath(fullPath,pathout,prefix1,prefix2+removeSpecialChars(archivo)+"_") if __name__=='__main__': pathin=sys.argv[1] pathout=sys.argv[2] prefix=sys.argv[3] processPath(pathin,pathout,prefix) zim-0.60/man/0000775000175000017500000000000012140000463012651 5ustar jaapjaap00000000000000zim-0.60/man/zim.10000664000175000017500000000550512140000462013536 0ustar jaapjaap00000000000000.TH ZIM "1" "April 2013" "zim 0.60" "User Commands" .SH NAME zim \- A Desktop Wiki Editor .SH SYNOPSIS usage: zim [OPTIONS] [NOTEBOOK [PAGE]] or: zim \-\-server [OPTIONS] [NOTEBOOK] or: zim \-\-export [OPTIONS] NOTEBOOK [PAGE] or: zim \-\-search NOTEBOOK QUERY or: zim \-\-index [OPTIONS] NOTEBOOK or: zim \-\-plugin PLUGIN [ARGUMENTS] or: zim \-\-manual [OPTIONS] [PAGE] or: zim \-\-help .SH DESCRIPTION Zim is a graphical text editor used to maintain a collection of wiki pages. Each page can contain links to other pages, simple formatting and images. Pages are stored in a folder structure, like in an outliner, and can have attachments. Creating a new page is as easy as linking to a nonexistent page. All data is stored in plain text files with wiki formatting. Various plugins provide additional functionality, like a task list manager, an equation editor, a tray icon, and support for version control. Zim can be used to: * Keep an archive of notes * Take notes during meetings or lectures * Organize task lists * Draft blog entries and emails * Do brainstorming .SH OPTIONS General Options: \-\-gui run the editor (this is the default) \-\-server run the web server \-\-export export to a different format \-\-search run a search query on a notebook \-\-index build an index for a notebook \-\-plugin call a specific plugin function \-\-manual open the user manual \-V, \-\-verbose print information to terminal \-D, \-\-debug print debug messages \-v, \-\-version print version and exit \-h, \-\-help print this text GUI Options: \-\-list show the list with notebooks instead of opening the default notebook \-\-geometry window size and position as WxH+X+Y \-\-fullscreen start in fullscreen mode \-\-standalone start a single instance, no background process Server Options: \-\-port port to use (defaults to 8080) \-\-template name of the template to use \-\-gui run the gui wrapper for the server Export Options: \-\-format format to use (defaults to 'html') \-\-template name of the template to use \-o, \-\-output output directory \-\-root\-url url to use for the document root \-\-index\-page index page name You can use the export option to print a single page to stdout. When exporting a whole notebook you need to provide a directory. Search Options: None Index Options: \-o, \-\-output output file Try 'zim \-\-manual' for more help. .SH AUTHOR Jaap Karssenberg .SH "SEE ALSO" The full documentation for .B zim is maintained as a zim notebook. The command .IP .B zim --manual .PP should give you access to the complete manual. The website for .B zim can be found at .I http://www.zim-wiki.org zim-0.60/cgi-bin/0000775000175000017500000000000012140000463013406 5ustar jaapjaap00000000000000zim-0.60/cgi-bin/zim.cgi0000644000175000017500000000237411544165551014716 0ustar jaapjaap00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2008 Jaap Karssenberg # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. '''Default cgi-bin script for zim. In order to use this you need to copy this script to your webserver's cgi-bin directory and edit the script to set the configuration. ''' from zim.config import data_dir config = { 'notebook': data_dir('manual'), #~ 'template': 'Default.html', } import logging logging.basicConfig(level=logging.INFO) from zim.www import WWWInterface from wsgiref.handlers import CGIHandler CGIHandler().run(WWWInterface(**config)) zim-0.60/Makefile0000644000175000017500000000221611752537411013555 0ustar jaapjaap00000000000000PYTHON=`which python` DESTDIR=/ BUILDIR=$(CURDIR)/debian/zim PROJECT=zim all: $(PYTHON) setup.py build help: @echo "make - Build sources" @echo "make test - Run test suite" @echo "make install - Install on local system" @echo "make source - Create source package" @echo "make buildrpm - Generate a rpm package" @echo "make builddeb - Generate a deb package" @echo "make epydoc - Generate API docs using 'epydoc'" @echo "make clean - Get rid of scratch and byte files" source: $(PYTHON) setup.py sdist $(COMPILE) test: $(PYTHON) test.py install: $(PYTHON) setup.py install --root $(DESTDIR) $(COMPILE) buildrpm: $(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall builddeb: dpkg-buildpackage -i -I -rfakeroot $(MAKE) -f $(CURDIR)/debian/rules clean epydoc: epydoc --config ./epydoc.conf -v @echo -e '\nAPI docs are available in ./apidocs' clean: $(PYTHON) setup.py clean rm -rf build/ MANIFEST tests/tmp/ locale/ man/ xdg/hicolor test_report.html find . -name '*.pyc' -delete find . -name '*.pyo' -delete find . -name '*~' -delete rm -fr debian/zim* debian/files debian/python-module-stampdir/ zim-0.60/HACKING/0000775000175000017500000000000012140000463013142 5ustar jaapjaap00000000000000zim-0.60/HACKING/objects.dot0000644000175000017500000000074011547416315015323 0ustar jaapjaap00000000000000digraph g { node [shape = box] main [shape = diamond] cgibin [label = "cgi-bin" shape = diamond] main -> GUIClient GUIClient -> GUIDeamon -> GtkInterface GtkInterface -> Notebook Notebook -> Page Notebook -> Namespace GtkInterface -> MainWindow MainWindow -> PageView MainWindow -> PageIndex main -> Server [label = "--server"] cgibin -> Handler -> WWWInterface Server -> WWWInterface WWWInterface -> Notebook Server -> ServerWindow [label ="--gui"] } zim-0.60/HACKING/Compatibility.txt0000644000175000017500000000154611544165551016541 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Sat, 04 Apr 2009 10:53:24 +0200 ====== Compatibility ====== ===== Changes from zim < 0.42 ===== We depend on Gtk+ >= 2.6 instead of >= 2.4 === Config files === * ... * Backward compatibility with files like notebook.list / repositories.list ? * Removed profile options - use different XDG dirs if needed === Templates === * Templates now use "[%-" and "-%]" to remove linebreaks around tags === File links === * Dropped backward support for linking images in same namespace as dir with "./" now only works with "../" while "./" is reserved for attachments. * Made paths starting with '/' always refer to the document root. Absolute paths now always need the file:// syntax. (Only in the case where a notebook really doesn't have a directory will the document root default to the filesystem root.) zim-0.60/HACKING/Formats_modules.txt0000644000175000017500000000066611573240004017062 0ustar jaapjaap00000000000000 TODO: more info about writing format modules Each module in zim.formats should contains exactly one subclass of DumperClass and exactly one subclass of ParserClass (optional for export formats). This includes imports, so do not import other classes that derive from these base classes directly into the module. When zim loads the format it finds the correct parser and dumper classes by looking at the base class of each class object. zim-0.60/HACKING/Test_Suite.txt0000644000175000017500000000367111572405060016012 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-05-13T23:18:07+02:00 ====== Test Suite ====== Zim comes with a full test suite, it can be executed using the "''test.py''" script. See "''test.py --help''" for it's commandline options. It is good practice to run the full suite before committing to a development branch and especially before generating a merge request. This should ensures the new patch doesn't break any existing code. For any but the most trivial fixes test cases should be written to ensure the functionality works as designed and to avoid breaking it again at a later time. You'll surprise how often the same bug comes back after some time if there is now test case is in place to detect it. Some bugs are just waiting to happen again and again. For writing tests have a look at the existing test code or check the documentation for the "unittest" module in the python library. (For python versions < 2.7 we use the "unittest2" module, which backports some new features for older python versions.) A most useful tool for developing tests is looking at test **coverage**. When you run "''test.py''" with the "''--coverage''" option the "coverage" module will be loaded and a set of html pages will be generated in "''./coverage''". In these pages you can see line by line what code is called during the test run and what lines of code go untested. It is hard to really get to 100% coverage, but the target should be to get the coverage above at least 80% for each module. If you added e.g. a new class and wrote a test case for it have a look at the coverage to see what additional tests are needed to cover all code. Of course having full coverage is no guarantee we cover all possible inputs, but looking at coverage combined with writing tests for reported bugs makes a strong test suite. Even if the test suite only catches the most simple bugs that users would see when first using the application it is worth the effort. zim-0.60/HACKING/Usage/0000775000175000017500000000000012140000463014206 5ustar jaapjaap00000000000000zim-0.60/HACKING/Usage/Document_Editing_and_Creative_Writing.txt0000664000175000017500000000157112061675117024363 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-12-11T19:21:55+01:00 ====== Document Editing and Creative Writing ====== Created Tuesday 11 December 2012 Manual snippet (Usage) If the same notebook contains both notes on the document and the polished text it is useful to be able to only export the polished text without the notes. In order to this one can either separate notes and final text in different namespaces or one can create an "index" page listing links to all the pages that are part of the final document. That way one can make the selection in the export dialog to only export the relevant sections. MISSING: export many pages to single document -- needed for latex export document MISSING: selection in export dialog based on index page as describe above -- needed for latex export document MISSING: custom ordering in a namespace -- MUST have zim-0.60/HACKING/Ideas.txt0000644000175000017500000001004111547416315014743 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Sat, 04 Apr 2009 10:56:09 +0200 ====== Ideas ====== How about a plugin to have a quick "scratch" pad, that concats notes to a certain page + commandline option to trigger this by a desktop keybinding (more sticky note like) Or put these stickies in a special namespace, with a top level list view -> file scratch + timestamps + separator Similar integration with a special window for databse plugin would make zim into a custom address book etc. ----- Entries can now have inline icons now - see http://library.gnome.org/devel/gtk/unstable/GtkEntry.html :) Using these for browse buttons etc will be very slick. Check gtk version in form code and fallback to adding a small button behind the entry. How does a browse dialog for pages / namespaces look ?? === file links for www === When serving: * attachments should be served - link needs to be from server root * files under doc root (if any) should be served - idem * bullet icons should be served * all other files get linked as file:/// urls When exporting: * attachments should be copied - link should be reative file path from html file * doc root never needs to be copied, absolute path or use doc_root url setting * other files maybe copied or linked with absolute path == Get a self hosting documentation browser == For example './zim.py zim/' should show all modules and classes in the treeview clicking a page should show API documentation. Using the xdot view should show relations between classes. * Store that generates pydoc like output for a python source file * Commandline option to force default store ? * Link types to distinguise inheritance and collaboration == File format == Header for mtime in pages causes conflicts when merging versions :S Get rid of all headers except the content-type line defining a zim version. Move to a new extension (.wkz ?) and assign the proper mimetype and icon. Move notebook.zim to hidden ".notebook.zim" (not in .zim dir - .zim should be ignored when versioning). Add zim format version to notebook as well. When we detect older version < 0.42, prompt user to upgrade the notebook to new format and move the files around. Do automated backup first! Do we need to keep backward compat mode ?? ( Code to store the tar.gz backup can be used as well for e.g. for a backup plugin, or to publish read-only notebooks. ) == Locking == Do not use mtime or lock, even mtime fails on network drives. Use lock directory (similar to bzr) and if locked prompt user to break lock or open read-only. If detected that other process broke lock, warn user and switch to read-only. Assume single user usage, so this is only prevention. For multi-user setups need network client etc. == mtime stuff == After reading a page get the mtime and keep the original raw file in memory. When at writing timestamps do not match, calculate md5 of original in memory and of the file on disk. Only prompt user if md5 sums really do not match. This makes us more reliable for network file systems etc. == file buffers == The idea to read /write diretly from and to files from e.g. a format was a pre-mature optimalization. Adapt the Buffer object to be a in-memory buffer of an existing file. Pass file data around in memory after reading. == Daemon == Same daemon architecture as we have now. However need to maintain interface type for clients, so server and gui can have same notebook open. Need daemonclient object class and interfaceclient class. Also need a stub daemon class for stand alone and testing. == Network client == If we want to run a network version and decide to fix all the related concurency and authentication stuff the proper way would be to extend the server with the needed interfaces. E.g. plain source pages and an SQL query interface with some plain text result page. == Autoformatting == Instead of hardcoding autoformatting maintain a list of regexes and actions that is aither user editable or at least editiable from a plugin script. Implement in a generic fashion. + need to be able to enable / disable sets based on prefs zim-0.60/HACKING/Coding_Style_&_Guidelines.txt0000644000175000017500000000553111671136775020675 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-07-04T13:58:33+02:00 ====== Coding Style & Guidelines ====== See the python style guide for best practices. Some items to keep in mind: * GUI classes are only allowed to construct widgets and wire signals. Any actual manipulation of pages, notebooks etc. should go elsewhere. * Signal handlers have a method name starting with "do_" * Only use "assert" for checks that could be removed when code is stable, these statements could be optimized away * Do not rely on ''__doc__'' on run time, this data could be optimized away * Have a look e.g. at zim.parsing and zim.gui.widgets for common code snippets **Other general guidelines** * Writing test cases is good, full test coverage is better. Run "./test.py --cover" to get a coverage report. * Wait with loading modules and constructing widgets untill they are really needed, this should keep startup speed reasonable * Try to do slow operations that could be done asynchronous using the idle event, e.g loading the side pane index, or a list with search results, or even running an external command to check in a new version of a file. **Source code formatting** * I use TABs (not spaces) with a tabstop set to the equivalent of 4 spaces, (most) lines should fit within 80 character with this setting. **Documentation** * Please add at at least docstrings for each public method with a short explanation what the method does. Docstrings should be formatted using the epydoc markup style, see: http://epydoc.sourceforge.net/ * There are a few custom fields used in the zim documentation: ''' @signal: signal-name (param1, param2): description @emits: signal @implementation: must implement / optional for sub-classes ''' ===== Gtk and GObject usage ===== Zim is build on top of pygtk and pygobject. However, the classes outside the 'gui' namespace are not allowed to use the gtk libraries, and should work when only gobject is available. This potentially allows zim to run without a graphical interface, also it gives a strict boundry between UI and data layers in the class hierarchy. The exception are modules in the 'plugin' namespace, which can of course package their own UI components. However, these should check on initialization if we are running in graphical mode or not. Zim should be able to run at systems with at least Gtk+ version 2.6, however up to date systems can be expected to have at least Gtk+ version 2.20 or newer. Therefore Gtk+ 2.20 is required to use all functionality. This means that you can use features not available for Gtk < 2.20 but you should wrap them in a block that checks the Gtk version first. Critical functions that can not be disabled should not rely on Gtk > 2.6. Note that the Gtk API documentation specifies what version a function was introduced (if not specified it can be assumed to be present in all 2.x versions). zim-0.60/HACKING/Release_checklist.txt0000664000175000017500000000424711736404135017341 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-03-24T21:47:03.883720 ====== Release checklist ====== Preliminary: * Go over all bugs in the tracker to check if status is still correct, any new patches are attached * Also check bugs in the debian bug tracker * Announce to mailing list what day the release will be, so translaters can update their translations **Don't allow any last minute patches on the same day as the release -- stupid mistakes will happen and force a bug fix release the next day.** Merge translations: * Request download from launchpad * Merge it with ''tools/import-launchpad-translations.py'' Prepare the package: * Set version in ''zim/__init__.py'' * Update CHANGELOG.txt -- see `''bzr visualize''` for changes * Update debian changes -- run e.g. `''debchange -v 0.46''` * Optionally merge branch with website updates since previous release * Update version number in website downloads page Check the package: * `''./setup.py sdist''` (updates meta data etc.) * `make builddeb` and check `''lintian -Ivi ../zim_0.46_i386.changes''` * Test website with ./tools/test_website.py * Run `''make clean''` and check `''bzr st''` for any remaining build files Finalize the revision: * run ''./test.py'' for the last time * commit + tag + push Build release packages: * `''./setup.py sdist''` (updates meta data etc.) * `''make builddeb''` + `''make clean''` * ''./tools/build_website.sh'' ~~Publish to launchpad PPA:~~ * ~~debuild -S -kB3223C82~~ * ~~dput ppa:jaap.karssenberg/zim ../zim_XX_sources.changes~~ * Update build recipe for PPA with latest tag * Request build for PPA with releases Publish the release: * Upload website * Upload tar.gz and deb packages * Write release notes * Announce on freshmeat * Announce on launchpad * ~~Announce on gnome files~~ * Announce on mailing list ~~For snapshots~~ * ~~`./setup.py sdist` to update build meta data~~ * ~~debchange -v 0.50-SNASPSHOT-r359~~ * ~~debuild -S -kB3223C82~~ * ~~lintian -Ivi ../zim_0.46_i386.changes~~ * ~~dput ppa:jaap.karssenberg/zim-snapshots ../zim_XX_sources.changes~~ ~~To check version numbering is OK use: ~~ ~~dpkg --compare-versions "0.51" gt "0.50-SNAPSHOT-r345" && echo OK~~ zim-0.60/HACKING/Translation_Guidelines.txt0000664000175000017500000000114712032024232020354 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-09-30T13:08:38+02:00 ====== Translation Guidelines ====== ===== Italian ===== A few remarks for Italian contributors. Please notice that these choices were made earlier and we should respect them in order to assure consistency. It doesn't mean that they're better than others. It's a just matter of stop discussing and choosing one option instead of another. :) plugin = estensione Please... = si elimina sempre pane = pannello (non riquadro) zim = lo mettiamo sempre in maiuscolo, Zim //Mailing list post by Marco Cevoli, Aug 29, 2012// zim-0.60/HACKING/notebook.zim0000644000175000017500000000014711544165551015524 0ustar jaapjaap00000000000000[Notebook] autosave_version=0 document_root= home=:Start icon= name=HACKING slow_fs=False version=0.4 zim-0.60/HACKING/Limitations.txt0000644000175000017500000000076211544165551016223 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Sat, 04 Apr 2009 10:58:28 +0200 ====== LIMITATIONS ====== Main assumption about the whole file handling and page rendering is that files are small enough that we can load them into memory several times. This seems a valid assumption as notebooks are spread over many files. Having really huge files with contents is outside the scope of the design. If this is what you want to do, you probably need a more heavy duty text editor. zim-0.60/HACKING/Start.txt0000664000175000017500000000157512000240757015017 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== HACKING ====== These notes contains general development documentation on zim. ===== Contents ===== * [[Development tools]] * [[Coding Style & Guidelines]] * [[Signals]] * [[Writing plugins]] * [[Test Suite]] * [[Compatibility]] * [[Config Files]] * [[Limitations]] * [[Parse Tree]] * [[Release checklist]] ===== Other documentation ===== Detailed API documentation is part of the source code in the form of python doc strings. To generate a full set of API docs install "[[http://epydoc.sourceforge.net/|epydoc]]" and run "''make epydoc''" in the zim source dir And of course any information about the usage of the application can be found in the user manual which can be found in [[~/code/pyzim-trunk/data/manual|../../data/manual]]. To find information online check our website at http://zim-wiki.org zim-0.60/HACKING/Unicode.txt0000664000175000017500000000277612132472704015321 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2013-04-08T20:55:50+02:00 ====== Unicode ====== Zim uses unicode everywhere internally. ===== Encoding ===== Main interfaces where we need to encode / decode are: * File paths — platform and locale dependent — handled by ''zim/fs.py'' * File contents — default to utf-8 — handled by ''zim/fs.py'' * Gtk widgets — utf-8 — handle by ''zim/gui/widgets.py'' for standard widgets ===== Collation (sorting) ===== See ''zim/utils.py'' for unicode / locale aware sorting ===== Comparison ===== Some characters can be encoded either as a single character or as a combination of a base character with symbols above or below it. For example the Ü can be either the "U with umlaut" character, or a "U" followed by a "umlaut above previous character". While visually the same for the user these are different unicode strings that do not compare equally. There is a standard function to "normalize" unicode strings in the standard library "''unicodedata''" module. If we could standardize all strings after decoding, there would be less risk of comparisons failing. However strings identifying external resources, like file names, need to be in the same normalization as they are known to the outside world. Therefore we have to deal with normalization in specific places when comparing strings or looking up strings. Notable places to do this is: * When matching user input from a widget with a set of options * When looking up files from use input * ... ? zim-0.60/HACKING/.zim/0000775000175000017500000000000012140000463014017 5ustar jaapjaap00000000000000zim-0.60/HACKING/.zim/state.conf0000664000175000017500000000340212137752037016026 0ustar jaapjaap00000000000000[History] list=[["Start",729,null],["Writing plugins",478,null],["Coding Style & Guidelines",244,null],["Compatibility",0,null],["Config Files",0,null],["Development Tools",0,null],["Start",140,null],["Writing plugins",434,null],["Release checklist",1502,null],["Config Files",0,null],["Start",206,null],["External Applications",742,null],["Start",138,null],["Signals",1234,null],["Translation Guidelines",492,null],["Release checklist",1469,null],["Usage:Document Editing and Creative Writing",780,null],["Coding_Style_&_Guidelines",0,null],["Release checklist",818,null]] current=18 recent=[["Development Tools",0,null],["Writing plugins",434,null],["Config Files",0,null],["External Applications",742,null],["Start",206,null],["Signals",null,null],["Translation Guidelines",492,null],["Usage:Document Editing and Creative Writing",null,null],["Coding_Style_&_Guidelines",0,null],["Release checklist",null,null]] [MainWindow] windowpos=[109,320] windowsize=[1001,694] show_sidepane=True sidepane_pos=200 show_menubar=True show_menubar_fullscreen=True show_toolbar=True show_toolbar_fullscreen=False show_statusbar=True show_statusbar_fullscreen=False pathbar_type=recent pathbar_type_fullscreen=none toolbar_style=None toolbar_size=None readonly=False active_tabs=["Index",null,null,null] toggle_panes=[] left_pane=[true,200,"Index"] right_pane=[false,200,null] top_pane=[false,200,null] bottom_pane=[false,200,"Attachments"] [SpellPlugin] active=True [InsertLinkDialog] windowsize=[330,144] [RenamePageDialog] windowsize=[436,190] [AttachmentBrowserPlugin] active=False bottompane_pos=258 icon_size=64 [TagsPlugin] treeview=tagged vpane_pos=150 tagcloud_sorting=score [NewPageDialog] windowsize=[358,154] [OpenPageDialog] windowsize=[301,110] [NotebookDialog] windowsize=[500,400] zim-0.60/HACKING/.zim/index.db0000644000175000017500000003600012137752066015455 0ustar jaapjaap00000000000000SQLite format 3@ -'   ll'P c AZq0P] /wRelease checklist   5AނLTA #SLimitations   Mir 9Translation Guidelines      5A &K:- /Tasks   Ag3l 5 ;Unicode   AZq -M '_Store modules   5A{P { ?!Coding Style & Guidelines$   55u5Aӹ/EqX= !MTest Suite   5M 0U +kWriting plugins"   5AӒK5 /Ideas   Ag3l Ag3y5 ;Signals   ATQ- /Start   AP{" #zim_version0.60    "              yy "                 ";waiting"   #tag   "" ""  m@etablemetametaCREATE TABLE meta ( key TEXT, value TEXT )ktablepagespagesCREATE TABLE pages ( id INTEGER PRIMARY KEY, basename TEXT, sortkey TEXT, parent INTEGER DEFAULT '0', hascontent BOOLEAN, haschildren BOOLEAN, type INTEGER, ctime TIMESTAMP, mtime TIMESTAMP, contentkey FLOAT, childrenkey FLOAT )^ tablepagetypespagetypesCREATE TABLE pagetypes ( id INTEGER PRIMARY KEY, label TEXT )tablelinkslinksCREATE TABLE links ( source INTEGER, href INTEGER, type INTEGER, CONSTRAINT uc_LinkOnce UNIQUE (source, href, type) ) WWA)=indexsqlite_autoindex_links_1links^ tablelinktypeslinktypesCREATE TABLE linktypes ( id INTEGER PRIMARY KEY, label TEXT )]tabletagstags CREATE TABLE tags ( id INTEGER PRIMARY KEY, name TEXT, sortkey TEXT )!!Ytabletagsourcestagsources CREATE TABLE tagsources ( source INTEGER, tag INTEGER, CONSTRAINT uc_TagOnce UNIQUE (source, tag) )3 G!indexsqlite_autoindex_tagsources_1tagsources ^^FZ^E #SSavedSearch !   Ag3l Q )eSpell Checking  5 Ag3l ` 1{Database and Album        55 Ag3l E #SAttachments    Ag3l 1 5Search   Ag3l 1 5Tables   Ag3l = GTemplates   Ag3l ] /wDevelopment Tools!   5AӒKI '_Compatibility  $  Mi- /Usage    A1ޓ!= !MParse Tree   5MiU +kFormats modules    5A{P I %YConfig Files  5AӒK :c:gU! +kSynchronization$%   Ag3l U +kSeparate Window  ""   5 Ag3l '+& WiDocument Editing and Creative Writing   !"   555 5A1ޓ]% /wExport OpenOffice#  5 Ag3l I$ %YTransclusion    Ag3l A# !MParse Tree   5 Ag3l =" GTask List   5 Ag3l - /Forms  Ag3l I %YInline Latex #  5 Ag3l 9 AProfiles  Ag3l 5 ;Storage   Ag3l ) )Tags   Ag3l zim-0.60/HACKING/Parse_Tree.txt0000644000175000017500000001044711544165551015761 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Tue, 19 May 2009 19:48:40 +0200 ====== Parse Tree ====== FIXME - make rules more lax - p should be optional FIXME - add bullet and checkbox lists (+ numbered lists in proposals) This page documents the parse tree format as used in zim. This is the format all the formats should support and is also understood by the gui editor widget. The parse tree is a parse tree object that supports the xml.etree API. The root node tag always must be "**zim-tree**". Structure below consists of headings and paragraphs. Top level can not contain any text except for whitespace. Whitespace between headings and paragraphs is considered a hint but can be ignored when exporting. //Top level tags:// **h** - heading attribute //level// 1 .. 6 gives nesting can only contain text **p** - paragraph can contain text, formats, links, images and lists attribute //indent// gives indent level **tt** - verbatim paragraph con only contain text, nothing else attribute //indent// gives indent level Basically all content should be wrapped in paragraph nodes. //Available formattings:// **em** - emphasis, default rendered italic **strong** - default rendered in bold **mark** - default rendered as highlighted, alternatively underline **strike **- strike through **code** - verbatim text Formats can only contain text and links, with the exception of the **tt** format, which can only contains text. Links: **link** can contain: none text: any attrib: href: string, actual link _href-type: page | url | file | ... (if none, href not yet resolved) _href: string, resolved target, depends on type type: string, semantic type of the link //Images:// **img** text: none attrib: src: string, link as it apeared in the source (optional) file: string, absolute file name width int height: int alt: string, name / short description, used e.g. for tooltip obj-type: string, reserved for objects that render as image in the gui Captions can be implied if the image is followed directly by a paragraph without whitespace in between (so the tail of the img element is empty). In this case the exporter can render this paragraph the caption of the image. ===== Proposed extensions ===== ==== Horizontal lines ==== Allow a
    element. ==== Image links ==== How to add linking capability to images ? Either add the link as a child node of the image or merge the attributes. Alternatively we could consider clickable images an object. ==== Image captions ==== For more elaborate documents you may want to have image captions. These should start with "Image XXX:" where the images are numbered automatically. In that case you also want references, links that link these images with their text automatically updated to the right number. (How to integrate this with latex export, which does this natively ?) One way to do this is to assume that any text directly below an image is the caption, if the image is on it's own line and there is no text above the image. In the tree this is a paragraph starting with an image and the tail of the image starting with "\n". ==== Icons ==== Special case of images, instead of a image file we give a stock image name. This can be used e.g. for smileys or tags. When images can be links as well an icon that is clickable can be nice for plugin development. ==== Objects ==== Generic tag "obj" which contains arbitrary content. In the interface there is a class for each object type which can render it. For serializing it could have special code for specific formats and a generic fallback that returns some parse tree consisting of basic types. For example an equation object would have a method to put a pixbuf in the gui + override the context menu. It also would have support for latex and wiki formats, (wiki parser needs to know about it though) and the fallback gives the image, which is used e.g. in html export. Base class for object extensions could fallback to parse tree with "image not found" icon. If we want captions for objects it should work same as for images. This is something we want for tables - although maybe it should be configurable whether the caption is above or below the object per type (below for images, above for tables). Also equations can have a captions etc. zim-0.60/HACKING/Signals.txt0000664000175000017500000000251612000250154015306 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2012-07-14T11:54:59+02:00 ====== Signals ====== Keep in mind that with each "connect" an object reference is created. The reference is kept by the object that is being connected to and is only broken when that object is being destroyed. So if you do ''object_A.connect('some-signal', object_B.some_method)'' then object_B will not be destroyed as long as object_A is alive. On the other hand, if object_A is destroyed, object_B simply doesn't get any signals anymore. This seems not to be a problem when you e.g. connect a button signal within a dialog object. Reason is probably that the circular reference is broken when the dialog is destroyed. But it is a problem when e.g. a dialog connects to an external object, or a plugin connect to the main interface objects. In those cases signals need to be explicitly disconnected when you close the dialog or remove the plugin. See the ''ConnectorMixin'' class in ''zim.signals''. A special not about **connect_object**. In the Python API it looks like this method is only intended to swap the object argument when calling the callback, however in the C API it is mentioned that this method also results in an additional object reference and it has a bug in current versions with cleaning up those references. So it is better avoided. zim-0.60/HACKING/Development_Tools.txt0000644000175000017500000000222011622405211017343 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-07-12T19:09:49+02:00 ====== Development tools ====== We use the following resources to communicate on zim development" **Bug tracker:** https://bugs.launchpad.net/zim Also for feature requests **Development wiki:** http://www.zim-wiki.org/wiki/ Has e.g. the planning for some of the developers **Mailing list:** https://launchpad.net/~zim-wiki For all your questions ===== Working with Bazaar ===== The zim code is kept under version control using the bazaar version control system. See the website for documentation on using this system: http://bazaar.canonical.com/en/ The quick course, to get a copy of the zim code: ''' bzr branch lp:zim ''' To check in some changes (don't forget to give some meaningful changelog) ''' bzr add bzr commit ''' To create a patch that can be mailed: ''' bzr send -o some-description.patch ''' Alternatively you can publish your branch directly on the launchpad website and file a merge proposal. ===== Development scripts ===== When you are working with the development code check the folder "''./tools/''" for some useful scripts. zim-0.60/HACKING/Ideas/0000775000175000017500000000000012140000463014167 5ustar jaapjaap00000000000000zim-0.60/HACKING/Ideas/Templates.txt0000644000175000017500000000067411547416315016714 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 30 Jul 2009 21:37:50 +0200 ====== Templates ====== Store page templates in notebook _templates/wiki - can always extend later for global templates etc. Add drop down to "New page" dialog Add menu item "tools -> set template" which is only active when the page is not saved yet Add menu item "tools -> edit templates" just open directory - worry about UI control later zim-0.60/HACKING/Ideas/Spell_Checking.txt0000644000175000017500000000346711547416315017633 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Spell Checking ====== Created Sunday 29 November 2009 Problem: Getting language config per notebook / page / paragraph correct is difficult - most office suites this is still a sore point Solution: Instead of specifying the language determine it by heuristics * Installed dictionaries are probably the language the user is likely to use * gtkspell has access to both the dictionaries and the text buffer * Heuristics can determine language per paragraph or even per sentence. Just lookup in multiple dictionaries and take language with least errors... * Pango has function to detect begin & end of paragraph or sentence * As a further refinement e.g. quoted words can be supposed to be in an other language * Popup menu for spell suggestions should indicate the language it thinks we are using. This would properly belong in the gtkspell library, so all gtk application can benefit. Gtkspell3 is dead in the water (see mailing list archive / cvs history) - so gtkspell2 is the proper target. Gtkspell uses enchant, which manages the dictionary backends. So gtkspell is just the abstraction layer between gtktextbuffer and enchant. If we want to prototype without modifying gtkspell, we should re-implement the gtktextbuffer interaction and interface with enchant directly. Need to check if pyEnchant bindings are functional. If this works it would still be nice for the community to patch gtkspell itself as well, so others can benefit. Give Bert credits for the radical idea of getting rid of language as a document option. Note: the latest version of gtkspellcheck seems to add a menu to switch languages. This is a good idea as well, to be able to force a certain dictionary to be used. This in part removes the urgency of fixing detailed language settings in zim notebooks. zim-0.60/HACKING/Ideas/Forms.txt0000644000175000017500000000126111547416315016035 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 24 Jun 2009 23:45:10 +0200 ====== Forms ====== Created Wednesday 24 June 2009 Clearly we need per page templates. To be able to edit these from zim they should be valid wiki pages. This is possible because we can include template instructions without problem. Open issue: how to layout forms with gtk entries as input in wiki ? Maybe just consider these embedded widgets and use some kind of "insert form" menu item to create them ? Would be able to use definition lists like "author:: foo" or similar, but would not allow e.g. right aligned image next to fields. Open issue: how to set initial cursor position ? zim-0.60/HACKING/Ideas/Search.txt0000644000175000017500000000342311547416315016156 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 30 Jul 2009 22:06:16 +0200 ====== Search ====== Created Thursday 30 July 2009 * search should be able to find orphaned pages * idem for non-existent pages (linked but non existing) * allow search query for all backlinks to a namespace recursively (tags plugin) Once we have support for complex search queries we should use this to define selections of pages. These are basically saved searches. E.g. "all pages linked by ":index" or "all pages linking to :tag:favourite". * We can use selections to define a group of pages for export. * We can use selections to filer in the TODOList dialog. Typical use cases: * Look for pages matching a word * Look for page matching a word in a certain namespace * Look for back links Advanced use cases * Look for pages that are not linked from anywhere * Look for dead links Since we also want to use search queries to collect pages for export it also makes sense to be able to list all pages linked by a certain page. ===== Syntax ===== See Usage:Searching for query syntax description. Inspiration for syntax from http://xesam.org/main/XesamUserSearchLanguage Main points are: * Be easy and simple to use * Any Google-like search should do the expected * Don't cater for complex queries (hence sub-queries/braces are left out) So just 3 logical ops: AND, OR and NOT and some aliases (and, &&, +, or, ||, -). No grouping or sub-queries and only one quoting style. Only difference is that we need a space after a field selector because page names can also contain ":". For the average user the complexity allow by the current syntax will be more than enough. ===== Suggestions ===== * Use proximity to set ranking (e.g. all terms less than 20 words apart and less than 50 words apart) zim-0.60/HACKING/Ideas/Export_OpenOffice.txt0000644000175000017500000000110411547416315020321 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Export OpenOffice ====== Created Wednesday 23 December 2009 * just zip file with XML, could handle it with etree library - but even easier as plain text * use template, open zip file, look for template instructions, fill them in * Need OO specific XML output - see: http://books.evc-cit.info/odbook/book.html While at it create base class for import / export xml formats * have a map with 1-to-1 translations * allow methods for specific tags that need conversion logic * import can ignore unknown tags (optional ?) zim-0.60/HACKING/Ideas/Task_List.txt0000644000175000017500000000761011547416315016650 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Task List ====== Start by renaming TODOList to "Task List"... ---- Keep it simple, only 2 preference options: [*] Include all checkboxes in the task list [ ] Include lines by tag Tags: [TODO, FIXME ] Do not take into account headers anymore 2 use cases: 1) task management - use checkboxes 2) writing a document - use tagged lines as placeholders request to do further filtering of headings / namespaces etc. only after clear use case Index should have two signals * initialize tables * index page On initialize table add extra table for tasks On index page scan for tasks and put them in the table We trust the index to be up2date Changing preferences -> popup index needs to be rebuild do it now? yes/no Also TreeModel that maps that table - re-use code from PageIndex ?? ----- **Possible improvement for the Task List plugin for GTD flow** 1. A tree view, showing hierarchy of checkbox lists and page 2. A list view only showing outer branches which represent actionable items 3. Distinguish a tree view showing dates for the next few days 4. Support items that are waiting - tag @waiting or special checkbox icon 5. Idem tasks not yet started (waiting for previous in the list to finish) ------ How could zim and gtg integrate ? GTG: 1) Support hyperlinks to zim notes - easy 2) Use zim as a backend to store data - medium ? -> Need to check how the task XML looks 3) Adopt zim PageView for full editing capabilities - lot of work -> Probably too much work for features not really needed in gtg Zim: 1) Select text, have a action "create task", opens gtg with the text inserted in a new task -> depends on how easy it is to open GTG with this input 2) Hyperlink to GTG tasks -> depends on commandline arguments for GTG Too merge the programs apply all of the above and run from a single process, or at least connect both processes with the same deamon. For zim Task List plugin: The "create task" item would be real nice, this allows selecting a single line in a checkbox list and turn it into a "taks" sub page. (Turn checkbox into other bullet, copy text, dates etc into subpage, set type to "task") This allows turning an inbox of items into fully specified tasks and allows adding longer descriptions and more line items for subtasks etc. Selecting a list would create one task and move all other items to line items in that task. Have a "New task" dialog popup -> Project: dropdown / namespace selector - should have a "new" item -> Title: First line for selected text (max X words ?) -> Text Area - full zim page view for editing -> Calendar selectors for due date etc. -> OK / CANCEL On ok a new page with this title is saved in a specific namespace Because page is type "task" it will have the calendar selectors embedded in the ui. Since Task List would give complete hierarchy of pages with line items and task items this integrates nicely. -> Need tag plugin @tag syntax is good, add autolink for this syntax (hook from plugin) after all, tags are just links to special pages ---- >From mailing list comment: Moreover, I have a GTD suggestion to Zim. Can it add a "Show actionable tasks only" check box in the TODO list window? A task is actionable if it don't have any sub-task , or all the subtasks are finished. It could be used to determine next actionable task easily. (p.s Subtask should inherit the priority from its parent) Any comment? ---- Actually current checkbox feature works quite well too Just need an extra bullet type for "waiting" and have the todolist exclude this but add in side pane --- In list view put column with basename page in front of summary - this provides context - tooltip should show whole item Limit the max length of an item, use ellipsis (make sure filter works on full content) --- Due dates relate to tickler calendar file - incorporate these in the calendar view / pageview for calendar pages zim-0.60/HACKING/Ideas/Transclusion.txt0000644000175000017500000000341311547416315017434 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2010-02-01T21:44:14.249245 ====== Transclusion ====== Created Monday 01 February 2010 **Problem**: How to incorporate non-wiki text in a wiki page **Examples**: Embedded code snippets, with syntax highlighting Embedded views for external files, e.g. code or logs or .. **Concepts**: Embedded text: source is stored within the wiki page itself Embedded view: source is stored externally - transclusion Images are an example of external files that are viewed in the page, but are not stored in the wiki page. For the equation editor we also want embedded latex, but still render as image **Details**: Some code for including arbitrary source types, ''{{{mimetype\n...\n}}}'' Some code for including files ''{{file}}'' (like images, but for non-image mimetypes as well) Generic container for these parts in the parse tree - probably one container type for all mimetype, including images Pageview should support embedded widgets (not just pixbufs) (also wrap images in a widget ?) Any image file can be rendered by default as it is now Any text file can be rendered with a gtksourceview For included text add some methods to open the file with an external program (same as for images) Have a method to register mimetype handlers, e.g. for rendering equations Each object type also need some code for exporting, fallback to either text or image Bonus would be to detect changes in the source file and refresh the object in real time Could check on regular intervals, but maybe adds to much IO overhead **Other** Equation rendering handler would compute md5 of text and use that as basis for image name, put it in a cache directory Handler for equations should play nicely with latex export, but produce image for any other export type zim-0.60/HACKING/Ideas/Database_and_Album.txt0000644000175000017500000001053111547416315020415 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Database and Album ====== Created Wednesday 23 December 2009 Database * Both form based notebooks and album notebooks are databses * Both are record based * Image name itself is record value, but also meta data like EXIF stuff.. * Key features that make this different from other pages * Each page has a uniform set of attributes - the record columns * Some special UI layout will be needed to show these attributes * Search interface can be extended to know about these attributes * Either a column based record list or thumbnail view as browsing interface replaces index sidepane o for thumbnails left placement could work, for table it should be top * Page name becomes much less relevant - in fact only needed for matching rest of zim o key based on arbitrary ID (photo number / some other ID number) o ID needs to be and remain unique because of linking - no "rename" o name in side pane does not need to match this unique ID.. * Need to configure properties per namespace * Storage may use flat file or even db file instead of separate text files * Still want to associate free form text to make it wiki-like -- but pages can have multiple free-form text fields, with templates for the text.. * Next logical step is to have separate namespaces as "tables" and link between properties of seperate tables o From there you go to business logic, like enforce relationships ... ewww :S * In core of zim o Function to deal with property tables / forms in wiki source o Fucntion to deal with including these in HTML export o Page property to show you can not rename it - is moving allowed than ? guess not - show error after drag-drop in side pane o Side pane should support diff between real name and name to display (also do the right thing when pasting by draggin link into editor) + Or allow plugin to hide namespace from side pane ? o commandline argument to load plugin early, so it can subclass GTKInterface + e.g. PhotoAlbum interface could derive from GTKInterface, but hide some widgets and initialize a album notebook by default + but really this should be determined by the "profile" option * In plugin o Control extra widgets for a namespace - e.g. column view or thumbnail view o Control display of a single page - e.g. form or image view * Database plugin o Allow user to specify form columns and layout o Add table view above page o Add search function ? o Let user choose way to store, file per item or single file * Album plugin o Add thumbnail view o Make pages render images o Store all meta data in a flat file by default o Think about fullscreen view / slideshow o Think about using saved search to make collections and still show correct controls + Saved search is just a page with links I guess ? Or show as a namespace ? # prefer list of links, as namespace is messing with uniqueness o Think about nice gallery template to export photos to webpage * Book plugin o Build on database plugin o Add some lib to extract to ISBN numbers (which one) o Add import from list of scanned ISBN numbers + Maybe put import / export CSV in dabase plugin features * notebook property profile="photoalbum" * Makes sure photoalbum plugin is loaded * Makes sure plugin is managing root namespace * Changes MainWindow to fine tuned view for photo collection * plugin has features both use embedded in a other notebook and this "stand alone" usage + first develop stand alone use to avoid complexity So concrete to add a album application: * Write the backend for it using a flat file (XML ?) + the photo directy - allow subdirectories * Have notebook support multiple children for real and add configuration options for it * Add plugin to render pages in such a namespace differently (need hooks for this in pageview / mainwindow) o First hack is to just look at first element of parsetree to be an image - optimise later with definition table logic * Add support for profile option to kickstart plugin * Add advanced option in "new notebooks" to assign profile zim-0.60/HACKING/Ideas/Synchronization.txt0000644000175000017500000000210211547416315020143 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Synchronization ====== Created Friday 18 December 2009 Multiple ways to do synchronisation * Version control push / pull (bazaar, subversion, git ...) * rsync, unison, ... * email * webmail (e.g. gmail) * dedicated http / webdav server The first two options are preferred because we can leave all the hassle of doing the actual sync or merge to a specialized program. Would need a trigger to determine when to sync. Probably the same as for autosaving a version in version control. E.g. when leaving the program, daily, weekly, on an explicit user action. Would like a generic plugin for this similar to versioncontrol and probably integrated with it when both are loaded. THe synchronization plugin could handle various backends. Would be nice if we can syncronize by sending diffs to email. * You don't have to have a server online (and webmail accounts are cheap) * If you can send the email through HTTP including proxy settings you can work from any network without to much hassle I think bazaar can generate the diffs. zim-0.60/HACKING/Ideas/Tags.txt0000644000175000017500000000264211547416315015651 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Tags ====== One way to work with tags is to link pages to a special tag page and use back links to track all pages that have this tag. The main thing a tag plugin would do is add UI elements for this way of working. * Autocomplete tags, e.g. drop down if you type "@" with known tags * Autolink tags when they are typed * Make tag pages really special and autogenerate them with a list of links * This could be build on top of [[SavedSearch]] * Tag based side pane view to replace hierarchy view * This would mean caching tags per page in the index database * Integrate tags better in the search dialog ? * special key word - register it somewhere and use property table from [[SavedSearch]] * Integrate tags better in the Task List dialog ? * apply page tag to all tasks in that page ?? might be confusing * Add a tag cloud somewhere ? Really need good interface to browse by tag - especially for photos --- As an alternative, how about adding an entry on the bottom of the page for listing tags ? Separate them from content, but add them as special links in properties / contents Have an "+" icon that shows a popup of known tags Might work nicer -> Disadvantage is that the tags are no longer part of the text. E.g. several sections in the same page can have their own tags. If the page later gets split up, the tags go with the text, not stay with the original page. zim-0.60/HACKING/Ideas/Attachments.txt0000644000175000017500000000254411547416315017227 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Attachments ====== Created Friday 18 December 2009 Attachments live in the same folder as the notes. This limits the use of text files as attachments as zim will confuse them for pages and try to open them. Sometimes that is not an issue other times it may fail. To distinguish better between notes and attachments we could check the content, e.g. match on the header of a note. However this may have the disadvantage that we have a name conflict between page names and attachment names. Alternatively we can use a special file extension for zim (like .zim or .zim.txt). This has been discussed extensively, but no consensus reached. Also this can not for 100% exclude the possibility of conflicts. So we need to be able to deal with conflicts anyway. In that case checking page contents is not a bad idea. Would need a property for this behavior for backward compatibility. Maybe even a user visible property "all text files are pages". Useful features when we implement an attachment manager * Rename, Move, Delete * Create from template (like filebrowser) * Open with application - would need vfs or check out + modify + checkin ? Another issue with attachments is that we can generate a lot of orphaned attachments, e.g. due to the equation editor. Tool to clean up all unlinked attachments could be useful. zim-0.60/HACKING/Ideas/Parse_Tree.txt0000644000175000017500000000162011547416315016777 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Parse Tree ====== Created Wednesday 23 December 2009 Make our internal format more HTML like. Still want to keep whitespace within paragraphs - encoding every extra space, tab and newline with an extra tag seems silly. So make every paragraph like a
    
    However for spaces between paragraphs we maybe need to be more flexible - rendering html now gets too many additional 
    elements. Use hint for number of newlines like with perl version ? Have parsetree builder clean up redundant whitespace after heading etc. Wrap everything in para elements to make structure more clear. (and properly nest list elements) How about indented part within a paragraph? Probably should use generic block element for this. Now it could be seen as a separate para, what is not necessarily what we want. Also Use "i" and "b" instead of "emphasis" and "strong" ?? zim-0.60/HACKING/Ideas/Storage.txt0000644000175000017500000000203411547416315016352 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 30 Jul 2009 21:34:55 +0200 ====== Storage ====== Created Thursday 30 July 2009 Ideas for new storage formats. Also see [[Attachments]] Formatting * Markdown * Mediawiki * Dokuwiki Storage * IMap * Mediawiki remote interface ? * Dokuwiki RPC interface Alternatively any storage that can be mounted through e.g. a fuse layer will just work out of the box. But may need to adjust directory layout details for other wiki types. Pages are abstract enough that any remote storage will work. However we do not include a full file manager for attachments (yet). So to make a truly remote some work would be needed to manage remote attachments as well. So we need to be able to deal with conflicts anyway. In that case checking content is not a bad idea. Have a notebook property to flag for backward compatibility and have a user visible property "all text files are pages" so peopel can choose depending on their usage. Woudl also need a one time upgrade action for old notebooks. zim-0.60/HACKING/Ideas/Separate_Window.txt0000644000175000017500000000133711547416315020046 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Separate Window ====== Created Wednesday 23 December 2009 * Need to be able to manage multiple pageviews * make sure we handle all by signals * ui needs to track open pages instead of single page attribute -> check who accesses ui.page * pageviews should coordinate to use the same model if they open the same page * Need class for secondairy window + own menubar / toolbar definition * Need option to split the window (horizontal / vertical) - once or multiple times ? * Need to decide up front how this combines with overloading pageview for special page types Quick hack would be to have separate windows that are strictly read-only and open links in the main window. zim-0.60/HACKING/Ideas/Tables.txt0000644000175000017500000000721711547416315016170 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 ====== Tables ====== Created Thursday 07 January 2010 ===== Wiki format ===== The dokuwiki format looks quite OK - documented [[http://www.dokuwiki.org/syntax|here]]. ''' ^ Heading 1 ^ Heading 2 ^ Heading 3 ^ | Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | | Row 2 Col 1 | some colspan (note the double pipe) || | Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 | ''' ''' | ^ Heading 1 ^ Heading 2 ^ ^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 | ^ Heading 4 | no colspan this time | | ^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 | ''' Only disadvantage is that it may not be easy to parse this unambiguously from a page. Some "frame" around it ? E.g. ''' {{{Table: | Foo | Bar | Baz | | Foo | Bar | Baz | }}} ''' ===== Rendering ===== Can either be done with a gtk.TreeView or with a gtk.Table of TextViews. The later is preferred because it allows full use of formatting. On the other hand we could choose to have a TreeView based table that explicitly does not allow formatting. This sounds on-zim like, but makes implementation a lot easier. In both cases we have an object embedded into the parent pageview. THis means it needs to be recognized as such when dumping the parse tree. Also the cursor in the parent view will step "over" the table instead of into it unless we overload cursor movements. Similarly we need to do something with the tab and shift-tab key bindings to cycle the cells. Will need a full set of controls to create and modify the table layout, resize cells, delete, insert etc. etc. complicated. Can we somehow unify this with outlining lists? E.g. an embedded treeview could render lists, but not in a direct editable way. The problem here is that while the cell renderer can render almost any formatting, it doesn't do cursors. **NO**, user interface for outlining is quite different from user interface for tables. A radical different approach is to somehow control tab stops over a region and essentially consider the table more like a list with tabs in them. **NO**, this will not allow for multi line cells. Also this you can not set tabs per line, this is per region. (Also we might need some tab control to make lists render somewhat nicer.) Do we need to do rendering of the cells ourselves (in effect replace gtk.Table with a custom widget) ? Probable it will be difficult to force exact cell sizes on a cell unless we do this. But as long as we assume people insert their own line breaks it is OK. See gtk.TextView.set_accepts_tab for fixing tabbing between cells. Benchmark showed textview is not so memory heavy as one might think. Of course Treeview based is lighter... ===== Open issues ===== * What are the primary use cases ? little text per cell (number, items etc.) or full formatting per cell ? * Let's assume it should be free-form, but not huge (we have spreadsheet programs for that) * Do we need / want table headings ? Seems nice to have them for structuring content, but would complicate setting text styles for those cells. If we do probably overriding the format in those cells is the way to go. * Do we want rowspan / colspan ? We can allow it when based on a gtk.Table object, but does it add much ? Well, it does allow for nice spanning headers. But also adds more complexity. * What happens when you paste a heading into a table - or a table into a table ?? * Prevent this one way or the other, only allow inline formats and images ==== Related ==== * To avoid people mis-purposing tables, make a widget for images setting the caption in a box below the image. zim-0.60/HACKING/Ideas/Profiles.txt0000644000175000017500000000100711547416315016530 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 06 Aug 2009 18:40:25 +0200 ====== Profiles ====== Created Thursday 06 August 2009 If we want preferences per notebook the right way to go would be by using profiles. This allows grouping notebooks which will share the same preferences set. Also different users can still have different preferences for the same notebook. * notebook has a "profile" name * each profiles has it's own preferences file * if the profiles doesn't exist, copy default zim-0.60/HACKING/Ideas/Inline_Latex.txt0000644000175000017500000000307611547416315017330 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Unknown ====== Inline latex ====== Created Tuesday 24 March 2009 Need support for inline objects that render images on the fly Object contains latex code, takes MD5, does a lookup in .zim/images/ If the image does not exist it is generated by calling latex and dvi2png and saves under MD5 Same can be done for equation edited with the equation editor Advantage is that copying an equation will do the copy on write for the image automatically. Define a cleaning action, e.g. when re-building the index, which removes all these cached images Also when editing with the editor it can clean up previous image (even if it is used elsewhere it will be re-created anyway when needed) Same appraoch can be used for e.g. for graphs and diagrams. Abstract the generator such that same editor dialog can serve for different inline formats Editor should use gtksourceview when available... Alternative the editor should allow saving as an external file by specifying a name, link as object, not as image. But allow image link for backward compatibility. Also for external files we can save the image by MD5 sum. * How to mark inline blocks in the wiki source ? * Support "$$ ... $$" for latex formulas ? * Support some block construct like "''{{{ latex\n ... \n}}}\n''" * distuinguise from block of latex for syntax highlighting ... * research wikipedia and creole syntax for such a block * How to trigger image generation when rendering the page ? * How to trigger image generation or copying when e.g. exporting to HTML ? zim-0.60/HACKING/Ideas/SavedSearch.txt0000644000175000017500000000254511547416315017145 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 30 Jul 2009 21:37:25 +0200 ====== SavedSearch ====== Created Thursday 30 July 2009 Saved Search would be generic interface used for e.g. by [[Task List]] plugin or a [[Tags]] plugin. It would use a table in the index database to account which page matches what search. This table would be updated all the time by hooking the queries into updates of the database. Need a way to hook query objects to the index update routines and then get pages that matched the query from the index. As a seperate feature it would be nice to have special pages, which are read-only and have links to all matches. Or should this go into a special UI element, e.g. in the side pane ? ===== Implementation ===== * Add two tables * one joining page ids and property ids * one mapping property names to ids * Have a method to register queries versus * Each query determines the match for a single property name * Optimise search to use these properties * Special keyword E.g. the task list could register the "has_tasks" property, or even "has_tasks" and "has_open_tasks" And the tags plugin could register a property "tag_foo" for a tag "@foo". Special saved search pages would have a property name like "matches_search001" etc. In SQL we can query multiple properties at the same time using the "INTERSECT" operator. zim-0.60/HACKING/Store_modules.txt0000644000175000017500000000053411573240004016535 0ustar jaapjaap00000000000000 TODO: more info about writing format modules Each module in zim.stores should contains exactly one subclass of StoreClass. This includes imports, so do not import other classes that derive from this base class directly into the module. When zim loads the store it finds the correct store class by looking at the base class of each class object. zim-0.60/HACKING/Writing_plugins.txt0000644000175000017500000001152011622405211017070 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Wed, 24 Jun 2009 23:42:30 +0200 ====== Writing plugins ====== This page collects random notes on writing plugins. **NOTE:** Under the GPL license used for distributing this program all plugins should also be licensed under the GPL. A closed source plugin extension is not allowed. A plugin is allowed to call any non-GPL program as long as the plugin itself is under GPL and the non-GPL program runs as a separate process with a clearly defined inter process communication interface. ===== Topics: ===== ==== What does a plugin look like ==== A plugin is just a python module that is a sub-module of ''zim.plugins'' . It should contain exactly one class that is a subclass of the base class "''PluginClass''". When zim loads a plugin a instance of this sub-class is created and attached to the main application object. From there it can access most other parts of the object structure that drives the application. Since a plugin is just a sub-module of "''zim.plugins''" a plugin is installed by placing it in any folder in the python path that maps to the "''zim.plugins''" module. So for example you can put them directly in "''./zim/plugins''" in the source code. When installing a plugin locally you may want to put it in the "[[http://docs.python.org/whatsnew/2.6.html#pep-370-per-user-site-packages-directory|per user site packages directory]]". If (after restarting) zim detects the new plugin it will show up in the plugins tab of the preferences dialog. See the API documentation for "''zim.plugins''" for all the implementation details of the plugin class. Of course the quickest way to get started is to take an existing plugin that does something you want to do as well and copy it, then start modifying it to suit your needs. TODO: we may want a system in the future where plugins can be packaged as zip files and installed by dropping the zip file in a place like "''.local/share/zim/plugins''" ==== Plugin Info ==== Each plugin object should have an attribute "''plugin_info''" which is a dict with basic information about the plugin such as the name, the author and a short description. This info is displayed to the user in the preferences dialog. ==== How to use preferences ==== The "''preferences''" attribute of the plugin holds a dict with preferences that are global for all zim instances. Typically these are editable by the customer in the preferences dialog. However to make preferences show up in the user interface they should be defined in the "''plugin_preferences''" attribute, which has some basic info like the name, a description, a type and a default value for each preference. ==== How to use uistate ==== The "''uistate''" attribute of the plugin holds a dict which is intended to keep a persistent state for a specific notebook. You may use it for example to store that last folder the user opened so next time you can start at the same place - or you can put the window size of a dialog in it. ==== How to add menu items ==== The menu bar and the toolbar in zim are managed by a Gtk UIManager. This construct consists of two parts: 1) a piece of XML that defines what items should show up in which menu or at which place in the toolbar and 2) a definition of "actions" which gives the description, icon, keybinding, etc. for each menu item. Zim has a wrapper for this that hooks each "action" to a method of the plugin object with the same name. See the PrintToBrowser plugin for a very simple plugin that just defines one menu item. To get a view of the whole menu structure have a look at ''./data/menubar.xml''. ==== How to call a plugin from the commandline ==== For interprocess communication it is nice if a plugin can be called externally. This for example used by the Quicknote and TrayIcon plugins that are shipped with zim which both have a few commandline options (see the user manual). To make it possible to call a plugin from the commandline the plugin module should define a "''main()''" function. When zim is called with "''zim --plugin pluginname''" this main function is called. This ''main()'' method is called directly in the new process. If you want to connect to a running instance of zim the plugin should load the daemon interface itself. See the TrayIcon plugin for an example. ==== How to package ==== TODO: At this moment we have no standard way for packagin plugins ==== Manual page ==== Each plugin should have it's own page in the user manual that explains what it does and how to use it. Please write it before proposing your plugin to be included in the main package. ==== Unit testing ==== As stated in the guidelines [[Test Suite|unittesting]] is good. Please try to write some test cases for your plugin before proposing it to be included in the main package. Other developers may not use your plugin, so if it breaks later on it may go undetected unless there is a test case for it. zim-0.60/HACKING/Config_Files.txt0000644000175000017500000000376011622405211016242 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Thu, 09 Apr 2009 21:23:30 +0200 ====== Config Files ====== Zim uses several config files for different kinds of data: **XDG_CONFIG_HOME/zim/preferences.conf** This file is used for all kinds of settings that are constant across notebooks. Mainly contains the contents of the "preferences" dialog and some hidden settings. Can be accessed in the code as ... FIXME If this file does not exist a default will be looked for first in the XDG_CONFIG_DIRS and then in the XDG_DATA_DIRS. **NOTEBOOK/notebook.zim** Used to save notebook specific settings. This file has the same format as the other ".conf" files, but the extension ".zim" is used so we can have our own mimetype (application/x-zim-notebook). When we configure zim as the default application for this mimetype we get to open notebooks by clicking on this file in the notebook. Can be accessed in the code as ... FIXME **NOTEBOOK/.zim/state.conf** Used for state parameters that are specific per notebook but do not belong to the notebook configuration. E.g. the window size, the last template used for export etc. We want to keep these out of notebook.zim because when the notebook is for example under version control, we do not want notebook.conf to change after every usage of zim. Can be accessed in the code as ... FIXME The files in NOTEBOOK/.zim/ can also be saved in XDG_CACHE/notebook_path/ when the notebook is read-only. **XDG_CONFIG_HOME/zim/accelmap** Specifies the key bindings for menu items if these are customized. Format is a scheme variant used byt gtk. can be loaded and saved by ''gtk.accel_map_load()'' and ''gtk.accel_map_save()'' respectively. If this file does not exist a default will be looked for first in the XDG_CONFIG_DIRS and then in the XDG_DATA_DIRS. **XDG_CONFIG_HOME/zim/style.conf** Specifies the look of the various text styles in the GUI. If this file does not exist a default will be looked for first in the XDG_CONFIG_DIRS and then in the XDG_DATA_DIRS. zim-0.60/HACKING/Tasks.txt0000644000175000017500000000534711547416315015020 0ustar jaapjaap00000000000000Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: Sat, 04 Apr 2009 10:54:39 +0200 ====== Tasks ====== **Also grep for TODO and FIXME tags in the code** == Packaging == [ ] Build windows installer (with or without Python + Gtk included) [ ] Update manual (check sections that were copied from perl version and TODO tags) == Defects & Missing Features == [ ] Pageview: Para indenting tags and bullet offset tags need to be split up [ ] WWW: check resolving of files and icons for web server * Add extra check that no files outside allowed directories are served [ ] Implement Fuse filesystem plugins for auto-mounting sshfs / encfs / .. * Preferences dialog should have list of mount points [ ] Make server gui also use the daemon == New Features == [*] Add custom commands in tools menu Custom Commands [ ] Add search selection in export [ ] Pageview: menu controls to indent / unindent / move up move down a list item * Check emission of indent-changed signal to set state of buttons * Also think about keybindings for moving a line up / down or top / bottom [ ] Pageview: support numbered lists [ ] Moving page should try to merge if namespace already exists * Prompt + check recursively no children conflict before attempt [ ] Implement "Open with custom command" dialog [ ] Implement zip and tar.gz notebooks [ ] Implement gjots notebooks [ ] WWW: Implement a '--public' option + add checkbox in GUI to allow remote connections (default localhost only) [ ] Calendar needs to register additional template methods in order to refine it's template [ ] Templates: setting to determing use of
    elements (default yes) [ ] Templates: need settings to enforce level of headings in output * see ParseTree.cleanup_headings() - needs test [ ] Templates: Need [% FOREACH section %] statement to export multiple zim pages to a single output [ ] Exporter: Need to support exporting multiple zim pages to a single output [ ] Templates: Need option to split body on H1 and HR * Needed for S5 output - multiple slides in one page * Also want to be able to control headings per slide [*] Templates: Add the option to include special pages into the template, e.g. index page [ ] Pageview: add support for arbitrary widgets, so we can have objects * Also wrap pixbufs into widgets so we can set tooltips etc. [ ] Add iconview with attachments at botton of pageview * Use an expander or similar to show / hide [ ] Archive function as an alternative to delete - put it in a special namespace + add timestamp to page name [ ] Allow multiple pageviews to be active, e.g. in separate windows, tabs * Share TextBuffers between pageviews - ref count on ui object owning the parse tree ? * add menus and toolbars to separate windows * remember state (and history ?) per window zim-0.60/translations/0000775000175000017500000000000012140000463014617 5ustar jaapjaap00000000000000zim-0.60/translations/sr.po0000664000175000017500000023665512137750055015643 0ustar jaapjaap00000000000000# Serbian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: Иван Старчевић \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Покретање програма није успело: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "враћено је излазно стање%(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Подразумевано" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Нема такве датотеке: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Није могуће прочитати: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "То обично значи да датотека садржи неважеће знаке" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Детаљи" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Отвори са „%s“" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Назив:" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Наредба" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Отвори датотеку" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Отвори фасциклу" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Избриши датотеку" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Избриши" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Избор" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Назив датотеке" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Страна" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Почисти прилоге" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Обрни избор" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Следеће датотеке нису повезане ни са чим у бележници,\n" "иако се налазе у фасцикли за прилоге. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Напуштене датотеке није могуће наћи" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Прилагођене алатке" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Можете да подесите жељене алате које ће се појавити\n" " на траци са алаткама или падајућем изборнику." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Уреди прилагођене алатке" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Опис" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Икона" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Команда не мења податке" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Прикажи у алатној траци" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Извези" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Ажурирање индекса" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Постоји фасцикла: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Фасцикла већ постоји и има садржај, извоз у ову фасциклу могу заменити " "постојеће датотеке. Да ли желите да наставите?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Извожење бележнице" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Датотека постоји" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Ова датотека већ постоји.\n" "Желите да је замените?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Изаберите странице за извоз" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Целокупна _бележница" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Појединачна _страница" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Изаберите формат за извоз" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Остало..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Формат" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Шаблон" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Повежи датотеке под главним документом са пуном путањом датотеке" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Пресликај главни документ у УРЛ адресу" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Изаберите излазну датотеку или фасциклу" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Излазна фасцикла" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Показатељ стране" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Излазна датотека" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Преглед" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Приказ _евиденције" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Грешкa приликом стварања слике.\n" "Да ли желите да сачувате ипак изворни текст?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Датотека евиденције" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Датотека" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Уреди" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Приказ" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Уметни" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Претражи" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "Фор_мат" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Алатке" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Иди" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Помоћ" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Трака _путање" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Алатна трака" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Нова страница..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Нова под_страница..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Отворите другу бележницу..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Отвори у новом _прозору" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Увези страницу..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Сачувај" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Сачувај _копију..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "И_звези..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Пошаљи у..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Премести страницу..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Преименуј страницу..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Избриши страницу" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Својс_тва" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Затвори" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Изађи" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Тражи..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Претрага _повратне везе..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "По_ставке" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Поново учитај" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Отвори фасциклу _прилога" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Отвори _фасциклу бележнице" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Отвори _главни документ" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Отвори _фасциклу докумената" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Приложи _датотеку" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Приложи спољну датотеку" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Почисти прилоге" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Уреди _извор" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Покрени _веб послужитеља" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Ажурирај индекс" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Прилагођене _алатке" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Назад" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Иди страницу назад" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Проследи" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Иди на страницу напред" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Надређени" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Иди на надређену страну" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Подређено" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Иди на подређену страну" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Предходна у индексу" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Иди на претходну страну" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Следећа у индексу" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Иди на следећу страну" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Почетна" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Иди на почетну" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Пређи на..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Садржај" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_ЧПП" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Тастатурне пречице" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Грешке" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_О програму" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Статусна трака" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Цео екран" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Уређивање _бележнице" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Укључи уређивање бележнице" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Ништа" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Недавне странице" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Историјат" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "И_менску простор" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Иконе _и текст" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "_Само иконе" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Само текст" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Велике иконе" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Мале иконе" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Сићушне иконе" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Додај 'tearoff' траке за изборнике" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Користи <Размак> за пребацивање у бочно окно" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Уклоните везе приликом брисања странице" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Увек користи последњу позицију показивача приликом отварања странице" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Нема такве датотеке или фасцикле: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Претрага" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Желите надоградити бележницу?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Надоградња бележнице" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Ажурирање везе" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Уклањање везе" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Желите направити фасциклу?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Није могуће отворити: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Ова страница нема фасциклу прилога" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Уређивање датотеке: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Ви уређујете датотеку у спољашњој апликацији. Затворите овај дијалог након " "измене" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Википедија - радна површина" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Vladimir Lazic https://launchpad.net/~vlazic\n" " Иван Старчевић https://launchpad.net/~ivanstar61" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Индекс" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "само за читање" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Повратна веза..." msgstr[1] "%i _Повратне везе..." msgstr[2] "%i _Повратних веза..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Није могуће сачувати страницу: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Одбаци измене" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Сачувај копију" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Скочи на" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Скочи на страницу" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Нова подстрана" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Нова страница" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Име стране" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Шаблон стране" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Страна постоји" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Сачувај копију" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Увези страну" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Текстуалне датотеке" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Премести страницу" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Премести страницу \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Ажурирај %i страницу која је повезана на ту страницу" msgstr[1] "Ажурирај %i странице које су повезане на ту страницу" msgstr[2] "Ажурирај %i страница које су повезане на ту страницу" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Именски простор" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Преименуј страну" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Преименуј страну \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Ажурирајте заглавље ове странице" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Обриши страну" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Избриши страницу \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Уклони везе са %i страницe које су повезане на ову страницу" msgstr[1] "Уклони везе са %i страницe које су повезане на ову страницу" msgstr[2] "Уклони везе са %i страницa које су повезане на ову страницу" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i датотека ће бити обрисана" msgstr[1] "%i датотеке ће бити обрисане" msgstr[2] "%i датотека ће бити обрисано" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Приложи датотеку" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Страница \"%s\" нема фасциклу за прилоге" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Уметни слике као везе" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Бележница" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Отвори бележницу" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Подразумевана бележница" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Додај бележницу" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Изаберите име и фасциклу за бележницу." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "фасцикла" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Ажурирање индекса..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Опозови" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Понови" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "И_сеци" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Умножи" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Налепи" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Обриши" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Пребаци поље за избор 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Пребаци поље за избор 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Уреди везу или објекат..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Уклони везу" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Датум и време..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Слика..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Нумерисани списак" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Текст из_ датотеке..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Веза..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Убаци везу" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Очисти форматирање" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Нађи..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Пронађи сле_деће" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Пронађи пре_тходно" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Замени..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Бројање речи..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Увећај" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "У_мањи" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Уобичајена величина" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Заглавље _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Заглавље 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Заглавље _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Заглавље 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Заглавље _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Заглавље 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Заглавље _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Заглавље 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Заглавље _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Заглавље 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Јако" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Јако" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Наглашавање" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Наглашавање" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Означи" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Означи" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Прецртај" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Прецртај" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Под-пис" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Над-пис" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Прикажи курсор на страници која се не може изменити" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Аутоматски претвори путање датотека у везе" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Потврда поља за избор ће такође променити под-ставке" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Преобликуј Вики ознаке у лету" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Подразумевани формат за копирање текста у остави" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Умножи _као..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Премести изабрани текст..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Уреди својства" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Уреди везу" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Умножи _везу" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Умножи е-адресу" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Отвори помоћу..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Отвори" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Уметни датум и време" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Календар" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Повежи на датум" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Уметни слику" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Прво приложи слику" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Тип датотеке није подржан: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Уреди слику" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Место" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Веза до" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Ширина" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Висина" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Поново постави величину" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Уметни текст из датотеке" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Уреди везу" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Веза" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Текст" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Следеће" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Претходно" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Цела _реч" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Правилан израз" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Означено" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Пронађи" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Могућности" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Нађи и замени" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Текст за претрагу" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Замени са" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Замени" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Замени _све" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Број речи" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Пасус" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Речи" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Редови" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Знакови" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Премести текст на другу страницу" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Премести" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Премести текст у" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Оставите везу ка новој страници" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Отвори нову страницу" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Сучеље" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Уређивање" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Поставке" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Додаци" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Користи жељени словолик" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Још" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "П_одеси" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Зависности" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Нема зависности" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "У реду" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Није успело" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "По избору" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Аутор" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Укључено" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Додатак" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Подеси додатак" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Могућности додатка %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Својства" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Својства бележнице" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Резултат" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Послужитељ није покренут" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Прикључак" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Послужитељ је покренут" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Послужитељ је заустављен" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Изаберите датотеку" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Прошири _све" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Скупи све" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Очисти" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Изабери фасциклу" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Изаберите слику" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "<Врх>" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Све датотеке" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Слике" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Датотека постоји" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Преглед" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Замени" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Није могуће наћи датотеку или фасциклу за ову бележницу" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Није могуће пронаћи бележницу: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Датој страници не важи име\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Неважеће име странице \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Није могуће изменити страницу: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Почетна страница" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Главни документ" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Профил" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Дељена бележница" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Аритметика" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Аритметика" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Прегледач прилога" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Прилози" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Непознато" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Величина" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Измењено" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Премести овде" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Умножи овде" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Откажи" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Аутоматско монтирање" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Да_нас" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Кале_ндар" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Дан" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Седмица" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Месец" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Година" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Прикажи календар у бочном окну уместо као дијалог" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Користи за сваку страну" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Календар" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Данас" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Диа_грам" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Уметни дијаграм" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Уметни дијаграм" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Уреди дијаграм" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Уметни ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Уметни Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Уреди Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "Ј_едначина..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Уметни једначину" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Уметни једначину" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Уреди једначину" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Уметни Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Уреди Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Није могуће анализирати израз" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Си_мбол..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Убаци симбол" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Разврстај линије" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Разврстач линија" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Print to Browser" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Брза белешка ..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Брза белешка" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Направи нову страну за сваку белешку" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Наслов" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Отвори _страницу" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Снимак екрана..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Уметни снимак екрана" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Снимак целог екрана" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Изабери прозор или област" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Кашњење" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "секунде" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Провера правописа" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Садржај" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Снизи" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Унапреди" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "необележено" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Поређај по алфабету" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Поређај странице по ознакама" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Ознаке" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Списак задатака" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Филтер" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Прикажи само одговарајуће задатке" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i отворена ставка" msgstr[1] "%i отворене ставке" msgstr[2] "%i отворених ставки" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Сви задаци" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Задатак" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Датум" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Икона у палети" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Брза белешка..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Остало..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Бележнице" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "с_ачувај ово издање..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Издања..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Нема промена од последњег издања" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Тржница" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Издање за проверу" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Сачувај ово издање" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Унесете коментар за ово издање" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Издања" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Страна" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Коментар" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Врати издање" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Прикажи _промене" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Страна по страна" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Промене" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Уређивач текста" #~ msgid "Pages" #~ msgstr "Странице" #~ msgid "Web browser" #~ msgstr "Интернет прегледач" #~ msgid "File browser" #~ msgstr "Прегледач датотека" #~ msgid "Email client" #~ msgstr "Корисник е-поште" zim-0.60/translations/ru.po0000644000175000017500000030557412137750055015640 0ustar jaapjaap00000000000000# Russian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-23 21:30+0000\n" "Last-Translator: DIG \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Не удалось запустить приложение: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "вернула ненулевой статус выхода %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Ошибка запуска %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "По умолчанию" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Файл %s не найден" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Не удалось прочитать: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Это обычно означает, что файл содержит некорректные символы" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Подробности" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Файл %s защищён от записи" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Файл %s на диске изменён" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Настроить..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Приложений не найдено" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Открыть с помощью «%s»" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Настройка приложения для открывания ссылок \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Настройка приложения для открывания файлов\n" "типа \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Настройка приложений" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Добавить приложение" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Настройка по умолчанию (системная)" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Имя" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Команда" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Сделать приложением по умолчанию" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Открыть файл" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Открыть папку" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Удалить файл" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Удалить" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Выделение" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Имя файла" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Страница" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Очистка вложений" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Инвертировать выделение" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Перечисленные ниже файлы не связаны ни с чем в блокноте, \n" "хотя находятся в папке для вложений. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Брошенные файлы не найдены." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Внешние инструменты" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Вы можете настроить внешние инструменты, которые затем \n" "будут отображаться на панели инструментов или в контекстном меню." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Редактирование внешнего инструмента" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Описание" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Значок" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Команда не изменяет данные" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Показывать на панели инструментов" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Следующие выражения могут быть использованы\n" "в строке «Команда»:\n" "\n" "%f исходный код страницы как временный файл\n" "%d папка с вложениями текущей страницы\n" "%s реальный исходный код страницы (если есть)\n" "%n путь к блокноту (файл или каталог)\n" "%D корневая папка документа (если есть)\n" "%t выделенный текст или слово под курсором\n" "%T выделенный текст с wiki-форматированием\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Экспорт" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Обновление содержания" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Папка существует: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Папка уже существует и содержит данные. Экспорт в нее может привести к " "перезаписи существующих файлов. Продолжить?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Экспорт записей блокнота" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Файл существует" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Этот файл уже существует.\n" "Заменить?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Выберите страницы для экспорта" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Блокнот _целиком" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Одна _страница" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Выберите формат для экспорта" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Другой..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Формат" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Шаблон" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Использовать полный путь для файлов" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Преобразовать путь к корневой папке документов в URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Выберите выходной файл или папку" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Выходная папка" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Главная страница" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Выходной файл" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Предварительный просмотр" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Просмотреть _журнал" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Во время генерации изображения возникла ошибка.\n" "Всё равно сохранить исходный текст?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Журнал" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Файл" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Правка" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Вид" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Вставка" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "П_оиск" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Формат" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Инструменты" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "Пере_ход" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Справка" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Панель _адреса" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Панель _инструментов" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Создать страницу…" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Создать _подстраницу…" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Открыть другой блокнот…" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Открыть в _новом окне" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Импорт страницы…" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "Со_хранить" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Сохранить коп_ию…" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Экспорт…" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Отправить…" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Переместить страницу…" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Пере_именовать страницу…" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Удалить страницу" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Свойства…" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Закрыть" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "В_ыход" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Найти..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Найти _ссылки..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Недавние изменения..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Копировать _адрес" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Шаблоны" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Параметры" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Обновить" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Открыть папку с вложениями" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Открыть папку _блокнота" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Открыть корневую папку документов" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Открыть папку документа" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Вложить _файл…" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Вложить внешний файл" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Очистить вложения" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Редактировать _исходный текст" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Запустить _веб-сервер…" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Обновить индекс" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "В_нешние инструменты…" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "На_зад" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Перейти к предыдущей странице" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "В_перед" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Перейти к следующей странице" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "Уровнем _выше" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Перейти на уровень выше" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "Уровнем _ниже" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Перейти на уровень ниже" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Назад по содержанию" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Перейти к предыдущей странице" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Вперед по содержанию" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Перейти к следующей странице" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Домашняя страница" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Перейти к домашней странице" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Пере_йти к…" #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "Со_держание" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_Часто задаваемые вопросы" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Горячие клавиши" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "О_шибки" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_О программе" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Все панели" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Показать все панели" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Строка состояния" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Боковые панели" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Показать боковые панели" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "Полноэкранный _режим" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Редактирование" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Переключить возможность редактирования блокнота" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Нет" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Недавние страницы" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Недавно изменённые страницы" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "Посещенные страницы" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Простр_анство имен" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Значки _и текст" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Только _значки" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Только _текст" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Большие значки" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Маленькие значки" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Очень маленькие значки" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Использовать «отрывные» меню" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Использовать <Пробел> для переключения на боковую панель" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Убирать ссылки при удалении страниц" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Всегда использовать последнюю позицию курсора при открытии страницы" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Указанный файл или папка не существует.\n" "Проверьте правильность пути." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Нет такого файла или папки: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Поиск" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Искать страницы...." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Обновить блокнот?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Этот блокнот был создан более старой версией Zim.\n" "Обновить его до последней версии?\n" "\n" "Обновление займет некоторое время и может привести \n" "к некоторым изменениям в блокноте. Рекомендуем \n" "сделать резервную копию перед этой операцией.\n" "\n" "Если вы откажетесь от обновления, некоторые\n" "новые возможности могут работать некорректно." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Обновление блокнота" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Содержание все еще обновляется. Пока эта операция не завершится, ссылки " "могут обновиться некорректно. Выполнение этого действия сейчас может " "повредить ссылки. Все равно продолжить?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Обновление ссылок" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Удаление ссылок" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Создать папку?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "Каталог \"%s\" ещё не существует.\n" "Хотите его создать?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Не удалось открыть: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "У этой страницы нет папки для вложений" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Редактирование файла: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Вы редактируете файл во внешнем приложении. Закройте этот диалог по " "завершении редактирования" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Настольная wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Andrew Kuzminov https://launchpad.net/~ilobster\n" " Antonio https://launchpad.net/~ghoniq\n" " Arsa Chernikov https://launchpad.net/~arsa-chernikov\n" " DIG https://launchpad.net/~dig\n" " Dmitry Ostasevich https://launchpad.net/~ostasevich\n" " Dominus Alexander Z. https://launchpad.net/~dominusalex\n" " Eugene Krivobokov https://launchpad.net/~eugene-krivobokov\n" " Eugene Marshal https://launchpad.net/~lowrider\n" " Eugene Mikhantiev https://launchpad.net/~mehanik\n" " Eugene Schava https://launchpad.net/~eschava\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Nikolay A. Fetisov https://launchpad.net/~naf-altlinux\n" " Oleg https://launchpad.net/~oleg-devyatilov\n" " Sergey Shlyapugin https://launchpad.net/~cpt-alatriste\n" " Sergey Vlasov https://launchpad.net/~sigprof\n" " Vadim Rutkovsky https://launchpad.net/~roignac\n" " Vitaliy Starostin https://launchpad.net/~vvs\n" " Vitaly https://launchpad.net/~jauthu\n" " Vladimir Sharshov https://launchpad.net/~vsharshov\n" " Vyacheslav Sharmanov https://launchpad.net/~vsharmanov\n" " aks-id https://launchpad.net/~aks-id\n" " anton https://launchpad.net/~faq-ru\n" " gest https://launchpad.net/~drug-detstva" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Содержание" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "только чтение" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Обратных ссылок…" msgstr[1] "%i _Обратная ссылка..." msgstr[2] "%i _Обратные ссылки…" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Не удалось сохранить страницу: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Для продолжения вы можете сохранить копию этой страницы \n" "или отклонить все изменения. Если вы сохраните копию, изменения\n" "также не будут внесены, но они могут быть восстановлены позже." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "От_клонить изменения" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Сохранить копию" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Переход" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Перейти к странице" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Создать новую подстраницу" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Создать новую страницу" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Имейте ввиду, что ссылка на несуществующую страницу\n" "приведет к автоматическому созданию этой страницы." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Имя страницы" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Шаблон страницы" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Страница уже существует" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Сохранить копию страницы" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Импорт страницы" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Текстовые файлы" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Перемещение страницы" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Переместить страницу «%s»" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Обновить %i страницу, ссылающуюся на эту страницу" msgstr[1] "Обновить %i страницы, ссылающихся на эту" msgstr[2] "Обновить %i страниц, ссылающихся на эту страницу" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Пространство имен" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Переименование страницы" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Переименовать страницу «%s»" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Обновить заголовок страницы" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Удаление страницы" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Удалить страницу «%s»?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Страница «%s» и все ее подстраницы\n" "и вложения будут удалены" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Убрать ссылки с %i страниц, ссылающихся на эту страницу" msgstr[1] "Убрать ссылки с %i страницы, ссылающейся на эту страницу" msgstr[2] "Убрать ссылки с %i страниц, ссылающихся на эту страницу" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i файлов будет удалено" msgstr[1] "%i файл будет удален" msgstr[2] "%i файла будет удалено" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Создать вложение" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "У страницы «%s» нет папки для вложений" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Вставить изображение как ссылку" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Блокнот" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Открыть блокнот" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Блокнот по умолчанию" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Добавить блокнот" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Укажите имя и папку для блокнота" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Папка" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Обновление содержания…" #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Отменить" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Ве_рнуть" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Вырезать" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Копировать" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Вст_авить" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Удалить" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Пометить как V-флажок" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Пометить как X-флажок" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Редактировать ссылку или объект…" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Убрать _ссылку" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Дата и время…" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Изображение..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Маркированный список" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Нумерованный список" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Список переключателей" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Текст из _файла…" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Ссылка…" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Вставить ссылку" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Очистить форматирование" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Найти" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Найти _следующее" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Найти _предыдущее" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Заменить…" #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Статистика…" #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Увеличить" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "У_меньшить" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Нормальный размер" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Новое _вложение" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Файл _Шаблоны..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Заголовок _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Заголовок 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Заголовок _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Заголовок 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Заголовок _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Заголовок 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Заголовок _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Заголовок 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Заголовок _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Заголовок 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Жирный" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Жирный" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Курсив" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Курсив" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Подчеркнутый" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Подчеркнутый" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "Зач_еркнутый" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Зачеркнутый" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Нижний индекс" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Верхний индекс" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "Стенограмма" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Стенограмма" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Использовать для перехода по ссылкам\n" "(если отключено, можно использовать )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Показывать курсор на страницах, защищенных от редактирования" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Автоматически делать ссылками слова, написанные в ПрыгающемРегистре" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Автоматически делать ссылками пути файлов" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Автоматически выделять текущее слово при применении форматирования" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Удаление отступов по \n" "(если отключено, можно использовать )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Повторение нажатий по флажку меняет его состояние по кругу" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Изменение отступа элемента списка изменяет отступы подэлементов" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Отметка флажка влияет на подэлементы" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Переформатировать разметку wiki на лету" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Применять форматирование по умолчанию для копируемого текста" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Каталог с шаблонами для файлов-вложений" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Неизвестная wiki-ссылка: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "_Копировать как..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Переместить выделенный текст" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Редактировать свойства" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Редактировать ссылку" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Копировать _ссылку" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Копировать адрес электронной почты" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Открыть с помощью…" #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Открыть" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Шаблоны не установлены" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Каталог \n" "%s\n" "не существует.\n" "Хотите его создать?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Вставить дату и время" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "Календарь" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Ссылка на дату" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Вставить изображение" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Вставить изображение" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Тип файла не поддерживается: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Редактировать изображение" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Местоположение" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Ссылка на" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Ширина" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Высота" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Сбросить размер" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Вставить текст из файла" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Редактировать ссылку" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Связать" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Текст" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Следующее" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Предыдущее" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "_Учитывать регистр" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Только слово целиком" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Регулярное выражение" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "П_одсвечивать" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Найти" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Параметры" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Найти и заменить" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Найти что" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Заменить на" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Заменить" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Заменить _всё" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Статистика" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Абзац" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Слов" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Строк" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Символов" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Переместить текст на другую страницу" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Переместить" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Переместить текст в" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Оставить ссылку на новую страницу" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Открыть новую страницу" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Новый файл" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Интерфейс" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Редактирование" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Параметры" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Модули" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Использовать свой шрифт" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Еще" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "Настроить" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Зависимости" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Нет зависимостей" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Ошибка" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Дополнительно" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Автор" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Включен" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Модуль" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Настроить модуль" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Параметры модуля «%s»" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Свойства" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Свойства блокнота" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Недавние изменения" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Сегодня" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Вчера" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Последнее изменение" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Для расширенного поиска можно использовать операторы И, ИЛИ и НЕ.\n" "Более подробная информация на странице помощи." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Ограничить поиск текущим пространством имен" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Найдено" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Веб-сервер" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Сервер не запущен" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Разрешить публичный доступ" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Порт" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Сервер запущен" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Сервер остановлен" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Шаблоны" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Обзор" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Копировать шаблон" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Выбрать файл" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Развернуть _все" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Свернуть всё" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Очистить" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Выбрать папку" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Выбрать изображение" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "<Верх>" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Левая боковая панель" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Правая боковая панель" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Нижняя панель" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Верхняя панель" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Сверху слева" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Внизу слева" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Сверху справа" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Внизу справа" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Похоже, вы нашли ошибку" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "При отправке отчета об ошибке, пожалуйста,\n" "включите информацию из текстового поля ниже" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Все файлы" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Изображения" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Файл существует" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Файл с именем «%s» уже существует.\n" "Вы можете указать другое имя или перезаписать существующий файл." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Обзор" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Перезаписать" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Не удалось найти файл или папку для этого блокнота" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Не удалось найти блокнот: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Введено некорректное имя страницы.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Неверное имя страницы «%s»" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Содержание все еще занято обновлением, пока мы пытаемся выполнить операцию, " "которой оно необходимо.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Не удалось изменить страницу: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Название для интервики:й" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Домашняя страница" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Корневая папка документа" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Свойства" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Общий блокнот" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Арифметика" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Этот модуль позволяет вставлять арифметические вычисления в zim. \n" "Он основан на арифметическом модуле \n" "http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Арифметика" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Менеджер вложений" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Этот модуль показывает папку вложений\n" "текущей страницы пиктограммой внизу.\n" "\n" "Этот модуль находится в разработке.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Положение в окне" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Вложения" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Показать просмотрщик приложений." #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Вложений" msgstr[1] "%i _Вложение" msgstr[2] "%i _Вложения" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "нет данных" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Тип" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Размер" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Изменен" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Переместить сюда" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Копировать сюда" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Отмена" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Автомонтирование" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот плагин может автоматически \"монтировать\" ноутбуки при необходимости. " "Он может быть использован\n" "например для подключения удаленных дисков или разблокирования шифрованных " "дисков\n" "когда zim пытается открыть указанный ноутбук.\n" "\n" "This is a core plugin shipping with zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Панель обратных ссылок" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет дополнительный виджет, который показывает список " "страниц,\n" "ссылающихся на текущую страницу.\n" "\n" "Это -- базовый модуль; поставляется с zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Обратные ссылки" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Сегодня" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Календарь" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Дневник" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Этот модуль превращает одно из пространств имён в дневник, \n" "в котором одной странице соответствует день, неделя или месяц. \n" "Он также добавляет календарный виджет для доступа к этим страницам.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "День" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Неделя" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Месяц" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Год" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Показывать календарь в боковой панели вместо отдельного окна" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Странице календаря соответствует:" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d %b %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Календарь" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Сегодня" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Диа_грамма…" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Диаграмма" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Вставка диаграмм" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет редактор диаграмм для Zim на основе GraphViz.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Редактировать диаграмму" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Редактирование не отвлекаясь" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Этот модуль добавляет установки, которые позволяют \n" "редактировать в zim, не отвлекаясь.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Скрыть меню в полноэкранном режиме" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Скрыть инструменты в полноэкранном режиме" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Скрыть индикатор пути в полноэкранном режиме" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Скрыть строку статуса в полноэкранном режиме" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Максимальная ширина страницы" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Вертикальное поле" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Цвет фона" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Цвет текста" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Цвет фона экрана" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Вставить ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Вставка ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет редактор диаграмм, основанный на Ditaa. \n" "Это -- базовый модуль; поставляется с zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Редактировать Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Формула…" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Формула" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Вставка формул" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет редактор формул для Zim на основе LaTeX.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Редактировать формулу" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot…" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Вставка Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Этот модуль предоставляет редактор графиков для Zim, основанный на Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "Редактировать Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot…" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Вставка графика GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Этот модуль, основанный на GNU R, служит для редактирования графиков.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Редактировать график GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "График GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Посчитать _формулу" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Встроенный калькулятор не смог\n" "рассчитать выражение под курсором." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Встроенный калькулятор" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль позволяет быстро рассчитать\n" "простые математические выражения в Zim.\n" "\n" "Это базовый модуль, поставляющийся вместе с Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Не удалось разобрать выражение" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Си_мвол…" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Вставка символа" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет диалог «Вставка символа» и\n" "позволяет автоформатирование типографских знаков.\n" "\n" "Это базовый модуль, поставляющийся вместе с Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "Сортировать строки" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Сортировщик строк" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Этот модуль сортирует выделенные строки в алфавитном\n" "порядке. Если строки уже отсортированы, порядок\n" "сортировки будет изменен на обратный (А-Я на Я-А).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Выделите не менее двух строк." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Показать карту ссылок" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Карта ссылок" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль отображает диалоговое окно с графическим\n" "представлением структуры ссылок блокнота. Он может\n" "быть использован в качестве «карты», показывающей,\n" "как связаны страницы.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Печать в браузер" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль предоставляет отсутствующую в Zim\n" "поддержку печати. Он экспортирует текущую страницу\n" "в HTML и открывает ее в браузере. Если браузер имеет \n" "поддержку печати, вы сможете произвести печать оттуда.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Печать в браузер" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Быстрая заметка…" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Быстрые заметки" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет диалог для быстрой вставки текста\n" "или содержания буфера обмена на страницу в Zim.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Создавать новую страницу для каждой заметки" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Заголовок" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Открыть _Страницу" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Выбросить заметку?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "_Нотный редактор..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Вставить нотный текст" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Вставка нотного текста" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет нотный редактор, основанный на GNU Lilypond. \n" "Это -- базовый модуль; поставляется с zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Общий включаемый заголовок" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Общий включаемый \"подвал\"" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Редактировать нотный текст" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "С_нимок экрана…" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Вставка снимка экрана" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль позволяет сделать снимок экрана и вставить его\n" "в страницу Zim.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Захватить весь экран" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Выбрать окно или область экрана" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Задержка" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "сек." #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "При выполнении «%s» возникла ошибка" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Проверять _орфографию" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Проверка орфографии" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Добавляет проверку правописания с помощью gtkspell.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Не получилось загрузить проверку правописания для языка: «%s»" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Это может означать, что соответствующий\n" "словарь не установлен" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Оглавление" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет дополнительный виджет, показывающий\n" "оглавление текущей страницы.\n" "\n" "Это -- базовый модуль; поставляется с zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Показать оглавление в плавающем виджете (а не в боковой панели)" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Оглавление" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Понизить" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Повысить" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "без меток" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Сортировать по алфавиту" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Сортировать страницы по меткам" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Метки" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Этот модуль позволяет фильтровать содержание по выбранным меткам в облаке.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Список задач" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет диалог, показывающий список \n" "открытых задач в определенном блокноте. \n" "Открытые задачи помечаются флажками или\n" "метками, например TODO или FIXME.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Считать задачами все строки с флажками" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Преобразовывать имя страницы в метки для задач" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Предполагаемая дата выполнения для задач из календаря" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "Пометить задачи на понедельни или вторник перед выходными" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Метки для задач" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Метка для следующей задачи" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Теги для невыполняемых задач" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Поддерево для индексации" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Игнорируемые поддеревья" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Необходимо проиндексировать блокнот" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Вы впервые открыли список задач,\n" "поэтому необходимо перестроить индекс.\n" "Операция может занять несколько минут\n" "в зависимости от размера блокнота.\n" "В следующий раз эта операция уже не потребуется." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Фильтр" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Показать только активные задачи" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i открытых задач" msgstr[1] "%i открытая задача" msgstr[2] "%i открытых задачи" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Все задачи" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Непомеченные" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Задача" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Дата" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Значок в области уведомлений" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль добавляет значок Zim в область уведомлений.\n" "\n" "Для работы этого модуля требуется версия Gtk+ не ниже 2.10.\n" "\n" "Это базовый модуль, поставляющийся с Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Классический значок в области уведомлений\n" "(не использовать новый стиль значков статуса в Ubuntu)" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Показывать отдельный значок для каждого блокнота" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Быстрая заметка…" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Другой…" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Блокноты" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Сохранить _версию…" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Версии…" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Со времени сохранения последней версии изменений не было." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Нет изменений с прошлой версии" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Контроль версий" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Этот модуль обеспечивает контроль версий для блокнотов.\n" "\n" "Этот модуль поддерживает следующие системы контроля версий: Bazaar, Git и " "Mercurial.\n" "\n" "Это -- базовый модуль; поставляется с zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Регулярное автосохранение версий" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Автоматически сохраненная версия" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Включить контроль версий?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Контроль версий для этого блокнота отключен.\n" "Включить?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Система контроля версий" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Сохранить версию" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Добавьте комментарий для этой версии" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Сохраненная версия" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Версии" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Страница" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Просмотреть _аннотации" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Выберите версию, чтобы увидеть изменения между этой версией и\n" "текущим состоянием. При выборе нескольких версий будут показаны различия " "между ними.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Комментарий" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Восстановить версию" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Показать _изменения" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Бок о бок" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Комментированный исходник страницы" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Вернуть страницу к сохраненной версии?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Вы хотите вернуть страницу: %(page)s\n" "к сохраненной версии: %(version)s?\n" "\n" "Все изменения с последней сохраненной версии будут утеряны!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Изменения" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Ревизия" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Журналировать события с помощью Zeitgeist." #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Передаёт события процессу zeitgeist." #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Вики-страница: %s" #~ msgid "Text Editor" #~ msgstr "Текстовый редактор" #~ msgid "Email client" #~ msgstr "Почтовый клиент" #~ msgid "Pages" #~ msgstr "Страницы" #~ msgid "Slow file system" #~ msgstr "Медленная файловая система" #~ msgid "Prio" #~ msgstr "Приоритет" #~ msgid "_Filter" #~ msgstr "_Фильтр" #~ msgid "Match c_ase" #~ msgstr "Учитывать регистр" #~ msgid "Output" #~ msgstr "Выходной файл" #~ msgid "File browser" #~ msgstr "Файловый менеджер" #~ msgid "Web browser" #~ msgstr "Веб-браузер" zim-0.60/translations/et.po0000644000175000017500000023206112137750055015610 0ustar jaapjaap00000000000000# Estonian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # # FIRST AUTHOR , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: Jaap Karssenberg \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Vaikimisi" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Sellist faili pole: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detailid" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Open with \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nimi" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Käsk" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Ava kaust" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Valik" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Lehekülg" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Kohandatud tööriistad" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Muuda kohandatud tööriista" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Kirjeldus" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikoon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Käsklus ei muuda andmeid" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Näita tööriistaribal" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Ekspordi" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Registrite uuendamine" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Kataloog on juba olemas ja sisaldab faile. Eksportimine antud kataloogi võib " "olemasolevad failid üle kirjutada. Oled kindel, et soovid jätkata?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Märkmiku eksportimine" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Fail on olemas" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "This file already exists.\n" "Do you want to overwrite it?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Vali leheküljed, mida soovid eksportida" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Terve _märkmik" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Üksik _lehekülg" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Vali eksportimise formaat" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Muu..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Vorming" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Mall" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Lingi dokumendi juurkaustas asuvad failid täisfailiteena" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Vastenda dokumendi juurkaust URLiks" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Vali väljundfail või -kaust" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Väljundkaust" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Indekslehekülg" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Väljundfail" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Eelvaade" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Kuva _logi" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Logifail" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fail" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Redigeeri" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Kuva" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Lisamine" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Otsing" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "Vor_ming" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Tööriistad" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Mine" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Abi" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "F_ailitee riba" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Töör_iistariba" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Uus Lehekülg..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Uus A_lamlehekülg..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "A_va olemasolev märkmik..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Ava uues _Aknas" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Impordi lehekülg..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Salvesta" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Salvesta _koopia..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Ekspordi..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Saada..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Liiguta lehekülg..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Nimeta leht ümber" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Kustuta lehekülg" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "A_tribuudid" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Sulge" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Lõpeta" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Otsing..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Otsi _tagasiviiteid..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Eelistused" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "La_e uuesti" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Ava _Manuste kaust" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Ava _Märkmiku kaust" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Ava _Dokumendi juurkaust" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Ava _Dokumendikaust" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Manusta fail" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Manusta väline fail" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Muuda lähtekoodi" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Käivita _veebiserver" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Kohandatud _Tööriistad" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Tagasi" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Eelmine lehekülg" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Edasi" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Järgmine lehekülg" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Ülemlehekülg" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Mine ülemleheküljele" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "Alamlehekülg" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Mine alamleheküljele" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Eelmine registris" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Mine eelmisele leheküljele" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Järgmine registris" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Mine järgmisele leheküljele" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Kodu" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Liigu koju" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Liigu l_eheküljele..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Sisu" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_KKK" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "Klahviseosed" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Veateated" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Teave" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Olekuriba" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Täisekraan" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Märkmik on _muudetav" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Lülita ümber märkmikku kirjutamine" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Puudub" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Hiljutised leheküljed" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Ajalugu" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Nimeruum" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikoonid ja tekstid" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Ainult _ikoonid" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Ainult _tekst" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Suured ikoonid" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Väikesed ikoonid" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Pisikesed ikoonid" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Lisa rebitavad ribad menüüdele" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Sellist faili või kausta pole: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Otsing" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Uuenda märkmikku?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Täiendan märkmikku" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Indeks on endiselt värskendamisega hõivatud. Viiteid ei saa enne lõppu " "värskendada. Selle sammu astumine võib viia linkide katkemiseni. Oled Sa " "kindel, et soovid sellest hoolimata jätkata?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Värskendan viiteid" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Eemaldan viiteid" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Loo uus kaust?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Ei saa avada: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Sellel leheküljel pole manuste kausta" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Muudan faili: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Hetkel kasutatakse faili välise programmi poolt. Sa võid selle akna pärast " "tegevuse lõpetamist sulgeda" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Töölaua wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " *nix https://launchpad.net/~xinu7\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Timo Sulg https://launchpad.net/~timgluz\n" " mahfiaz https://launchpad.net/~mahfiaz\n" " milosh https://launchpad.net/~raoul-hot" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Ainult loetav" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i Ta_gasiviide..." msgstr[1] "%i Ta_gasiviited..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Lehekülje %s salvestamine ebaõnnestus" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Unusta muudatused" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Salvesta _koopia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Liigu..." #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Liigu leheküljele" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Uus Alamleht" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Uus Lehekülg" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Lehekülje nimi" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Lehekülg on olemas" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Salvesta koopia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Impordi lehekülg" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Tekstifailid" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Liiguta lehekülg" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Move page \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Värskenda %i lehekülg, viidates sellele leheküljele" msgstr[1] "Värskenda %i lehekülge, viidates sellele leheküljele" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Nimeruum" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Muuda lehekülje nime" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Rename page \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Uuenda lehekülje päist" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Kustuta lehekülg" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Delete page \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Eemalda %i lehel asuv viide käesolevale leheküljele" msgstr[1] "Eemalda %i lehel asuvad viited käesolevale leheküljele" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Manusta fail" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Page \"%s\" does not have a folder for attachments" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Lisa pilt viitena" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Märkmik" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Ava märkmik" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Aktiivne märkmik" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Lisa uus märkmik" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Vali palun märkmikule pealkiri ja kataloog." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Kaust" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Indeksite uuendamine..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "Võta _tagasi" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Taasta" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Lõika" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopeeri" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Kleebi" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Kustuta" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Märgista valikkast 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Märgista valikkast 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Viite või objekti redigeerimine" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Eemalda viide" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "Kuupäev ja kellaaeg..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Pilt..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Tekst _failist..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Viide..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Viite lisamine" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Puhasta vorming" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Otsi..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Otsi _järgmine" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Otsi _eelmine" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Asenda..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Sõnaarvestus..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Pealkiri _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Pealkiri 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Pealkiri _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Pealkiri 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Pealkiri _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Pealkiri 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Pealkiri _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Pealkiri 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Pealkiri _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Pealkiri 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Tugev" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Tugev" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Rõhutatud" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Rõhutatud" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Märgistatud" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Märgistatud" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Läbikriipsutatud" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Läbikriipsutatud" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Allindek_s" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_ülaindeks" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Sõnasõnaline" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Sõnasõnaline" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Use the key to follow links\n" "(If disabled you can still use )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Kuva kursor ka kirjutuskaitsud lehekülgedel." #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automatically turn \"CamelCase\" words into links" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Teisenda faili asukohatee automaatselt viidaks." #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Vormingu lisamisel märgista automaatselt käesolev sõna" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Unindent on \n" "(If disabled you can still use )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Taande muutmine muudab ka alamkirjeid" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Valikasti valimine muudab ka alamkirje väärtust." #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Vorminda wiki märgistus jooksvalt ümber" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Redigeeri linki" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopeeri _link" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopeeri e-posti aadress" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Ava kasutades..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Ava" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Kuupäeva ja kellaaja lisamine" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "Vii_ta kuupäevale" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Lisa pilt" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Manusta esmalt pilt" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Muuda pilti" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Asukoht" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Viita..." #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Laius" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Kõrgus" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Suuruse l_ähtestamine" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Lisa tekst failist" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Muuda linki" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Viit" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Tekst" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Järgmine" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Eelmine" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Erista _Suurtähti" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Terve s_õna" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regulaaravaldis" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Tõsta esile" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Otsi" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Valikud" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Otsi ja asenda" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Otsi mida" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Asenda millega" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Asenda" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Asenda _kõik" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Sõnaarvestus" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Lõik" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Sõnad" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Read" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Tähed" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Eelistused" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Lisandmoodulid" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Kasuta kohandatud fonti" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "V_eel" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Seadista" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Sõltuvused" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Sõltuvusi pole" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Nurjus" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Lubatud" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Lisandmoodul" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Seadista lisandmoodulit" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Lisandmooduli %s suvandid" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Atribuudid" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Märkmiku atribuudid" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "For advanced search you can use operators like\n" "AND, OR and NOT. Vaata lähemalt abilehekülgedelt." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Piira otsingut praeguse nimeruumiga" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Hinnang" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server pole käivitunud." #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server on käivitunud" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server on peatatud" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Vali fail" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Vali kaust" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Tundub, et Sa leidsid programmivea." #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Kõik failid" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Pildid" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Selle märkmiku faili või kausta ei leitud" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Ei leitud märkmiku: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "The given page name is not valid.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Invalid page name \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Lehekülje %s muutmine ebaõnnestus." #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Kodulehekülg" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Dokumendi juurkaust" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Jagatud Märkmik" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Manusesirvija" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Tänase _päeva leheküljele" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kalender" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Kuvab kalenderit külgpaanil, mitte dialgooaknas" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Täna" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "_Diagramm" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Lisa diagramm" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Lisa Diagramm" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Redigeeri _diagrammi" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Valem..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Lisa valem" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Lisa valem" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Muuda valemit" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R diagramm..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Lisa GNU R diagramm" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "This plugin provides a plot editor for zim based on GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Muuda GNU R diagrammi" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R diagramm" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Hinda _Avaldist" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Tekstisisene kalkulaator" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Avaldise sõelumine nurjus" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sü_mbol..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Lisa sümbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Ava viidaloend" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Viidaloend" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Trüki veebilehitseja kaudu" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Trüki veebilehitseja abil" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Kiire märge..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Kiire märge" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Lisa iga märkme jaoks eraldi leht" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Pealkiri" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Ekraanitõmmis" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Lisa ekraanitõmmis" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Kaasa terve ekraan." #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Vali aken või piirkond" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Viivitus" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekundid" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Some error occurred while running \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Kontrolli _õigekirja" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Õigekirjakontroll" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Sildid" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Ülesandeloend" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Consider all checkboxes as tasks" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Labels marking tasks" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Need to index the notebook" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i avatud kirje" msgstr[1] "%i avatud kirjet" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Ülesanne" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Kuupäev" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Tray Icon" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Show a separate icon for each notebook" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Quick Note..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Muu..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Märkmikud" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Töölaua Viki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Sa_lvesta versioon" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versioonid" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Märkmikusse ei ole viimase versiooni salvestamisest saadik tehtud muudatusi" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Eelmise versiooniga võrreldes muudatused puuduvad" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Versioonihaldus" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Salvesta versioon regulaarse ajavahemiku järel" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automaatselt salvestatud Zimi versioonid" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Lülitan versioonihalduse sisse?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Salvesta versioon" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Sisesta kommentaar versiooni kohta" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Salvestatud Zimi versioonid" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versioonid" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Lehekülg" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Vaata märgitu_d" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Kommentaar" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Taasta versioon" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Kuva _muutused" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Rida-realt" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Märgistatud lehekülje lähtekood" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Kas soovid lehekülje salvestatud versiooni põhjal taastada?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Muudatused" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Tekstiredator" #~ msgid "Pages" #~ msgstr "Leheküljed" #~ msgid "Output" #~ msgstr "Väljund" #~ msgid "Match c_ase" #~ msgstr "Tõstutundlik" #~ msgid "Web browser" #~ msgstr "Veebisirvija" #~ msgid "Email client" #~ msgstr "E-posti rakendus" #~ msgid "Slow file system" #~ msgstr "Aeglane failisüsteem" #~ msgid "_Filter" #~ msgstr "_Filter" #~ msgid "File browser" #~ msgstr "Failisirvija" #~ msgid "Prio" #~ msgstr "Prioriteet" zim-0.60/translations/pl.po0000644000175000017500000025110212137750055015610 0ustar jaapjaap00000000000000# Polish translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # # FIRST AUTHOR , 2009. # Mirosław Zalewski , 2012. msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-12-13 01:32+0000\n" "Last-Translator: Jaap Karssenberg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" "Language: pl\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Nie udało się uruchomić aplikacji: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "Komenda %(cmd)s zwróciła niezerowy status %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Nie udało się uruchomić: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Domyślna" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Brak takiego pliku: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Nie można odczytać: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Ten komunikat przeważnie oznacza, że plik zawiera niepoprawne znaki." #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Szczegóły" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Plik nie ma atrybutu zapisywalności: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Plik na dysku twardym został zmieniony: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Dostosuj..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Nie znaleziono aplikacji" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Otwórz za pomocą \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Aplikacja uruchamiająca odnośniki typu \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "Aplikacja otwierająca pliku typu \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Konfiguruj aplikacje" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Dodaj aplikację" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Domyślne ustawienia systemowe" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nazwa" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Polecenie" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Ustaw jako aplikację domyślną" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Otwórz plik" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Otwórz katalog" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Usuń plik" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Usuń" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Zaznaczenie" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nazwa pliku" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Strona" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Wyczyść załączniki" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Odwróć Zaznaczenie" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Poniższe pliki zostały znalezione w katalogu załączników Zim, jednakże nie\n" " są połączone z żadnym notatnikiem. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nie znaleziono osieroconych plików." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Narzędzia użytkownika" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Możesz konfigurować narzędzia użytkownika, które zostaną wyświetlone\n" "w menu narzędzi, w pasku narzędzi lub menu kontekstowych." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Edytuj narzędzie użytkownika" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Opis" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Komenda nie modyfikuje danych" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Pokaż na pasku narzędziowym" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Poniższe zmienne zostaną zastąpione\n" "podczas wykonywania polecenia:\n" "%f ścieżka do tymczasowego pliku zawierającego kod źródłowy strony\n" "%d ścieżka do katalogu z załącznikami aktualnej strony\n" "%s ścieżka do pliku zawierającego kod źródłowy strony (jeśli " "istnieje)\n" "%n ścieżka do notesu (plik lub katalog)\n" "%D katalog główny dokumentu (jeśli istnieje)\n" "%t zaznaczony tekst lub słowo pod kursorem\n" "%T zaznaczony tekst lub słowo pod kursorem wraz z formatowaniem wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Eksport" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Odświeżanie indeksu" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Katalog istnieje: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Katalog już istnieje i nie jest pusty. Eksport do tego katalogu może " "nadpisać znajdujące się w nim pliki. Czy na pewno chcesz kontynuować?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Eksportowanie notesu" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Plik istnieje" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Ten plik już istnieje.\n" "Czy chcesz go nadpisać?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Wybierz stronę do eksportu" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Cały _notes" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Pojedyncza _strona" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Wybierz format eksportu" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Inny..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Szablon" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Użyj pełnych ścieżek do plików w katalogu głównym" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Mapuj katalog główny na URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Wybierz plik wyjściowy lub folder" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Folder docelowy" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Indeks" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Plik wyjściowy" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Podgląd" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Wyświetl _dziennik zdarzeń" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Podczas generowania pliku graficznego wystąpił błąd. Czy mimo to chcesz " "zapisać tekst źródłowy?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Plik dziennika" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Plik" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Edycja" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Widok" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Wstaw" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Szukaj" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Narzędzia" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Idź" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Pomoc" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Pasek ścieżki" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Pasek narzędzi" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nowa strona..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nowa podstrona..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Otwórz kolejny notes..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Ot_wórz w nowym oknie" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importuj stronę..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "Zapi_sz" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Zapisz _kopię..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "Wye_ksportuj..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Wyślij do..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Przenieś stronę..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Zmień nazwę strony..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Usuń stronę" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Właściwości" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Zamknij" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Zakończ" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "Szukaj..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Szukaj linków zwrotnych" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "S_kopiuj położenie" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Szablony" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Preferencje" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Odśwież" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Otwórz katalog z _załącznikami" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Otwórz katalog notesu" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Otwórz katalog główny" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Otwórz katalog z dokumentami" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Dołącz _plik" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Dołącz zewnętrzny plik" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Wyczyść Załączniki" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Edytuj _źródło" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Uruchom _serwer www" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Uaktualnij indeks" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Narzędzia uży_tkownika" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Wstecz" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Przejdź do poprzedniej strony" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Naprzód" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Przejdź do następnej strony" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Nadrzędny" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Przejdź do strony nadrzędnej" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Podrzędny" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Przejdź do strony podrzędnej" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Poprzedni w indeksie" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Wróć do poprzedniej strony" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Następny w indeksie" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Przejdź do następnej strony" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "Start" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Przejdź do początku" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Przejdź do..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Zawartość" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Skróty klawiszowe" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Błędy" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_O programie" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "Wszystkie p_anele" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Pokaż wszystkie panele" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Pasek _stanu" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "Panele _boczne" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Pokaż panele boczne" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Pełny ekran" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notes możliwy do edytowania" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Zmień możliwość edytowania notesu" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Brak" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Ostatnie strony" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historia" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Przestrzeń nazw" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikony i tekst" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Tylko _ikony" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Tylko _tekst" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Duże ikony" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Małe ikony" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Malutkie ikony" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Dodaj odrywalne paski do menu" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Użyj by przejść do panelu bocznego" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Usuń odnośniki podczas usuwania stron" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Zapamiętaj ostatnią pozycję kursora w czasie otwierania strony" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Określony plik lub katalog nie istnieje.\n" "Sprawdź, czy podana ścieżka jest poprawna." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Brak następującego pliku lub katalogu: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Znajdź" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Zaktualizować zeszyt?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Zeszyt został stworzony przez starszą wersję programu zim.\n" "Czy chcesz zaktualizować program do najnowszej wersji?\n" "\n" "Aktualizacja może trochę potrwać i może zmienić rozmaite zmiany\n" "w zeszycie. Dobrym pomysłem jest zrobić kopie zapasową\n" "przed zrobieniem tego.\n" "\n" "jeżeli nie zaktualizujesz programu teraz, niektóre funkcje\n" "mogą nie działać" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Aktualizowanie zeszytu" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Indeks zajęty jest aktualizacją. Dopóki nie zostanie ukończona, odnośniki " "nie mogą zostać poprawnie zaktualizowane. Wykonanie tego działania może " "uszkodzić odnośniki. Czy pomimo wszystko chcesz kontynuować?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Aktualizacja odnośników" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Usuwanie linków" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Utworzyć katalog?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Nie mogłem otowrzyć: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Ta strona nie posiada katalogu z załącznikami" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Edytowany plik: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Edytujesz plik za pomocą zewnętrznej aplikacji. Zamknij to okno kiedy " "spończysz" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Twój osobisty notatnik" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " BPS https://launchpad.net/~bps\n" " DB79 https://launchpad.net/~mr-bogus\n" " Dariusz Dwornikowski https://launchpad.net/~tdi-kill-9-deactivatedaccount\n" " Filip Stepien https://launchpad.net/~filstep\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Kabturek https://launchpad.net/~marcindomanski\n" " Lucif https://launchpad.net/~lucif-onet\n" " Marcin Swierczynski https://launchpad.net/~orneo1212\n" " Mirosław Zalewski https://launchpad.net/~miroslaw-zalewski\n" " Tomasz (Tomek) Muras https://launchpad.net/~zabuch\n" " ZZYZX https://launchpad.net/~zzyzx-eu\n" " ciastek https://launchpad.net/~ciastek" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Indeks" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Tylko do odczytu" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Link zwrotny" msgstr[1] "%i _Linków zwrotnych" msgstr[2] "%i odnośniki do tej strony" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Nie udało się zapisać strony: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Aby kontynuować możesz zapisać kopię tej strony lub odrzucić\n" "wprowadzone zmiany. Jeśli zapiszesz kopię tej strony zmiany również zostaną\n" "odrzucone, jednak później będziesz mógł przywrócić kopię." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Odrzuć zmiany" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Zapisz Kopię" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Przejdź do" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Przejdź do strony" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nowa podstrona" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nowa strona" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Pamiętaj że utworzenie linku do nieistniejącej strony powoduje jej " "automatyczne utworzenie." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nazwa strony" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Szablon strony" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Strona istnieje" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Zapisz Kopię" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importuj stronę" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Pliki tekstowe" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Przenieś stronę" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Przenieś stronę \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Zaktualizuj %i stron odwołujących się do tej strony" msgstr[1] "Zaktualizuj %i stronę odwołującą się do tej strony" msgstr[2] "Zaktualizuj %i strony odwołujące się do tej strony" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Przestrzeń nazw" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Zmień nazwę strony" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Zmień nazwę strony \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Zaktualizuj nagłówek tej strony" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Usuń stronę" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Usunąć stronę \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Strona \"%s\" oraz wszystkie jej\n" "podstrony i załączniki zostaną usunięte" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Usuń odnośniki ze strony %i powiązane z tą stroną" msgstr[1] "Usuń odnośniki ze stron %i powiązane z tą stroną" msgstr[2] "Usuń odnośniki ze stron %i powiązane z tą stroną" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i plik nie będzie usunięty" msgstr[1] "%i plik będzie usunięty" msgstr[2] "%i plików będzie usunięte" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Załącz plik" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Strona \"%s\" nie posiada katalogu z załącznikami" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Wstaw obrazek jako odnośnik" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notes" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Otwórz notes" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Domyślny notes" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Dodaj notes" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Wybierz nazwę i folder dla notatnika." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Katalog" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Odświeżanie indeksu..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Cofnij" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Ponów" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Wytnij" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Skopiuj" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Wklej" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Usuń" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Zmień zaznaczenie pola 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Zmień zaznaczenie pola 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Edytuj odnośnik lub obiekt..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Usuń odnośnik" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Data i czas..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Obraz..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Wypunk_towanie" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Lista numeryczna" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Lista checkbo_x" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Tekst z _pliku..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Odnośnik..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Wstaw odnośnik" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Wyczyść formatowanie" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Znajdź…" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Zn_ajdź następne" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Znajdź p_oprzednie" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "Za_stąp..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Liczba słów..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "Po_większ" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Po_mniejsz" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Zwykły rozmiar" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nowy _Załącznik" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Szab_lony plików..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Nagłówek _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Nagłówek 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Nagłówek _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Nagłówek 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Nagłówek _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Nagłówek 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Nagłówek _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Nagłówek 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Nagłówek _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Nagłówek 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Pogrubienie" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Silne zaakcentowanie" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "Pochylenie" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Wyróżnienie" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Zaznacz" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Zaznacz" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Przekreślenie" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Przekreślenie" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Indeks dolny" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Indeks górny" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Wyjustowanie" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Wyjustowanie" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Użyj klawisza , by podążać za odnośnikami\n" "(Jeśli wyłączysz, nadal możesz używać )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "" "Pokaż kursor również na stronach nie posiadających możliwości edytowania" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automatycznie twórz odnośniki z \"TakichSłów\"" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Automatycznie twórz odnośniki ze ścieżek do plików" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Automatycznie zaznacz aktualne słowo przy nadawaniu formatowania" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Usuń wcięcie klawiszem \n" "(jeśli wyłączysz, nadal możesz użyć )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Zmiana wcięcia elementu listy zmienia także elementy podrzędne" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Zaznaczenie tego pola spowoduje zmianę pól podrzędnych" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Zamieniaj znaczniki wiki na formatowanie w trakcie pisania" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Domyślny format tekstu skopiowanego do schowka" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Katalog zawierający szablony załączników" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Nie znaleziono strony: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopiuj _Jako..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Przenieś Zaznaczony Tekst..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Zmień ustawienia" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Edytuj odnośnik" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Skopiuj _odnośnik" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Skopiuj adres e-mail" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Otwórz za pomocą..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Otwórz" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Nie zainstalowano szablonów" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Katalog%s\n" "jeszcze nie istnieje.\n" " Utworzyć go?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Wstawienie daty i czasu" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalendarz" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Odnośnik do daty" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Wstaw obraz" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Najpierw dołącz obraz" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Plik o nieobsługiwanym typie: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Edytuj obraz" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Położenie" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Odnośnik do" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Szerokość" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Wysokość" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Przywróć rozmiar początkowy" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Wstaw tekst z pliku" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Edytuj odnośnik" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Odnośnik" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Tekst" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Następny" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Poprzedni" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Wielkość _Liter" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Tylko całe słowa" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Wyrażenie regularne" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Podświetlenie" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Znajdź" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opcje" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Znajdź i zamień" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Znajdź" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Zamień na" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Zastąp" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Zastąp _wszystkie" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Ilość słów" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Akapit" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Słowa" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Wiersze" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Znaki" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Przenieś tekst na inną stronę" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Przenieś" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Przenieś tekst na" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Pozostaw odnośnik do nowej strony" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Otwórz nową stronę" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interfejs" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Edycja" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Ustawienia" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Wtyczki" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Użyj wybranej czcionki" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Więcej" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "Sk_onfiguruj wtyczkę" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Zależności" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Brak zależności" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Nie udało się" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opcjonalnie" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Włączona" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Wtyczka" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Skonfiguruj wtyczkę" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opcje dla wtyczki %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Właściwości" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Właściwości notesu" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Dla zaawansowanego wyszukiwania możesz używać operatorów takich jak\n" "AND, OR i NOT. Aby uzyskać więcej informacji, zobacz stronę pomocy." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Ogranicz tylko do aktualnej przestrzeni nazw" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Trafność" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Serwer nie został uruchomiony" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Serwer został uruchomiony" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Serwer został zatrzymany" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Szablony" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Skopiuj szablon" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Wybierz plik" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "_Rozwiń wszystkie" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Zw_iń wszystkie" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Wyczyść" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Wybierz katalog" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Wybierz obraz" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Panel po lewej stronie" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Panel po prawej stronie" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Panel na dole" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Panel na górze" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Góra, po lewej" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Dół, po lewej" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Góra, po prawej" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Dół, po prawej" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Wygląda na to, że znalazłeś błąd" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "W trakcie zgłaszania błędu, proszę podać\n" "informacje z pola poniżej" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Wszystkie typy plików" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Obrazy" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Plik istnieje" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Plik o nazwie \"%s\" już istnieje.\n" "Możesz użyć innej nazwy lub nadpisać istniejący plik." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Przeglądaj" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Nadpisz" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Brak pliku lub katalogu dla tego notesu" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Brak notesu: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Podana nazwa strony nie jest prawidłowa.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nieprawdiłowa nazwa strony \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Podczas próby wykonania akcji wymagającej indeksu\n" "indeks był nadal w trakcie aktualizacji.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Brak możliwości zmodyfikowania strony: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Strona główna" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Katalog główny dokumentów" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Notes współdzielony" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Arytmetyka" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Arytmetyka" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Przeglądarka załączników" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Pozycja w oknie" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Załączniki" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _załącznik" msgstr[1] "%i _załączniki" msgstr[2] "%i _załączników" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Nieznany" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Rozmiar" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Data modyfikacji" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Przenieś tutaj" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Skopiuj tutaj" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Anuluj" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Montuj automatycznie" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka automatycznie \"zamontuje\" notesy w razie potrzeby. Może\n" "być użyta w celu połączenia z zewnętrznym nośnikiem lub odblokowania\n" "zaszyfrowanego dysku gdy Zim próbuje otworzyć określony notes.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Panel z Odnośnikami do strony" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka dodaje widżet pokazujący listę stron zawierających\n" "odnośniki do aktualnej strony.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Odnośniki do strony" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Dziś" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kalen_darz" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "dnia" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "tygodnia" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "miesiąca" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "roku" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Pokaż kalendarz w panelu bocznym zamiast w oknie dialogowym" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Użyj osobnej strony dla każdego" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %e %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalendarz" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Dziś" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Wstaw diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Wstaw diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka udostępnia programowi Zim edytor diagramów wykorzystujący GraphViz.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Edytuj diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Wstaw ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Wstaw Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka udostępnia programowi Zim edytor diagramów wykorzystujący Ditaa.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Edytuj Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "Wyrażenie matematyczne..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Wstaw wyrażenie matematyczne" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Wstaw wyrażenie matematyczne" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka udostępnia programowi Zim edytor równań wykorzystujący LaTeX.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Edytuj wyrażenie matematyczne" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Wstaw Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Wtyczka dostarcza programowi Zim edytor wykresów na podstawie Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Edytuj Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Wykres GNU _R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Wstaw wykres GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Wtyczka dostarcza programowi Zim edytor wykresów na podstawie GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Edytuj wykres GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Wykresy GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Oblicz wyrażenie" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Wtyczka kalkulatora wewnętrznego nie była w stanie\n" "obliczyć wyrażenia pod kursorem." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Kalkulator wewnętrzny" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka umożliwia szybkie obliczanie prostych wyrażeń matematycznych\n" "w programie Zim.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Błąd analizy składni wyrażenia" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbol..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Wstaw symbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka dodaje okno 'Wstaw symbol' i umożliwia\n" "automatyczne formatowanie znaków typograficznych.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "Sortuj wiersze" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Sortowanie wierszy" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Wtyczka sortuje wybrane wiersze w kolejności alfabetycznej.\n" "Jeżeli wiersze są już posortowane, kolejność jest odwracana\n" "(A-Z na Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Proszę wpierw wybrać więcej niż jeden wiersz tekstu." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Pokaż mapę odnośników" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa odnośników" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka udostępnia okno zawierające graficzną\n" "reprezentację struktury odnośników w notesie.\n" "Może być użyta jako coś na wzór „mapy myślowej”\n" "przedstawiającej relacje między stronami.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Drukuj do przeglądarki www" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka ta służy jako substytut drukowania w programie Zim.\n" "Eksportuje aktualną stronę do pliku html i otwiera ten plik\n" "w przeglądarce www. Następnie możesz użyć przeglądarki www\n" "do wydrukowania swojej strony.\n" "\n" "Jest to wtyczka domyślnie dostarczana z programem Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Drukuj do przeglądarki www" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Szybka notatka..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Szybka notatka" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka udostępnia okno do szybkiego umieszczania tekstu\n" "ze schowka w treści aktualnej strony.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Stwórz nową stronę dla każdej notatki" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Nazwa" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Otwórz _stronę" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "Part_ytura" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Wstaw partyturę" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Wstaw partyturę" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka dostarcza programowi Zim edytor partytur na podstawie Lilypond.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Nagłówek dołączany za każdym razem" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Stopka dołączana za każdym razem" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Edytuj partyturę" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Zrzut ekranu..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Wstaw zrzut ekranu" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka umożliwia wykonywanie zrzutów ekranu i bezpośrednie wstawianie ich\n" "na aktualną stronę.\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Zrób zrzut całego ekranu" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Wybierz okno lub obszar" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Opóźnienie" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekund" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "W trakcie wykonywania polecenia \"%s\" wystąpiły błędy" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Sprawdź _pisownię" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Sprawdzanie pisowni" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dodaje obsługę sprawdzania pisowni przy użyciu gtkspell.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Nie udało się załadować sprawdzania pisowni dla języka \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "To może oznaczać, że nie masz zainstalowanych\n" "odpowiednich słowników" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Spis treści" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka dodaje specjalny widżet wyświetlający spis treści aktualnej strony.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" "Wyświetlaj spis treści jako pływający widżet zamiast w panelu bocznym" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Spis treści" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Poziom niżej" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Poziom wyżej" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "brak znaczników" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Sortuj w kolejności alfabetycznej" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sortuj strony zgodnie ze znacznikami" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Znaczniki" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Wtyczka udostępnia indeks stron filtrowanych według znaczników wyświetlanych " "w chmurce.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Lista zadań" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta wtyczka wyświetla okno dialogowe zawierające wszystkie zadania do " "wykonania\n" "znajdujące się w otwartym notesie. Zadania te powinny być umieszczone w " "notesie\n" "w postaci niezaznaczonych pól \"[ ]\" lub elementów oznakowanych słowami " "\"TODO\" lub \"FIXME\".\n" "\n" "Jest to wtyczka domyślnie dostarczana z programem Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Rozpatruj wszystkie pola wyboru jako zadania" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Przekształć nazwę strony w znaczniki dla zadań" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Domniemana data wykonania dla zadań na stronach kalendarza" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Oznaczaj zadania do wykonania na poniedziałek lub wtorek jako przedweekendowe" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Etykiety wskazujące na zadania" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Etykieta następnego zadania" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Należy stworzyć indeks notesu" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Otwierasz listę zadań po raz pierwszy.\n" "Najpierw należy przebudować indeks notesu.\n" "W zależności od rozmiarów notesu, może to zająć\n" "do kilku minut. Nie będzie potrzeby przebudowywania\n" "indeksu gdy następnym razem otworzysz listę zadań." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtr" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Pokaż tylko zadania wymagające akcji" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i zadań do wykonania" msgstr[1] "%i zadanie do wykonania" msgstr[2] "%i zadania do wykonania" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Wszystkie zadania" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Nieoznaczone" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Zadanie" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Data" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikona obszaru powiadamiania" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka to dodaje ikonę obszaru powiadamiania, by ułatwić szybki dostęp do " "notesu Zim.\n" "\n" "Zależy od Gtk+ w wersji 2.10 lub wyższej.\n" "\n" "Jest to wtyczka domślnie dostarczana z programem Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klasyczna ikona obszaru powiadamiania,\n" "nie używaj nowych ikon statusu na Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Pokaż oddzielne ikony dla każdego notatnika" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "Szybka notatka" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Inne..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notesy" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim - Osobista Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Zapisz wersje..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "Wersje..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Brak zmian od ostatniej zapisanej wersji" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Brak zmian od ostatniej wersji" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Kontrola wersji" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Wtyczka dodaje kontrolę wersji dla notesów.\n" "\n" "Wtyczka obsługuje systemy kontroli wersji Bazaar, Git i Mercurial.\n" "\n" "Wtyczka ta jest domyślnie dostarczona wraz z programem Zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Automatyczny zapis wersji w określonych przedziałach czasu" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatycznie zapisana wersja z programu Zim." #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Włączyć kontrolę wersji?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Kontrola wersji nie jest włączona dla tego notesu.\n" "Czy chcesz ją włączyć?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "System kontroli wersji" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Zapisz wersję" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Wpisz komentarz do tej wersji" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Zapisana wersja z programu Zim." #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Wersje" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Strona" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Pokaż _opisane" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Wybierz wersję, którą chcesz porównać z obecnym stanem.\n" "Możesz też wybrać wiele wersji, by porównać je między sobą.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Komentarz" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Przywróć wersję" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Pokaż _Zmiany" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Obok siebie" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Opisane źródło strony" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Przywrócić stronę do zapisanej wersji?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Czy chcesz przywrócić stronę: %(page)s\n" "do zapisanej wersji: %(version)s ?\n" "\n" "Wszystkie zmiany wprowadzone po zapisaniu ostatniej wersji zostaną utracone!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Zmiany" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rewizja" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Zapisuj wydarzenia przy pomocy Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Przesyła wydarzenia do usługi Zeitgeist." #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Strona wiki: %s" #~ msgid "Web browser" #~ msgstr "Przeglądarka WWW" #~ msgid "File browser" #~ msgstr "Przeglądarka plików" #~ msgid "Pages" #~ msgstr "Strony" #~ msgid "Output" #~ msgstr "Wyjście" #~ msgid "Match c_ase" #~ msgstr "Rozróżniaj małe i wielkie litery" #~ msgid "Prio" #~ msgstr "Ważn" #~ msgid "Text Editor" #~ msgstr "Edytor tekstowy" #~ msgid "Email client" #~ msgstr "Klient e-mail" #~ msgid "Slow file system" #~ msgstr "Wolny system plików" #~ msgid "_Filter" #~ msgstr "_Filtruj" zim-0.60/translations/ro.po0000664000175000017500000023436412137750055015632 0ustar jaapjaap00000000000000# Romanian translation for zim # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:10+0000\n" "Last-Translator: abelcavasi \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Alegerea fișierului sau dosarului de ieșire" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Dosarul de ieșire" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Eșec în rularea aplicației: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "a returnat statusul de ieșire nenul %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Implicit" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Fișier negăsit: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Nu poate fi citit: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Aceasta înseamnă de regulă că fișierul conține caractere invalide" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detalii" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Deschide cu „%s”" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nume" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Comanda" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Deschide fișier" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Deschide dosar" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Şterge Filă" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Ştergeţi" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selecţia" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nume fişier" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Pagină" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Curăţă ataşamentele" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inversare selecție" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Fişierele următoare se găsesc în dosarul cu ataşamente al Zim, dar nu mai " "sunt \n" "legate în notes. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "N-au fost găsite fişiere orfane." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Unelte personalizate" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Puteţi configura uneltele personalizate care apar\n" "în meniul de unelte şi în bara de unelte sau în meniurile contextuale." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Editaţi unealta personalizată" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descriere" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Iconiţă" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Comanda nu modifică date" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Afișat în bara de unelte" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Următorii parametri vor fi substituiți\n" "în comandă când aceasta este executată:\n" "\n" "%f sursa paginii ca fișier temporar\n" "%d dosarul cu atașamente al paginii curente\n" "%s adevăratul fișier-sursă al paginii (dacă există)\n" "%n locația notesului (fișier sau dosar)\n" "%D rădăcina documentului (dacă există)\n" "%t textul sau cuvântul selectat în dreptul cursorului\n" "%T textul selectat ce include formatarea wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportare" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Se actualizează indexarea" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Dosarul există: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Dosarul există deja și are conținut, iar exportarea în acest dosar ar putea " "suprascrie fișierele existente. Continuați, totuși?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Se exportă notesul..." #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Fișierul există" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Fișierul există.\n" "Doriți să-l suprascrieți?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Selectați paginile pentru exportare" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Notesul complet" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "O singură pagină" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Selectați formatul pentru export" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Altele..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formatare" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Șablon" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Leagă fișierele de documentul-rădăcină cu întreaga cale a fișierului" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Harta dosarului rădăcină în legătură" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Pagina de index" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Fișier de ieșire" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Previzualizați" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Arată _jurnalul" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "A ocurs o eroare la generarea imaginii.\n" "Doriți totuși să salvați textul-sursă?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Fișier-jurnal" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fișier" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Editează" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Vizualizare" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Inserare" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Căutare" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_matare" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "Unel_te" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "Navi_gare" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "A_jutor" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "_Bara de căi" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Bară de unel_te" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "Pagină _nouă" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "S_ubpagină nouă" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Deschide alt n_otes" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Deschide într-o _fereastră nouă" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importă pagina" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Salvare" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Salvează o _copie" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportă..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Trimite _spre..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Mută pagina..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Redenumește pagina..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Șterge pagina" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Proprie_tăți" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "În_chide" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "P_ărăsește aplicația" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Scotocește" #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Caut_ă antelegături" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Pref_erințe" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Reîncarcă" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Deschide d_osarul atașamentelor" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Deschide dosarul _notesurilor" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Deschide Documentul-_rădăcină" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Deschide _dosarul documentelor" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Atașează _fișier" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Atașează fișier extern" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Curăță atașamentele" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Editează _sursa" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Pornește serverul _web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Actualizează _indexul" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Unel_te personalizate" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "Îna_poi" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Mergi o pa_gină înapoi" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Înaintează" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Mergi o _pagină înainte" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Părinte" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Mergi la pagina-părinte" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Copil" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Mergi la pagina-copil" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Anterior în index" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Mergi la pagina precedentă" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Următorul în i_ndex" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Mergi la pagina următoare" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Acasă" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Mergi acasă" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Sari _la..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Conținuturi" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "Întrebări _frecvente" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "Sc_urtături de taste" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "O_bstacole" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Despre aplicație" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Bară de _stare" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "Pe tot _ecranul" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notes de _editat" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Comută notesul de editat" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Nimic" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Pagini _recente" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Istoric" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Sp_ațiu pentru nume" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Iconiț_e și text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Doar _iconițe" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Doar _text" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Iconițe _mari" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Iconițe m_ici" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Ic_onițe minuscule" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Utilizează pentru a trece la panoul lateral" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Șterge și lincurile odată cu paginile" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Utilizează mereu ultima poziție a cursorului la deschiderea unei pagini" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Fișierul sau dosarul specificat nu există.\n" "Verificați dacă ați ales calea corectă." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Nici un fișier sau dosar: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Caută" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Actualizez notesul?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Acest notes a fost creat cu o versiune mai veche a Zim.\n" "Doriți să-l actualizați la ultima versiune acum?\n" "\n" "Actualizarea va lua ceva timp și va produce unele schimbări\n" "notesului. În general, este o idee bună să faceți o\n" "copie a lui înainte.\n" "\n" "Dacă alegeți să nu actualizați acum, unele caracteristici\n" "s-ar putea să nu lucreze după așteptări." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Se actualizează notesul" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Indexul se actualizează, încă. Înaintea finalizării, legăturile nu pot fi " "actualizate corect. Efectuarea acestei acțiuni acum ar putea întrerupe " "legăturile. Continuați, totuși?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Se actualizează legăturile" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Se șterg legăturile" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Creați dosarul?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Nu s-a putut deschide: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Această pagină nu are un dosar pentru atașamente" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editarea fișierului: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Editați fișierul cu o aplicație externă. Puteți închide acest dialog când " "terminați" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Un wiki pentru desktop" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " abelcavasi https://launchpad.net/~abel-cavasi" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "doar în citire" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Antelegătură" msgstr[1] "%i _Antelegături" msgstr[2] "%i _Antelegături" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Nu poate fi salvată pagina: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Pentru a continua, puteți salva o copie a acestei pagini sau neglijați\n" "toate modificările. Dacă salvați o copie, modificările vor fi de asemenea\n" "neglijate, dar veți putea restaura copia ulterior." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Neglijați mo_dificările" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Salvați copia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Salt la" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Salt la pagina" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "O nouă sub-pagină" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Pagină nouă" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Notați faptul că legarea la o pagină inexistentă\n" "creează de asemenea o nouă pagină automat." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Numele paginii" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Model de pagină" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Pagina există" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Salvați o copie" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Pagina de import" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Fișiere text" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Mută pagina" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "'Mută pagina \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Se actualizează %i legătură de pagină la această pagină" msgstr[1] "Se actualizează %i legături de pagină la această pagină" msgstr[2] "Se actualizează %i legături de pagină la această pagină" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Spațiu de nume" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Redenumire Pagină" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Redenumirea paginii \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Se actualizează antetul acestei pagini" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Ștergeți pagina" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Ștergeți pagina \"%s\"" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Pagina \"%s\" și toate sub-paginile\n" "și atașamentele sale vor fi șterse" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "" "Ștergeți legăturile de la %i legături de pagină ale acestei pagini" msgstr[1] "" "Ștergeți legăturile de la %i legături de pagini ale acestei pagini" msgstr[2] "" "Ștergeți legăturile de la %i legături de pagini ale acestei pagini" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i fișier va fi șters" msgstr[1] "%i fișiere vor fi șterse" msgstr[2] "%i fișiere vor fi șterse" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Atașează fișier" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Pagina \"%s\" nu are un dosar pentru atașamente" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Inserează imaginile ca legătură" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notesul" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Deschide notesul" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Notesul implicit" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Adaugă notes" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Selectați vă rog un nume și un dosar pentru notes" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Dosar" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Se actualizează indexul..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Desfă" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Refă" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "De_cupează" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copiază" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Li_pește" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "Șt_erge" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Comută căsuța de verificare 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Comută căsuța de verificare 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Editează legătura sau obiectul..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Ște_rge legătura" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Dată și timp..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Imagine..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Lis_tă de marcatori" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Listă numerală" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Listă de ca_sete" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text din _fișier..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Legătură..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Inserează legătură" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Curăță formatarea" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Găsește" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Gă_sește următorul" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Găsește precedentul" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "Înlocui_re..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Numărător de cuvinte..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Mărește" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Micș_orează" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Mărime _normală" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Antet _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Antet 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Antet _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Antet 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Antet _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Antet 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Antet _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Antet 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Antet _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Antet 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "În_groșat" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Îngroșat" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Accentuat" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Accentuat" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "S_ubliniat" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Subliniat" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Tăiat" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Tăiat" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Indice" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "E_xponent" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Literal" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Literal" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Utilizați tasta pentru a urma legătura\n" "(Dacă debifați, utilizați pentru aceasta)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Arată cursorul și pe paginile ce nu pot fi editate" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Transformă automat cuvinte \"CamelCase\" în legături" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Transformă automat căi de fișier în legături" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Selectează automat cuvântul curent la aplicarea formatului" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "De-indentare cu tasta \n" "(Dacă debifați, de-indentați cu )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Cu clicuri repetate pe casetă se obțin ciclic toate opțiunile casetei" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "(De-)Indentarea unei liste de itemi afectează și sub-itemii" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Bifând o casetă se bifează și sub-itemii" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformatează din mers marcajele wiki" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Formatul implicit de copiere a textului din sertarul de memorie" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Nu există vreun wiki definit ca: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copi_ază ca" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Mută textul selectat..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Editează proprietățile" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Editează _legătura" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copiază le_gătura" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copiază adresa de e-mail" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Deschide cu..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Deschide" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Inserare dată și oră" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendar" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "Legătură la _dată" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Inserare imagine" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Atașați imaginea întâi" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Tip de fișier nesuportat: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Editare imagine" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Locația" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Legătură la" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Lățimea" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Înălțimea" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Resetați mărimea" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Inserare text din fișier" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Editare legătură" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Legătură" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Următor" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Precedent" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Potrivire exa_ctă" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Cu_vânt întreg" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expresie _regulată" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Evidențiază" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Găsește" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opțiuni" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Caută și înlocuiește" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Ce să caute" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Cu ce să înlocuiască" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "În_locuiește" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Înlo_cuiește tot" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Contor de cuvinte" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paragraf" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Cuvinte" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Linii" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caractere" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Mută textul în altă pagină" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Mută" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Mută textul în" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Lasă legătură la noua pagină" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Deschide pagină nouă" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interfață" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editare" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferințe" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Suplimente" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Utilizează font personalizat" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mai multe" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigurare" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependențe" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Fără dependențe" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Eșuat" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opțional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Activat" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Supliment" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configurare supliment" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opțiuni pentru suplimentul %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Proprietăți" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Proprietăți notes" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Pentru căutări avansate puteți utiliza operatori precum\n" "AND, OR și NOT. Citiți pagina de ajutor pentru mai multe detalii." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limitează căutarea la câmpul de nume curent" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Scor" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Serverul nu este pornit" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Portul" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Serverul este pornit" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Serverul este oprit" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Selectați fișierul" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Exp_andează tot" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Res_trânge tot" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Golește" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Selectarea dosarului" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Selectarea imaginii" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Se pare că ați găsit o avarie" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Când raportați această avarie includeți vă rog\n" "informația din caseta de text de dedesubt" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Toate fișierele" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Imagini" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Fișierul există" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Fișierul cu numele \"%s\" există deja.\n" "Puteți utiliza alt nume sau suprascrie fișierul existent." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Răsfoiește" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Suprascrie" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "N-a fost găsit vreun fișier sau dosar pentru acest notes" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Nu poate fi găsit notesul: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Numele de pagină dat este invalid.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nume de pagină invalid: \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Indexarea apare ca fiind în curs de desfășurare când se încearcă\n" "realizarea unei operații ce necesită indexul.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Nu se poate modifica pagina: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Cuvânt-cheie interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Pagină de pornire" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Document-rădăcină" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Notes distribuit" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetic" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetic" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Răsfoire printre atașamente" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Acest supliment prezintă dosarul cu atașamente al paginii curente ca\n" "panou de vizualizare cu iconițe, aflat dedesubt.\n" "\n" "Suplimentul este încă în curs de dezvoltare.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Atașamente" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Necunoscut(ă)" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Mărime:" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modificată" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Mută aici" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copiază aici" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Anulează" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Auto-montare" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment poate \"monta\" automat notesurile când e nevoie. El poate " "fi,\n" "de exemplu, utilizat pentru conectarea cu unități de la distanță sau " "deblocarea unei unități criptate\n" "când zim încearcă deschiderea unui notes specific.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "La _ziua" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_dar" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Zi" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Săptămână" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Lună" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "An" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Afișează calendarul în panoul alăturat în locul unui dialog" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Utilizează o pagină pentru fiecare" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendar" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "As_tăzi" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gramă..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Inserare diagramă" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Inserare diagramă" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment furnizează un editor de diagrame pentru zim bazat pe " "GraphViz.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Editare diagramă" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Inserează ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Inserare Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment furnizează un editor de diagrame bazat pe Ditaa\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Editare Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_cuație" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Inserare ecuație" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Inserare ecuație" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment furnizează un editor de ecuații pentru zim bazat pe latex.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Editare ecuație" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Inserare Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Acest supliment furnizează un editor grafic bazat pe Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Editare Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Inserare GNU R Plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Acest supliment furnizează un editor grafic pentru zim bazat pe GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Editare GNU R Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evaluează expresii _matematice" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Suplimentul de calculator în linie nu poate\n" "evalua expresia de lângă cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calculator în linie" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment vă permite să evaluați rapid cu zim\n" "expresii matematice simple.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Expresia nu poate fi analizată" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Si_mbol..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Inserare simbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment adaugă dialogul 'Inserare simbol' și permite\n" "caractere tipografice auto-formatate.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Sortează linii" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Sortator de linii" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Acest supliment sortează liniile selectate în ordine alfabetică.\n" "Dacă lista este deja sortată, ordonarea va fi inversată\n" "(A-Z to Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Selectați întâi mai mult de o linie de text." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Afișează harta cu legături" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Harta cu legături" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Acest supliment furnizează un dialog cu reprezentarea\n" "grafică a structurii cu legături a unui notes.\n" "El poate fi utilizat în genul unei \"hărți mentale\"\n" "ce arată cum se relaționează paginile.\n" "\n" "Acesta este un supliment de bază asociat cu zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Printează în navigator" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Printează în navigator" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "" msgstr[1] "" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Editor de text" #~ msgid "Email client" #~ msgstr "Client de e-mail" #~ msgid "Web browser" #~ msgstr "Navigatorul web" #~ msgid "File browser" #~ msgstr "Navigatorul de fişiere" zim-0.60/translations/da.po0000644000175000017500000024107312137750055015567 0ustar jaapjaap00000000000000# English (United Kingdom) translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # Morten Juhl-Johansen Zölde-Fejér , 2010. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: Morten Juhl-Johansen Zölde-Fejér " "\n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-11-19 05:57+0000\n" "Last-Translator: mjjzf \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Kunne ikke køre programmet %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "returnerede en exit-status, der ikke var nul %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Kunne ikke køre: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Standard" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Ingen fil med navnet %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Kunne ikke indlæse %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Dette betyder almindeligvis, at filen indeholder ugyldige tegn" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detaljer" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Kunne ikke skrive til fil: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Fil ændret på disk: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Tilpas..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Ingen programmer til rådighed" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Åbn med \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Opsæt et priogram til at åbne \"%s\"-links" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Opsæt et program til at åbne filer\n" "af typen \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Opsæt programmer" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Tilføj program" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Systemstandard" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Navn" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Kommando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Sæt som standardprogram" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Åben fil" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Åbn mappe" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Slet fil" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Slet" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Markering" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Filnavn" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Side" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Opryd vedhæftninger" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Omvend markering" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Nedenstående filer blev fundet i mappen med vedhæftede filer, men har ikke " "længere henvisninger i notesbogen. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Der blev ikke fundet filer uden tilknytning." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Egne værktøjer" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Du kan definere egne værktjer, som vil vises\n" "i Værktøjer-menuen og værktøjslinien eller kontekstmenuer." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Rediger egne værktøjer" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Beskrivelse" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Kommando modificerer ikke data" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Vis på værktøjslinie" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "De følgende parametre vil blive erstattet\n" "i kommandoen, når den udføres:\n" "\n" "%f sidens kilde som midlertidig fil\n" "%d vedhæftningsmappen for aktuelle side\n" "%s den virkelige kildefil til siden (hvis der er en)\n" "%n notesbogens placering (fil eller mappe)\n" "%D dokumentets rod (hvis der er en)\n" "%t markeret tekst eller ord under cursor\n" "%T markeret tekst inklusiv wiki-formattering\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Eksport" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Opdaterer indeks" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Mappen findes: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Mappen findes allerede og er ikke tom; eksporteres der til denne mappe, kan " "det overskrive eksisterende filer. Ønsker du at fortsætte?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Eksporterer notesbog" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Filen findes allerede" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Denne fil filndes allerede.\n" "Ønsker du at overskrive den?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Vælg sider, der skal eksporteres" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Hele _notesbogen" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Enkelt _side" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Vælg format til eksport" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Andet..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Skabelon" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Link filer under dokumentets rod med fuld filsti" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Sæt dokumentrod til URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Vælg outputfil eller -mappe" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Mappe til output" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Indeksside" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Outputfil" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Forhåndsvisning" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Vis _Log" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Der opstod en fejl under billedgenereringen.\n" "Ønsker du at gemme kildeteksten alligevel?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Logfil" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fil" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Rediger" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Vis" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Indsæt" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Søg" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Værktøjer" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Go" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Hjælp" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "S_tilinie" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Værktøjslinie" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Ny side..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Ny _underside..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Åbn anden notesbog..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Åbn i nyt vindue" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importer side..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Gem" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Gem _kopi..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "Eksport..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Send til..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "F_lyt side..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Omdøb side..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Slet side" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Egenskaber" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Luk" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Afslut" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Søg..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Søg til_bagevisende links..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Kopier _placering" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "S_kabeloner" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Indstillinger" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Genindlæs" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Åbn mappe med vedhæftede _filer" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Åbn mappe med notesbøger" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Åbn dokumentets rod" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Åbn dokumentmappe" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Vedhæft _Fil" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Vedhæft ekstern fil" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Opryd vedhæftninger" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Rediger _kildetekst" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Start _webserver" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Opdater indeks" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Egne _værktøjer" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Tilbage" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Gå en side tilbage" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Frem" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Gå en side frem" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Overordnet" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Gå til overordnet side" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Underordnet" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Gå til underordnet side" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Foregående i indeks" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Gå til foregående" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Næste i indeks" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Gå til næste side" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Forside" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Gå til forside" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Spring til..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Indhold" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Tastaturbindinger" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bugs" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Om" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_All Paneler" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Vis alle paneler" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statuslinie" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Sidepaneler" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Vis sidepanelder" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Fuld skærm" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notesbog _redigerbar" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Notesbog redigerbar/ikke-redigerbar" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Ingen" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Seneste sider" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historik" # Not too happy about this one. #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_amespace" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikoner _og tekst" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Kun _ikoner" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Kun _tekst" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "St_ore ikoner" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "S_må ikoner" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Helt små ikoner" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Tilføj håndtag til at frigøre menuer" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Anvend for at skifte til sidepanelet" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Fjern links, når sider slettes" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Brug altid seneste markørplacering ved åbning af side" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Den angivne fil eller mappe eksisterer ikke.\n" "Efterse, at stien er opgivet korrekt." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Filen eller mappen %s findes ikke" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Søg" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Opgrader notesbog?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Denne notesbog er oprettet med en ældre version af zim.\n" "Ønsker du at opgradere den til nyeste version nu?\n" "\n" "Opgradering vil tage noget tid og kan foretage visse ændringer\n" "i notesbogen. Det er generelt en god ide at lave en backup forinden.\n" "\n" "Hvis du ønsker at opgradere nu, vil nogle funktioner muligvis ikke\n" "fungere som man kunne forvente" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Opgraderer notesbog" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Indekset er i gang med at opdatere. Indtil dette er fuldført, kan links ikke " "opdateres korrekt. At udføre denne funktion nu kunne knække nogle links - " "ønsker du at fortsætte alligevel?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Opdaterer links" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Fjerner links" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Opret mappe?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Kunne ikke åbne %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Denne side har ikke en mappe med vedhæftninger" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Redigerer filen %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Du er i gang med at redigere en fil i et eksternt program. Du kan lukke " "denne dialog, når du er færdig" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "En desktop-wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Frederik 'Freso' S. Olesen https://launchpad.net/~freso\n" " Jeppe Toustrup https://launchpad.net/~tenzer\n" " fsando https://launchpad.net/~fsando\n" " mjjzf https://launchpad.net/~mjjzf\n" " nanker https://launchpad.net/~nanker" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Indeks" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Skrivebeskyttet" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Henvisning hertil..." msgstr[1] "%i _Henvisninger hertil..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Kunne ikke gemme siden %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "For at fortsætte kan du gemme en kopi af denne side eller forkaste\n" "ændringer. Gemmer du en kopi vil ændringerne også bortfalde, men\n" "kopien vil kunne genindlæses senere." # Upræcist #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Forkast ændringer" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Gem kopi" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Sping til" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Spring til side" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Ny underside" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Ny side" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Bemærk, at at link til en ikke-eksisterende side\n" "opretter en ny side automatisk." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Navn på side" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Sideskabelon" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Siden findes allerede" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Gem kopi" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importer side" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Tekstfiler" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Flyt side" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Flyt siden \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Opdatér %i side, der henviser til denne side" msgstr[1] "Opdatér %i sider, der henviser til denne side" # Not happy about this one. #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Namespace" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Omdøb side" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Omdøb siden \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Opdater sidens overskrift" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Slet side" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Slet siden \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Siden \"%s\" og alle dens\n" "undersider og vedhæftede filer vil blive slettet" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Fjern links fra %i side, der henviser til denne side" msgstr[1] "Fjern links fra %i sider, der henviser til denne side" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i fil vil blive slettet" msgstr[1] "%i filer vil blive slettet" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Vedhæft fil" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Siden \"%s\" har ingen mappe til vedhæftede filer" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Indsæt billeder som link" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notesbog" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Åbn notesbog" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Standardnotesbog" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Tilføj notesbog" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Vælg navn og mappe til notesbog." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Mappe" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Opdaterer indeks..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Fortryd" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Gendan" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Kl_ip" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "K_opier" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Indsæt" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Slet" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Skift afkrydsning 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Skift afkrydsning 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Rediger link eller objekt..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Slet link" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Dato og tid..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Billede..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "_Punktliste" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Nummereret liste" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Liste med _afkrydsningsbokse" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Tekst fra _fil..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Link..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Indsæt link" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Ryd formattering" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Find..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Find _næste" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Find _foregående" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Erstat..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Ordtælling..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Zoom ind" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Zoom _ud" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normal størrelse" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Ny _vedhæftning" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "_Skabeloner..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Overskrift _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Overskrift 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Overskrift _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Overskrift 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Overskrift _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Overskrift 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Overskrift _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Overskrift 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Overskrift _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Overskrift 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Fed" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Fed" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Kursiv" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Kursiv" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marker" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marker" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Overstreg" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Overstreg" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Lav skrift" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Høj skrift" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Maskinskrift" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Maskinskrift" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Brug til at følge links\n" "(Hvis deaktiveret kan man stadig bruge )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Vis cursoren - også i sider, der ikke kan redigeres" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Konverter automatisk ord med \"CamelCase\" til links" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Konverter automatisk filstier til links" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Vælg automatisk det aktuelle ord, når formattering påføres" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Slet indrykning med \n" "(Hvis deaktiveret kan fortsat anvendes)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Trykkes der igen på en afkrydsningsboks, vil man gennemgå de forskellige " "markeringstyper for denne." #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Ændring af indrykning på en liste vil også påvirke underliggende punkter" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Kryds i afkrydsningsboks vil også ændre underpunkter" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Konverter wiki-opmærkningm mens der skrives" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Standardformat for kopiering af tekst til udklipsholder" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Mappe med skabeloner til vedhæftede filer" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Der er ikke defineret en sådan wiki: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopier _Som..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Flyt valgt tekst..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Rediger indstillinger" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Rediger link" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopier _link" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopier emailadresse" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Åbn med..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Åbn" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Ingen skabeloner installeret" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Mappen\n" "%s\n" "findes ikke.\n" "Ønsker du at oprette den nu?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Indsæt dato og tidspunkt" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalender" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Link til dato" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Indsæt billede" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Vedhæft billede først" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Filtype ikke understøttet: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Rediger billede" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Placering" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Link til" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Bredde" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Højde" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Nulstil størrelse" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Indsæt tekst fra fil" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Rediger link" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Link" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Tekst" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Næste" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Foregående" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Samme _store/små bogstaver" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Helt _ord" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regulære udtryk" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Fremhæv" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Find" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Valgmuligheder" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Find og erstat" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Søg efter" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Erstat med" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Erstat" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Erstat _alle" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Ordtælling" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Afsnit" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Ord" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Linier" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Tegn" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Flyt tekst til anden side" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Flyt" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Flyt tekst til" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Efterlad link til ny side" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Åbn ny side" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Grænseflade" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Redigering" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Indstillinger" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Plugins" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Anvend egen font" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mere" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "Konfiguration" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Afhængigheder" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Ingen afhængigheder" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Fejlet" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Valgfri" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Forfatter" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Aktiveret" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Plugin" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Konfigurer plugin" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Valgmuligheder for plugin'et %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Egenskaber" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Egenskaber for notesbog" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "For avanceret søgning kan man bruge operatorer som\n" "AND, OR og NOT. Se hjælpesiden for yderligere detaljer." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Begræns søgning til nuværende namespace" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Score" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server ikke startet" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server startet" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server stoppet" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Skabeloner" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Kopier skabelon" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Vælg fil" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Udfold _alle" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Sammenfold alle" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Ryd" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Vælg mappe" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Vælg billede" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Venstre sidepanel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Højre sidepanel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Panel i bunden" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Panel i toppen" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Det ser ud som en fejl i zim!" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Ved fejlrapportering bedes\n" "nedenstående oplysninger inkluderet" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Alle filer" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Billeder" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Filen eksisterer" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "En fil med navnet \"%s\" findes allerede." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Gennemse" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Overskriv" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Kunne ikke finde fil eller mappe for denne notesbog" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Kunne ikke finde notesbogen %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Det opgivne navn er ikke et gyldigt sidenavn.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Ugyldigt sidenavn - \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Indeks er fortsat i gang med en opdatering, mens der\n" "foretages en operation, der kræver indekset.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Kan ikke ændre i siden %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Adgangskode til Interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Forside" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Dokumentets rod" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Delt notesbog" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetik" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetik" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Browser til vedhæftede filer" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Dette plugin viser mappen med filer vedhæftet til den aktuelle side\n" "som ikonserie i et panel i bunden.\n" "\n" "Dette plugin er fortsat under udvikling.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Vedhæftede filer" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Størrelse" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Ændret" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automount" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "I_dag" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Kalender" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Dag" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Uge" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Måned" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "År" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Vis kalender i sidebjælken istedet for som dialog" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Brug en side til hver" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d. %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Idag" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Indsæt diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Indsæt diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin tilføjer en GeaphViz-baseret diagram-editor til zim.\n" "\n" "Dette er et core-plugin, der leveres med zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Rediger diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Formel..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Indsæt formel" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Indsæt formel" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin indsætter en LaTeX-baseret formeleditor i zim.\n" "\n" "Dette er et core-plugin, der udgives sammen med zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr ":_Rediger formel" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Indsæt Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Dette plugin giver adgang til redigering af plots via Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Rediger Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R-plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Indsæt GNU R-plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Dette plugin tilføjer en plot-editor baseret på GNU R i zim\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Rediger GNU R-Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R-Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evaluer _matematik" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Matematik-plugin'et kunne ikke evaluere\n" "udtrykket ved markøren." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "In-line regnemaskine" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin giver mulighed for hurtigt at vurdere simple\n" "matematiske udtryk i zim.\n" "\n" "Dette er et core-plugin, der udgives med zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Kunne ikke fortolke udtrykket" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbol..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Indsæt symbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin tilføjer \"Indsæt symbol\"-dialogen, som \n" "tilføjer automatisk formattering af typografiske tegn.\n" "\n" "Dette er et core-plugin, der udgives sammen med zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Sorter linier" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Liniesortering" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Dette plugin sorterer markerede linier i alfabetisk rækkefølge.\n" "Såfremt listen allerede er sorteret sådan, vil rækkefølgen blive omvendt\n" "(A-Å bliver til Å-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Start med at vælge mere end 1 tekstlinie." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Vis kort over links" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Link-kort" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin giver en dialog med en grafisk visning\n" "af notesbogens struktur. Den kan bruges som en slags\n" "\"mind map\", der viser, hvordan siderne relaterer til hinanden.\n" "\n" "Dette er et core-plugin, der leveres med zin.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Udskriv til browser" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin fungerer som en måde at komme udenom\n" "manglende printerunderstøttelse i zim. Det eksporterer den\n" "nuværende side til HTML of åbner den i en browser. Såfremt\n" "browseren er sat op til udskrift, får man sine data til printeren i to " "skridt.\n" "\n" "Dette er et core-plugin, der udgives sammen med zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Udskriv til browser" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Kviknote..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Kviknote" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin tilføjer en dialog til hurtigt at indsætte noget tekst eller " "udklipsholderens\n" "Indhold i en zim-side.\n" "\n" "Dette er et core-plugin, der udgives sammen med zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Opret ny side for hver note" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titel" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Åbn _Side" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Skærmbillede..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Indsæt skærmbillede" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin lader brugeren tage et skærmbillede og indsætte det direkte\n" "i en zim-side.\n" "\n" "Dette er et core-plugin, der udgives sammen med zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Tag billede af fuld skærm" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Vælg vindue eller område" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Forsinkelse" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekunder" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Der opstod en fejl under kørsel af \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Check _stavning" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Stavekontrol" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tilføjer stavekontrol med gtkspell.\n" "\n" "Dette er et core-plugin, der udgives med zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Kunne ikke indlæse stavekontrol for sproget: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Dette kan betyder, at du ikke har de rette\n" "ordbøger installeret" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Indholdsfortegnelse" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Indholdsfortegnelse" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Nedryk" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Fremryk" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "utagget" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Sorter alfabetisk" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sort sider efter tags" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Tags" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Dette plugin giver et sideindeks filtreret efter tags, der er valgt fra en " "tag-sky.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Opgaveliste" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin tilføjer en dialog, der viser alle igangværende opgaver fra\n" "denne notesbog. Aktive opgaver kan være åbne afkrydsningsbokse\n" "eller punkter markeret med \"TODO\" eller \"FIXME\".\n" "\n" "Dette er et core-plugin, der leveres med zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Tolk alle afkrydsningsbokse som opgaver" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Gør sidens navn til tag for opgaveliste" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Labels, der angiver opgaver" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Mærkat for næste opgave" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Indeksering af notesbogen er påkrævet" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Dette er den første gang opgavelisten er blevet åbnet.\n" "Derfor skal indekset opbygges.\n" "Afhængigt af notesbogens størrelse kan dette\n" "tage op til flere minutter. Næste gang du bruger\n" "listen vil det ikke være nødvendigt at gentage det." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Vis kun aktive opgaver" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i åben komponent" msgstr[1] "%i åbne komponenter" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Alle opgaver" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Opgave" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Dato" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikon" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dette plugin tilføjer et tray icon, så man hurtigt kan komme til zim.\n" "\n" "Dette plugin kræver Gtk+ version 2.10 eller nyere,\n" "\n" "Dette er et core-plugin, der udgives med zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klassisk tray icon,\n" "bruger ikke det nye statusikon i Ubuntu." #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Vis særskilt ikon for hver notesbog" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Kviknote..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Andet..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notesbøger" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "_Gem version..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versioner..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Der er ingen ændringer i denne notesbog, siden sidste version blev gemt." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Ingen ændringer siden sidste version" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Versionskontrol" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Gem en version automatisk med faste mellemrum" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatisk gemt version fra zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Aktiver versionskontrol?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Versionkontrol er ikke aktiveret for denne notesbog.\n" "Ønsker du at slå det til?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Gem version" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Indtast en kommentar til denne version" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Gemt version fra zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versioner" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Side" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Vis _annoteret" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Vælg en version for at se ændringerne imellem den version og den nuværende,\n" "eller vælg flere versioner for at se ændringerne imellem de versioner.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Kommentar" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Gendan version" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "_Vis ændringer" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Ved siden af hinanden" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Annoteret kilde for siden" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Gendan side til gemt version?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Ønsker du at etablere siden: %(page)s\n" "til den gemte version version: %(version)s ?\n" "\n" "Alle ændringer siden sidst gemte version vil gå tabt!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Ændringer" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Web browser" #~ msgstr "Webbrowser" #~ msgid "Match c_ase" #~ msgstr "_Versalfølsom" #~ msgid "File browser" #~ msgstr "Filbrowser" #~ msgid "Email client" #~ msgstr "Emailklient" #~ msgid "Text Editor" #~ msgstr "Teksteditor" #~ msgid "_Filter" #~ msgstr "_Filter" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "Pages" #~ msgstr "Pages" #~ msgid "Output" #~ msgstr "Output" #~ msgid "Slow file system" #~ msgstr "Slow file system" zim-0.60/translations/ja.po0000644000175000017500000026251112137750055015575 0ustar jaapjaap00000000000000# Japanese translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-01-01 16:05+0000\n" "Last-Translator: OKANO Takayoshi \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "アプリケーションの実行に失敗: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "が非ゼロの終了ステータス%(code)i を返しました" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "実行に失敗: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "デフォルト" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "カレンダー:週開始日(_S):0" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "ファイル無し: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "読込不能: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "これは通常、ファイル内に無効な文字が含まれている事を意味します" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "詳細情報" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "ファイルは書き込み不可: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "ディスク上でファイルが変更されています: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "カスタマイズ..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "アプリケーションが見つかりません" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "\"%s\" で開く" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "\"%s\"のリンクを開くアプリケーションを設定する" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "タイプが\"%s\"のファイルを開くアプリケーションを設定する" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "アプリケーションを設定する" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "アプリケーションを追加" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "システムのデフォルト" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "名前" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "コマンド" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "デフォルトのアプリケーションにする" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "ファイルを開く" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "フォルダを開く" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "ファイルを削除" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "削除" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "選択範囲" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "ファイル名" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "ページ" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "添付ファイルのクリーンアップ" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "選択を反転" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "以下のファイルはzimの添付ディレクトリ内で見つかりましたが\n" "ノートブックの何処からもリンクされていません。 " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "孤立ファイルは見つかりませんでした。" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "カスタムツール" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "ツールメニューやツールバー、コンテキストメニューに\n" "表示されるカスタムツールを設定することが出来ます。" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "カスタムツールの編集" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "説明" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "アイコン" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "このコマンドによるデータの改変を禁止" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "ツールバーに表示" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "実行するコマンドでは以下の事前定義パラメータを\n" "使用することが出来ます:\n" "\n" "%f 一時ファイルとして使用するページソース\n" "%d 現在のページ用の添付ディレクトリ\n" "%s (存在するなら)実際のページソースファイル\n" "%n ノートブックの位置(ファイル/フォルダ)\n" "%D (存在するなら)ドキュメントルート\n" "%t 選択範囲のテキストまたは単語\n" "%T 選択範囲のテキスト(ウィキ書式を含む)\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "エクスポート" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "目次の更新中" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "既存フォルダ: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "指定したフォルダ内には既にデータが存在しており、このフォルダにエクスポートすれば既存ファイルを上書きする可能性があります。 続けて宜しいですか?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "ノートブックをエクスポート中" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "既存ファイル" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "このファイルは既に存在します。\n" "このまま上書きして宜しいですか?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "エクスポートするページの選択" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "ノートブック全体(_N)" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "単一ページ(_P)" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "エクスポートフォーマットの選択" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "その他..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "書式" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "テンプレート" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "ドキュメントルート以降のファイルをフルパスでリンクする" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "ドキュメントルートをURLにマップする" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "出力ファイル/フォルダの選択" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "出力フォルダ" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "インデックスページ" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "出力ファイル" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "プレビュー(_P)" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "ログを表示(_L)" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "イメージの生成中にエラーが発生しました。\n" "ソーステキストをこのまま保存して宜しいですか?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "ログファイル" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "ファイル(_F)" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "編集(_E)" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "表示(_V)" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "挿入(_I)" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "検索(_S)" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "フォーマット(_M)" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "ツール(_T)" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "移動(_G)" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "ヘルプ(_H)" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "パスバー(_A)" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "ツールバー(_T)" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "新規ページ(_N)..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "新規サブページ(_U)..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "別のノートブックを開く(_O)" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "新しいウィンドウで開く(_W)" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "ページのインポート(_I)..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "保存(_S)" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "コピーの保存(_C)" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "エクスポート(_X)..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "送る(_S)..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "ページの移動(_M)..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "ページ名の変更(_R)..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "ページを削除(_D)" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "プロパティ(_T)" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "閉じる(_C)" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "終了(_Q)" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "検索(_S)..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "逆リンク検索(_B)..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "ウィキパスをコピー(_L)" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "テンプレート(_T)" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "設定(_E)" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "再読込(_R)" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "添付フォルダを開く(_F)" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "ノートブックフォルダを開く(_N)" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "ドキュメントルートを開く(_D)" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "ドキュメントフォルダを開く(_D)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "添付ファイル(_F)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "外部ファイルを添付" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "添付のクリーンアップ(_C)" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "ソースを編集(_S)" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "ウェブサーバを起動(_W)" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "インデックスを更新" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "カスタムツール(_T)" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "戻る(_B)" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "前のページへ戻る" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "進む(_F)" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "次のページへ進む" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "親ページ(_P)" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "親ページへ移動" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "子ページ(_C)" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "子ページへ移動" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "前の項目(_P)" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "前のインデックス項目へ移動" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "次の項目(_N)" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "次のインデックス項目へ移動" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "ホーム(_H)" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "ホームへ移動" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "移動(_J)..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "コンテンツ(_C)" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "FAQ(_F)" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "キーの割り当て(_K)" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "バグ(_B)" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "Zimについて(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "全てのペイン(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "全てのペインを表示" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "ステータスバー(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "サイドペイン(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "サイドペインを表示" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "全画面(_F)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "ノートブック編集(_E)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "ノートブック編集状態の切替え" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "なし(_N)" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "最近使ったページ(_R)" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "履歴(_H)" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "名前空間(_A)" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "アイコンとテキスト(_A)" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "アイコンのみ(_I)" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "テキストのみ(_T)" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "大きいアイコン(_L)" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "小さいアイコン(_S)" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "極小アイコン(_T)" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "メニューを\"点線\"で切り離せるようにする" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "サイドペインへの切替えに+を使用する" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "ページ削除時にそのページへのリンクも取り除く" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "最後にページを開いていた時のカーソル位置を記録する" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "指定されたファイルまたはフォルダが存在しません。\n" "パスが正しいかどうか確認して下さい。" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "ファイル/フォルダ無し: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "検索" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "ノートブックをアップグレードしますか?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "このノートブックは古いバージョンのZimで作成されています。\n" "今すぐ最新バージョンの形式にアップグレードしますか?\n" "\n" "アップグレードには少し時間がかかり、ノートブックがいくつか変更\n" "される可能性があります。アップグレードを行う前にノートブックの\n" "バックアップをとることをお勧めします。\n" "\n" "ここでアップグレードを行わなかった場合、いくつかの機能が期待\n" "通りの働きをしない事があります。" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "ノートブックをアップグレード中" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "インデックスが更新作業中のため、これが完了するまでリンク更新が正しく行えません。 " "今この操作を行えばリンクが破壊される可能性がありますが、それでも続けますか?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "リンクの更新" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "リンクの削除中" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "フォルダを作成しますか?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "開けません: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "このページには添付フォルダがありません" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "ファイルの編集中: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "外部アプリケーションでファイルを編集中です。 作業が終わればこのダイアログを閉じて下さい。" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "デスクトップ ウィキ" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Akihiro Nishimura https://launchpad.net/~nimu-zh3\n" " DukeDog https://launchpad.net/~windows-ero\n" " EminoMeneko https://launchpad.net/~eminomeneko\n" " Hiroshi Tagawa https://launchpad.net/~kuponuga\n" " Johan Burati https://launchpad.net/~johan-burati\n" " Katz Kawai https://launchpad.net/~katzkawai\n" " OKANO Takayoshi https://launchpad.net/~kano\n" " Tetsuya https://launchpad.net/~dr.hornet\n" " Yajima Hiroshi https://launchpad.net/~yajima\n" " mobilememo@gmail.com https://launchpad.net/~mobilememo\n" " orz.inc https://launchpad.net/~orz-inc" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "インデックス" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "読込専用" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "逆リンク: %i (_B)..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "ページを保存できません: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "続けるにはこのページのコピーを保存するか 又は全ての変更を破棄\n" "する必要があります。コピーを保存した場合でも変更は破棄されますが\n" "後でそのコピーから復元することができます。" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "変更を破棄する(_D)" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "コピーを保存(_S)" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "移動先" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "移動先ページ:" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "新規サブページ" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "新規ページ" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "存在しないページへのリンクを作成すれば\n" "自動的に新しいページが作成されます。" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "ページ名" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "ページテンプレート" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "既存ページ名:" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "コピーの保存" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "ページのインポート" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "テキストファイル" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "ページの移動" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "ページ \"%s\" へ移動" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "リンクしている %i ページを更新" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "名前空間" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "ページ名の変更" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "ページ名 \"%s\" を変更" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "ページの見出しを更新" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "ページを削除" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "ページ \"%s\" を削除しますか?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "ページ \"%s\" とその全てのサブページ\n" "及び添付ファイルが削除されます。" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "このページへリンクしている %i ページからリンクを取り除きます" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i ファイルを削除しました" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "添付ファイル" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "ページ \"%s\" は添付用のフォルダを持っていません。" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "リンクとして画像を挿入" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "ノートブック" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "ノートブックを開く" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "デフォルトのノートブック" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "ノートブック追加" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "ノートブックの名前とフォルダを選択してください。" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "フォルダ" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "インデックスの更新中..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "元に戻す(_U)" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "やり直す(_R)" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "切り取り(_T)" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "コピー(_C)" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "貼り付け(_P)" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "削除(_D)" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "チェックボックス 'V' の切替" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "チェックボックス 'X' の切替" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "リンク/オブジェクトの編集(_E)..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "リンクを消す(_R)" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "日時(_D)..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "画像(_I)..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "箇条書きリスト(_T)" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "連番リスト(_N)" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "チェックボックスリスト(_X)" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "テキストファイル(_F)..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "リンク(_L)..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "リンクの挿入" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "書式のクリア(_C)" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "ページ内検索(_F)..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "次を検索(_X)" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "前を検索(_V)" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "置換(_R)..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "単語統計..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "拡大(_Z)" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "縮小(_O)" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "通常サイズ(_N)" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "添付ファイルを新規作成(_A)" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "ファイルテンプレート(_T)..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "見出し1(_1)" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "見出し1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "見出し2(_2)" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "見出し2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "見出し3(_3)" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "見出し3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "見出し4(_4)" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "見出し4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "見出し5(_5)" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "見出し5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "太字(_S)" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "太字" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "斜体(_E)" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "斜体" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "下線(_M)" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "下線" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "取消線(_S)" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "取り消し線" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "下付き(_U)" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "上付き(_P)" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "固定幅(_V)" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "固定幅" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "カーソルがリンク上にある時 キーでリンク先に移動する\n" "(無効にしている場合は + の組み合わせ)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "編集できないページにもカーソルを表示する" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "キャメル記法(CamelCase)の単語を自動的にリンクへ変換する" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "ファイルパスを自動的にリンクへ変換する" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "現在カーソルがある単語に対して自動的にフォーマットを適用する" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" " で字下げを解除する\n" "(無効にしている場合は の組み合わせ)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "クリックによるチェックボックスの状態変更を循環させる" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "リストアイテムの字下げ(解除)をサブアイテムにも適用する" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "チェックボックスへの変更を全てのサブアイテムにも適用する" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "編集中のWikiマークアップを再フォーマットする" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "クリップボードにコピーするテキストのデフォルト形式" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "添付ファイル用テンプレートの格納フォルダ:" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Wikiの定義無し: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "特殊コピー(_A)..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "選択テキストに移動..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "プロパティの編集(_E)" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "リンクの編集(_E)" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "リンクをコピー(_L)" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "メールアドレスをコピー" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "アプリケーションで開く..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "開く(_O)" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "テンプレート無し" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "フォルダ\n" "%s\n" "はまだ存在しません。\n" "作成して宜しいですか?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "日時の挿入" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "カレンダー(_C)" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "日時ページへリンク(_L)" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "画像を挿入" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "始めに画像を添付" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "未サポートのファイル形式: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "画像プロパティの編集" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "場所" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "リンク先" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "幅" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "高さ" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "サイズのリセット(_R)" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "ファイルからテキストを挿入" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "リンクの編集" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "リンク(_L)" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "テキスト" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "次へ(_N)" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "前へ(_P)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "大小文字を区別(_C)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "単語のみ検索(_W)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "正規表現(_R)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "強調表示(_H)" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "ページ内検索" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "オプション" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "検索と置換" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "検索文字列" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "置換文字列" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "置換(_R)" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "全て置換(_A)" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "単語統計" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "段落" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "単語数" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "行数" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "文字数" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "他のページへテキストを移動" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "移動(_M)" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "移動先" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "新しいページへのリンクを残す" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "新しいページを開く" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "新規ファイル" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "インタフェース" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "編集" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "設定" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "プラグイン" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "使用するフォントを指定" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "詳細(_M)" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "設定(_O)" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "依存ファイル" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "無し" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "失敗" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "オプション" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "作者" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "有効" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "プラグイン" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "プラグインの設定" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "プラグイン%sのオプション" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "プロパティ" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "ノートブックのプロパティ" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "高度な検索用にANDやOR、NOTといった演算子が\n" "使用できます。詳しくはヘルプを参照して下さい。" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "検索対象を現在の名前空間に制限する" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "スコア" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "サーバは起動していません" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "ポート番号" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "サーバは起動中です" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "サーバは停止中です" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "テンプレート" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "テンプレートをコピー" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "ファイルの選択" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "全て開く(_A)" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "全て閉じる(_C)" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "クリア" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "フォルダの選択" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "画像の選択" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "左ペイン" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "右ペイン" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "下ペイン" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "上ペイン" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "左上" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "左下" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "右上" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "右下" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "バグに遭遇した可能性があります" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "このバグを報告する場合は下のテキストボックス\n" "にある情報も合わせて入力して下さい" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "全てのファイル" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "画像" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "既存ファイル" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "\"%s\" という名前のファイルが既に存在しています。\n" "別の名前にするか、既存のファイルを上書きすることが出来ます。" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "参照(_B)" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "上書き" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "このノートブック用のファイル又はフォルダが見つかりません" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "ノートブックが見つかりません: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "指定されたページ名は無効です。\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "\"%s\" は不正なページ名です。" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "インデックスが必要な操作を行おうとしていますが\n" "インデックスは現在更新作業中です。\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "ページを更新できません: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwikiキーワード" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "ホームページ" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "ドキュメントルート" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "プロフィール" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "ノートブックの共有" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "演算" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "演算(_A)" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "添付ブラウザ" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "このプラグインは現在の添付フォルダにある内容をアイコンとして下部ペインに表示します。\n" "\n" "このプラグインは現在未だ開発途上です。\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "ウィンドウの位置" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "添付" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "添付数(_A): %i" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "不明" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "サイズ" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "更新" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "ここへ移動(_M)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "ここへコピー(_C)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "キャンセル" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "自動マウント" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインは必要になれば自動的にノートブックを\"マウント\"します。\n" "例えば、Zimが指定したノートブックを開こうとした時、リモートドライブに接続したり、暗号化されたドライブをアンロックしたりする為に使用されます。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "逆リンクペイン" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインは現在のページへリンクしているページのリストを表示する拡張ウィジェットを追加します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "逆リンク" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "今日(_D)" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "カレンダー(_D)" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "日誌" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "このプラグインはひとつの名前空間を日・週・月毎にページを持つ日誌形式に変換します。\n" "これらのページにアクセスするにはカレンダーウィジェットが必要となります。\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "日" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "週" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "月" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "年" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "ダイアログの替わりにサイドペインに表示" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "ページを追加する単位" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%Y %B %d %A" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "カレンダー" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "今日(_T)" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "ダイアグラム(_G)..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "ダイアグラムの挿入" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "ダイアグラムの挿入" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはGraphVizを利用したダイアグラムエディタをzimに追加します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "ダイアグラムの編集(_E)" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "集中編集モード" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "このプラグインはzimの使用中、集中力を損なう無駄な表示をしない設定を追加します。\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "全画面表示でメニューバーを表示しない" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "全画面表示でツールバーを表示しない" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "全画面表示でパスバーを表示しない" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "全画面表示でステータスバーを表示しない" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "最大ページ幅" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "縦余白" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "文字背景色" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "文字色" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "画面背景色" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "ditaaを挿入" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "ditaaを挿入" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはDitaaをベースにしたZim用のダイアグラムエディタを提供します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "Ditaa編集(_E)" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "数式(_Q)..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "数式の挿入" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "数式の挿入" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはlatexを利用した方程式エディタをzimに提供します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "数式の編集(_E)" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Gnuplotの挿入" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "このプラグインはGnuplotを使用するZim用のplotエディタを提供します。\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "Gnuplot編集(_G)" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU R Plot(_R)..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "GNU R Plotの挿入" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "このプラグインはGNU Rを使用するZim用のplotエディタを提供します。\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "GNU R Plot編集(_R)" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "計算式を評価(_M)" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "インライン電卓プラグインでカーソル位置の\n" "の計算式を評価することが出来ませんでした。" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "インライン電卓" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインを使えば、Zimで簡単な数式を即座に評価することが出来るようになります。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "数式を解析できません" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "記号(_M)..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "記号の挿入" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインは特殊な記号や文字を挿入する\"記号を挿入\"ダイアログを追加し、それらの記号や文字を自動的に書式化します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "行のソート(_S)" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "行ソート" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "このプラグインは選択行をアルファベット順にソートします。\n" "既にリストがソートされていた場合は、逆順にソートされます\n" "(A-Z → Z-A)\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "1行以上選択することが前提条件になります。" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "リンクマップの表示" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "リンクマップ" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはノートブックのリンク構造をグラフ化してダイアログに表示します。\n" "ページ間の相関関係を表示するので、一種の\"マインドマップ\"のような使い方が出来ます。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "ブラウザで印刷" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはZimの貧弱な印刷機能の次善策を提供します。\n" "まず現在のページをHTMLとして書き出し、その後ブラウザで開きます。ブラウザに満足のいく印刷機能があるとすれば、この二つの手順を踏むことでデータを印刷でき" "ることになります。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "ブラウザで印刷(_P)" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "クイックノート..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "クイックノート" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはいくつかのテキストを入力したり、クリップボードの内容を貼り付けたりすることで、素早くZimページを作成できるダイアログを提供します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "入力項目毎に新しいページを作成" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "タイトル" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "ページを開く(_P)" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "楽譜(_C)..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "楽譜を挿入" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "楽譜を挿入" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはGNU Lilypondを利用した楽譜エディタをzimに追加します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "通常のインクルードヘッダ" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "通常のインクルードフッタ" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "楽譜編集(_E)" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "スクリーンショット(_S)..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "スクリーンショットの挿入" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはスクリーンショットを撮ってZimページ内に直接挿入することができます。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "画面全体をキャプチャ" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "ウィンドウまたは範囲を選択" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "待機時間" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "秒" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "\"%s\"起動中に何らかのエラーが発生しました" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "スペルチェック(_S)" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "スペルチェッカ" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "gtkspellを使用したスペルチェック機能を追加します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "指定言語用のスペルチェックを読み込めませんでした: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "これは適切な辞書がインストールされていない\n" "ことを意味します。" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "目次" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインは現在のページに目次を表示するウィジェットを提供します。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "サイドペインではなく独立したウィジェットとして目次を表示" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "目次" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "下位" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "上位" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "未タグ" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "アルファベット順にソート" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "タグでページをソート" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "タグ" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "このプラグインは左ペイン下部のページインデックスを、上部のタグクラウドにあるタグを選択することによってフィルタリング出来るような機能を追加します。\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "タスク一覧" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはノートブック内に存在する全てのタスクを表示するダイアログを提供します。\n" "タスク候補にはチェックボックスか、\"TODO\"または\"FIXME\"としてタグが付けられたアイテムが選ばれます。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "全てのチェックボックスをタスクとする" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "タスクアイテム用にページ名をタグに変換する" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "カレンダーページ内のタスクアイテム用の強制満期日" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "終末を控えた月曜又は火曜のフラグタスク期限" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "タスク処理するラベル" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "次のタスク用のラベル" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "無期限タスク用タグ" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "サブツリーのインデックス" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "サブツリーを無視" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "ノートブックのインデックス作業が必要です" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "初めてタスクリストを開くため、再インデックス化する必要があります。\n" "ノートブックのサイズによってはこの作業に少し時間が掛かる場合も\n" "あります。この作業は初回だけで、次にタスクリストを開く時には必要\n" "ありません。" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "フィルタ" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "操作できるタスクだけを表示" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i の未処理項目" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "全タスク" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "非タグ" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "タスク名" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "日付" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "トレイアイコン" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはZimにすぐアクセス出来るようになるトレイアイコンを提供します。\n" "\n" "このプラグインには Gtk+ 2.10 以降のバージョンが必須となります。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "旧トレイアイコン\n" "(Ubuntuで新しい形式のステータスアイコンを使用しない)" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "ノートブックで個別にアイコンを表示する" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "クイックノート(_Q)..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "その他(_O)..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "ノートブック" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim デスクトップ・ウィキ" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "バージョンを保存(_A)..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "バージョン(_V)..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "このノートは最後に保存されたバージョンから全く変更されていません" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "最終バージョンから変更はありません" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "バージョン管理" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "このプラグインはノートブック用のバージョン管理機能を提供します。\n" "\n" "このプラグインはBazaar、Git、Mercurialバージョン管理機構をサポートしています。\n" "\n" "これはZimに同梱される基幹プラグインです。\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "一定の間隔毎にバージョンを自動保存する" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Zimに自動保存されたバージョン" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "バージョン管理を有効にしますか?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "このノートブックでは現在、バージョン管理は有効になっていません。\n" "有効にして宜しいですか?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "バックエンド" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "保存バージョン" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "このバージョンについてのコメントを入力してください" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Zimに保存されたバージョン" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "バージョン" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "ページ(_P)" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "注釈を表示(_A)" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "バージョンを選択して現在のものとの相違点を表示します。\n" "または複数のバージョンを選択して相互間の相違を見ることもできます。\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "コメント" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "バージョンを復元(_R)" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "変更を表示(_C)" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "サイドバイサイド(_S)" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "ページソースの注釈" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "保存バージョンからの復元を行いますか?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "復元するページ: %(page)s\n" "保存バージョン: %(version)s\n" "この復元を行いますか?\n" "\n" "最終保存バージョン以降に行われた全ての変更は破棄されます!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "変更" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Zeitgeistログイベント" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Zeitgeistデーモンへイベントを送る" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "ウィキページ: %s" #~ msgid "Email client" #~ msgstr "メールクライアント" #~ msgid "Web browser" #~ msgstr "ウェブブラウザ" #~ msgid "Output" #~ msgstr "出力" #~ msgid "Prio" #~ msgstr "優先度" #~ msgid "_Filter" #~ msgstr "フィルタ(_F)" #~ msgid "Pages" #~ msgstr "ページ数" #~ msgid "Slow file system" #~ msgstr "低速なファイルシステム" #~ msgid "File browser" #~ msgstr "ファイルブラウザ" #~ msgid "Text Editor" #~ msgstr "テキストエディタ" zim-0.60/translations/hu.po0000644000175000017500000025157012137750055015622 0ustar jaapjaap00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Zim 0.48\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-01-28 15:47+0000\n" "Last-Translator: SanskritFritz \n" "Language-Team: Zim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Nem sikerült elindítani a(z) \"%s\" alkalmazást" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "kilépéskor hibakódot adott vissza: %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Indítás sikertelen: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Alapértelmezett" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "naptár:hét_eleje:0" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Nincs ilyen fájl: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Nem sikerült beolvasni: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" "Ennek oka általában az, hogy a fájl nem megengedett karaktereket tartalmaz" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Részletek" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Fájl nem írható: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Az alábbi fájl megváltozott időközben: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Testreszabás..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Nem találtam alkalmazásokat" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Megnyitás ezzel: \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Alkalmazás beállítása \"%s\" hivatkozás megnyitásához" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Olyan alkalmazások beállítása, amik képesek megnyitni\n" "egy \"%s'\" típusú hivatkozást" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Alkalmazások beállítása" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Alkalmazás hozzáadása" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Alapértelmezett" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Név" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Parancs" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Legyen alapértelmezett alkalmazás" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Fájl megnyitása" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Könyvtár megnyitása" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Fájl törlése" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Törlés" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Kijelölés" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Fájlnév" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Oldal" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Csatolmánymappa tisztogatása" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Kijelölés megfordítása" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Az alábbi fájlokat találtam a Zim csatolmányainak mappájában,\n" "amik már nincsenek kapcsolatban a munkafüzettel. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nincsenek elárvult fáljok" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Egyedi eszközök" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Szerkesztheted az eszközöket, amik megjelenhetnek\n" "az Eszközök menü alatt, és az eszköztáron, vagy a helyi menüben." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Egyéni eszközök szerkesztése" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Megjegyzés" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "A parancs nem módosítja az adatokat" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Látsszon az eszköztáron" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Az alábbi paramétereket helyettesítem be\n" "a parancs futtatásakor:\n" "\n" "%f egy ideiglenes fálj az aktuális oldal forrásszövegével\n" "%d az aktuális oldalhoz tartozó csatolmánymappa\n" "%s az aktuális oldal forrásfájlja (ha van)\n" "%n a munkafüzet helye (fálj vagy mappa)\n" "%D a dokumentum gyökere (ha van)\n" "%t a kijelölt szöveg, vagy a kurzor alatti szó\n" "%T a kijelölt szöveg wiki formázással\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportálás" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Index frissítése" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Létező mappa: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "A mappa már létezik, és van tartalma. Az exportálás visszavonhatatlenul " "felülírhat fájlokat! Mégis folytatod?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Jegyzetek exportálása" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Fájl létezik" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Ez a fájl már létezik!\n" "Szeretnéd felülírni?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Válaszd ki az exportálandó fájlokat" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Adatkiegészítés" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Önálló _oldal" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Válassz exportálási formátumot" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Más…" #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formátum" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Minta" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Fájl hivatkozások tartalmazzák a teljes elérési utat" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "A dokumentum gyökerének hozzáadása az URL-hoz" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Válaszd ki a kimeneti fájlt vagy mappát" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Kimeneti mappa" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Index lap" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Kimeneti fájl" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Előnézet" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "_Logok megtekintése" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Hiba történt a kép készítése közben.\n" "Így is el akarod menteni a szöveg forrását?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Log fájl" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fájl" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "S_zerkesztés" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Nézet" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Beszúrás" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Keresés" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Formátum" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Eszközök" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Ugrás" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Súgó" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "_Helyek" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Eszköztár" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "Új _lap..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Új alábontá_s..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Adatbázis _váltás..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Új _ablakban mutat" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "Lap _importálása..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Mentés" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Más_olat mentés" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Exportálás..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Küldés le_vélben..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Lap át_helyezése..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Lap át_nevezése..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "Lap tö_rlése" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Tulajdonságok" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "Adatbázis _bezárása" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Kilépés" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "Általáno_s keresés..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "_Előzmény keresés..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "He_ly másolása" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Sablonok" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Beállítások" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Frissítés" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "_Lap mappája" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Adatbázis mappája" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "_Dokumentum gyökere" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "_Dokumentum mappája" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Fájl _csatolása" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Külső fájlok csatolása" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Csatolmánymappa tisztogatása" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "_Forrás szerkeszése" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "_Web szerver indítása" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Index frissítése" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Egyéni eszközök" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "Ugrás _vissza" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Ugrás egy lapot vissza" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "Ugrás _előre" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Ugrás egy lapot előre" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "Egy _szitet vissza" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ugrás a felette lévő lapra" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "Egy szitet _lejjeb" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Ugrás az alatta lévő lapra" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Előző inde_xre" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ugrás az előző lapra" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Követlező in_dexre" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ugrás a következő lapra" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Kezdőlapra" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Ugrás a kezdőlapra" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Ugrás lapra..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Tartalom" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_GYIK" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Billentyűhozzárendelések" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Hibák" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Készítő" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Minden panel" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Minden panel megmutatása" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Státuszsor" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Oldalpanel" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Oldalpanelek megmutatása" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "Teljes képernyő" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Szerkeszthető lapok" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Tedd a jegyzetet szerkeszthetővé" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Nincs" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Utoljára megnyitott" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Előzmények" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Index" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "_Ikon és szöveg" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "_Csak ikon" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Csak _szöveg" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Nagy ikonok" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Kis ikonok" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Mini ikonok" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "'tearoff' látszik" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr " visz át az oldalpanelre" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Linkek eltávolítása oldalak törlése esetén" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "A kurzor visszaállítása a legutóbbi helyzetébe egy oldal megnyitásakor" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "A megadott fájl vagy mappa nem létezik.\n" "Ellenőrizd az elérési út helyességét!" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Nincs ilyen fájl vagy mappa: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Keresés" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Frissíted az adatbázist?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Ez az adatbázis a Zim egy korábbi verziójával készült.\n" "Kívánod felfrissítani a jelenlegi verzióra?\n" "\n" "A frissítés eltarthat egy darabig, és változásokat hajthat végre\n" "az adatbázisban. Célszrű egy mentést készíteni az adatbázisról\n" "a művelet megkezdése előtt.\n" "\n" "Ha nem frissíted fel az adatbázist, akkor néheány funkció\n" "esetleg nem fog megfelelően működni." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Jegyzet felfrissítése" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Az indexek frissítése még folyamatban van. Amíg nem fejeződik be, a " "hivatkozás nem tud megfelelően frissülni. Ha folytatja az hibás " "hivatkozásokat okozhat. Folytatja ennek ellenére?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Hivatkozás frissítése" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Hivatkozások törlése" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Hozzam létre a mappát?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "%s nem nyitható meg" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Ennak a lapnak nincs csatolás könyvtára" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "%s szerkesztése" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Egy fájlt szerkesztesz egy külső alkalmazással. Ezt a dialógust bezárhatod, " "amikor kész vagy." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Egy asztali wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "fordító-hitelesség\n" "\n" "Launchpad Contributions:\n" " István Papp https://launchpad.net/~istpapp\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Marton S. Viktor https://launchpad.net/~msv-titok\n" " Robert Roth https://launchpad.net/~evfool\n" " SanskritFritz https://launchpad.net/~sanskritfritz+launchpad\n" " bruce https://launchpad.net/~mano155\n" " sipizoli https://launchpad.net/~zoltan-siposs" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Tárgymutató" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "csak olvasható" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _visszacsatolás..." msgstr[1] "%i _visszacsatolás..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Lap nem menthető: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Ahhoz folytassa a munkát, vagy elmenti a fájlt egy másolatba,\n" "vagy eldobja a változásokat. Ha a másolat készítést választja,\n" "a változások akkor is elvesznek, de a másolatből később visszaállíthatja." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Változások _eldobása" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Málsolat mentése" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Ugrás" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Ugrás lapra" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Új alábontás" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Új lap" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "A hivatkozások által mutatott nem létező lapok\n" "jöjjenek létre automatikusan." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Lap neve" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Oldalsablon" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Lap már létezik" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Másolat mentése" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Lap importálása" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Szöveg fájlok" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Lap áthelyezése" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "\"%s\" lap áthelyezése" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "%i db erre a lapra mutató hivatkozást frissítettem" msgstr[1] "%i db erre a lapra mutató hivatkozást frissítettem" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Index" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Lap átnevezése" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "\"%s\" lap átnevezése" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Frissítsd az aktuális lap fejlécét" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Lap törlése" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "\"%s\" lap törölhető?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "A \"%s\", minden alatta lévő lap,és ezek csatolásai törölve lesznek" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "%i db erre a lapra mutató hivatkozást töröltem" msgstr[1] "%i db erre a lapra mutató hivatkozást töröltem" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i fáljt fogok törölni" msgstr[1] "%i fáljt fogok törölni" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Fájl csatolása" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "A \"%s\" lapnak nincs mappája a cstolásokhoz." #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Kép csatolása hivatkozásként" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Adatbázis" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Adatbázis megnyitása" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Alapértelmezett adatbázis" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Adatbázis hozzáadása" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Válassz nevet és mappát az adatbázishoz" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Mappa" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Index aktualizálása..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "Mégs_e" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Még_is" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Kivágás" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Másolás" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Bei_llesztés" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Törlés" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Ki_pipálás" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Beiks_zelés" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Hivatkozás/objektum" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Hivatkozás tö_rlése" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Dátum/idő" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Kép..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "_Felsorolás" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Számozott lista" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "_Jelölőgombos lista" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Szöveg _fájlból..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Hivatkozás..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Hivatkozás beszúrása" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Formátum _törlése" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Keresés a lapon" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Következő _találat" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Elő_ző találat" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Csere..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Szavak száma..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Nagyítás" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Kicsinyítés" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normál méret" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Új _csatolmány" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "_Fájl sablonok" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Címsor _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Címsor 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Címsor _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Címsor 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Címsor _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Címsor 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Címsor _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Címsor 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Címsor _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Címsor 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Félkövér" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Félkövér" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Dőlt" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Dőlt" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Megjelölt" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Megjelölt" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "Át_húzott" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Áthúzott" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Alsó index" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Felső index" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Kód" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Kód" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Használd az -t a hivatkozások követéséhez\n" "(Ha letiltod az marad használatban)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "A kurzor akkor is látsszon, ha a lap nem szerkeszthető" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "A \"KözbülsőNagybetűs\" szavak automatikusan hivatkozások lesznek" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Automatikusan kerüljenek az elérési utak a hivatkozásokba" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Formázáskor kerüljön kijelölésre az egész szó" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Behúzás csökkentése -szel\n" "(Ellenkező esetben marad a )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Ismételt kattintással lehet a jelölőnégyzet kijelzéseit változtatni" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Behúzás megváltoztatásakor változzanak az alá besoroltak is" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Jelölőnégyzet megváltoztatásakor változzanak az alá besoroltak is" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Menet közben formázza újra a wiki tegeket" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Vágólapra másoláskor alapértelmezett formátum" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Csatolt fájlokat tartalmazó sablonok könyvtára" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Iyen wiki nincs definiálva: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Másolás _mint..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Kijelölt szöveg mozgatása..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Tulajdonságok szerkesztése" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Hivatkozás _szerkesztése" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "_Hivatkozás másolása" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Levélcím másolása" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Megnyitás mással..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Megnyitás" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Nincsenek telepített sablonok." #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "A(z) %s\n" "könyvtár még nem létezik.\n" "Létrehozzuk most?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Dátum és idő beszúrása" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Naptár" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Csatolás a dátumhoz" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Kép beszúrása" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Előbb csatold a képet" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Nem támogatott fálj típus: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Kép szerkesztése" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Pozíció" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Hivatkozás" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Szélesség" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Magasság" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Méret _visszaállítása" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Szöveg beszúrása fájlból" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Hivatsozás szerkesztése" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Hivatkozás" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Szöveg" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Következő" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Előző" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Kis- és nagy_betű" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "_Egész szó" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Reguláris kifejezés" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Kiemelés" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Keresés" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opciók" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Keresés és csere" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Mit keres" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Mire cserél" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Csere" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Ö_sszes cseréje" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Szavak száma" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Bekezdés" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Szavak" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Sorok" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "karakter" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Szöveg átmozgatása másik oldalra" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "M_ozgatás" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Szöveg áthelyezése" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Hagyja meg az új oldalra hivatkozást" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Új oldal létrehozása" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Új fájl" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Felhasználói felület" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Szerkesztés" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Tulajdonságok" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Kiegészítők" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Használj egyéni betűkészletet" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Tovább" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Beállítás" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Függőségek" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Nincsenek függőségek" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Rendben" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Hibás" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Elhagyható" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Szerző" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Engedélyezve" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Kiegészítő" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Kiegészítők beállítása" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "%s kiegészítő beállítása" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Tulajdonságok" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Adatbázis tulajdonságok" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "A kibővitett keresésben használhatók legyenek ilyen operátorok:\n" "AND, OR és NOT. Nézd meg a súhót a részletekért!" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "A ketesés korlátozása az adott ágra" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Találat" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Szerver nem fut" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Szerver elindítva" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Szerver leállítva" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Sablonok" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Sablon másolása" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Válassz fájlt" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Mindent _kinyit" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Mindent _becsuk" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Törlés" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Válassz mappát" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Kép kiválasztása" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Baloldali panel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Jobboldali panel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Alsó panel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Felső panel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Bal felső" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Bal alsó" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Jobb felső" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Jobb alsó" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Úgy tűnik találtál egy hibát" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "A hibajelentéshez kérjük csatolja hozzá az alábbiakat" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Minden fájl" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Képek" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "A fájl már létezik" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Ilyen névvel már van fájl: \"%s\"\n" "Találjon ki más nevet, vagy felülírhatja a létező fájlt." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Tallózás" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Felülírás" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Nem található az adatbázis fájlja vagy mappája" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Nem található adatbázis: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Az adott lapnév nem megfelelő!\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "\"%s\" nem megengedett lapnév" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "A tárgymutató elkészítése még folyamatban van, ehhez a parancshoz pedig " "szükség lenne rá.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "\"%s\" nem módosítható lap" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwiki kulcsszó" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Kezdő lap" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Adatbázis mappa" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Megosztott jegyzettömb" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetika" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetikus" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Csatolmány Böngésző" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Ez a beépülőmodul a csatolmányokat ikonként mutatja\n" "az alsó panelen.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Ablakon belüli pozíció" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Mellékletek" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i csatolmány" msgstr[1] "%i csatolmány" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Ismeretlen" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Méret" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Módosítva" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Áthelyezés ide" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Másolás ide" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Mégsem" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automatikus csatolás" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a bővítmény szükség szerint, automatikusan megnyitja a jegyzetfüzeteket.\n" "Használható például távoli meghajtókhoz történő kapcsolódásra, vagy " "titkosított\n" "meghajtók feloldására, mikor a Zim egy adott jegyzetfüzetet próbál " "megnyitni.\n" "\n" "Ez egy alapvető bővítmény, a Zimmel együtt került telepítésre.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Visszacsatolások panelja" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő megjelenít egy külön panelt\n" "ami azokat az oldalakat sorolja fel, ahol hivatkozás található\n" "az aktuális oldalra.\n" "\n" "Ez egy alapvető bővítmény, a Zim-mel együtt települt.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Visszacsatolások" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Mai dátumra" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Napló" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Napló" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Ez a beépülő modul egy névteret átváltoztat naplóvá\n" "laponként egy napal, héttel vagy hónappal.\n" "A lapok eléréséhez hozzáad egy naptár elemet is.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Nap" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Hét" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Hónap" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Év" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "A naptár mutatása az oldalpanelon külön ablak helyett" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Darabonként egy oldal" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Naptár" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Ma" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Diagram beszúrása" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Diagram beszúrása" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő a GraphViz segítségével diagramokat ad a kódhoz.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Diagram szerkeszése" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Szerkesztés a figyelem elvonása nélkül" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Ez a beépülő modul átváltoztatja a Zim-et\n" "olyan szerkesztővé, ami nem vonja el a figyelmet.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Menü elrejtése teljes képernyős módban" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Ezköztár elrejtése teljes képernyős módban" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Kenyérmorzsák elrejtése teljes képernyős módban" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Státuszsor elrejtése teljes képernyős módban" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Legnagyobb oldalszélesség" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Vízszintes margó" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Szöveg háttérszín" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Szöveg színe" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Képernyő háttérszín" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Ditaa beillesztése" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Ditaa beillesztése" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a bővítmény egy diagram szerkesztő, mely a Ditaa-n alapul.\n" "\n" "Ez egy alapvető bővítmény, a Zimmel együtt került telepítésre.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "Ditaa sz_erkesztése" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Egyenlet..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Egyenlet beszúrása" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Egyenlet beszúrása" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő a latex segítségével egyenleteket ad a kódhoz.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Egyenletszerkesztő" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Gnuplot beillesztése" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Ez a beépülőmodul grafikonokat jelenít meg a Gnuplot segítségével.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "Gnuplot _szerkesztése" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "GNU R Plot beszúrása" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Ez a kiegészítő a GNU R segítségével rajzokat ad a kódhoz.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "GNU R Plot _szerkesztése" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "_Math kiértékelése" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "A beépített kalkulátor nem volt képes \n" "kiértékelni a kifejezést a kurzornál." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Beépített Kalkulátor" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ezzel a beépülőmodullal gyorsan ki lehet értékelni\n" "egyszerű matematikai kifejezéseket a Zim-ben.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Nem tudtam elemezni a kifejezést" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "_Szimbólumok..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Szimbólum beszúrása" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő szimbólumok kódba való beszúrását,\n" "és a tipográfiai jelek automatikus formázását teszi lehetővé.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Sorok rendezése" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Sorrendező" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Ez a beépülőmodul sorbarendezi a kijelölt sorokat.\n" "Már rendezett sorokon fordított sorrendben teszi ugyanezt (A-Z, majd Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Kérem, először több, mint egy sort jelöljön ki." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Hivatkozás-térkép" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Hivatkozás-térkép" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő a linkek szerkezeti struktúrájának\n" "grafikus megjelenítését teszi lehetővé.\n" "Használható egyfajta \"elmetérképként\",\n" "megjelenítve a bejegyzések közötti kapcsolatokat.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Megjelenítés a böngészőben" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő egy megkerülése a Zim-ből hiányzó\n" "nyomtatási lehetőségnek. Ki tudja exportálni az\n" "aktuális lapot egy böngészőbe, ahonnan annak\n" "nyomtatási lehetőségét használva nyomtatható\n" "az anyag. Így a nyomtatás két lépésből megoldható.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "Nyomtatás bön_gészővel" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Gyors jegyzet..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Gyors jegyzet" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő egy párbeszédablakot ad egy szöveg\n" "vagy a vágólap tartalmának gyors beszúrásához.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Új lap létrehozása minden jegyzethez" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Cím" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "_Oldal megnyitása" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "_Kotta" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Kotta beillesztése" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Kotta beillesztése" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a bővítmény egy kottaszerkesztő, ami a GNU Lilypond-on alapul.\n" "\n" "Ez egy alapvető bővítmény, a Zimmel együtt került telepítésre.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Általános fejléc" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Általános lábléc" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "Kotta sz_erkesztése" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Képernyőkép..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Képernyőkép beszúrása" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a beépülőmodul lehetővé teszi, hogy közvetlenül\n" "beillesszünk egy képernyőképet egy Zim oldalba.\n" "A Zim magjához tartozó modul, kiadva azzal együtt.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Az egész képernyő mentése" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Ablak vagy terület kijelölés" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Várakozás" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "másodperc" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Hibák voltak, a \"%s\" futtatásakor" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "_Helyesírás ellenőrzés" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Helyesírás ellenőrző" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő helyesírás ellenőrzést tesz lehetővé a gtkspell " "segítségével.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "\"%s\" nyelvhez nem találtam helyesírásellenőrzőt" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "Talán a megfelelő szótárak nincsenek telepítve" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Tartalom" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a bővítmény egy extra funkciót biztosít,\n" "ami az aktuális oldal tartalomjegyzékét mutatja.\n" "\n" "Ez egy alapvető bővítmény, a Zimmel együtt kerültelepítésre.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" "A tartalomjegyzéket nem oldalpanelként, hanem lebegő ablakként mutatja." #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Tart." #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Lejjebb sorol" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Feljebb sorol" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "Cimke nélkül" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Rendezés abc sorrendben" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sorbarendezés cimkék szerint" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Címkék" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Ez a beépülőmodul lehetővé teszi az oldalak szűrését egy cimkefelhő " "segítségével.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Feladat lista" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő az adatbázisba felvett nyitott feladatolat jeleníti\n" "meg egy dialógus ablakban. A nyitott feladatokat az üres\n" "jelölőnégyzetek és a \"TODO\", \"FIXME\" kezdetű sorok jelentik.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Minden jelölőnégyzet feladatnak tekintése" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Az oldal neve legyen cimke a feladatlista számára" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Megadja a naptárban található feladatok időtartamát." #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "A hétvége előtt megjelöli a hétfőn vagy kedden esedékes feladatokat." #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "A megjelölt feladatok cimkéi" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "A következő feladat címkéje." #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Nem indítható feladatok címkéi" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Fa-alstruktúra amit indexelni kell" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Fa-alstruktúra amit ki kell hagyni" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Szükséges indexelni az adatbázist" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Első alkelommal nyitottad meg a feledat listát.\n" "Ezért újra kell indexelni az adatbázist.\n" "Ez az adatbázis méretétől függően akár\n" "néhány percet is igénybe vehet.\n" "A következő indításkor erre már nem lesz szükség." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Szűrő" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Csak a végrehajtható feladatokat mutatja." #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i db nyitott tétel" msgstr[1] "%i db nyitott tétel" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Minden feladat" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Nincs címke" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Feladat" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Dátum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Tálca ikon" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a kiegészítő egy ikont hoz létre az értesítési területen a gyors " "eléréshez.\n" "\n" "Működéséhez legalább 2.10-es GTK+ szükséges.\n" "\n" "Ez a kiegészítő szerves része a Zim-nek.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klasszikus értesítési ikon.\n" "Ne használj új típusú ikont Ubuntu alatt!" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Különböző ikonok használata minden adatbázishoz" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Gyors jegyzet" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Egyéb..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Adatbázisok" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim asztali wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Verzió _mentése" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Verziók..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Nincsenek változások az adatbázisban az utolsó mentés óta" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Nem történt módosítás az utolsó verzió óta" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Verzió követés" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ez a bővítmény verziókezelést biztosít a jegyzetfüzetekhez.\n" "\n" "Támogatja a Bazaar, a Git, a Mercurial verziókövető rendszereket.\n" "\n" "Ez egy alapvető bővítmény, a Zimmel együtt kerül telepítésre.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Automatikus verziómentés meghatározott gyakorisággal" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Zim által automatikusan mentett verzió" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Engedélyezi a verzókövetést?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "A verziókövetés nincs bekapcsolva ehhez az adatbázishoz.\n" "Be akarod kapcsolni most?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Kiszolgáló" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Verzió _mentése" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Írd be egy megjegyzést ehhez a verzióhoz" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Zim-ből mentett verzió" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Verziók" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Lap" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Mutasd a_z állapotokat" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Válaszd ki azt a verziót, amelyet össze akarsz vetni a jelenlegi " "állapottal!\n" "Vagy válassz ki többet, hogy összehasonlítsd őket egymással!\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Megjegyzés" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "Verzió vi_sszaállítása" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "_Változások mutatása" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Egy az egyben" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Állapot lap forrása" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Visszaállítja a lap mentett verzióját?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Vissza kívánod állítani ezt a lapot: %(page)s\n" "erre a mentett verzióra: %(version)s ?\n" "\n" "Az utolsó mentés óta történt változások el fognak veszni!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Változások" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Vissza" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Események naplózása a Zeitgeisten keresztül" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Az eseményeket a Zeitgeist démonnak továbbítja" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Wiki oldal: %s" #~ msgid "Text Editor" #~ msgstr "Szövegszerkesztő" #~ msgid "Email client" #~ msgstr "E-mail kliens" #~ msgid "Pages" #~ msgstr "Oldalak" #~ msgid "Output" #~ msgstr "Kimenet" #~ msgid "Match c_ase" #~ msgstr "Na_gybetűérzékeny" #~ msgid "Slow file system" #~ msgstr "Lassú fájlrendszer" #~ msgid "_Filter" #~ msgstr "_Szűrő" #~ msgid "Web browser" #~ msgstr "Web böngésző" #~ msgid "File browser" #~ msgstr "Fájl böngésző" #~ msgid "Prio" #~ msgstr "Prioritás" zim-0.60/translations/ca.po0000644000175000017500000023334412137750055015570 0ustar jaapjaap00000000000000# Catalan translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-02-28 11:10+0000\n" "Last-Translator: pataquets \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Per omissió" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "No hi ha cap fitxer %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "No s'ha pogut llegir: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detalls" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Personalitza..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "No s'han trobat aplicacions" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Obre amb «%s»" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nom" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Ordre" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Obre la carpeta" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Esborra el fitxer" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Esborra" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selecció" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nom de fitxer" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Pàgina" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inverteix la selecció" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Eines personalitzades" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Podeu configurar eines personalitzades que apareixeran\n" "al menú d'eines i a la barra d'eines o al menús contextuals." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Edita una eina personalitzada" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descripció" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Icona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "L'ordre no modifica dades" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Enganxa a la barra d'eines" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exporta" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Actualitzant l'índex" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "La carpeta ja existeix i conté informació; si exporteu a aquesta carpeta us " "arrisqueu a sobreescriure alguns fitxers. Voleu continuar?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exportant el quadern." #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "El fitxer existeix" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "Aquest fitxer ja existeix./nEl voleu sobreescriure?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Seleccioneu les pàgines a exportar." #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Quader_n complet" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "_Pàgina única" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Seleccioneu el format d'exportació" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Un altre..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formata" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Plantilla" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Enllaceu els documents des del directori arrel amb la ruta completa" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Enllaç de la pàgina mare envers l'URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Seleccioneu el fitxer de sortida o la carpeta" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Carpeta de sortida" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Pàgina índex" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Fitxer de sortida" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Previsualització" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Visua_litza el registre" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "S'ha produït un error mentre es generava la imatge.\n" "Voleu desar el text font igualment?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Fitxer de registre" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fitxer" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Edita" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Visualitza" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Insereix" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Cerca" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Eines" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Vés" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "A_juda" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "B_arra d'adreces" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Barra d'eines" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nova pàgina..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "S_ubpàgina nova" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Obre un altre quadern" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Obre una _finestra nova" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importa una pàgina" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Desa" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "_Desa'n una còpia" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xporta" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "En_via a..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Desplaça la pàgina" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Reanomena la pàgina" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Suprimeix la pàgina" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Propie_tats" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Tanca" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Surt" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Cerca..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "_Cerca els retroenllaços" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copia la _ubicació" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "Pl&antillas" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Preferències" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Refresca" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Obre la _carpeta d'adjunts" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Obre la carpeta de _quaderns" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Obre l'_arrel del document" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Obre la _carpeta del document" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Adjunta un _fitxer" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Adjunta un fitxer extern" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Edita el _codi" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Engega el servidor _web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Actualitza l'índex" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "_Eines personalitzades" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Precedent" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Tornar a la pàgina anterior" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Següent" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Avençar a la pàgina següent" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Mare" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Vés a la pàgina mare" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Filla" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Vés a la pàgina filla" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Pàgina _precedent a l'índex" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Vés a la pàgina precedent" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Pàgina _següent a l'índex" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Vés a la pàgina següent" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Inici" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Vés a l'inici" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Vés a..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contingut" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_PMF (FAQ)" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Dreceres de teclat" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Errors" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Quant a" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Barra d'e_stat" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Pantalla completa" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "El quadern es pot _modificar" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Marca el quadern com a modificable" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Cap ni u" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Pàgines _recents" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historial" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Espai de _noms" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Icones _i text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Només _icones" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Només _text" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Icones _grans" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Icones _petites" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Icones _més petites" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Afegeix als menús una línia de tall per arrabassar-los" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "El fitxer (o la carpeta) especificat no existeix.\n" "Comproveu que la ubicació sigui correcta." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "No existeix el fitxer o la carpeta %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Cerca" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Voleu actualitzar el quadern?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Aquest quadern ha estat creat amb una versió més antiga de Zim.\n" "El voleu actualitzar a la versió actual?.\n" "\n" "L'actualització requerirà una mica de temps i pot realitzar alguns canvis\n" "en el quadern. En general és una bona idea fer-ne, abans,\n" "una còpia de seguretat.\n" "\n" "Si no realitzeu l'actualització, algunes funcionalitats\n" "potser no funcionaran correctament." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Actualitzant el quadern" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "S'està actualitzant l'índex. Fins que això acabi, no es pot actualitzar els " "enllaços correctament. Realitzant aquesta acció, podeu trencar enllaços; " "voleu continuar igualment?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Actualitzant els enllaços" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Eliminant els enllaços" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Voleu crear una carpeta?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Aquesta pàgina no té una carpeta per als fitxers adjunts" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editant fitxer: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Una wiki d'escriptori" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " David Planella https://launchpad.net/~dpm\n" " Giorgio Grappa https://launchpad.net/~j-monteagudo\n" " Siegfried Gevatter https://launchpad.net/~rainct\n" " animarval https://launchpad.net/~animarval\n" " pataquets https://launchpad.net/~pataquets" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Índex" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "només lectura" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _retroenllaç..." msgstr[1] "%i _retroenllaços..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "No ha estat possible desar la pàgina: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Per continuar, podeu desar una còpia d'aquesta pàgina o descartar\n" "els canvis. Si deseu una còpia, els canvis també seran descartats,\n" "però podreu restaurar la còpia més endavant." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Descarta els canvis" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Desa'n una còpia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Vés a" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Vés a la pàgina" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nova subpàgina" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Pàgina nova" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Enllaçant un pàgina que no existeix\n" "la creeu automàticament." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nom de la pàgina" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Plantilla de pàgina" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Aquesta pàgina ja existeix" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Desa'n una còpia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importa la pàgina" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Fitxers de text" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Desplaça la pàgina" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Desplaça la pàgina \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Actualitza %i pàgina que enllaça aquesta" msgstr[1] "Actualitza %i pàgines que enllacen aquesta" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Espai de noms" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Reanomena la pàgina" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Reanomena la pàgina \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Actualitza l'encapçalament de la pàgina" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Elimina la pàgina" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Voleu eliminar la pàgina \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "La pàgina \"%s\" i totes les seves\n" "subpàgines seran eliminades." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Elimina els enllaços de %i pàgina que apunta a aquesta" msgstr[1] "Elimina els enllaços de %i pàgines que apunten a aquesta" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Adjunta un fitxer" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "La pàgina \"%s\" no té cap carpeta per als adjunts" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Insereix imatges com a enllaços" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Quadern" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Obre un quadern" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Quadern per omissió" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Crea un quadern" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Trieu un nom i una carpeta per al quadern" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Carpeta" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Actualitzant l'índex..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Desfés" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Refés" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Talla" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copia" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Engan_xa" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Elimina" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Canvia la marca 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Canvia la marca 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Edita un enllaç o un objecte..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Elimina un enllaç" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Data i hora..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Imatge..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Llista _numerada" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text des d'un _fitxer..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Enllaç..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Insereix un enllaç" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Elimina el format" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Troba..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Troba el _següent" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Troba el _precedent" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Substitueix..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Compta els mots..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Mida _normal" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Encapçalat _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Encapçalat 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Encapçalat _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Encapçalat 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Encapçalat _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Encapçalat 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Encapçalat _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Encapçalat 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Encapçalat _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Encapçalat 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Destacat" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Destacat" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Emfasitzat" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Emfasitzat" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marcat" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marcat" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Tatxat" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Tatxat" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Subíndex" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Su_períndex" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "Text _pur" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Text pur" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Empra la tecla per seguir els enllaços.\n" "(Si està deshabilitada, podeu emprar )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Mostra el cursor fins i tot per a pàgines no editables" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Converteix automàticament en enllaços els mots tipus \"CamelCase\"" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Converteix automàticament en enllaços les rutes a fitxers" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Selecciona automàticament el mot actual en aplicar formats" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Elimina el sagnat amb \n" "(Si està deshabilitat, pot emprar )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Canviar el sagnat d'un ítem en una llista també\n" "en modifica els subítems" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Marcar un requadre també en modifica els subítems" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformata el marcat de la wiky al vol" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Moure text seleccionat..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Edita propietats" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Edita l'enllaç" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copia l'_enllaç" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copia l'adreça de correu" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Obre amb..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Obre" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "No hi ha cap plantilla instal·lada" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Insereix la data i l'hora" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendari" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Enllaça la data" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Insereix una imatge" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Adjunta una imatge" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Edita la imatge" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Ubicació" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Enllaça amb" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Ample" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Alçada" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Restaura la mida" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Insereix text des d'un fitxer" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Edita l'enllaç" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Enllaç" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Següent" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Anterior" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Distingeix majúscules i minúscules" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Paraula completa" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expressió _regular" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Ressaltat" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Troba" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opcions" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Cerca i reemplaça" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Troba" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Reemplaça per" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Reemplaça" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Substitueix-ho tot" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Comptador de mots" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paràgraf" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Mots" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Línies" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caràcters" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Moure text a una altra pàgina" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Mou" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Moure text a" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferències" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Extensions" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Empra un tipus de lletra personalitzat" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Més" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigura" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependències" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Sense dependències" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "D'acord" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Fallada" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Habilitat" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Extensió" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configura l'extensió" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opcions de l'extensió %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Propietats" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Propietats del quadern" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Per fer cerques elaborades, podeu emprar operadors com\n" "AND, OR i NOT. Vegeu la pàgina d'ajuda si voleu més informació." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limita la cerca a l'espai de noms actual" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Puntuació" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "El servidor no s'ha engegat" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Servidor engegat" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Servidor aturat" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Seleccioneu un fitxer" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Seleccioneu una carpeta" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Tots els fitxers" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Imatges" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "No s'ha trobat el fitxer o la carpeta d'aquest quadern" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "No s'ha trobat el quadern: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "El nom de pàgina introduït no és vàlid.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nom de pàgina invàlid \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "No es pot modificar la pàgina: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Pàgina d'inici" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Document arrel" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Avui" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_dari" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Mostra el calendari en el panell lateral, no pas com un diàleg" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendari" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Avui" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_grama..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Insereix un diagrama" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Insereix un diagrama" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió proporciona un editor de diagrames per a Zim basat en " "GraphViz.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Edita el diagrama" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_quació..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Insereix una equació" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Insereix una equació" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió proporciona un editor d'equacions per a Zim basat en " "Latex.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Edita l'equació" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Gràfic de GNU _R" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insereix un gràfic de GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Aquesta extensió proporciona un editor de gràfics basat en GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Edita gràfic de GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Gràfic de GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sí_mbol" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Insereix símbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió afegeix el diàleg 'Insereix un símbol' i permet\n" "el formatat automàtic de caràcters tipogràfics.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Mostra el mapa d'enllaços" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa d'enllaços" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió afegeix un diàleg amb una representació\n" "gràfica de l'estructura d'enllaços del quadern. Es pot emprar\n" "com una mena de mapa mental que mostra com les pàgines\n" "es relacionen entre elles.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Imprimeix al navegador" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió ofereix una solució alternativa la manca\n" "de suport d'impressió en Zim. S'exporta la pàgina actual\n" "a HTML i s'obre en el navegador. Suposant que aquest disposi\n" "de suport d'impressió, això us permetra d'imprimir les\n" "vostres pàgines en dos passos.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "Im_primeix al navegador" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Anotació ràpida..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Anotació ràpida" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió afegeix un diàleg per inserir ràpidament\n" "text (o el contingut del portapapers a una pàgina.\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Crea una nova pàgina per cada anotació" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Títol" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Captura de pantalla" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Insereix captura de pantalla" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Captura la pantalla completa" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Selecciona una finestra o una regió" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Retard" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "segons" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Verificar l'ortografia" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Corrector ortogràfic" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Afegeix suport de corrector ortogràfic emprant gtkspell\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiquetes" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Llista de feines" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió afegeix un diàleg que mostra totes les feines\n" "pendents del quadern, sigui caixes sense marcar, sigui llistes\n" "marcades amb les etiquetes \"TODO\" o \"FIXME\".\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Considera totes les caixes com a feines" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Etiquetes que marquen feines" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Cal indexar el quadern" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "És la primera vegada que s'obre la llista de feines;\n" "cal, per tant, reconstruir-ne l'índex. En funció de la\n" "grandària del quadern, això pot trigar alguns minuts.\n" "La pròxima que empreu la llista de feines, això ja\n" "no caldrà." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtre" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i ítem obert" msgstr[1] "%i ítems oberts" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Feina" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Data" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Icona de la safata del sistema" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aquesta extensió afegeix una icona a la safata del sistema\n" "que permet l'accés ràpid.\n" "\n" "Depèn de Gtk+, versió 2.10 o superior\n" "\n" "Aquesta és una extensió bàsica que se subministra amb Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Icona de notificació clàssica,\n" "no empreu el nou tipus d'icona amb Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Mostra una icona per cada quadern" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "Nota _ràpida..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "Un _altre..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Quaderns" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim, wiki d'escriptori" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "_Desa la versió..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versions..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "No hi ha canvis en aquest quadern des de la darrera versió desada" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Sense canvis des de la darrera versió" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Control de versions" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Desa automàticament la versió a intervals regulars" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Versió desada automàticament des de Zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Voleu activar el control de versions?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "El control de versions no es troba habilitat per a aquest quadern.\n" "Voleu habilitar-lo?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Desa la versió" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Escriviu un comentari per a aquesta versió" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versió desada des de Zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versions" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Pàgina" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Mostra les _anotacions" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Seleccioneu una versió veure els canvis entre aquella i l'actual.\n" "O seleccioneu diverses versions per veure els canvis entre elles.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Comentari" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restaura la versió" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Mostra els _canvis" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Un a costat de l'altre" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Font de la pàgina anotada" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Voleu restaurar la pàgina a la versió desada?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Voleu tornar a la versió %(version)s\n" "de la pàgina %(page)s ?\n" "\n" "Tots els canvis efectuats des que la vau desar es perdran!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Canvis" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev." #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Email client" #~ msgstr "Client de correu" #~ msgid "Web browser" #~ msgstr "Navegador web" #~ msgid "Text Editor" #~ msgstr "Editor de text" #~ msgid "Pages" #~ msgstr "Pàgines" #~ msgid "File browser" #~ msgstr "Navegador de fitxers" #~ msgid "Slow file system" #~ msgstr "Sistema de fitxers lent" #~ msgid "_Filter" #~ msgstr "_Filtre" #~ msgid "Prio" #~ msgstr "Prioritat" zim-0.60/translations/fr.po0000644000175000017500000025556612137750055015626 0ustar jaapjaap00000000000000# French translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-14 12:09+0000\n" "Last-Translator: Rui Nibau \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Echec du lancement de l'application : %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "a retourné un code d'erreur : %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Echec dans l'exécution de %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Par défaut" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Fichier inexistant : %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Impossible de lire : %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" "Ceci signifie généralement que le fichier contient des caractères invalides" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Détails" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Le fichier est protégé en écriture: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Le fichier a été modifié sur le disque: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Personnaliser..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Aucune application trouvée" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Ouvrir avec « %s »" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Configurez une application pour ouvrir les liens « %s »" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "Configurer une application pour ouvrir des fichiers de type « %s »" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Configurer les applications" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Ajouter une application" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Valeur par défaut du système" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nom" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Commande" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Application par défaut" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Ouvrir un fichier" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Ouvrir le dossier" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Supprimer un fichier" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Supprimer" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Sélection" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nom du fichier" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Page" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Supprimer les pièces jointes" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inverser la sélection" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Les fichiers ci-dessous sont présents dans le dossier des pièces jointes de " "zim, mais ne sont plus liés au bloc-notes. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Aucun fichier orphelin n'a été trouvé" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Outils personnalisés" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Vous pouvez configurer des outils personnalisés qui \n" "appaîtront dans le menu \"Outils\" et dans la barre d'outils \n" "ou les menus contextuels." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Éditer un outil personnalisé" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Description" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Icône" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "La commande ne modifie pas les données" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Afficher dans la barre d'outils" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Les paramètres suivants seront substitués \n" "dans la commande lors de son exécution :\n" "\n" "%f la page source comme fichier temporaire\n" "%d le dossier des pièces attachées de la page courante\n" "%s le fichier réel de la page source (s'il existe)\n" "%n l'emplacement du bloc-notes (fichier ou dossier)\n" "%D la racine du document (s'il existe)\n" "%t le texte sélectionné ou le mot sous le curseur\n" "%T le texte sélectionné avec le formatage wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exporter" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Mise à jour de l'index" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Le dossier existe : %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Le dossier existe déjà et possède des fichiers ; exporter dans ce dossier " "pourrait remplacer des fichiers existants. Voulez-vous continuer ?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Export du bloc-notes" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Le fichier existe." #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Le fichier existe déjà.\n" "Voulez-vous l'écraser ?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Sélectionner les pages à exporter" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "_Bloc-notes complet" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "_Page unique" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Sélectionner le format d'exportation" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Autre..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Modèle" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Lier les fichiers présents dans l'arborescence des documents avec des " "chemins complets" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Lien du document parent vers l'URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Sélectionner le fichier ou le dossier de destination" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Dossier de destination" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Page d'index" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Fichier de sortie" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Aperçu" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Consulter le _journal" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Une erreur est survenue lors de la génération de l'image.\n" "Voulez-vous tout de même sauvegarder le texte source ?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Fichier de log" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fichier" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Édition" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Affichage" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Insérer" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Rechercher" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Outils" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "A_ller à" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Aide" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "_Barre d'adresse" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Barre d'outils" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nouvelle page..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nouvelle so_us-page..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Ouvrir un autre bloc-notes" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Ouvrir dans une nouvelle _fenêtre" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importer la page..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Enregistrer" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Enregistrer une _copie..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xporter..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Envoyer à..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Déplacer la page..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Renommer la page..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Supprimer la page" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Proprié_tés" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Fermer" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Quitter" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Rechercher..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Rechercher les _rétroliens" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Changements récents..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copier _l'emplacement" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Modèles" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Préférences" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Actualiser" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Ouvrir le _dossier des pièces attachées" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Ouvrir le _dossier du bloc-notes" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Ouvrir le _document racine" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Ouvrir le _dossier du document" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Joindre un _fichier" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Joindre une fichier externe" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Effacer les pièces attachées" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Modifier les sources" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Démarrer le serveur _web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Mettre à jour l'index" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Outils _personnalisés" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Précédent" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Revenir à la page précédente" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Suivant" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Aller à la page suivante" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Parent" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Aller à la page parent" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Enfant" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Aller à la page fille" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Page _précédente dans l'index" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Aller à la page précédente" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Page _suivante dans l'index" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Aller à la page suivante" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Accueil" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Aller à l'accueil" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "A_ller à..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contenus" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Raccourcis clavier" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bugs" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_À propos" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Tous les panneaux" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Afficher tous les panneaux" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Barre d'état" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "Panneaux _latéraux" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Affichez les panneaux latéraux" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Plein écran" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Bloc-notes é_ditable" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Changer le mode éditable du bloc-notes" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Aucun" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Pages récentes" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Pages _récemment modifiées" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historique" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Esp_ace de noms" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Icônes et texte" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "_Icônes seules" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Texte seul" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Grosses icônes" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Petite_s icônes" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Icônes minuscules" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Ajouter des pointillés aux menus pour les détacher" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Utiliser pour passer sur le panneau latéral" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Supprimer les liens quand les pages sont supprimées" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Toujours utiliser la dernière position du curseur lors de l'ouverture de la " "page" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "Le fichier ou le dossier que vous avez spécifié n'existe pas." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Pas de fichier ou de dossier : %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Rechercher" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Chercher des pages..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Mettre à niveau le bloc-notes ?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Ce bloc-notes a été créé avec une ancienne version de zim.\n" "Voulez-vous le mettre à niveau maintenant ?\n" "\n" "La mise à niveau peut prendre du temps et provoquer diverses\n" "modifications dans le bloc-notes. Il est préférable d'effectuer\n" "une sauvegarde avant.\n" "\n" "Si vous n'effectuez pas la mise à niveau maintenant,\n" "certaines fonctionnalités risquent de ne pas\n" "fonctionner correctement." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Mise à niveau du bloc-notes" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "La mise à jour de l'index est en cours. Tant qu'elle n'est pas finie, les " "liens ne peuvent pas être mis à jour correctement. Effectuer cette opération " "maintenant pourrait détruire des liens, souhaitez-vous vraiment continuer ?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Mise à jour des liens" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Supprimer les liens" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Créer le répertoire ?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "Le dossier \"%s\" n'existe pas.\n" "Voulez-vous le créer ?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Ne peut pas ouvrir : %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Cette page n'a pas de dossier pour pièces jointes" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Modification de fichier: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Vous êtes en train de modifier un fichier avec un éditeur externe. Vous " "pouvez fermer cette fenêtre de dialogue lorsque vous aurez terminé." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Un wiki pour le bureau" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Jean Demartini\n" "Launchpad Contributions:\n" " BobMauchin https://launchpad.net/~zebob.m\n" " Daniel Stoyanov https://launchpad.net/~dankh\n" " Etienne Le Belléguy https://launchpad.net/~etiennelb\n" " François https://launchpad.net/~sciunto.org\n" " Herve Robin https://launchpad.net/~robin-herve\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Jean DEMARTINI https://launchpad.net/~jean-demartini-dem-tech\n" " Jean-Philippe Rutault https://launchpad.net/~rutault-jp\n" " Jigho https://launchpad.net/~jigho\n" " Joseph Martinot-Lagarde https://launchpad.net/~contrebasse\n" " Jérôme Guelfucci https://launchpad.net/~jerome-guelfucci-" "deactivatedaccount\n" " Kernel https://launchpad.net/~larrieuandy\n" " LEROY Jean-Christophe https://launchpad.net/~celtic2-deactivatedaccount\n" " Le Bouquetin https://launchpad.net/~damien-accorsi\n" " Lkppo https://launchpad.net/~lkppo\n" " Makidoko https://launchpad.net/~makidoko\n" " Pascollin https://launchpad.net/~pascollin\n" " Quentin THEURET https://launchpad.net/~qt-tempo-consulting\n" " Raphaël Hertzog https://launchpad.net/~hertzog\n" " Rui Nibau https://launchpad.net/~ruinibau\n" " Steve Grosbois https://launchpad.net/~steve.grosbois\n" " Thomas LAROCHE https://launchpad.net/~mikaye\n" " andré https://launchpad.net/~andr55\n" " pitchum https://launchpad.net/~pitchum\n" " samuel poette https://launchpad.net/~fracte" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Lecture seule" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _rétro-lien" msgstr[1] "%i _rétro-liens" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Impossible de sauvegarder la page : %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Pour continuer, vous pouvez enregistrer une copie de la page ou abandonner \n" "les modifications. Si vous enregistrez une copie, les modifications seront " "aussi\n" "abandonnées mais vous pourrez récupérer la copie plus tard." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Annuler les modifications" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Enregistrer la copie" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Aller à" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Aller à la page" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nouvelle sous-page" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nouvelle page" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Remarquez que lier une page non-existante\n" "aura pour effet de créer une nouvelle page automatiquement." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nom de la page" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Modèle de page" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "La page existe" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Enregistrer une copie" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importer la page" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Fichiers texte" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Déplacer la page" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Déplacer la page « %s »" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Mettre à jour %i page pointant sur cette page" msgstr[1] "Mettre à jour %i pages pointant sur cette page" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Espace de nom" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Renommer la page" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Renommer la page « %s »" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Mettre à jour l'en-tête de cette page" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Supprimer la page" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Supprimer la page « %s » ?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "La page \"%s\" et \n" "toutes ses sous-pages et leurs pièces attachées seront supprimées." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Supprimer les liens de %i page pointant sur cette page" msgstr[1] "Supprimer les liens des %i pages pointant sur cette page" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "le fichier %i va être supprimé" msgstr[1] "les fichiers %i vont être supprimés" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Joindre un fichier" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "La page « %s » n'a pas de dossier pour les pièces jointes" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Insérer l'image en tant que lien" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Bloc-notes" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Ouvrir le bloc-notes" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Carnet par défaut" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Ajouter un bloc-note" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Veuillez choisir un nom et un dossier pour le bloc-notes" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Dossier" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Mise à jour de l'index..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "Ann_uler" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Rétablir" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Co_uper" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copier" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "C_oller" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Supprimer" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "(Dé)Cocher la case 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "(Dé)Cocher la case 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "É_diter lien ou objet..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Retirer le lien" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Date et Heure..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Image..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Lis_te à puces" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Liste _numérotée" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Ca_se à cocher" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Texte à partir d'un _fichier..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Lien..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Insérer un lien" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Effacer les styles" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Rechercher..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Rechercher le _suivant" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Rechercher _précédent" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Remplacer..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Nombre de mots..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Zoomer" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Dézoomer" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Taille _normale" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nouveau _Pièce_jointe" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "_Modèles de fichier..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Titre _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Titre 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Titre _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Titre 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Titre _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Titre 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Titre _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Titre 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Titre _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Titre 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Gras" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Gras" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Italique" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Italique" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marquer" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marquer" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Barré" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Barré" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Indice" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "E_xposant" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Utiliser la touche pour suivre les liens\n" "(si désactivé vous pouvez encore employer )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Afficher le curseur en lecture seule" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Transformer automatiquement les mots \"CamelCase\" en liens" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "" "Transformer automatiquement les chemins vers le système de fichiers en liens" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Sélectionner le mot courant en appliquant un style" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Désindenter avec la touche \n" "(si désactiver, vous pouvez toujours utiliser )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Une succession de clics boucle à travers les états de case à cocher" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Désindenter un élément de liste affecte également les éventuels sous-éléments" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Cocher les cases de manière récursive" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformater les balises wiki à la volée" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Format par défaut du texte copié dans le presse-papier" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Dossier avec templates pour les pièces jointes" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Pas de lien wiki défini: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copier _au format..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Déplacer le texte sélectionné..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Editer les propriétés" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Mo_difier le lien" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copier le _lien" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copier l'adresse électronique" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Ouvrir avec..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Ouvrir" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Pas de modèles installés" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Le dossier\n" "%s\n" "n'existe pas.\n" "Voulez-vous le créer ?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Insérer la date et l'heure" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendrier" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Lier à une date" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Insérer une image" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Copier l'image dans le bloc-notes" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Type de fichier non supporté: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Modifier l'image" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Emplacement" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Lien vers" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Largeur" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Hauteur" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Supprimer la taille" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Insérer du texte depuis un fichier" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Modifier le lien" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Lien" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Texte" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Suivant" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Précédent" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Respecter la casse" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Mot _entier" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expression _régulière" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "S_urligner" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Rechercher" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Options" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Rechercher et Remplacer" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Rechercher" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Remplacer par" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "Re_mplacer" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Remplacer _tout" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Statistiques" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paragraphe" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Mots" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Lignes" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caractères" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Déplacer le texte sur une autre page" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Déplacer" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Déplacer le texte vers..." #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Ajouter un lien vers la nouvelle page" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Ouvrir une nouvelle page" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Nouveau fichier" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interface" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Modification" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Préférences" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Greffons" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Utiliser une police personnalisée" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Plus" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigurer" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dépendances" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Pas de dépendances" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Échec" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Facultatif" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Auteur" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Actif" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Greffon" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configurer le greffon" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Options du greffon %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Propriétés" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Propriétés du bloc-note" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Changements récents" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Aujourd'hui" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Hier" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Dernière modification" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Pour une recherche avancée, vous pouvez utiliser des opérateurs\n" "comme AND, OR et NOT. Voir l'aide pour plus de détails." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limiter la recherche à l'espace de nom courant" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Résultat" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Serveur web" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Serveur non-démarré" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Autoriser l'accès public" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Serveur démarré" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Serveur arrêté" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Modèles" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Parcourir" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Copier le modèle" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Sélectionner un fichier" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Tout _déplier" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Tout _replier" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Effacer" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Sélectionner un dossier" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Sélectionner une image" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Panneau latéral gauche" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Panneau latéral droit" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Panneau inférieur" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Panneau supérieur" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "En haut à gauche" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "En bas à gauche" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "En haut à droite" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "En bas à droite" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Il semble que vous ayez trouvé un bogue" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Lors du rapport sur ce bogue, veuillez inclure\n" "l'information de la boîte de texte ci-dessous" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Tous les fichiers" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Images" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Le fichier existe" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Un fichier portant le nom \"%s\" existe déjà.\n" "Vous pouvez utiliser un autre nom ou écraser le fichier existant." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Parcourir" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Écraser" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Impossible de trouver le fichier ou le dossier de ce bloc-notes" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Impossible de trouver le bloc-note : %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Le nom de page indiqué n'est pas valide\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nom de page invalide « %s »" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "La mise à jour de l'index est encore en cours pour\n" "l'exécution d'une opération qui nécessite l'index.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Ne peut pas modifier la page: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Mot clé interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Page d'accueil" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Racine du document" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Bloc-notes partagé" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Arithmétique" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Ce greffon permet d'intégrer des calculs arithmétiques dans Zim.\n" "Il est basé sur le module arithmétique suivant:\n" "http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Arithmétique" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Navigateur de fichiers liés" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Ce greffon permet de visualiser le dossier des fichiers liés sous\n" "forme d'icône dans le panneau inférieur.\n" "Le greffon est encore en cours de développement\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Position dans la fenêtre" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Fichiers liés" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Afficher la navigateur de pièces attachées" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Pièce jointe" msgstr[1] "%i _Pièces jointes" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Inconnu" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Type" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Taille" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modifié" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Déplacer ici" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copier ici" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Annuler" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Montage Automatique" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon peut monter automatiquement des bloc-notes au besoin. Par ex.,\n" "il peut être utilisé pour se connecter à des disques distants ou pour " "déverrouiller\n" "un disque crypté quand zim essaie d'ouvrir un bloc-notes donné.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Panneau de rétroliens" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon ajoute une icône supplémentaire affichant une liste\n" "des pages liées à la page courante.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Rétroliens" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Ajour_d'hui" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_drier" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Journal" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Ce greffon transforme un espace de noms en journal\n" "avec une page par jour, semaine ou mois.\n" "Ajoute également une icône caledrier pour accéder à ces pages.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Jour" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Semaine" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mois" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Année" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "" "Afficher le calendrier dans un panneau latéral au lieu d'une boîte de " "dialogue" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Utiliser une page pour chacun" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Agenda" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "Au_jourd'hui" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gramme" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Insérer un diagramme" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Insérer un diagramme" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit un éditeur de diagrammes basé sur GraphViz.\n" "\n" "C'est un greffon de base livré avec Zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "É_diter diagramme" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Edition sans distraction" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Ce plugin permet de transformer Zim en\n" "\"éditeur sans distraction\".\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Masquer la barre de menus en mode plein écran" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Masquer la barre d'outils en mode plein écran" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Masquer la barre de chemin en mode plein écran" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Masquer la barre d'état en mode plein écran" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Largeur maximale de page" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Marges verticales" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Couleur de fond du texte" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Couleur du texte" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Couleur de fond de l'écran" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Insérer Ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Insérer Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit un éditeur de diagrammes pour zim, basé sur Ditaa.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Editer Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_quation" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Insérer une équation" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Insérer une équation" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit un éditeur d'équations basé sur latex.\n" "\n" "C'est un greffon de base livré avec Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Modifier l'équation" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Insérer un graphe Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Ce greffon fournit un éditeur de graphe pour zim basé sur Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Editer le graphe Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Graphe GNU R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insérer un graphe GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Ce greffon fournit un éditeur de graphes pour Zim basé sur GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Editer le graphe GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Graphe GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Évalue expression _mathématique" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "La calculatrice en ligne n'a pas pu\n" "évaluer l'expression au curseur." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calculatrice en ligne" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon vous permet d'évaluer rapidement les\n" "expressions mathématiques simple dans zim.\n" "C'est un greffon de base livré avec zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Ne peut pas analyser l'expression" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbole..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Insérer un symbole" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon ajoute la boîte de dialogue « Insérer un symbole »\n" "et permet une mise en forme automatique des caractères\n" "typographiques.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Trier les lignes" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Tri de ligne" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Ce greffon trie les lignes sélectionnées par ordre alphabétique.\n" "Si la liste est déjà triée, elle le sera de nouveau en sens inverse\n" "(A-Z vers Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Veuillez sélectionner d'abord plus qu'une ligne." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Afficher la carte des liens" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Carte des liens" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit une représentation graphique\n" "des liens entre les pages du bloc-notes.\n" "C'est une sorte de « carte des idées » (ou \"mind map\").\n" "\n" "C'est un greffon de base livré avec Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Imprimer vers le navigateur" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon permet de contourner l'absence de fonctionnalités\n" "d'impression dans zim. Il exporte la page courante en HTML\n" "et ouvre un navigateur web. Si celui-ci a la possibilité\n" "d'imprimer, il enverra vos données à l'imprimante en\n" "deux étapes.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Imprimer vers le navigateur" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Note rapide..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Note rapide" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit une boîte de dialogue pour ajouter rapidement\n" "du texte ou le contenu du presse-papier dans une page zim.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Créer une nouvelle page pour chaque note" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titre" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Ouvrir la _Page" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Abandonner la note ?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "_Partition..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Insérer une partition" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Insérer une partition" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon fournit un éditeur de partition musicale basé sur GNU Lilypond.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "En-tête d'inclusion commun" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Pied de page d'inclusion commun" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Editer la partition" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Capture d'écran..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Insérer une capture d'écran" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon permet de prendre une capture d'écran et de\n" "l'insérer directement dans une page zim.\n" "\n" "C'est un greffon de base livré avec zim\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Capturer tout l'écran" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Sélectionner une fenêtre ou une zone" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Délai" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "secondes" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Une erreur est survenue lors de l'exécution de \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Vérifier l'_orthographe" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Correcteur d'orthographe" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ajoute le soutien de vérification d'orthographe basée sur gtkspell.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" "Impossible de charger le correcteur d'orthographe pour la langue: « %s »" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Cela peut signifier que vous n'avez pas le bon\n" "dictionnaire installé." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Table des Matières" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon ajoute un objet supplémentaire affichant une\n" "table des matières de la page courante.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" "Afficher la table des matières sous forme d'objet flottant au lieu d'un " "panneau latéral" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Contenu" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Minimiser" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Promouvoir" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "sans étiquette" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Trier alphabétiquement" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Trier les pages par étiquette" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Étiquettes" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Ce greffon fournit un index de pages filtré par les étiquettes " "sélectionnées\n" "dans une liste.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Liste des tâches" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon ajoute une boite de dialogue listant toutes \n" "les taĉhes en cours dans le bloc-notes. Ces tâches peuvent\n" "être soit des cases à cocher, soit des lignes marquées par un\n" "mot-clé comme « TODO » ou « FIXME ».\n" "\n" "C'est un greffon de base livré avec zim\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Considérer les cases à cocher comme des tâches" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Transformer le nom de la page en tags pour les items de tache" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" "Date due implicite pour les items de tâches dans les pages calendrier" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "Marquer avant le fin de semaine les tâches dû le lundi ou mardi" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Labels marquant les tâches" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Label pour la tâche suivante" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Etiquettes pour les tâches non-déclenchables" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Sous-page(s) à indexer" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Sous-pages à ignorer" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Le bloc-notes doit être indexé" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Il faut construire l'index, car c'est la première\n" "fois que la liste des tâches est ouverte.\n" "Cela peut durer plusieurs minutes, selon la\n" "taille du bloc-notes. Il ne sera plus\n" "nécessaire la prochaine fois." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtrer" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Afficher uniquement les tâches de type \"case à cocher\"" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i tâche en cours" msgstr[1] "%i tâches en cours" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Toutes les tâches" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Non étiquetté" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Tâche" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Date" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Icône de notification" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon ajoute une icône de notification pour un accès rapide.\n" "\n" "Il dépend de Gtk+, version 2.10 ou supérieure.\n" "\n" "C'est un greffon de base livré avec zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Icône de notification classique,\n" "ne pas utiliser le nouveau type d'icône sous Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Afficher une icône pour chaque bloc-notes" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Note rapide..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Autre..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Bloc-notes" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim, le Wiki de bureau" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Enregi_strer la version..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versions..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Il n'y a aucune modification de ce bloc-notes depuis la dernière version " "sauvegardée" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Pas de modifications depuis la dernière version" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Gestion de version" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ce greffon permet de gérer des versions de notebooks.\n" "\n" "Ce greffon soutien les systèmes de gestion de versions Bazaar, Git et " "Mercurial. \n" "\n" "C'est un greffon de base livré avec zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Enregistrer automatiquement des versions à intervalles réguliers" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Version enregistrée automatiquement depuis Zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Activer la gestion de version ?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "La gestion de versions n'est pas activée pour ce bloc-notes.\n" "Souhaitez-vous l'activer ?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Backend" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Enregistrer la version" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Saisissez un commentaire pour cette version" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Version enregistrée depuis zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versions" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Page" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Voir les _annotations" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Sélectionner une version pour voir les différences entre celle-ci et l'état " "actuel.\n" "Ou sélectionner plusieurs versions pour voir les différences entre elles.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Commentaire" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restaurer la version" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Afficher les _Changements" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Côte à côte" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Source de la page annotée" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Revenir à la version enregistrée ?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Voulez-vous revenir à la version %(version)s\n" "de la page %(page)s ?\n" "Toutes les modifications effectuées depuis seront perdues !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Changements" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Journaliser les évènements avec Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Passer les évènements au démon Zeiteist." #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Page Wiki : %s" #~ msgid "Text Editor" #~ msgstr "Éditeur de texte" #~ msgid "Web browser" #~ msgstr "Navigateur web" #~ msgid "Match c_ase" #~ msgstr "Respecter la c_asse" #~ msgid "Output" #~ msgstr "Sortie" #~ msgid "File browser" #~ msgstr "Navigateur de fichiers" #~ msgid "Pages" #~ msgstr "Pages" #~ msgid "Slow file system" #~ msgstr "Système de fichiers lent" #~ msgid "_Filter" #~ msgstr "_Filtrer" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "Email client" #~ msgstr "Client de messagerie" zim-0.60/translations/sv.po0000644000175000017500000023606612137750055015641 0ustar jaapjaap00000000000000# Swedish translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:11+0000\n" "Last-Translator: Jaap Karssenberg \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Standard" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Ingen sådan fil: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detaljer" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Öppna med \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Namn" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Kommando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Öppna fil" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Öppna katalog" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Ta bort fil" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Ta bort" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Markering" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Filnamn" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Sida" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Rensa bilagor" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Invertera markering" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Filerna nedan hittades i zims katalog för bilagor men är inte längre \n" "länkade i anteckningsboken. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Inga föräldralösa filer hittades." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Egna verktyg" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Du kan konfigurera egna verktyg som kommer att synas\n" "i verktygsmenyn eller i snabbmenyer." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Inställningar för Egna verktyg" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Beskrivning" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Kommandot ändrar inte data" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Visa i verktygsraden" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Följande parametrar kommer bli ersatta\n" "i kommandot när det exekveras:\n" "\n" "%f sidkällan som en temporär fil\n" "%d den aktuella sidans katalog för bilagor\n" "%s den riktiga källkodsfilen för sidan (om någon)\n" "%n platsen för anteckningsboken (fil eller mapp)\n" "%D roten för dokumentet (om någon)\n" "%t den markerade texten eller ordet under markören\n" "%T den markerade texten inklusive wiki formatering\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportera" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Uppdaterar register" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Mapp existerar: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Katalogen finns redan och innehåller filer, att exportera hit kan skriva " "över befintliga filer. Vill du fortsätta?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exporterar anteckningsbok" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Filen finns redan" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Denna fil finns redan.\n" "Vill du skriva över den?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Välj vilka sidor som ska exporteras" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Hela _anteckningsboken" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Enkel _sida" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Välj exportformat" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Annan..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Mall" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Länka till filer i dokumentroten med full sökväg" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Tilldela dokumentets root en URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Exportera till fil eller katalog" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Utdatakatalog" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Registersida" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Exportfil" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Förhandsgranska" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Visa _logg" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Ett fel uppstod när bilden skapades.\n" "Vill du spara källtexten ändå?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Loggfil" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Arkiv" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Redigera" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Visa" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Infoga" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Sök" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Format" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "Ver_ktyg" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Gå" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Hjälp" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "S_ökvägsfält" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Verktygsrad" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Ny sida" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Ny _undersida" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Öppna anteckningsbok..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Öppna i _nytt fönster" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importera sida" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Spara" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Spara so_m..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportera..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Skicka till..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Flytta sida..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Byt namn på sida..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Ta bort sida" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Egenskaper" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "St_äng" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Avsluta" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Sök..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Sök _bakåtlänkar" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Inställningar" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Läs om" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Öppna katalog för _bifogade filer" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Öppna _anteckningsbokens katalog" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Öppna dokument_rot" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Öppna dokument_katalog" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "_Bifoga fil" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Bifoga en extern fil" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Rensa bilagor" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "R_edigera källkod" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Starta_webbserver" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Egna _verktyg" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Bakåt" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Gå en sida bakåt" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Framåt" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Gå en sida framåt" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "Förälder" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Gå till ovanliggande sida" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "Barn" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Gå till underliggande sida" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "F_öregående i register" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Gå till föregående sida" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "N_ästa i register" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Gå till nästa sida" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Hem" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Gå hem" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Ho_ppa till" #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Innehåll" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_Frågor och svar" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Snabbkommandon" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "Kända _fel" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Om" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statusrad" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Helskärm" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Anteckningsbok _redigerbar" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Växla om anteckningsboken ska vara redigerbar eller inte" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Ingen" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Senaste sidor" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historik" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_amnrymd" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikoner _och text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Endast _ikoner" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Endast _text" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "S_tora ikoner" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "S_må ikoner" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Pyttesmå ikoner" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Gör varje meny löstagbar och möjlig att öppna i ett eget fönster" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Filen eller platsen du angav existerar inte.\n" "Var vänlig kontrollera att sökvägen är korrekt." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Ingen sådan fil eller katalog: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Hitta" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Uppgradera anteckningsbok?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Denna anteckningsbok skapades av en äldre version av Zim.\n" "Vill du uppgradera till den senaste versionen?\n" "\n" "Uppgraderingen kan ta flera minuter och kan komma att göra\n" "förändringar i anteckningsboken. Det är rekommenderat att du\n" "sparar en säkerhetskopia innan du genomför uppgraderingen.\n" "\n" "Om du väljer att uppgradera nu, kan en del funktioner helt, eller\n" "delvis, sluta fungera." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Uppgraderar anteckningsbok" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Registret uppdateras fortfarande. Under tiden kan inga länkar uppdateras " "korrekt. Att genomföra detta kommando nu kan bryta länkar. Vill du ändå " "fortsätta?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Uppdaterar länkar" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Tar bort länkar" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Skapa katalog?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Kunde inte öppna: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Den här sidan har ingen katalog för bifogade filer" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Redigerar filen: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Du redigerar en fil i ett externt program. Du kan stänga den här dialogrutan " "när du är klar." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "En skrivbordswiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Jesper J https://launchpad.net/~jesperj\n" " Kess Vargavind https://launchpad.net/~kess\n" " Leopold Augustsson https://launchpad.net/~leopold-augustsson\n" " Mikael Mildén https://launchpad.net/~mikael-milden\n" " Rustan Håkansson https://launchpad.net/~rustanhakansson\n" " rylleman https://launchpad.net/~rylleman" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Ej skrivbar" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _bakåtlänk..." msgstr[1] "%i _bakåtlänkar..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Kunde inte spara sida: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "För att fortsätta måste du spara en kopia av den här sidan eller förkasta\n" "alla ändringar. Om du sparar en kopia kommer ändringarna också\n" "att förkastas, men du kan återskapa kopian senare." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Förkasta ändringar" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Spara" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Hoppa till" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Hoppa till sida" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Ny undersida" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Ny sida" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Observera att länkning till en icke existerande sida\n" "automatiskt skapar en ny sida." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Sidnamn" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Sidmall" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Sidan finns redan" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Spara som" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importera sida" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Textfiler" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Flytta sida" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Flytta sida ”%s”" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Uppdatera %i sida som länkar till den här sidan" msgstr[1] "Uppdatera %i sidor som länkar till den här sidan" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Namnrymd" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Byt namn på sida" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Byt namn på sidan ”%s”" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Uppdatera rubriken på den här sidan" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Ta bort sida" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Ta bort sidan ”%s”" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Sidan \"%s\" och alla dess\n" "undersidor och bifogade filer kommer att raderas." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Ta bort länkar från %i sida, som länkar till denna sida." msgstr[1] "Ta bort länkar från %i sidor, som länkar till denna sida." #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i fil kommer att tas bort" msgstr[1] "%i filer kommer att tas bort" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Bifoga fil" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Sidan \"%s\" har ingen mapp för bifogade filer." #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Infoga bilder som länk" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Anteckningsbok" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Öppna anteckningsbok" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Standardanteckningsbok" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Lägg till anteckningsbok" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Välj ett namn och en mapp för anteckningsboken" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Katalog" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Uppdaterar register..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Ångra" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Gör om" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Klipp _ut" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopiera" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "K_listra in" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Ta bort" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "(Av)markera kryssruta - bock" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "(Av)markera kryssruta - kryss" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Redigera länk eller objekt..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Ta bort länk" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Datum och tid..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Bild..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Punk_tlista" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "kryssrutelista" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text från _fil..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Länk..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Infoga länk" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Rensa formatering" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Sök..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Sök _nästa" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Sök _föregående" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Ersätt..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Räkna _ord..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Rubrik _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Rubrik 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Rubrik _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Rubrik 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Rubrik _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Rubrik 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Rubrik _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Rubrik 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Rubrik _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Rubrik 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Fetstil" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Fetstil" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Kursiv" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Kursiv" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Markera" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Markera" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Genomstrykning" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Genomstrykning" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Nedsänkt" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Upphöjd" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Spärrad" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Spärrad" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Använd för att följa länkar\n" "(om avstängd kan du fortfarande använda )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Visa pekaren också på sidor som inte kan redigeras" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Gör automatiskt om ord i \"CamelCase\" till länkar" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Gör automatiskt om sökvägar till länkar" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Välj det aktuella ordet automatiskt vid formatering" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Ta bort indrag med \n" "(om du avaktiverar kan fortfarande användas)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Att upprepande gånger klicka på en kryssruta växlar genom lägena för " "kryssrutan" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "(Ta bort) indrag i en lista ändrar också alla underobjekt" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Markera en kryssruta påverkar alla underobjekt" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Omformatera wiki markup kontinuerligt" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Redigera egenskaper" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Redigera länk" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopiera _länk" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopiera e-postadress" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Öppna med..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Öppna" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Infoga datum och tid" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Länka till datum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Infoga bild" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Bifoga bild först" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Filtypen stöds ej: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Redigera bild" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Plats" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Länka till" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Bredd" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Höjd" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Återställ storlek" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Infoga text från fil" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Redigera länk" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Länk" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Nästa" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Föregående" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Matcha _små/stora" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Sök endast _hela ord" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Reguljärt uttryck" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Markera" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Sök" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Alternativ" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Sök och ersätt" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Sök efter" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Ersätt med" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Ersätt" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Ersätt _alla" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Räkna ord" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Stycke" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Ord" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Rader" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Tecken" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Gränssnitt" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Redigering" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Inställningar" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Insticksmoduler" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Använd anpassat typsnitt" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mer" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "K_onfigurera" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Beroenden" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Inga beroenden" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Misslyckades" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Användarnamn" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Aktiverad" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Insticksmodul" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Konfigurera modul" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Alternativ för insticksmodulen %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Egenskaper" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Egenskaper för anteckningsbok" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "För avancerad sökning kan du använda operatorer som\n" "AND, OR och NOT. Se hjälpsidorna för utförligare beskrivning." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Begränsa sökningen till aktuell namnrymd" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Resultat" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server ej startad" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server startad" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server stoppad" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Välj fil" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Välj katalog" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Välj bild" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Det verkar som om du har hittat en bug" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Var vänlig och inkludera informationen från textrutan nedan när du " "rapporterar den här buggen" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Alla filer" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Bilder" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Filen finns redan" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "En fil med namnet \"%s\" finns redan.\n" "Du kan ange ett annat filnamn eller skriva över den existerande filen." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Bläddra" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Skriv över" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Kunde inte hitta filen eller platsen för anteckningsboken" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Kunde inte hitta anteckningsbok: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Det angivna namnet för sidan är ogiltigt.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Ogiltigt namn \"%s\" för sidan" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Kan inte redigera sidan: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Hemsida" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Dokumentets root" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Delad anteckningsbok" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Bilage-bläddrare" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Det här insticksprogrammet visar den aktuella sidans katalog för bilagor som " "en ikonöverblick på nedre panelen.\n" "\n" "Detta insticksprogram är under utveckling.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Bilagor" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Storlek" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Ändrad" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "I_dag" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kalen_der" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Visa kalender i sidopanel i stället för dialog" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A den %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Idag" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Ta_bell" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Infoga diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Infoga diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram tillhandahåller en diagramredigerare för zim som " "baseras på GraphViz\n" "\n" "Detta tilläggsprogram följer med zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Redigera tabell" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "Ek_vation" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Infoga ekvation" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Infoga ekvation" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram tillhandahåller en ekvationsredigerare baserad på " "latex.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Redigera _formel" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Infoga GNU R Plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Detta tilläggsprogram tillhandahåller en diagramredigerare baserad på GNU " "R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Inställningar för GNU R Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Utvärdera _Matematik" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Kalkylator-tilläggsprogrammet kunde\n" "inte utvärdera uttrycket under markören." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Kalkylator" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Det här tilläggsprogrammet tillåter dig att snabbt\n" "utvärdera enkla matematiska uttryck i zim.\n" "\n" "Det här är ett bas-tilläggsprogram som kommer med zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Kunde inte tolka uttrycket" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Spe_cialtecken..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Infoga specialtecken" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram tillhandahåller en dialogruta för att infoga " "specialtecken och tillåter\n" "autoformatering av typografiska tecken.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Visa länkkarta" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Länkkarta" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram öppnar en grafisk\n" "representation av länkstrukturen i din\n" "anteckningsbol. Det kan användas som en sorts \"mind map\"\n" "som visar hur sidor relaterar till varandra.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Skriv till webläsare" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram ersätter bristen på\n" "utskriftsstöd i Zim. Det exporterar den aktuella sidan\n" "till html och öppnar en webläsare. Om webläsaren \n" "har stöd för utskrifter kommer detta ge möjligheten\n" "att skriva ut i två steg.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Skriv till webläsare" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Snabb anteckning..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Snabb anteckning" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram tillhandahåller ett sätt att snabbt lägga in text\n" "eller ett urklipp på en sida i Zim.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Skapa en ny sida för varje ny anteckning" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titel" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Skärmbild..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Infoga skärmbild" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram låter dig ta en skärmdump och infoga den\n" "på en sida i Zim.\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Fånga hela skärmen" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Välj fönster eller region" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Fördröjning" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekunder" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Ett fel inträffade vid körningen av \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Kontrollera _stavning" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Stavningskontroll" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Aktiverar stavningskotroll med hjälp av gtkspell.\n" "Detta tilläggsprogram medföljer zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiketter" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Uppgiftslista" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram visar alla oavslutade aktiviteter i den här\n" "anteckningsboken. En oavslutad aktivitet kan vara antingen omarkerade " "kryssrutor\n" "eller objekt markerade med etiketter som \"TODO\" eller \"FIXME\".\n" "\n" "Detta är ett kärnprogram som följer med Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Se alla kryssrutor som aktiviteter" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Omvandla sidnamn till taggar för uppgifter" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Etiketter som markerar aktiviteter" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Måste indexera anteckningsboken" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Detta är första gången du öppnar att göra-listan.\n" "Därför måste ett register skapas.\n" "Beroende på anteckningsbokens storlek kan det\n" "ta upp till flera minuter. Nästa gång du använder\n" "att göra-listan kommer detta inte att behövas." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i öppet objekt" msgstr[1] "%i öppna objekt" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Uppgift" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Datum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikon för aktivitetsfältet" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Detta tilläggsprogram lägger till en ikon i aktivitetsfältet för lätt " "tillgänglighet.\n" "\n" "Programmet kräver Gtk+ version 2.10 eller senare.\n" "\n" "Detta är ett kärnpogram som följer med Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klassisk ikon för aktivititetsfältet.\n" "Använd inte den nya typen av statusikon i Ubuntu." #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Visa en ikon för varje anteckningsbok" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Snabb anteckning..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Annan..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Anteckningsböcker" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Sp_ara version..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versioner..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Inga ändringar har gjorts i anteckningsboken sedan den senast sparades" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Inga ändringar sedan senaste versionen" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Versionshantering" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Spara automatiskt med jämna tidsintervaller" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatiskt sparad version av zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Aktivera versionshantering?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Versionskontroll är inte aktivierat för den här anteckningsboken\n" "Vill du aktivera nu?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Spara version" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Ange en kommentar för den här versionen" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Sparad version av zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versioner" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Sida" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Visa _kommentarer" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Välj en version för att se ändringar mellan den versionen och den aktuella.\n" "Du kan också välja flera versioner och se ändringar mellan dessa.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Kommentar" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Återställ version" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Visa ändringar" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Sida vid sida" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Sidans källkod med kommentarer" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Återställ sida till sparad version?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Vill du återskapa sidan: %(page)s\n" "till den sparade versionen: %(version)s ?\n" "Alla ändringar efter att du senast sparade kommer att förloras!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Ändringar" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Ver" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Output" #~ msgstr "Utdata" #~ msgid "Slow file system" #~ msgstr "Långsamt filsystem" #~ msgid "Text Editor" #~ msgstr "Textredigerare" #~ msgid "Email client" #~ msgstr "E-postprogram" #~ msgid "Web browser" #~ msgstr "Webbläsare" #~ msgid "Pages" #~ msgstr "Sidor" #~ msgid "Match c_ase" #~ msgstr "Gör skillnad på _gemener/VERSALER" #~ msgid "File browser" #~ msgstr "Filbläddrare" #~ msgid "_Filter" #~ msgstr "_Filter" #~ msgid "Prio" #~ msgstr "Prioritet" zim-0.60/translations/gl.po0000664000175000017500000024121512137750055015605 0ustar jaapjaap00000000000000# Galician translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: Roberto Suarez \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Houbo un erro ó executar a aplicación: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "O comando:\n" "%(cmd)s\n" "devolveu un código de saída distinto de cero: %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Predeterminado" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Non tal ficheiro: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Non foi posible ler: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" "Esto habitualmente significa que o ficheiro contén caracteres inválidos" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detalles" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Abrir con \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nome" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Orde" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Abrir ficheiro" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Abrir cartafol" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Borrar Ficheiro" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Borrar" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selección" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nome de ficheiro" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Páxina" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Limpar adxuntos" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Invertir a selección" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Os ficheiros a continuación foron atopados no directorio de adxuntos de zim, " "mais\n" "xa non están enlazados desde o caderno. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Non se atoparon ficheiros orfos" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Ferramentas personalizadas" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Pode engadir ferramentas personalizadas que aparecerán\n" "no menú e barra de ferramentas, ou no menú de contexto." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Editar a ferramenta personalizada" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descripción" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Icona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "O comando non modifica os datos" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Amosar na barra de ferramentas" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Os parámetros seguintes serán sustituídos\n" "no comando cando se execute:\n" "\n" "%f Un ficheiro temporal cos contidos da páxina\n" "%d O directorio de adxuntos da páxina actual\n" "%s Os contidos da propia páxina (se existe)\n" "%n A ubicación do caderno (ficheiro ou cartafol)\n" "%D O raíz de documentos (se existe)\n" "%t O texto seleccionado ou a palabra baixo o cursor\n" "%T O texto seleccionado incluindo o formato wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportar" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Actualizando índice" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "O cartafol xa existe: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "O cartafol xa existe e non está baleiro: exportar a este cartafol pode " "sobreescribir os ficheiros existentes. ¿Quere continuar?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exportando caderno" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "O ficheiro xa existe" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Este ficheiro xa existe.\n" "¿Desexa escribir por enriba?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Seleccione as páxinas a exportar" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Caderno _completo" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Só unha _páxina" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Seleccione o formato de exportación" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Outro..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formato" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Modelo" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Enlazar ficheiros baixo o raíz de documentos coa ruta completa" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Mapear o raíz de documentos cunha URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Seleccione o ficheiro ou cartafol de saída" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Cartafol de saída" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Páxina de índice" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Ficheiro de saída" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "Vista _previa" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Ver _rexistro" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Produciuse un erro ó xerar a imaxe.\n" "¿Quere gardar o fonte do texto de todos modos?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Ficheiro de rexistro" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Ficheiro" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Editar" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Ver" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Inserir" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Buscar" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mato" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Ferramentas" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Ir" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Axuda" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Barra de _rutas" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Barra de ferramen_tas" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nova páxina" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nova _subpáxina" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Abrir outro _caderno" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Abrir nunha _xanela nova" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importar páxina" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Gardar" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Gardar unha _copia" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportar…" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Enviar a…" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Mover páxina" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Renomear páxina" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Borrar páxina" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Propie_dades" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Pechar" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Saír" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Buscar" #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Buscar nos enlaces _inversos" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Pr_eferencias" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "A_ctualizar" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Abrir o cartafol de adx_untos" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Abrir o cartafol do ca_derno" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Abrir o raí_z de documentos" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Abrir o cartafol de docu_mentos" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Ad_xuntar ficheiro" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Adxuntar un ficheiro ex_terno" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "Lim_par adxuntos" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Editar f_onte" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Lanzar _servidor web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Actualizar índice" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Ferramentas _personalizadas" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Atrás" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Ir á páxina anterior" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Adiante" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Ir á seguinte páxina" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Pai" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ir á páxina superior" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Inferior" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Ir á páxina inferior" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Anterior no índice" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ir á páxina anterior" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Seguinte no índice" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ir á páxina seguinte" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Inicio" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Ir ó inicio" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Sal_tar a ..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contidos" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_Preguntas máis frecuentes" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "Atallos de _teclado" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "Fallos" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Acerca de" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Barra de e_stado" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Pantalla Completa" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "O cartafol é _editable" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Modificar o estado de \"editable\" do caderno" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Ningún" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Páxinas _recentes" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historial" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Espacio de _nomes" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Iconas e _texto" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Só _iconas" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Só texto" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Iconas _grandes" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Iconas _pequenas" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Iconas _diminutas" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Engadir barras para desprender os menús" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Use para cambiar ó panel lateral" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Eliminar enlaces cando se elimien as páxinas" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Lembrar a última posición do cursor cando se abra unha páxina" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "O ficheiro ou cartafol que indicou non existe.\n" "Por favor, comprobe se a ruta é correcta." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Non existe o ficheiro ou cartafol: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Buscar" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "¿Actualizar o caderno?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Este caderno foi creado cunha versión vella de zim.\n" "¿Quere actualizalo á derradeira versión?\n" "\n" "A actualización levará un tempo e pode facer varios cambios\n" "ó caderno. En xeral recoméndase facer unha copia de seguridade\n" "antes de facer isto.\n" "\n" "Se escolle non actualizar agora, pode que algunhas características\n" "non funcionen como deben." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Actualizando o caderno" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "O índice todavía está actualizándose. Ata que esto remate, as ligazóns non " "poden actualizarse correctamente. Continuar pode romper as ligazóns: " "¿confirma que quere seguir?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Actualizando ligazóns" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Eliminando ligazóns" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "¿Crear o cartafol?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Non foi posible lanzar a aplicación: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Esta páxina non ten un cartafol de adxuntos" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editando ficheiro: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Está editando un ficheiro cunha aplicación externa. Pode pechar esta xanela " "cando remate." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Un wiki de escritorio" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Miguel Anxo Bouzada https://launchpad.net/~mbouzada\n" " Roberto Suarez https://launchpad.net/~robe-allenta\n" " marisma https://launchpad.net/~mariamarcp" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Índice" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Só lectura" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i Ligazón _inversa" msgstr[1] "%i Ligazóns _inversas" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Non foi posible gardar a páxina: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Para continuar pode gardar unha copia desta páxina ou\n" "rexeitar as modificacións. Se garda unha copia, \n" "as modificacións tamén serán rexeitadas, pero pode restaurala máis tarde." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Rexeitar as modificacións" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Gardar unha copia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Ir a" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Ir a Páxina" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Subpáxina nova" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Páxina nova" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Por favor, lembre que ligar a unha páxina que non existe\n" "creará a páxina automáticamente." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nome da páxina" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Modelo da páxina" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "A páxina xa existe" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Gardar unha copia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importar páxina" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Ficheiros de texto" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Mover páxina" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Mover a páxina \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Actualizar %i páxina que enlaza a esta páxina" msgstr[1] "Actualizar %i páxinas que enlazan a esta páxina" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Espazo de nomes" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Renomear páxina" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Renomear páxina \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Actualizar o título do texto da páxina" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Eliminar a páxina" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "¿Eliminar a páxina \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "A páxina \"%s\" e todas as súas\n" "subpáxinas e adxuntos serán eliminados." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "¿Eliminar ligazóns desde %i páxina que enlaza a esta?" msgstr[1] "¿Eliminar ligazóns desde %i páxinas que enlazan a esta?" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i ficheiro será eliminado" msgstr[1] "%i ficheiros serán eliminados" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Adxuntar ficheiro" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "A páxina \"%s\" non ten unha carpeta de adxuntos" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Insertar imaxes como ligazóns" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Caderno de Notas" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Abrir caderno" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Caderno de notas predeterminado" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Engadir caderno" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Por favor, escolla un nome e un cartafol para o caderno." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Cartafol" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Actualizando índice ..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Desfacer" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Refacer" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Cor_tar" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copiar" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Pegar" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Eliminar" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Editar ligazón ou obxecto" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Eliminar a Ligazón" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Data e hora" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Imaxe" #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Lista de _puntos" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Texto desde _ficheiro" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Ligazón…" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Inserir unha ligazón" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Limpar formatos" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Buscar…" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Buscar _seguinte" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Buscar _anterior" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Substituír…" #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Contar palabras" #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Ampliar" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Reduc_ir" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Tamaño _normal" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Cabeceira _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Cabeceira 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Cabeceira _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Cabeceira 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Cabeceira _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Cabeceira 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Cabeceira _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Cabeceira 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Cabeceira _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Cabeceira 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Negrita" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Negrita" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Énfase" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Énfase" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marcar" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marcar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Tachar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Tachado" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Subíndice" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Su_períndice" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "Texto _sen formato" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Literal" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Use a tecla para seguir ligazóns\n" "(se está deshabilitado, sempre pode usar )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Amosar o cursor tamén nas páxinas que non poden ser editadas" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Convertir automáticamente as palabras \"CamelCase\" en ligazóns" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Convertir automáticamente as rutas a ficheiros en ligazóns" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Seleccionar automáticamente a palabra actual cando se aplique un formato" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Eliminar indentación con \n" "(se está deshabilitado, sempre pode usar )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Eliminar ou aplicar indentación ó elemento dunha lista tamén cambia os " "elementos inferiores" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Aplicar o formato wiki a medida que se escribe" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Formato por defecto para o texto copiado ó portapapeis" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Non está definido tal wiki: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Editar propiedades" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Editar ligazón" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copiar a _ligazón" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copiar o enderezo de correo-e" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Abrir con..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Abrir" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "_Insertar data e hora" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendario" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Ligar á data" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Inserir unha imaxe" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Adxuntar a imaxe primeiro" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Tipo de ficheiro non soportado: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Editar imaxe" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Ubicación" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Enlazar a" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Anchura" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Altura" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Restaurar tamaño" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Insertar texto desde un ficheiro" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Editar a ligazón" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Ligazón" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Texto" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Seguinte" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Anterior" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "_Distinguir maiúsculas/minúsculas" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Palabras _enteiras" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expresión _regular" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "Resaltado" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Buscar" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opcións" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Buscar e substituír" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Palabras a atopar" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Substituír por" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Substituír" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Substituír _todo" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Contador de palabras" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Parágrafo" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Palabras" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Liñas" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caracteres" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interface" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editando" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferencias" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Engadidos" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Usar un tipo de letra personalizado" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Máis" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigurar" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependencias" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Sen dependencias" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Aceptar" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Produciuse un erro" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opcional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Activado" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Complemento" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configurar o complemento" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opcións para o complemento %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Propiedades" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Propiedades do caderno de notas" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Para a búsqueda avanzada pode usar operadores como\n" "AND, OR e NOT. Mire a páxina de axuda para saber máis." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limitar a búsqueda o espacio de nomes actual" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Puntuación" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "O servidor non está activo" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Porto" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "O servidor está activo" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "O servidor está parado" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Escoller un ficheiro" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Limpar" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Escoller un cartafol" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Seleccionar unha imaxe" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Seica atopou un fallo" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Cando informe dun fallo por favor inclúa\n" "a información da caixa de texto a continuación" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Todos os ficheiros" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Imaxes" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "O ficheiro xa existe" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Xa existe un un ficheiro co nome \"%s\".\n" "Pode usar outro nome ou sobreescribir o ficheiro existente." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Explorar" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Sobrescribir" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Non se atopou o ficheiro ou cartafol para este caderno" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Non se atopou o caderno: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "O nome dado para a páxina non é correcto.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nome de páxina incorrecto \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "O índice está aínda ocupado coa actualización mentras\n" "tentamos facer unha operación que necesita o índice.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Non se pode modificar a páxina: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Palabra clave de Interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Páxina de inicio" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Documento pai" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Caderno compartido" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmética" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmética" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Navegador de Adxuntos" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Este complemento amosa o cartafol de adxuntos da páxina actual cunha\n" "vista de iconas no panel inferior.\n" "\n" "O complemento aínda está desenrolándose.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Adxuntos" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Tamaño" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modificado" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Hoxe" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Calendario" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Día" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Semana" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mes" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Ano" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Amosar calendario no panel lateral en lugar de como xanela" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Usar unha páxina para cada un" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d de %B de %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendario" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Hoxe" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_grama" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Insertar diagrama" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Insertar diagrama" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento proporciona un editor de diagramas baseado en GraphViz.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Editar diagrama" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_cuación" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Insertar ecuación" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Insertar ecuación" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento proporciona un editor de ecuaciones para zim basado en " "LaTeX.\n" "\n" "É un complemento básico distribuído con zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Editar ecuación" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Insertar gráfico de Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Este complemento proporciona un editor de gráficos para zim baseado en " "Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Editar Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Gráfico GNU _R" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insertar un gráfico GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Este complemento proporciona un editor de gráficos para zim baseado en GNU " "R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Editar gráfico de GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Gráfico de GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evaluar _matemáticas" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "O complemento de calculadora integrada de zim non\n" "puido evaluar a expresión ó pé do cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calculadora integrada" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento permite evaluar expresións\n" "matemáticas sinxelas en zim.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Non foi posible analizar a expresión" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sí_mbolo" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Insertar símbolo" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento engade á xanela de 'Insertar símbolo', e\n" "permite dar formato ós caracteres tipográficos.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Ordear liñas" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Ordeador de liñas" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Este plugin ordea as liñas seleccionadas en orden alfabético.\n" "Se a lista xa está ordeada, a orde será revertida (A-Z pasa a Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Por favor, seleccione primeiro máis dunha liña de texto." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Amosar mapa de ligazóns" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa de ligazóns" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento proporciona unha xanela cunha representación\n" "gráfica da estructura de ligazóns do caderno. Pode ser usada de xeito\n" "parecido a un \"mapa mental\", amosando cómo se relacionan as páxinas.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Imprimir ó navegador" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento proporciona un amaño para a falta\n" "de soporte de impresión en zim. Exporta a páxina actual\n" "a html é lanza un navegador. Asumindo que o navegador\n" "ten soporte de impresión, isto enviará os seus datos á\n" "impresora en dous pasos.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Imprimir ó navegador" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Nota rápida" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Nota rápida" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento engade unha xanela para escribir rápidamente\n" "unha nota ou soltar o contido do portapapeis nunha páxina de zim.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Crear unha nova páxina para cada nota" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Título" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Abrir _páxina" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Captura de pantalla..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Insertar captura de pantalla" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento permite sacar unha captura de pantalla e insertala\n" "nunha páxina de zim.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Capturar a pantalla completa" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Seleccionar xanela ou rexión" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Retraso" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "segundos" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Produciuse un erro ó executar \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Comprobar _ortografía" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Corrector ortográfico" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Engade soporte de comprobación de ortografía usando gtkspell.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" "Non foi posible cargar o soporte de comprobación ortográfica para o idioma " "\"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Isto podería significar que non ten os diccionarios\n" "apropiados instalados no sistema." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "Sen etiquetar" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Ordear páxinas por etiquetas" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiquetas" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Este complemento proporciona un índice filtrado mediante a selección de " "etiquetas nunha nube.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Lista de tarefas" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Trocar os nomes de páxina en etiquetas para os elementos de tarefas" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Cómpre indexar o caderno" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Esta é a primeira vez a lista de tarefas é aberta.\n" "Polo tanto, cómpre reconstruir o índice.\n" "Dependendo do tamaño do caderno, esto pode levar\n" "ata varios minutos. A próxima vez que use a lista de tarefas\n" "esto non fará falta." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtrar" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i elemento aberto" msgstr[1] "%i elementos abertos" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Todas as tarefas" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Tarefa" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Data" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Icona na bandexa do sistema" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este elemento engade unha icona na bandexa do sistema para acceder " "rápidamente.\n" "\n" "Este complemento require a versión de Gtk+ 2.10 ou superior.\n" "\n" "Este é un complemento básico distribuído con zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Icona clásica,\n" "non usar o novo estilo de iconas de estado de Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Amosar unha icona distinta para cada caderno" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "Nota _rápida" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Outro..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Cadernos de notas" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Wiki persoal Zim" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "_Gardar versión" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "Versións" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Non hai cambios neste caderno desde que a última versión foi gardada" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Non hai cambios desde a última versión" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Control de versións" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Gardar automáticamente unha versión a intervalos regulares" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Versión gardada automáticamente desde zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "¿Activar o sistema de control de versións?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "O sistema de control de versións non está activado para este caderno.\n" "¿Desexa activalo?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Gardar versión" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Por favor, introduza un comentario para esta versión" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versión gardada desde zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versións" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Páxina" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Ver" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Seleccione unha versión para ver os cambios entre esa versión e o estado\n" "actual. Ou seleccione varias versións para ver os cambios entre elas.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Comentario" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restaurar versión" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "_Amosar cambios" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Lado a lado" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Páxina de código fonte con anotacións" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "¿Restaurar a páxina á versión gardada?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "¿Desexa restaurar a páxina: %(page)s\n" "á versión gardada: %(version)s?\n" "\n" "¡Perderanse tódolos cambios desde a última versión gardada!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Cambios" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Revisión" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "File browser" #~ msgstr "Navegador de ficheiros" #~ msgid "Web browser" #~ msgstr "Navegador web" #~ msgid "Pages" #~ msgstr "Páxinas" #~ msgid "Output" #~ msgstr "Saída" #~ msgid "Match c_ase" #~ msgstr "_Distinguir maiúsculas e minúsculas" #~ msgid "Prio" #~ msgstr "Prioridade" #~ msgid "_Filter" #~ msgstr "_Filtrar" #~ msgid "Slow file system" #~ msgstr "Sistema de ficheiros lento" #~ msgid "Text Editor" #~ msgstr "Editor de texto" #~ msgid "Email client" #~ msgstr "Programa de correo-e" zim-0.60/translations/cs.po0000644000175000017500000024774012137750055015617 0ustar jaapjaap00000000000000# Czech translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-13 18:42+0000\n" "Last-Translator: aloisam \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Nepodařilo se spustit aplikaci %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "Příkaz %(cmd)s\n" "vrátil chybový kód %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Nepodařilo se spustit %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Výchozí" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Soubor %s neexistuje" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Nelze načíst %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Obvykle to znamená, že soubor obsahuje neplatné znaky" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detaily" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Soubor %s je chráněn proti zápisu" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Soubor %s se na disku změnil" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Přizpůsobit..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Žádné aplikace" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Otevřít pomocí \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Nastavit aplikaci pro otevírání odkazů %s" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Nastavit aplikaci pro otevírání souborů\n" "typu %s" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Nastavit aplikace" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Přidat aplikaci" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Výchozí v systému" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Název" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Příkaz" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Nastavit jako výchozí" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Otevřít soubor" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Otevřít složku" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Smazat soubor" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Smazat" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Výběr" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Jméno souboru" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Stránka" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Odstranit nepoužité přílohy" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Obrátit výběr" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Níže zobrazené soubory byly nalezeny v adresáři pro přílohy, \n" "ale nevedou na ně odkazy ze sešitu. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nenalezeny žádné nepoužité přílohy." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Vlastní nástroje" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Můžete si nastavit vlastní programy, zobrazí se v nabídce Nástroje,\n" " v nástrojové liště a v kontextové nabídce." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Upravit vlastní nástroj" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Popis" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Příkaz nezmění data" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Zobrazit v nástrojové liště" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Následující parametry budou při spuštění\n" "programu nahrazeny skutečnými hodnotami:\n" "\n" "%f zdrojový text stránky jako dočasný soubor\n" "%d adresář s přílohami současné stránky \n" "%s skutečný zdrojový text stránky (pokud existuje)\n" "%n umístění sešitu (soubor nebo adresář)\n" "%D kořen dokumentu (pokud je k dispozici)\n" "%t označený text nebo slovo pod kurzorem\n" "%T označený text včetně wiki formátování \n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportovat" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Probíhá aktualizace indexu" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Adresář %s existuje" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Složka již existuje a obsahuje soubory - hrozí, že při exportu budou " "přepsány. Chcete pokračovat?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Probíhá export sešitu" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Soubor existuje" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Tento soubor už existuje.\n" "Chcete jej přepsat?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Vyberte stránky k exportu" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Kompletní sešit" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Jednu _stránku" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Vyberte exportovaný formát" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Další..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formát" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Šablona" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Odkazovat soubory v kořenové složce dokumentu absolutní cestou" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Převést kořen dokumentu na URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Vyberte výstupní soubor nebo adresář" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Výstupní složka" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Stránka s indexem" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Výstupní soubor" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Náhled" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Zobrazit _záznam" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Při vytváření obrázku došlo k chybě.\n" "Přejete si zdrojový text přesto uložit?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Soubor se záznamem" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Soubor" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "Ú_pravy" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Zobrazit" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Vložit" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Hledat" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Formát" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "Nás_troje" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Přejít" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Nápověda" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Ukazatel struktury" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Nástrojová lišta" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nová stránka" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nová _podstránka" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Otevřít jiný sešit" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Otevřít v novém _okně" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importovat stránku" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Uložit" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Uložit _kopii" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportovat..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Odesla_t..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Přesunout stránku..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Pře_jmenovat stránku...." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Smazat stránku" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "V_lastnosti" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Zavřít" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "U_končit" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Hledat..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Hledat _zpětné odkazy" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Nedávné změny..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Kopírovat _umístění" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "Ša_blony" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Nastavení" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "Z_novu načíst" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Otevřít složku s _přílohami" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Otevřít složku se _sešitem" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Otevřít _kořenovou složku dokumentu" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Otevřít složku _dokumentu" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "_Připojit soubor" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Připojit externí soubor" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Odstranit nepoužité přílohy" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "_Upravit zdrojový kód" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Spustit _webový server" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Aktualizovat index" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "_Vlastní nástroje" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Zpět" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Přejít o stranu zpět" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Vpřed" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Přejít o stranu vpřed" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "O úroveň _výš" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Přejít na nadřazenou stránku" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "O úroveň _níž" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Přejít na podřízenou stránku" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Pře_dchozí v indexu" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Přejít na předchozí stránku" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Následující v indexu" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Přejít na následující stránku" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Domů" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Přejít na startovní stránku" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Skočit na..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Obsah" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "Časté _otázky" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Klávesové zkratky" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Chyby" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_O programu" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "Všechny _panely" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Zobrazit všechny panely" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Stavový řádek" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Postranní panely" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Zobrazit postranní panely" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Celoobrazovkový režim" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Sešit lze _upravovat" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Přepnout: sešit lze upravovat" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "Žá_dný" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Nedávné stránky" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Nedávno změněné stránky" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historie" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Jmenný prostor" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikony a _text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Pouze ik_ony" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Pouze t_ext" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Velké ikony" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Malé ikony" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "D_robné ikony" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Připojit k nabídkám odtrhávací proužky" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Aktivovat boční panel pomocí Ctrl-mezerník" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Odstranit odkazy při mazání stránek" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Při otevření stránky umístit kurzor na poslední známou pozici" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Soubor nebo složka, kterou jste zadali, neexistuje.\n" "Ověřte prosím, že je cesta správná." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Soubor nebo složka neexistuje: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Hledat" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Hledat stránky" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Povýšit verzi sešitu?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Tento sešit byl vytvořen starší verzí Zimu.\n" "Chcete jej aktualizovat na aktuální verzi?\n" "\n" "Aktualizace bude chvíli trvat a může se na obsahu sešitu projevit.\n" "Měli byste si určitě udělat zálohu sešitu.\n" "\n" "Pokud se rozhodnete, že aktualizovat nebudete,\n" "některé funkce nebudou pracovat tak, jak očekáváte." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Probíhá změna verze sešitu" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Index se stále ještě sestavuje. Dokud proces neskončí, nelze aktualizovat " "odkazy. Pokud budete pokračovat, může se stát, že budou odkazy neplatné. " "Pokračovat?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Probíhá aktualizace odkazů" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Odstranit odkazy" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Vytvořit složku?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "Složka \"%s\" zatím neexistuje.\n" "Chcete ji nyní vytvořit?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Nelze otevřít %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Stránka nemá složku s přílohami" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Úpravy souboru %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Upravujete soubor v externí aplikaci. Až budete hotovi, můžete tohle okno " "zavřít." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Desktopová wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Jakub Kozisek https://launchpad.net/~kozisek-j\n" " Konki https://launchpad.net/~pavel-konkol\n" " Radek Tříška https://launchpad.net/~radek-fastlinux\n" " Vlastimil Ott https://launchpad.net/~vlastimil\n" " Vlastimil Ott https://launchpad.net/~vlastimil-e-ott\n" " aloisam https://launchpad.net/~a-musil" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Rejstřík" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "jen ke čtení" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i zpětný odkaz" msgstr[1] "%i zpětné odkazy" msgstr[2] "%i zpětných odkazů" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Stránku %s nelze uložit" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Můžete uložit kopii stránky, nebo všechny změny zahodit.\n" "Pokud uložíte kopii, změny budou sice také zahozeny, \n" "ale kopii můžete později obnovit." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Zahodit změny" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Uložit _kopii" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Skočit na" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Skočit na stránku" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nová podstránka" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nová stránka" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Pamatujte na to, že pokud odkážete na stránku, která dosud neexistuje, \n" "bude automaticky vytvořena." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Název stránky" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Šablona stránky" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Stránka již existuje" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Uložit kopii" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importovat stránku" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Textové soubory" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Přesunout stránku" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Přesunout stránku %s" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Aktualizovat %i stránku, která sem odkazuje" msgstr[1] "Aktualizovat %i stránky, které sem odkazují" msgstr[2] "Aktualizovat %i stránek, které sem odkazují" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Jmenný prostor" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Přejmenovat stránku" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Přejmenovat stránku %s" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Aktualizovat záhlaví stránky" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Smazat stránku" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Smazat stránku %s?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Stránka \"%s\"a všechny\n" "její podstránky a přílohy budou smazány" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Odstranit odkazy z %i stránky, které sem odkazuje" msgstr[1] "Odstranit odkazy z %i stránek, které sem odkazují" msgstr[2] "Odstranit odkazy z %i stránek, které sem odkazují" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i soubor bude smazán" msgstr[1] "%i soubory budou smazány" msgstr[2] "%i souborů bude smazáno" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Připojit soubor" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Stránka %s nemá složku pro přílohy" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Vložit obrázky jako odkaz" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Sešit" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Otevřít sešit" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Výchozí sešit" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Přidat sešit" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Vyberte prosím název a složku pro sešit." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Složka" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Aktualizace indexu..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "V_rátit" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Zrušit v_rácení" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Vyjmout" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopírovat" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "V_ložit" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Smazat" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Zatrhnout přepínač kladně" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Zatrhnout přepínač záporně" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Upravit odkaz nebo objekt" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Odst_ranit odkaz" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Datum a čas" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Obrázek..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Odráž_kový seznam" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Čís_lovaný seznam" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Zašk_rtávací seznam" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text ze _souboru" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Odkaz" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Vložit odkaz" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Vymazat formátování" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "N_ajít..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Najít _následující" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Najít _předchozí" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "Nah_radit..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Počet slov..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "Z_většit" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Z_menšit" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normální velikost" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nová _příloha" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Šablony _souborů" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Nadpis _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Nadpis 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Nadpis _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Nadpis 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Nadpis _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Nadpis 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Nadpis _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Nadpis 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Nadpis _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Nadpis 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Tučně" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Tučně" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Kurziva" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Kurziva" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "O_značit" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Zvýraznit" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "Proškr_tnout" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Proškrtnuté" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Dolní index" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Horní index" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "Stro_jopis" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Strojopis" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Pomocí klávesy Enter můžete přejít na cíl odkazu\n" "(pokud to nefunguje, použijte Alt-Enter)." #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Zobrazit kurzor také na stránkách, které nelze upravovat." #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automaticky vytvářet odkazy ze SloženýchSlov" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Automaticky vytvářet odkazy z adresářových cest" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Při formátování automaticky vybrat aktuální slovo" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Smazat odsazení při stisku Backspace\n" "(pokud to nefunguje, použijte Shift-Tab)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Opakované klepnutí na přepínač mění jeho stavy" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Odsazení položky seznamu ovlivní i podpoložky" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Zatržení přepínače změní také jeho podpoložky" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Přeformátovat wiki značky za běhu" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Výchozí formát pro kopírování textu do schránky" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Složka se šablonami příloh" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Takový odkaz na wiki není definován: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopírovat _jako..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "_Přesunout vybraný text..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Upravit vlastnosti" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Upravit odkaz" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopírovat _odkaz" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopírovat e-mailovou adresu" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Otevřít pomocí..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Otevřít" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Nenainstalovány žádné šablony" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Složka\n" "%s\n" "neexistuje. Má se vytvořit?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Vložit datum a čas" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalendář" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Odkaz na datum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Vložit obrázek" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Nejprve připojit obrázek" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Typ souboru není podporován: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Upravit obrázek" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Umístění" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Odkaz na" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Šířka" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Výška" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Původní velikost" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Vložit text ze souboru" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Upravit odkaz" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Odkaz" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Další" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Předchozí" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Rozlišovat _velikost" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "_Celá slova" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regulární výraz" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Zvýraznění" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Najít" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Možnosti" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Najít a zaměnit" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Najít výraz" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Nahradit výrazem" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Nahradit" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Nahradit _vše" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Počet slov" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Odstavec" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Slov" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Řádků" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Znaky" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Přesunout text na jinou stránku" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Přesunout" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Přesunout text na:" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Vložit odkaz na novou stránku" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Otevřít novou stránku" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Nový soubor" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Rozhraní" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Úpravy" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Nastavení" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Moduly" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Použít vlastní písmo" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Více" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Nastavit" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Závislosti" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Bez závislostí" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Nevyřešeny" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Volitelné" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Povoleno" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Zásuvný modul" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Nastavit zásuvný modul" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Možnosti zásuvného modulu %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Vlastnosti" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Vlastnosti sešitu" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Nedávné změny" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Dnes" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Včera" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Naposledy upraveno" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Pro pokročilé vyhledávání můžete použít operátory\n" "AND, OR a NOT. Více informace v nápovědě." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Omezit vyhledávání na současný jmenný prostor" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Skóre" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Webový server" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server neběží" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Povolit veřejný přístup" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server spuštěn" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server zastaven" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Šablony" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Procházet" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Kopírovat šablonu" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Vybrat soubor" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "_Rozbalit vše" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "S_balit vše" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Vymazat" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Vybrat složku" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Vyberte obrázek" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Panel vlevo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Panel vpravo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Panel dole" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Panel nahoře" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Vlevo nahoře" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Vlevo dole" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Vpravo nahoře" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Vpravo dole" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Pravděpodobně jste narazili na chybu" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Pokud budete hlásit chybu, přiložte,\n" "prosím, níže uvedené informace" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Všechny soubory" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Obrázky" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Soubor existuje" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Soubor jménem \"%s\" už existuje.\n" "Vyberte jiné jméno, nebo soubor přepište." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Procházet" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Přepsat" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Nelze najít soubor nebo složku pro tento sešit" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Nelze najít sešit %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Zadaný název stránky není platný.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Neplatný název stránky %s" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Není možné pracovat s indexem stránek,\n" "protože stále probíhá jeho aktualizace.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Nelze upravit stránku %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "klíčové slovo interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Domovská stránka" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Kořen dokumentu" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Sdílený sešit" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Výpočty" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Tento modul umožňuje zahrnout do zimu aritmetické výpočty.\n" "Je založen na výpočetním modulu z\n" " http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Výpočty" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Prohlížeč příloh" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Tento modul zobrazuje složku s přílohami současné stránky\n" "jako ikony v bočním panelu.\n" "\n" "Vývoj modulu stále probíhá (=může být nestabilní).\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Pozice uvnitř okna" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Přílohy" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Ukázat přiřazený prohlížeč" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i přílo_ha" msgstr[1] "%i přílo_hy" msgstr[2] "%i přílo_h" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Neznámé" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Typ" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Velikost" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Změněn" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Přesunout sem" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Kopírovat sem" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Zrušit" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automount" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul dokáže automaticky připojit sešity, když jsou potřeba.\n" "Můžete toho využít, pokud máte sešit uložený na výměnném\n" "zařízení, nebo pro odemčení šifrovaného disku, když k němu \n" "chce Zim přistupovat.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Panel zpětných odkazů" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul zobrazuje widget se seznamem stránek,\n" "které odkazují na aktuální stránku.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Zpětné odkazy" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Dnešek" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Kalendář" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Deník" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Prostřednictvím tohoto modulu vytvoříte z jednoho\n" "jmenného prostoru deník se stránkami pro den, týden\n" "nebo měsíc.\n" "Zároveň se aktivuje modul Kalendář, který vám usnadní\n" "přístup k těmto stránkám.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Den" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Týden" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Měsíc" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Rok" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Zobrazit kalendář v bočním panelu místo dialogového okna" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Použít pro každý stránku" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d. %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalendář" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Dnes" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Vložit diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Vložit diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul poskytuje editor diagramů založený na GraphViz.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Upravit diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Nerušivé psaní" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Tento modul přidává nastavení, která ze Zimu\n" "vytvoří nerušivý editor.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "V režimu celé obrazovky skrýt hlavní nabídku" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "V režimu celé obrazovky skrýt nástrojovou lištu" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "V režimu celé obrazovky skrýt ukazatel struktury" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "V režimu celé obrazovky skrýt stavový řádek" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Maximální šířka strany" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Horní okraj" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Barva pozadí textu" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Barva textu" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Barva pozadí obrazovky" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Vložit Ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Vložit Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul poskytuje editor diagramů založených na Ditaa.\n" "Základní modul dodávaný se Zimem.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Upravit Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Rovnice" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Vložit rovnici" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Vložit rovnici" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul poskytuje editor rovnic založený na LaTeX.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Upravit rovnici" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Vložit Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Modul poskytuje editor pro grafy založené na Gnuplotu.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Upravit Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Graf GNU _R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Vložit graf GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Tento modul nabízí editor diagramů, schémat a grafů v GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Upravit graf GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Graf GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Vyhodnotit _matematiku" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Zabudovaná kalkulačka nedokázala\n" "vyhodnotit výraz na pozici kurzoru." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Zabudovaná kalkulačka" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul vám umožní rychle vyhodnotit\n" "jednoduché matematické výrazy.\n" "\n" "Jde o základní modul dodávaný se Zimem.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Výraz je nesrozumitelný" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbol" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Vložit symbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul přidává dialog 'Vložit symbol' a umožňuje\n" "automaticky formátovat typografické znaky.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Setřídit řádky" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Setřídit řádky" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Modul seřadí označené řádky podle abecedy.\n" "Pokud je seznam už setříděný, pořadí se obrátí.\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Vyberte nejprve aspoň jeden řádek textu." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Zobrazit mapu odkazů" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa odkazů" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul zobrazuje okno se strukturou sešitu. Můžete ho použít jako \n" "myšlenkovou mapu - zobrazuje vztahy mezi stránkami.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Zobrazit v prohlížeči" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul poskytuje dočasné řešení pro tisk,\n" "jehož podpora v Zimu chybí. Exportuje stránku \n" "do HTML a spustí webový prohlížeč, v němž ji \n" "pak lze snadno vytisknout.\n" "\n" "Tohle je základní modul dodávaný se Zimem.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Zobrazit v prohlížeči" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Rychlá poznámka..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Rychlá poznámka" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul přidává dialog, pomocí něhož můžete do stránky \n" "rychle přidat nějaký text nebo obsah schránky.\n" "\n" "Je to základní modul dodávaný se Zimem.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Vytvořit pro každou poznámku novou stránku" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Nadpis" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Otevřít _stránku" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Odstranit poznámku?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "No_tový zápis" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Vložit notový zápis" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Vložit notový zápis" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul poskytuje editor pro vytváření notových zápisů \n" "(založený na GNU Lilypond).\n" "\n" "Základní modul dodávaný se Zimem.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Společné záhlaví" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Společné zápatí" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Upravit notový zápis" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Snímek obrazovky..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Vložit snímek obrazovky" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul umožní vytvořit snímek obrazovky\n" "a vložit jej přímo do stránky.\n" "\n" "Jde o základní modul dodávaný se Zimem.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Sejmout celou obrazovku" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Vybrat okno nebo oblast" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Prodleva" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekund" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Při běhu %s došlo k chybě" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "_Kontrola překlepů" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Kontrola překlepů" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul zajišťuje kontrolu překlepů pomocí GtkSpell.\n" "\n" "Základní modul dodávaný se Zimem.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Nelze použít kontrolu překlepů pro jazyk \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "To může znamenat, že nemáte nainstalované\n" "odpovídající slovníky" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Obsah stránky" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul zobrazuje osnovu na aktuální stránce osnovu\n" "z nadpisů (obsah).\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Obsah stránky jako plovoucí prvek místo v bočním panelu" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Obsah" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "O úroveň níž" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "O úroveň výš" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "bez štítku" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Seřadit abecedně" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Seřadit stránky podle štítků" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Štítky" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Modul poskytuje seznam stránek filtrovaný na základě vybraných štítků.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Seznam úkolů" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul přidává dialogové okno zobrazující všechny \n" "otevřené úkoly v sešitu. Otevřené úkoly jsou buď\n" "nezatržené přepínače nebo položky označené\n" "slovy jako TODO nebo FIXME.\n" "\n" "Základní modul dodávaný se zimem.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Považovat všechny přepínače za úlohy" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Názvy stránek jako štítky v úkolech" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Uzávěrka úkolů v kalendáři podle data stránky" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "Úkoly s uzávěrkou v pondělí nebo úterý označit před víkendem" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Značky pro označení úloh" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Štítek pro další úkol" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Štítky pro nesplnitelné úkoly" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Podstromy pro indexování" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Ignorovat podstromy" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Sešit je potřeba indexovat" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Seznam úloh je otevřen poprvé.\n" "Je potřeba znovu sestavit index.\n" "Tato operace může v závislosti na\n" "velikosti sešitu trvat i několik minut.\n" "Až seznam úloh otevřete příště,\n" "tato operace již nebude potřeba." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtr" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Zobrazit pouze proveditelné úkoly" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i otevřená položka" msgstr[1] "%i otevřené položky" msgstr[2] "%i otevřených položek" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Všechny úkoly" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Beze štítku" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Úkol" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Datum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikona v systémové oblasti" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul zajišťuje ikonu v systémové oblasti.\n" "Závisí na Gtk+ verze 2.10 nebo novější.\n" "Základní modul dodávaný se zimem.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klasická ikona do systémového panelu,\n" "ikona v novém pojetí se nehodí pro Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Pro každý sešit zobrazit samostatnou ikonu" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Rychlá poznámka..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Další..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Sešity" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Uložit v_erzi..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Verze..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Od poslední uložené verze nevznikly v sešitě žádné změny." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Žádné změny od poslední verze" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Správa verzí" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Modul přidává sešitům možnost správy verzí.\n" "Podporuje systémy Bazaar, Git a Mercurial.\n" "Základní modul dodávaný se Zimem.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Automaticky ukládat verze v pravidelných intervalech" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Verze uložená automaticky zimem" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Povolit správu verzí?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Správa verzí není pro tento sešit aktuálně povolena.\n" "Chcete ji povolit?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Systém" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Uložit verzi" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Vložte prosím k této verzi komentář" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Verze uložená zimem" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Verze" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Stránku" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Zobrazit _komentované" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Vyberte verzi, abyste mohli srovnat rozdíly mezi touto verzí a aktuální " "verzí.\n" "Nebo vyberte více verzí a uvidíte rozdíly mezi nimi.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Komentář" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "O_bnovit verzi" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Zobrazit _změny" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Jedna ku jedné" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Komentovaný zdroj stránky" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Obnovit stránku na uloženou verzi?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Přejete si obnovit stránku %(page)s\n" "na uloženou verzi %(version)s?\n" "Všechny změny od poslední uložené verze budou ztraceny!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Změny" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Ukládat záznamy pomocí Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Zaznamenává události pomocí démonu Zeitgeist" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Wiki stránka: %s" #~ msgid "Text Editor" #~ msgstr "Textový wiki editor" #~ msgid "File browser" #~ msgstr "Správce souborů" #~ msgid "Email client" #~ msgstr "E-mailový klient" #~ msgid "Web browser" #~ msgstr "Webový prohlížeč" #~ msgid "Pages" #~ msgstr "Stránky" #~ msgid "Output" #~ msgstr "Výstup" #~ msgid "Match c_ase" #~ msgstr "Rozlišovat ve_likost" #~ msgid "Slow file system" #~ msgstr "Pomalý souborový systém" #~ msgid "Prio" #~ msgstr "Priorita" #~ msgid "_Filter" #~ msgstr "_Filtr" zim-0.60/translations/uk.po0000644000175000017500000025435512137750055015631 0ustar jaapjaap00000000000000# Ukrainian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # Sergiy Gavrylov , 2010. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2011-05-15 05:02+0000\n" "Last-Translator: Sergiy Gavrylov \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Типовий" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Немає такого файла: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Деталі" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Відкрити за допомогою \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Назва" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Команда" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Відкрити теку" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Виділення" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Сторінка" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Зовнішні інструменти" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Ви можете налаштувати зовнішні інструменти показані\n" "в меню та на панелі інструментів або в контекстних меню." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Зміна зовнішнього інструмента" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Опис" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Піктограма" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Команда не змінює дані" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Показувати на панелі інструментів" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Експортувати" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Оновлення індексу" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Тека вже існує і містить файли, експортування до цієї теки може перезаписати " "наявні файли. Ви хочете продовжити?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Експорт зошита" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Файл існує" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Цей файл вже існує.\n" "Хочете перезаписати його?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Вибрати сторінки для експорту" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "_Увесь зошит" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Одна _сторінка" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Вибрати формат експорту" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Інше…" #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Формат" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Шаблон" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Створювати посилання на файли в кореневому документі використовуючи повний " "шлях" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Перетворити шлях до кореневого документа в URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Вибрати вихідний файл або теку" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Вихідна тека" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Початкова сторінка" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Вихідний файл" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Попередній перегляд" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Переглянути _журнал" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Під час генерування зображення виникла помилка.\n" "Зберегти джерельний текст незважаючи на помилку?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Журнал" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Файл" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Правка" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Вигляд" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "Вст_авити" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "З_найти" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "Фор_мат" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "С_ервіс" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "Пере_йти" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Довідка" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Р_ядок адреси" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "П_анель інструментів" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Створити сторінку..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Створити _під-сторінку..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Відкрити інший зошит..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "В_ідкрити в новому вікні" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Імпортувати сторінку..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "З_берегти" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Зберегти _копію..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Експортувати..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Надіслати _до..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Перемістити сторінк_у..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Пере_йменувати сторінку..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "В_илучити сторінку" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "В_ластивості" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Закрити" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "Ви_йти" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "З_найти..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Знайти з_воротні посилання..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Параметри" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Перезавантажити" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Відкрити теку п_рикріплень" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Відкрити теку _зошита" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Відкрити кореневий _документ" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Відкрити теку _документів" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Прикріпити _файл" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Прикріпити зовнішній файл" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Редагувати д_жерело" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Запустити _веб сервер" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Зовнішні інс_трументи" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "На_зад" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "На сторінку назад" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "В_перед" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "На сторінку вперед" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Вгору" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "На сторінку вгору" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "В_низ" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "На сторінку вниз" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "П_опередня в індексі" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "На попередню сторінку" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Нас_тупна в індексі" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "На наступну сторінку" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Головна" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "На головну" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Перейти _до..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Зміст" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_Часті питання" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Комбінації клавіш" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "П_омилки" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Про програму" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Рядок стану" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "На _весь екран" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "_Лише читання" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Увімкнути захист від редагування" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Сховати" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Недавні сторінки" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Історія" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Пр_остір імен" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Значки т_а текст" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Лише _значки" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Лише _текст" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Великі значки" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Маленькі значки" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Дрібні значки" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Додати смужки „відриву“ до меню" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Зазначений вами файл або тека не існують.\n" "Будь ласка, перевірте коректність шляху." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Немає такого файла або теки: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Знайти" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Оновити зошит?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Цей зошит створений старішою версією Zim.\n" "Хочете оновити його до останньої версії?\n" "\n" "Оновлення займе деякий час і може внести деякі зміни\n" "до записника. Рекомендуємо зробити резервну копію\n" "перед оновленням.\n" "\n" "Якщо ви зараз відмовитесь від оновлення, деякі нові\n" "функції можуть працювати не коректно." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Оновлення зошита" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Індекс все ще відновлюється. До його завершення, посилання можуть оновитись " "неправильно. Виконання цієї дії зараз, може пошкодити посилання. Хочете " "продовжити у будь-якому випадку?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Оновлення посилань" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Вилучення посилань" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Створити теку?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Не вдалось відкрити: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Ця сторінка не має теки для прикріплень" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Редагувальний файл: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Ви редагуєте файл в зовнішній програмі. Коли зробите, можете закрити цей " "діалог" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Вікі для робочого стола" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Sergiy Gavrylov https://launchpad.net/~gavro\n" " atany https://launchpad.net/~ye-gorshkov" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "тільки для читання" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Зворотнє посилання..." msgstr[1] "%i _Зворотні посилання..." msgstr[2] "%i _Зворотніх посилань..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Неможливо зберегти сторінку: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Щоб продовжити, ви можете зберегти копію цієї сторінки\n" "або відкинути зміни. Якщо ви збережете копію, зміни також\n" "не будуть внесені, але ви зможете відновити їх пізніше." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Відкинути зміни" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Зберегти _копію" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Перейти до" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Перейти до сторінки" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Створити під-сторінку" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Створити сторінку" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Зауважте, що посилання на неіснуючу сторінку\n" "також автоматично створює нову сторінку." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Назва сторінки" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Сторінка вже існує" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Зберегти копію" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Імпортувати сторінку" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Текстові файли" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Перемістити сторінку" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Перемістити сторінку \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Оновити %i сторінку, що посилається на цю сторінку" msgstr[1] "Оновити %i сторінки, що посилаються на цю сторінку" msgstr[2] "Оновити %i сторінок, що посилаються на цю сторінку" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Простір імен" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Перейменувати сторінку" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Перейменувати сторінку \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Оновити заголовок цієї сторінки" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Вилучити сторінку" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Вилучити сторінку \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Сторінка \"%s\" та всі її\n" "під-сторінки та долучення будуть вилучені" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Вилучити посилання, яке вказує на цю сторінку з %i сторінки" msgstr[1] "Вилучити посилання, яке вказує на цю сторінку з %i сторінок" msgstr[2] "Вилучити посилання, яке вказує на цю сторінку з %i сторінок" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Прикріпити файл" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Сторінка \"%s\" не має теки для прикріплень" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Вставити зображення як посилання" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Зошит" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Відкрити зошит" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Типовий зошит" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Додати зошит" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Вкажіть назву і теку для цього зошита." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Тека" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Оновлення індексу..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "Пов_ернути" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Пов_торити" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Вирізати" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Копіювати" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Вст_авити" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "В_илучити" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Встановити прапорець" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Зняти прапорець" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "Редагувати посилання або _об’єкт..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "В_илучити посилання" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Дату й час..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Зображення..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Текст із _файла..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Посилання..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Вставити посилання" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Скинути _форматування" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "З_найти..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Зна_йти далі" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Знайти _попередній" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Замінити..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Кількість слів..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Заголовок _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Заголовок 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Заголовок _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Заголовок 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Заголовок _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Заголовок 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Заголовок _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Заголовок 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Заголовок _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Заголовок 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Жирний" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Жирний" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Курсив" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Курсив" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Підкреслений" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Підкреслений" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Викреслений" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Викреслений" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Нижній індекс" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Верхній індекс" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Стенографічний" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Дослівний режим" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Натискайте для переходу за посиланнями\n" "(якщо зайнято, використовуйте )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Показувати курсор на сторінках тільки для читання" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Автоматично перетворювати „CamelCase“ слова в посилання" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Автоматично перетворювати адреси файлів в посилання" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Автоматично виділяти поточне слово при застосуванні форматування" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Клавіша зменшує відступи за табуляцією\n" "(якщо вимкнено, використовуйте )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Зміна відступу елемента списку змінює відступи піделементів" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Встановлення прапорця змінює стан прапорців для всіх нащадків" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Форматування вікі-розмітки «на льоту»" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Редагувати посилання" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "_Копіювати посилання" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Копіювати адресу електронної пошти" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Відкрити у програмі..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Відкрити" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Вставити дату й час" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "Посилання _на дату" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Вставити зображення" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Спочатку прикріпити зображення" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Редагувати зображення" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Адреса" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Посилання на" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Ширина" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Висота" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "С_кинути розмір" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Вставити текст із файлу" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Редагувати посилання" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Посилання" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Текст" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "Нас_тупний" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "П_опередій" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "В_раховувати регістр" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Збігається _ціле слово" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Регулярний вираз" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Виділення" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Знайти" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Параметри" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Знайти та замінити" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Знайти що" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Замінити на" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "За_мінити" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Замінити _все" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Статистика" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Абзац" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Слів" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Рядків" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Символи" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Інтерфейс" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Редагування" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Параметри" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Модулі" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Використовувати власний шрифт" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Більше" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Налаштувати" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Залежності" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Немає залежностей" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Гаразд" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Збій" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Автор" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Увімкнено" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Модуль" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Налаштувати модуль" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Параметри модуля %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Властивості" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Властивості зошита" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Для розширеного пошуку використовуйте знаки операції\n" "AND, OR або NOT. Детальніше на довідковій сторінці." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Обмежити пошук чинним простором назв" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Кількість" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Сервер не запущено" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Порт" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Сервер запущено" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Сервер зупинено" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Вибрати файл" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Вибрати теку" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Схоже, ви знайшли помилку" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Всі файли" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Зображення" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Не можу знайти файл або теку для цього зошита" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Не можу знайти зошит: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Задана назва сторінки неправильна.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Неправильна назва сторінки „%s“" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Неможливо змінити сторінку: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Головна сторінка" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Коренева тека документа" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Спільний зошит" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Attachment Browser" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Цей модуль показує приєднану теку поточної сторінки\n" "як значок внизу панелі.\n" "\n" "Цей модуль досі в розробці.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "С_ьогодні" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Календар" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Показати календар в бічній панелі замість діалогу" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Календар" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Сьогодні" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Діа_граму..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Вставити діаграму" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Вставка діаграми" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль надає редактор діаграм для zim базований на GraphViz.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Редагувати діаграму" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "Ф_ормулу..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Вставити формулу" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Вставка формул" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль надає редактор рівнянь для zim базований на latex.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Редагувати _формулу" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insert GNU R Plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Цей модуль надає графічний редактор для ZIM, базований на GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Редагувати GNU R Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Обчислення _мат. виразів" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Модуль вбудованого калькулятора не\n" "в змозі обчислити вираз під курсором." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Вбудований калькулятор" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль дає змогу швидко обчислити прості\n" "математичні вирази в zim.\n" "\n" "Цей модуль є базовим і поставляється із zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Не вдалось проаналізувати вираз" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Си_мвол..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Вставка символу" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль додає діалог «Вставка символу» і дає змогу\n" "авто-форматувати типографські символи.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Показувати схему посилань" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Схема посилань" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль показує діалог з графічним\n" "поданням структури посилань зошита.\n" "Його можна використовувати як «розумну»\n" "схему, яка показує зв’язок посилань.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Друкувати до веб-переглядача" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль реалізує обхідний спосіб друку, зважаючи\n" "на відсутність підтримки друку в zim, шляхом експорту\n" "поточної сторінки до HTML файлу і відкриває його у\n" "веб-переглядачі. Припускаючи, що в веб-переглядачі\n" "реалізована функція друку, ви подаєте ваші данні\n" "до принтера в два кроки.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Друкувати до веб-переглядача" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Швидка нотатка..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Швидка нотатка" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Модуль додає діалог для вставки тексту або вмісту буферу \n" "обміну на сторінку zim.\n" "\n" "Цей модуль основний, і поставляється разом з zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Створювати нову сторінку для кожної нотатки" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Назва" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Знімок екрана..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Вставка знімків екрана" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль дає змогу робити знімок екрана і вставляти\n" "його прямо на сторінку zim.\n" "\n" "Цей модуль є базовим і поставляється із zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Зробити знімок всього екрана" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Вибрати вікно або область екрана" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Затримка" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "секунд(и)" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Виникли деякі помилки під час роботи \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Перевірка _орфографії" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Перевірка орфографії" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Додає перевірку орфографії через gtkspell.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Позначки" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Список завдань" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль додає діалог зі списком всіх відкритих\n" "завдань в окремому зошиті. Відкриті завдання позначені\n" "або галками або позначками «TODO» чи «FIXME».\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Вважати всі поля з відміткою завданнями" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Ярлики маркування завдань" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Потрібно індексувати зошит" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Список завдань відкритий вперше.\n" "А отже індекс необхідно перебудувати.\n" "Залежно від розміру зошита це може\n" "тривати кілька хвилин. Під час наступного\n" "відкривання це вже не знадобиться." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Фільтр" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i відкрите завдання" msgstr[1] "%i відкритих завдання" msgstr[2] "%i відкритих завдань" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Завдання" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Дата" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Значок в лотку" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Цей модуль додає значок в системний лоток.\n" "\n" "Залежить від Gtk+ версії 2.10 або новішої.\n" "\n" "Це базовий модуль, що поставляється в складі zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Класичний значок в лотку,\n" "не використовувати новий значок стану в Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Показувати окремий значок для кожного зошита" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Швидка нотатка..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Інше..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Зошити" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Зберегти вер_сію..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Версії..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Від часу збереження останньої версії зошита змін не було." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Немає змін з останньої версії" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Контроль версій" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Регулярне автозбереження версій" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Автоматично збережена в zim версія" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Увімкнути контроль версій?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Контроль версій для цього зошита вимкнений.\n" "Хочете його увімкнути?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Зберегти версію" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Додайте коментар для цієї версії" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Збережена в Zim версія" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Версії" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Сторінка" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Переглянути _зауваження" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Виберіть версію, щоб побачити зміни між цією версією та чинним\n" "станом, або виберіть кілька версій, щоб побачити зміни між ними.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Коментар" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Відновити версію" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Показати_зміни" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Поруч" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Прокоментоване джерело сторінки" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Відновити сторінку в збережену версію?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Хочете відновити сторінку: %(page)s\n" "в збережену версію: %(version)s ?\n" "\n" "Всі зміни в останній збереженій версії будуть втрачені!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Зміни" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Версія" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Pages" #~ msgstr "Сторінки" #~ msgid "Match c_ase" #~ msgstr "Збігається _регістр" #~ msgid "File browser" #~ msgstr "Переглядач файлів" #~ msgid "Web browser" #~ msgstr "Веб-переглядач" #~ msgid "Slow file system" #~ msgstr "Повільна файлова система" #~ msgid "Text Editor" #~ msgstr "Текстовий редактор" #~ msgid "Prio" #~ msgstr "Пріоритет" #~ msgid "Email client" #~ msgstr "Клієнт електронної пошти" #~ msgid "Output" #~ msgstr "Вихідний файл" #~ msgid "_Filter" #~ msgstr "_Фільтр" zim-0.60/translations/tr.po0000644000175000017500000024251312137750260015626 0ustar jaapjaap00000000000000# Turkish translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-12-13 02:09+0000\n" "Last-Translator: ytasan \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Uygulama çalıştırırken hata: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "sıfır-olmayan %(code)i çıkış durumunu döndürdü" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Varsayılan" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Böyle bir dosya yok: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Okunamadı: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Bu genellikle dosyanın geçersiz karakterler içerdiği manasına gelir." #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Ayrıntılar" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "\"%s\" ile aç" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Ad" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Komut" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Dosya aç" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Klasör Aç" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Dosyayı Sil" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Sil" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Seçim" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Dosya adı" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Sayfa" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Eklentileri Temizle" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Seçimi Çevir" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Aşağıdaki dosyalar Zim'in eklenti dizininde mevcut, ancak defterde herhangi " "bir \n" "bağlantıları bulunmuyor. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Sahipsiz dosya bulunmadı." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Özel araçlar" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Araç menüsünde ve araç çubuğunda veya içerik \n" "menüsünde gözükecek özel araçları yapılandırabilirsiniz." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Özel Aracı Düzenle" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Açıklama" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Simge" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Komut veriyi değiştirmiyor" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Araç çubuğunda göster" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Şu parametreler, çalıştırıldığı sırada\n" "komutun içinde yerine konacak:\n" "\n" "%f sayfa kaynağı geçici bir dosya\n" "%d geçerli sayfanın ek (ilişim) dizini\n" "%s gerçek sayfanın kaynak dosyası (varsa)\n" "%n not defterinin yeri (dosya veya dizin)\n" "%D belge kökü (varsa)\n" "%t seçili metin veya imlecin altındaki sözcük\n" "%T viki biçimindeki, dahil edilecek seçili metin\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Dışa Aktar" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "İndeks güncelleniyor" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "%s klasörü mevcut" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Klasör zaten mevcut ve içi boş değil; bu klasöre aktarmak var olan " "dosyaların üzerine yazabilir. Devam etmek ister misiniz?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Defter dışa aktarılıyor" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Dosya mevcut" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Bu dosya zaten var.\n" "Üzerine yazmak istiyor musunuz?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Dışarı aktarılacak sayfaları seçiniz" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Tüm _defter" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Tekil _sayfa" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Aktarım biçimini seçiniz" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Diğer..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Biçim" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Şablon" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Belge kökü altındaki dosyaların bağlantılarında tam dosya yolunu göster" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Belge kökünü şu URL'de haritalandır" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Çıktı dosyasını veya dizinini seçiniz" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Çıktı klasörü" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Index sayfası" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Çıktı dosyası" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "Ö_nizleme" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "_Kayıtları Göster" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Resim oluşturulurken bir hata meydana geldi.\n" "Kaynak metnini yine de kaydetmek ister misiniz?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Kayıt dosyası" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Dosya" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Düzenle" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Görünüm" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Ekle" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Arama" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "Biçi_m" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Araçlar" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Git" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Yardım" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Yol _Çubuğu" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Araç Çubuğu" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Yeni Sayfa" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Yeni A_lt Sayfa" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Başka bir Defter _Aç" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Yeni _Pencerede Aç" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "Sayfa _İçe Aktar" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Kaydet" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Bir _Kopyasını Kaydet..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Dışa Aktar" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Gönder..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Sayfayı _Taşı..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Sayfayı _Yeniden Adlandır..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "Sayfayı _Sil" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Özellikler" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Kapat" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Çıkış" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Ara..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "_Geri Bağlantıları Ara..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Te_rcihler" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Yenile" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Eklentiler _Klasörünü Aç" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "_Defter Klasörünü Aç" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "_Belge Kökünü Aç" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "_Belge Klasörünü Aç" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "_Dosya Ekle" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Dışarıdan dosya ekle" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Ekleri Temizle" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "_Kaynağı Düzenle" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "_Web Sunucusunu Başlat" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "İndeksi Güncelle" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Özel _Araçlar" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Geri" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Gerideki sayfaya git" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_İleri" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "İlerideki sayfaya git" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Ebeveyn" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ebeveyn sayfaya git" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Çocuk" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Çocuk sayfaya git" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "İndekste _önceki" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Önceki sayfaya git" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "İndexte _sonraki" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Sonraki sayfaya git" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Anasayfa" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Anasayfaya git" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Atla..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_İçerik" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_SSS" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Tuş kısayolları" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Hatalar" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Hakkında" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Durum Çubuğu" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Tam Ekran" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "_Düzenlenebilir Defter" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Defteri düzenlemeye açın" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Hiçbiri" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Son kullanılan sayfalar" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Geçmiş" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "Ad _Levhası" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Simgeler _Ve Metin" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Yalnızca _Simgeler" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Yalnızca _Metin" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Büyük Simgeler" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Küçük Simgeler" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Minik Simgeler" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Menülere koparma öğesi ekler" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Yan panele geçmek için kullan" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Sayfaları silerken bağlantıları da kaldır" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Sayfa açılışında her zaman imlecin son pozisyonunu kullan." #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Belirttiğiniz gibi bir dosya veya klasör mevcut değil.\n" "Lütfen girdiğiniz adresin doğru olup olmadığını kontrol edin." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Böyle bir dosya veya klasör mevcut değil: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Ara" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Defteri güncellemek ister misiniz?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Bu defter daha eski bir Zim sürümü ile oluşturulmuş.\n" "Son sürüme güncellemek ister misiniz?\n" "\n" "Güncelleme biraz zaman alacaktır ve defterde bazı değişikliklere\n" "sebep olabilir. Genel kural olarak, böyle bir işlemi gerçekleştirmeden\n" "önce yedekleme yapmak iyi olur.\n" "\n" "Eğer şimdi güncellemeyi seçmezseniz, bazı özellikler beklendiği\n" "şekilde çalışmayabilir." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Defter güncelleniyor" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "İndeks hâlâ güncelleniyor. Bağlar bitirilinceye kadar doğru bir güncelleme " "olamaz. İcra ettiğiniz bu eylem, bağları kırabilir; yine de devam etmek " "istiyor musunuz?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Bağlar Güncelleniyor" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Bağlar kaldırılıyor" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Klasör oluşturmak ister misiniz?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Açılamadı: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Bu sayfanın eklentiler klasörü yok" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Düzenlenen dosya: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Dosyayı harici bir uygulama ile düzenliyorsunuz. Tamamladığınızda bu " "iletişim kutusunu kapatabilirsiniz." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Masaüstü Wikisi" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Bekir DURAK https://launchpad.net/~bekir-durak\n" " Burhan Teoman https://launchpad.net/~burhanteoman-deactivatedaccount\n" " Caner GÜRAL https://launchpad.net/~canergural\n" " Emre Ayca https://launchpad.net/~anatolica\n" " Engin BAHADIR https://launchpad.net/~enginbah\n" " Gökdeniz Karadağ https://launchpad.net/~gokdeniz\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " M. Emin Akşehirli https://launchpad.net/~memedemin\n" " ytasan https://launchpad.net/~yasintasan" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Dizin" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "saltokunur" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i_Geri bağlantı..." msgstr[1] "%i_Geri bağlantı..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Sayfa kaydedilemedi: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Devam etmek için bu sayfanın bir kopyasını kaydedebilir ya da\n" "değişiklikleri yoksayabilirsiniz. Eğer bir kopya kaydederseniz, " "değişiklikler\n" "yine yoksayılacaktır, ancak daha sonra kopyaya geri döndürebilirsiniz." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Değişikliklerden Vazgeç" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Kopyayı Kaydet" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Sayfaya git" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Sayfaya Git" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Yeni Alt Sayfa" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Yeni Sayfa" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Henüz var olmayan bir sayfaya bağlantı yapmanın\n" "otomatik olarak bu sayfayı oluşturacağını unutmayın." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Sayfa Adı" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Sayfa Şablonu" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Sayfa mevcut" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Kopyayı Kaydet" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Sayfa İçe Aktar" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Metin Dosyaları" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Sayfayı Taşı" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "\"%s\" sayfasını taşı" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Bu saykaya bağlantısı olan %i sayfayı da güncelle" msgstr[1] "Bu saykaya bağlantısı olan %i sayfayı da güncelle" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Ad levhası" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Sayfayı Yeniden Adlandır" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "\"%s\" sayfasını yeniden adlandır" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Bu sayfanın başlığını güncelle" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Sayfayı Sil" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "\"%s\" sayfası silinsin mi?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "\"%s\" sayfası, onun tüm\n" "alt sayfaları ve ekleri silinecek" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Bu sayfaya yapılan bağlar, %i sayfadan çıkarılsın" msgstr[1] "Bu sayfaya yapılan bağlar, %i sayfadan çıkarılsın" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i dosyası silinecek" msgstr[1] "%i dosyası silinecek" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Dosya Ekle" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "\"%s\" sayfasının ekler için bir klasörü yok" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Resimleri bağlantı olarak ekle" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Not defteri" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Defter Aç" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Öntanımlı not defteri" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Defter Ekle" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Lütfen defter için bir ad ve klasör seçin" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Klasör" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "İndeks güncelleniyor..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Geri Al" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Tekrar Yap" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "K_es" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopyala" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Yapıştır" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Sil" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "'V' İşaret Kutusunu aç/kapa" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "'X' İşaret Kutusunu aç/kapa" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "Bağlantı veya Nesneyi _Düzenle..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Bağlantıyı _Kaldır" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Tarih ve Zaman..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Resim..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Bulle_t Listesi" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Numaralanmış Liste" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "O_nay Kutusu Listesi" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "_Dosyadan Metin Aktar..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Bağlantı..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Bağlantı Ekle" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Biçimlendirmeyi _Temizle" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Bul..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "So_nrakini Bul" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Önc_ekini Bul" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Değiştir..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Sözcük Sayımı..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Yakınlaştır" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Uzaklaştır" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normal Boyut" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Başlık _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Başlık 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Başlık _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Başlık 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Başlık _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Başlık 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Başlık _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Başlık 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Başlık _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Başlık 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Kalın" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Kalın" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Eğik" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Eğik" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_İşaret" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "İşaret" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Üstü çizili" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Üstü çizili" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Alt simge" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Üst simge" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Aynen" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Sabit" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Bağlantıları takip etmek için tuşunu kullanın.\n" "(Eğer devre dışı ise da kullanabilirsiniz)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "İmleci düzenlemeye kapalı sayfalarda da göster" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "" "\"DeveHörgücü\" (CamelCase) sözcükleri otomatik olarak bağlantıya çevir" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Dosya yollarını otomatik olarak bağlantıya çevir" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Biçimlendirme uygularken halihazırdaki sözcüğü de otomatik olarak seç" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" " ile girintiyi kaldır\n" "(Eğer devredışı ise, aynı işi görür)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Bir liste maddesinde girinti eklemek/kaldırmak alt maddeleri de aynen " "değiştirir" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Bir işaret kutusunu işaretlemek alt maddeleri de aynen değiştirir" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Eş zamanlı viki işaretleme (markup) biçimlendirmesi" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Panoya kopyalanan metin için öntanımlı biçim" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Böyle bir wiki bulunamadı: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Farklı_Kopyala..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Seçili Metni Taşı" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "Özellikleri _Düzenle" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Bağlantıyı _Düzenle" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Bağlantıyı _Kopyala" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "E-posta Adresini Kopyala" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Birlikte Aç..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Aç" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Tarih ve Zaman Ekle" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Takvim" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "Tari_he bağla" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Görsel Ekle" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Önce resim ekle" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Dosya türü desteklenmiyor: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Görsel Düzenle" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Konum" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Bağlantı oluştur" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Genişlik" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Yükseklik" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Boyutu Sıfırla" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Dosyadan Metin Aktar" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Bağlantı Düzenle" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Bağlantı" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Görünecek Metin" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "So_nraki" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Önceki" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Büyük/küçük _harf uyumlu" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Kelimenin _tamamı" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Kurallı ifade" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Vurgula" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Bul" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Tercihler" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Bul ve Değiştir" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Bul..." #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Yerine bunu koy:" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Değiştir" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "_Tümünü Değiştir" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Sözcük Sayımı" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paragraf" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Sözcük" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Satır" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Karakterler" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Metni diğer sayfaya taşı" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Taşı" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Metni taşı" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Yeni sayfa aç" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Arayüz" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Düzenleme" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Yeğlenenler" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Eklentiler" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Özel font kullan" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Daha Fazla" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "Ya_pılandır" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Bağımlılıklar" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Bağımlılık yok" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Tamam" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Başarısız" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "İsteğe bağlı" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Yazar" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Etkin" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Eklenti" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Eklentiyi Yapılandır" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "%s eklentisi için Seçenekler" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Özellikler" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Defter Özellikleri" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "İleri seviye aramalar için AND, OR ve NOT işleçlerini\n" "kullanabilirsiniz. Ayrıntılar için yardım sayfasına bakınız." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Geçerli isim uzayı sınırında ara" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Sayı" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Sunucu başlatılmadı" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Sunucu başlatıldı" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Sunucu durduruldu" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Dosya Seç" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Hepsini_Genişlet" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Tümünü _Daralt" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Temizle" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Dizini Seç" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Görüntü Seç" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Öyle görünüyor ki bir hata buldunuz" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Bu hatayı bildirirken lütfen aşağıdaki metin\n" "kutusunda verilen bilgiyi de ekleyin." #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Tüm Dosyalar" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Resimler" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Dosya zaten var" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "\"%s\" adında bir dosya zaten mevcut.\n" "Başka bir isim kullanabilir veya mevcut dosyanın üzerine yazabilirsiniz." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Gözat" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Üzerine yaz" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Bu defter için klasör veya dosya bulunamadı" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Defter bulunamadı: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Sayfaya verilen isim geçerli değil\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Geçersiz sayfa adı \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Dizine ihtiyacımız olan bir işlem yapmak isterken\n" "dizin hala güncellemekle meşgul.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Sayfa değiştirilemiyor: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Wiki Kaynak Bağlantısı Anahtar Kelimesi" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Başlangıç Sayfası" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Belge Kök Dizini" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Paylaşılan not defteri" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetik" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetik" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Eklenti Tarayıcısı" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Ekler" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Bilinmeyen" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Boyut" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Değiştirildi" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Buraya Kopyala" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "İptal" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Otomatik Mount" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti gerektiğinde notebook'ları otomatik mount eder. Mesela\n" "uzak sürücüleri bağlamak için kullanılabilir veya zim, belirli bir " "notebook'u\n" "açmaya kalktığında şifrelenmiş sürücünün şifresini kaldırır.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Bu_gün" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Tak_vim" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Gün" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Hafta" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Ay" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Yıl" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Takvimi ileti kutusu yerine yan panelde göster" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Her biri için bir sayfa kullan" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Takvim" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Bugün" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Diya_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Diyagram ekle" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Diyagram Ekle" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti, GrapViz'li Zim için bir diyagram editörü sağlar.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Diyagramı _Düzenle" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Ditaa ekle" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Ditaa Ekle" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "Bu eklenti zim için, Ditaa tabanlı bir diagram editörü sağlar.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Ditaa Düzenle" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "D_enklem..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Denklem ekle" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Denklem Ekle" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "Bu eklenti, Latex'li Zim için bir denklem editörü sağlar.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Denklemi D_üzenle" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Gnuplot Ekle" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Bu eklenti zim için, Gnuplot tabanlı bir grafik çizim editörü sağlar.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Gnuplot Düznele" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "GNU R Plot'u Ekle" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Bu eklenti, GNU R'li Zim için bir plot editörü sağlar.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "GNU R Plot'u _Düzenle" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Math _Hesapla" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Satır içi hesaplayıcı eklentisi, imleç üzerindeki ifadeyi\n" "değerlendirmeye uygun değil." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Satır İçi Hesaplayıcı" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti ile zim içindeki basit matematiksel ifadelerin\n" "hızlı bir şekilde değerlendirilmesi sağlanır. \n" "Bu eklenti zim ile beraber gelen ana eklentilerdendir.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "İfade çözümlenemedi." #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Se_mbol" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Sembol Ekle" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti 'Sembol Ekle' diyalogunu ekler ve \n" "oto-biçimlendirilmiş karakterleri sağlar.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Satırlari Sırala" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Satır Sıralayıcısı" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Bu eklenti ile seçili satırlar alfabetik şekilde sıralanır.\n" "Eğer liste daha önceden sıralanmış ise sıralama tersine\n" "çevrilir. (A-Z'den Z-A'ya)\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Lütfen önce birden fazla metin satırı seçin." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Bağlantı Haritasını Göster" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Bağlantı Haritası" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti, not defteri bağ yapısını haritalayan bir diyalog\n" "penceresi sağlar. Sayfaların ilgisini görüntüleyen bir\n" "\"zihin haritası\" olarak kullanılabilir.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Tarayıcıya Yazdır" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti Zim'in yazdırma eksikliğine bir çözüm getirmeyi\n" "amaçlar. Kullanımdaki sayfayı html haline getirerek tarayıcıda\n" "açar. Tarayıcının yazdırma desteği olduğu varsayılırsa, bu yöntemle\n" "verilerinizi iki adımda yazıcıya gönderebilirsiniz.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "Tarayıcıya _Yazdır" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Hızlı Not..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Hızlı Not..." #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti, yazıları veya pano içeriğini kolayca \n" "bir Zim sayfasına taşımayı sağlayan bir diyalog ekler.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Her not için yeni bir sayfa oluştur" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Başlık" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Sayfa _Aç" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Ekran Görüntüsü..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Ekran Görüntüsü Ekle" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti ile alınan ekran görüntüsü doğrudan zim sayfasına\n" "eklenebilir. \n" "Bu eklenti zim ile gelen çekirdek eklentilerdendir.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Tüm ekranın görüntüsünü al" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Pencere veya bölge seç" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Gecikme" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "saniye" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "\"%s\" çalıştırılırken bir hata oluştu" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "_Yazım denetle" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Yazım Denetleyici" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Gtkspell kullanan yazım denetimi desteğini ekler.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Dil için yazım kontrolüne erişilemiyor: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Bu hata, sözlüklerinizin doğru yüklenmediği \n" "anlamına gelebilir." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "İçerik Tablosu" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Yançerçeve yerine, ToCas floating widget göster" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Alfabetik olarak sırala" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sayfaları etiketlere göre sırala" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiketler" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Görev Listesi" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti bu defterde buluna tüm açık görevleri gösteren bir iletişim\n" "kutusu ekler. Açık görevler işaretlenmemiş işaret kutuları ya da\n" "\"TODO\" veya \"FIX ME\" etiketleri ile işaretlenmiş maddeler olabilir.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "İşaret kutularını görevler gibi düşünün" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Görev işaretleme etiketleri" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Yeni görev için etiket" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Not defteri indeksine ihtiyaç var" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Bu, ilk kez açılan görev listesi.\n" "Bu nedenle indeks, yeniden inşa edilmeli.\n" "Bu, not defterinin boyutuna göre birkaç dakika\n" "sürebilir. Bir daha görev listesini kullandığınızda\n" "buna ihtiyaç duymayacaksınız." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Süzgeç" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i açık görev" msgstr[1] "%i açık görev" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Tüm Görevler" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Görev" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Tarih" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Sistem Çubuğu Simgesi" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Bu eklenti çabuk erişim için bir sistem çubuğu simgesi ekler.\n" "\n" "Bu eklenti Gtk+ 2.10 veya daha yeni sürümünü gerektirmektedir.\n" "\n" "Bu eklenti Zim ile beraber sağlanan temel bir eklentidir.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "Klasik tepsi simgesi" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Her not defteri için ayrı simge göster" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Hızlı Not..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Diğer..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Not Defterleri" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Sürümü Kay_det..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Sürümler..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Son kaydedilen sürümünden beri bu defterde değişiklik yapılmamış" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Son sürümle aynı" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Pazar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Sürüm Kontrolü" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Düzenli aralıklarla otomatik olarak sürüm kaydı yap" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Zim tarafından otomatik kaydedilen sürüm" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Sürüm Kontrolü etkinleştirilsin mi?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "Bu defter için sürüm kontrolü halihazırda etkin değil." #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Sürümü Kaydet" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Bu sürüm için bir açıklama girin" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Zim tarafından kaydedilen sürüm" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Sürümler" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Sayfa" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "_Açıklamalı Göster" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Bir sürüm seçerek şu andaki durum ile seçilen sürüm arasındaki farkları " "görebilirsiniz.\n" "Veya birden fazla sürüm seçerek bunlar arasındaki farkları görebilirsiniz.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Açıklama" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "Sürüme _Döndür" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "_Değişiklikleri Göster" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Yanyana" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Açıklamalı Sayfa Kaynağı" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Sayfayı kaydedilmiş sürüme döndürsün mü?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "%(page)s sayfasını kaydedilmiş sürümlerinden\n" "%(version)s sürümüne geri döndürmek ister misiniz?\n" "\n" "Son kaydedilen sürümünden itibaren yapılmış olan tüm değişiklikler " "silinecektir !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Değişiklikler" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Metin Düzenleyici" #~ msgid "File browser" #~ msgstr "Dosya Tarayıcı" #~ msgid "Email client" #~ msgstr "E-posta istemcisi" #~ msgid "Web browser" #~ msgstr "Web tarayıcı" #~ msgid "Pages" #~ msgstr "Sayfalar" #~ msgid "Output" #~ msgstr "Çıktı" #~ msgid "Match c_ase" #~ msgstr "BÜYÜK/küçük harf _eşleştir" #~ msgid "Slow file system" #~ msgstr "Yavaş dosya sistemi" #~ msgid "Prio" #~ msgstr "Önc" #~ msgid "_Filter" #~ msgstr "_Süz" zim-0.60/translations/sk.po0000644000175000017500000022427412137750055015624 0ustar jaapjaap00000000000000# Slovak translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # Robert Hartl , 2010. msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: Robert Hartl \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Nepodarilo sa spustiť aplikáciu: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Predvolený" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Súbor %s neexistuje" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detaily" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Otvoriť pomocou \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Názov" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Príkaz" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Otvoriť súbor" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Otvoriť priečinok" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Odstrániť súbory" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Zmazať" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Výber" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Názov súboru" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Stránka" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Invertovať výber" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nenájdené žiadne nepoužité prílohy." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Vlastné nástroje" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Upraviť vlastné nástroje" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Poznámka" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Príkaz nezmení dáta" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Zobraziť na paneli nástrojov" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportovať" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Aktualizácia indexu" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Priečinok %s existuje" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Priečinok už existuje a obsahuje súbory, hrozí, že pri exporte budú " "prepísané. Chcete pokračovať?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Export zápisníka" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Súbor existuje" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Tento súbor už existuje\n" "Chcete ho prepísať?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Vyberte stránky pre export" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Celý _zápisník" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Jednu _stránku" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Vyberte formát exportu" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Iné..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formát" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Šablóna" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Vyberte výstupný súbor alebo priečinok" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Výstupný priečinok" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Stránka s indexom" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Výstupný súbor" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Náhľad" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Pozrieť _záznam" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Súbor záznamu" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Súbor" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Upraviť" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Zobraziť" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Vložiť" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Hľadať" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Formát" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Nástroje" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Prejsť" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Pomocník" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Panel _umiestnenia" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Panel _nástrojov" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nová stránka..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nová _podstránka..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Otvoriť ďalší zápisník..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Otvoriť v novom _okne" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importovať stránku..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Uložiť" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Uložiť kópiu..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Exportovať" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Poslať na..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Pre_sunúť stranu..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Premenovať stranu..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Zmazať stranu" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Vlastnosti" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Zatvoriť" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Koniec" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Hľadať" #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Hľadať _spätné odkazy" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Možnosti" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Obnoviť" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Otvoriť priečinok s _prílohami" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Otvoriť priečinok _zápisníka" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Pripojiť _súbor" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Pripojiť externý súbor" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Odstrániť nepoužité prílohy" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Upraviť _zdroj" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Spustiť _webový server" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Aktualizovať index" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Vlastné _nástroje" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Späť" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Prejsť o stranu späť" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Dopredu" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Prejsť o stranu vpred" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "O úroveň _vyššie" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "O úroveň _nižšie" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ísť na predchádzajúcu stranu" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ísť na ďalšiu stranu" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Domov" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Prejsť domovskú stranu" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Skočiť na..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Obsah" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Klávesové skratky" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Chyby" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_O programe" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Stavový riadok" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "Na _celú obrazovku" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "_Upraviteľný zápisník" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Prepnúť úpravy zápisníka" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "Ž_iadny" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Posledné stránky" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_História" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Menný priestor" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikony _a text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Len _ikony" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Len _text" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Veľké ikony" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Malé ikony" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Drobné ikony" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Aktivovat bočný panel pomocou " #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Odstrániť odkazy pri mazaní stránok" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Hľadať" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Aktualizácia odkazov" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Odstraňovanie odkazov" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Vytvoriť priečinok?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Desktopová wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " DAG Software https://launchpad.net/~dagsoftware\n" " Robert Hartl https://launchpad.net/~lesnyskriatok\n" " mirek https://launchpad.net/~bletvaska" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "len na čítanie" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "" msgstr[1] "" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Nie je možné uložiť stranu: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Zrušiť zmeny" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Uložiť kópiu" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Skočiť na" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Skočiť na stranu" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nová podstránka" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nová stránka" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Názov strany" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Šablóna strany" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Stránka existuje" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Uložiť kópiu" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importovať stranu" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Textové súbory" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Presunúť stranu" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Presunúť stranu \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "" msgstr[1] "" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Menný priestor" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Premenovať stranu" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Premenovať stranu \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Aktualizovať hlavičku tejto strany" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Zmazať stranu" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Zmazať stranu \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Strana \"%s\" a všetky jej\n" "podstránky a prílohy budú zmazané" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "" msgstr[1] "" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Pripojiť súbor" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Vložiť obrázky ako odkaz" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Zápisník" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Otvoriť zápisník" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Predvolený zápisník" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Pridať zápistník" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Zadajte, prosím, názov a umiestnenie priečinka pre zápisník." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Priečinok" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Aktualizácia indexu..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Späť" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Znova" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Vystrihnúť" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Koprírovať" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Prilepiť" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Zmazať" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Prepnúť zaškrtávacie políčko 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Prepnúť zaškrtávacie políčko 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Upraviť odkaz alebo objekt..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Odstrániť odkaz" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Dátum a čas..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Obrázok..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Od_rážkový zoznam" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Čí_slovaný zoznam" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Z_aškrtávací zoznam" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text zo _súboru..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Odkaz" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Vložiť odkaz" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Vyčistiť formátovanie" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Nájsť..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Nájsť ď_alšie" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Nájsť _predchádzajúce" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "Na_hradiť..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Počet slov..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Priblížiť" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Vzdialiť" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Normálna _veľkosť" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Nadpis _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Nadpis 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Nadpis _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Nadpis 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Nadpis _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Nadpis 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Nadpis _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Nadpis 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Nadpis _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Nadpis 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Tučné" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Tučné" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Kurzíva" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Kurzíva" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Podčiarknuté" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Podčiarknuté" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "P_reškrtnuté" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Preškrtnuté" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Dolný index" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Horný index" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Strojopis" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Strojopis" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automaticky vytvárať odkazy zo ZloženýchSlov" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Preformátovať wiki značky za behu" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopírovať _ako..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Upraviť vlastnosti" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Upraviť odkaz" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopírovať _odkaz" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopírovať e-mailovú adresu" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Otvoriť pomocou..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Otvoriť" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Vložiť dátum a čas" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalendár" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Odkaz na dátum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Vložiť obrázok" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Typ súboru nie je podporovaný: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Upraviť obrázok" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Miesto" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Odkaz na" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Šírka" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Výška" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Pôvodná veľkosť" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Vložiť text zo súboru" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Upraviť odkaz" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Odkaz" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "Ď_alšie" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Predošlé" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "_Rozlišovať veľkosť písma" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Celé _slovo" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regulárny výraz" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Zvýrazniť" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Hľadať" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Voľby" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Nájsť a nahradiť" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Nahradiť za" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "Na_hradiť" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Nahradiť _všetky" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Počet slov" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Odsek" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Slov" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Riadkov" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Znaky" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Rozhranie" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editovanie" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Nastavenia" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Zásuvné moduly" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Použiť vlastné písmo" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Viac" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Nastaviť" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Závislosti" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Bez závislostí" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Zlyhalo" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Povolené" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Zásuvný modul" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Nastavenie zásuvného modulu" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Voľby pre zásuvný modul %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Vlastnosti" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Vlastnosti zápisníka" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Obmedziť vyhľadávanie na súčasný menný priestor" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server nie je spustený" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server spustený" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server zastavený" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Vybrať súbor" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Vybrať priečinok" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Vybrať obrázok" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Pravdepodobne ste narazili na chybu" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Všetky súbory" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Obrázky" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Súbor už existuje" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Prehliadať" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Prapísať" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Nie je možné nájsť súbor alebo priečinok tohoto zápisníka" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Nie je možné nájsť zápisník: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Neplatný názov stránky \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "kľúčové slovo interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Domovská stránka" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Výpočty" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Výpočty" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Prehliadač príloh" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Prílohy" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Veľkosť" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Dnes" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Kalendár" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Deň" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Týždeň" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mesiac" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Rok" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Zobraziť kalendár v bočnom paneli namiesto dialógového okna" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Použiť stránku pre každy" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalendár" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Dnes" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "_Diagram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Vložiť diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Vložiť diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul poskytuje editor diagramov založený na GraphViz.\n" "\n" "Je to základný modul dodávaný so Zimom.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Upraviť diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Rovnice..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Vložiť rovnicu" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Vložiť rovnicu" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul poskytuje editor rovníc založený na LaTeX.\n" "\n" "Je to základný modul dodávaný so Zimom.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Upraviť rovnicu" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Vložiť Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "Modul poskytuje editor pre grafy založené na Gnuplote\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Upraviť Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Graf GNU _R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Vložiť graf GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Tento modul poskytuje editor diagramov, schém a grafov v GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Upraviť graf GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Graf GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Výraz je nezrozumiteľný" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "_Znak..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Vložiť znak" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul pridáva dialóg 'Vložiť symbol' a umožňuje\n" "automaticky formátovať typografické znaky.\n" "\n" "Je to základní modul dodávaný so Zimom.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "Zoradiť _riadky" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Zoraďovač riadkov" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Modul zoradí označené riadky podľa abecedy.\n" "Ak je zoznam už zoradený, poradie sa obráti.\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Vyberte najprv aspoň jeden riadok textu." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Zobraziť mapu odkazov" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa odkazov" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Tlačiť to prehliadača" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Tlačiť to prehliadača" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Rýchla poznámka..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Rýchla poznámka" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul pridáva dialóg, pomocou ktorého môžete do stránky\n" "rýchlo pridať nejaký text alebo obsah schránky.\n" "\n" "Je to základný modul dodávaný so Zimom.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Vytvoriť novú stránku pre každú poznámku" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Názov" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Snímok obrazovky..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Vložiť snímok obrazovky" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Zachytiť celú obrazovku" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Vybrať okno alebo oblasť" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Oneskorenie" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekúnd" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Skontrolovať _pravopis" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Kontrola pravopisu" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Pridá podporu pre kontrolu pravopisu pomocou gtkspell.\n" "\n" "Toto je základný zásuvný modul dodávaný so zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Zoradiť abecedne" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Značky" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Zoznam úloh" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento modul pridáva dialógové okno zobrazujúce všetky\n" "otvorené úlohy v zápisníku. Otvorené úlohy sú buď\n" "nezaškrtnuté prepínače alebo položky označené\n" "slovami ako TODO alebo FIXME.\n" "\n" "Je to základní modul dodávaný so Zimom.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "" msgstr[1] "" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Úloha" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Dátum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikona v oznamovacej oblasti" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Tento zásuvný modul pridáva ikonu v oznamovacej oblasti pre rýchly prístup.\n" "\n" "Tento zásuvný modul závisí na Gtk+ verzie 2.10 alebo novšej.\n" "\n" "Je to základný modul dodávaný so Zimom.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Rýchla poznámka..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Ostatné..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Zápisníky" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "U_ložiť verziu..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Verzie..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "V tomto zápisníku neboli vykonané žiadne zmeny od posledného uloženia verzie" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Žiadne zmeny od poslednej verzie" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Kontrola verzií" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Automatické uloženie verzie v pravidelných intervaloch" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automaticky uložená verzia zo zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Povoliť kontrolu verzií?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Kontrola verzii nie je práve povolená pre tento zápisník.\n" "Chcete ju povoliť?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Uložiť verziu" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Zadajte prosím komentár pre túto verziu" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Uložená verzia zo zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Verzie" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Stránka" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Zobraziť _komentáre" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Vyberte verziu pre zobrazenie zmien medzi ňou a súčasným stavom.\n" "Alebo vyberte viac verzií pre zobrazenie zmien medzi týmito verziami.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Komentár" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Obnoviť verziu" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Zobraziť _zmeny" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Okomentovaný zdroj strany" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Zmeny" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Textový editor" #~ msgid "Email client" #~ msgstr "Emailový klient" #~ msgid "Web browser" #~ msgstr "Web prehliadač" #~ msgid "File browser" #~ msgstr "Prehliadač súborov" #~ msgid "Pages" #~ msgstr "Stránky" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "Output" #~ msgstr "Výstup" #~ msgid "_Filter" #~ msgstr "_Filter" zim-0.60/translations/ko.po0000664000175000017500000022365612137750055015625 0ustar jaapjaap00000000000000# Korean translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-01-09 05:43+0000\n" "Last-Translator: sjsaltus \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "어플리케이션 실행 실패: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "비-제로 종료 상태로 돌아감 %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "다음 항목 실행 실패 : %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "기본값" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "파일이 존재하지 않습니다: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "%s 을 읽을 수 없습니다." #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "이것은 화일이 적절하지 않은 문자셋을 가지고 있다는 것을 의미합니다." #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "파일에 쓰기 권한이 없습니다: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "어플리케이션을 찾을 수 없습니다." #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "\"%s\"(으)로 열기" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "이름" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "명령" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "폴더 열기" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "선택한 부분" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "페이지" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "사용자 지정 도구" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "도구 메뉴와 도구 바 또는 컨텍스트 메뉴에 나타날 사용자 정의 도구를 구성할 수 있습니다" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "사용자 지정 도구 편집" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "설명" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "아이콘" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "명령이 데이터를 수정하지 않습니다" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "툴바에 보이기" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "내보내기" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "인덱스를 업데이트 하는 중" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "폴더가 이미 존재하며 폴더가 비어있지 않습니다. 이 폴더로 내보내면 기존의 파일들이 지워질 수 있습니다. 계속 하시겠습니까?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "노트북을 내보내는 중 ..." #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "파일이 존재합니다" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "이 파일은 이미 존재합니다." #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "내보낼 페이지를 선택하십시오" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "내보낼 포맷을 선택하십시오" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "그 외..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "형식" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "서식" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "최상위 문서 아래에 전체 경로로 파일을 링크합니다." #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "최상위 문서를 URL로 처리합니다." #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "출력 파일 또는 폴더를 선택하세요" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "출력 폴더" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "인덱스 페이지" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "출력 파일" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "미리보기(_P)" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "로그 보기(_L)" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "이미지 처리 중 오류가 발생했습니다.\n" "텍스트만이라도 저장할까요?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "로그 파일" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "파일(_F)" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "편집(_E)" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "보기(_V)" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "삽입(_I)" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "찾기(_S)" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "형식(_M)" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "도구(_T)" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "이동(_G)" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "도움말(_H)" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "경로막대(_A)" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "도구 모음(_T)" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "새로운 페이지(_N)" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "새로운 하위 페이지(_U)" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "다른 노트북 열기 ... (_O)" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "새 창에서 열기(_W)" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "페이지 가져오기 ... (_I)" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "저장하기(_S)" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "사본 저장하기 ... (_C)" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "내보내기 ... (_X)" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "보내기 ... (_S)" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "페이지 옮기기 ... (_M)" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "페이지 이름 바꾸기 ... (_R)" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "페이지 지우기 (_D)" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "등록 정보(_T)" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "닫기(_C)" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "끝내기(_Q)" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "찾기(_S)..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "역 링크 찾기 ... (_B)" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "설정(_e)" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "다시 읽기(_R)" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "첨부 폴더 열기 (_F)" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "노트북 폴더 열기(_N)" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "최상위 문서 열기 (_D)" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "문서 폴더 열기(_D)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "파일 첨부하기(_F)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "외부 파일 첨부하기" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "원본 편집하기(_S)" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "웹서버 시작하기(_W)" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "사용자 정의 도구(_T)" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "뒤로(_B)" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "이전 페이지로 가기" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "앞으로(_F)" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "다음 페이지로 가기" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "부모(_P)" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "상위 페이지로 가기" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "하위 페이지로 가기" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "색인에서 다음" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "이전 페이지로 이동합니다" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "색인에서 이전" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "다음 페이지로 이동합니다" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "홈(_H)" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "시작으로 가기" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "" #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "내용(_C)" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "자주 묻는 질문들(_F)" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "단축키(_K)" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "버그(_B)" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "정보(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "상태 표시줄(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "전체 화면(_F)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "노트북 편집가능(_E)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "노트북 편집가능 상태 토글" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "없음(_N)" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "최근 페이지(_R)" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "기록(_H)" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "네임스페이스(_a)" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "아이콘과 글잘 (_A)" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "아이콘만(_I)" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "텍스트만(_T)" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "큰 아이콘(_L)" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "작은 아이콘(_S)" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "아주 작은 아이콘(_T)" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "메뉴에 '자르는 선' 추가하기" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "지정한 파일 또는 폴더가 존재하지 않습니다.\n" "경로가 정확한지 확인하십시오." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "파일 또는 디렏토리가 없습니다: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "찾기" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "노트북을 업그레이드할까요?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "이 노트북은 이전 버전의 Zim에서 제작되었습니다. \n" "최신 버전으로 지금 업그레이드 하시겠습니까?\n" "\n" "업그레이드는 약간의 시간이 걸리며 \n" "노트북에 여러 가지 변경 사항이 발생할 수 있습니다. \n" "일반적으로 이 작업을 수행하기 전에 백업을 하는 것이 좋습니다\n" "\n" "만약 지금 업그레이드 하지 않으면, 몇몇 기능이 제대로 작동하지 않을 수 있습니다" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "노트북 업그레이드 중" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "색인이 아직 업데이팅 중입니다. 이것이 끝나기 전까지는 링크들을 정상적으로 업데이트 할 수 없습니다. 지금 이 작업을 수행하면 링크들이 " "깨질 수 있습니다. 그래도 계속 하시겠습니까?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "링크 업데이트 중" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "폴더를 생성하시겠습니까?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "%s 를 열 수 없습니다" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "이 페이지에는 첨부 폴더가 없습니다." #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "%s 편집 중" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "데스크탑 위키" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Elex https://launchpad.net/~mysticzizone\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Joon Ro https://launchpad.net/~groups-joon\n" " Talez https://launchpad.net/~talezshin\n" " sjsaltus https://launchpad.net/~sjsaltus" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "읽기 전용" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "" msgstr[1] "" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "페이지를 저장할 수 없습니다: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "계속하려면 이 페이지의 복사본을 저장하거나 변경 사항을 버려야 합니다. 복사본을 저장하면 변경 사항은 버려지지만, 나중에 복사본을 복원할 " "수 이있습니다." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "바뀐 사항 버리기(_D)" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "사본 저장(_S)" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "직접 이동" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "페이지로 직접 이동" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "새 하위 페이지" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "새 페이지 만들기" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "존재하지 않는 페이지로 링크를 만들면 새로운 페이지가 자동으로 만들어집니다." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "페이지 이름" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "페이지가 존재합니다." #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "복사본 저장" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "페이지 가져오기" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "텍스트 파일" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "페이지 옮기기" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "페이지 \"%s\"를 옮깁니다." #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "이 페이지에 링크된 %i 페이지 업데이트" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "네임스페이스" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "페이지 이름 바꾸기" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "페이지 \"%s\"의 이름을 바꿉니다." #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "페이지 지우기" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "페이지 \"%s\"를 지우시겠습니까?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "" msgstr[1] "" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "파일 첨부" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "페이지 \"%s\"는 첨부 폴더가 없습니다." #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "노트북" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "노트북 열기" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "기본 노트북" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "노트북 추가" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "이 노트북의 이름과 폴더를 선택하십시오" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "폴더" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "인덱스 업데이트 중 ..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "되돌리기(_U)" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "다시 실행(_R)" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "잘라내기(_T)" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "복사하기(_C)" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "붙여넣기(_P)" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "지우기(_D)" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "링크 제거(_R)" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "날짜와 시간 (_D) ..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "그림(_I)..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "링크(_L)..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "링크 삽입" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "서식 지우기(_C)" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "찾기(_F)..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "다음 찾기(_X)" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "이전 찾기(_V)" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "바꾸기(_R)..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "단어 세기 ..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "제목 _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "제목 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "제목 _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "제목 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "제목 _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "제목 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "제목 _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "제목 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "제목 _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "제목 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "굵게 (_S)" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "굵게" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "강조 (_E)" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "강조" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "표시(_M)" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "표시" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "가로줄(_S)" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "가로줄" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "링크를 따라가려면 키를 누릅니다.\n" "(사용안함 상태에서도 를 사용할 수 있습니다.)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "편집할 수 없는 페이지에서도 커서를 보여줍니다." #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "\"CamelCase\" 단어를 자동으로 링크로 전환" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "파일 경로를 자동으로 링크로 전환" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "서식을 적용할 때 현재 단어를 자동으로 선택" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "링크 복사(_L)" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "이메일 주소 복사" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "다음으로 열기..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "열기(_O)" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "날짜과 시간을 입력" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "그림 넣기" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "이미지 먼저 첨부" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "그림 편집" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "위치" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "연결 대상" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "너비" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "높이" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "텍스트를 파일로부터 삽입" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "링크 편집" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "링크(_L)" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "문자열" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "다음(_N)" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "이전(_P)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "대소문자 구분(_c)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "단어 전체(_w)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "정규식(_R)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "강조(_H)" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "찾기" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "옵션" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "찾아서 바꾸기" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "찾기" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "바꾸기" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "바꾸기(_R)" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "모두 바꾸기(_A)" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "단어 갯수" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "문단" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "단어" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "줄" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "문자" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "환경설정" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "부가 기능" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "사용자 정의 글꼴 사용" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "더보기(_M)" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "설정(_O)" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "의존 패키지" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "의존 패키지 없음" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "만족" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "실패" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "만든이" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "사용함" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "부가 기능" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "플러그인 설정" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "%s 플러그인 옵션" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "속성" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "노트북 설정" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "고급 검색에서는 AND, OR 그리고 NOT 등의 연산자를 사용할 수 있습니다. 더 자세한 내용은 도움 페이지를 참고하십시오." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "검색을 현재 네임 스페이스로 한정" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "점수" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "서버가 시작되지 않았습니다." #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "포트" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "서버 시작됨" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "서버가 중지됨" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "파일 선택" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "폴더 선택" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "버그인 것 같습니다." #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "모든 파일" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "이미지" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "이 노트북의 파일이나 폴더를 찾을 수 없음" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "%s 노트북을 찾을 수 없음" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "주어진 페이지 이름이 적절하지 않습니다.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "페이지 이름 \"%s\"이 적절하지 않습니다." #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "%s 페이지를 수정할 수 없습니다." #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "홈페이지" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "문서 루트" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "공유된 노트북" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "첨부 브라우저" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "이 플러그인은 현재 페이지의 첨부 폴더를 아이콘 보기로 하단 창에 보여 줍니다.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "오늘(_d)" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "달력(_d)" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%Y-%m-%d %A" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "달력" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "오늘(_T)" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "도표 삽입" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "이 플러그인은 GraphViz에 기반한 도표 편집기를 제공합니다.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "도표 편집(_E)" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "수식(_q)" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "수식 삽입" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "수식 삽입" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "이 플러그인은 latex에 기반한 수식 편집기를 제공합니다.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "수식 편집(_E)" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "" msgstr[1] "" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "짐 데스크탑 위키" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "버전" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "주석" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "변경 사항 보기" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "변경 사항" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "텍스트 편집기" #~ msgid "Pages" #~ msgstr "페이지" #~ msgid "Output" #~ msgstr "출력" #~ msgid "Email client" #~ msgstr "이메일 클라이언트" #~ msgid "Web browser" #~ msgstr "웹 브라우저" #~ msgid "File browser" #~ msgstr "파일 탐색기" zim-0.60/translations/he.po0000644000175000017500000025507312137750055015604 0ustar jaapjaap00000000000000# Hebrew translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "כישלון בנסיון להריץ תוכנה: %s‏" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "החזיר קוד יציאה שונה מאפס %(code)i‏" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "‏כשלון בהפעלת: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "בררת מחדל" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "אין קובץ כזה: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "לא ניתן לקרוא: %s‏" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "בדרך הכלל זאת אומרת שהקובץ קלט כולל תוים בלתי חוקיים.‏" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "פרטים" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "‏קובץ אין ניתן לכתיבה: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "קובץ בקונן השתנה: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "התאם אישית..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "לא נמצאו יישומים מתאימות." #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "פתיחה באמצעות \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "הגדר יישום לפתוח קישורים מסוג: %s" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "הגדר יישום לפתוח קבצים מסוג: %s" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "הגדר יישומים" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "הוסף יישום" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "ברירת המחדל של המערכת" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "שם" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "פקודה" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "עשה כיישום בחירת מחדל" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "פתיחת קובץ" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "פתיחת תיקייה" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "מחיקת הקובץ" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "מחיקה" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "בחירה" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "שם קובץ" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "עמוד" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "פינוי הקבצים המצורפים" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "היפוך הבחירה" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "הקבצים שלהלן נמצאו בתיקיית הקבצים המצורפים של zim אך אינם מקושרים\n" "עוד בקלסר. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "לא נמצאו קבצים יתומים." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "כלים מותאמים" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "ניתן להגדיר את הכלים המותאמים שיופיעו\n" "בסרגל הכלים או בתפריטי ההקשר." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "עריכת הכלים המותאמים" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "תיאור" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "סמל" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "הפקודה אינה משנה את הנתונים" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "הצגה בסרגל כלים" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "הפרמטרים הבאים יוחלפו בפקודה כשיופעלו:\n" "\n" "%f מקור העמוד כקובץ זמני\n" "%d תיקיית הקבצים המצורפים של העמוד הנוכחי\n" "%s קובץ המקור האמתי של העמוד (אם יש כזה)\n" "%n מיקום הקלסר (קובץ או תיקייה)\n" "%D שורש המסמך (אם יש כזה)\n" "%t הטקסט או המילה שמתחת לסמן העכבר\n" "%T הטקסט הנבחר לרבות עיצוב הוויקי\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "ייצוא" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "המפתח מתעדכן" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "התיקייה קיימת: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "התיקייה כבר קיימת ויש בה תוכן, ייצוא תיקייה זו עלול לשכתב על קבצים קיימים. " "האם ברצונך להמשיך?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "ייצוא מחברת" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "הקובץ קיים" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "קובץ זה כבר קיים.\n" "האם ברצונך לשכתב עליו?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "בחירת העמודים ליצוא" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "כל ה_מחברת" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "עמוד _יחיד" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "בחירת מבנה הפלט" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "אחר..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "מבנה" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "תבנית" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "קישור קבצים תחת שורש המסמכים עם נתיב מלא לקובץ" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "מיפוי שורש המסמכים לכתובת באינטרנט" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "בחירת קובץ או תיקיית הפלט" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "תיקיית הפלט" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "עמוד מפתח" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "קובץ פלט" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_תצוגה מקדימה" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "הצ_גת רישום" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "ארעה שגיאה בעת יצירת התמונה.\n" "האם ברצונך לשמור את טקסט המקור בכל מקרה?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "קובץ רישום" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_קובץ" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "ע_ריכה" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_תצוגה" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "ה_וספה" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_חיפוש" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_עיצוב" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_כלים" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_מעבר" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "ע_זרה" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "סרגל _נתיב" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "סרגל _כלים" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_עמוד חדש..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "_תת־עמוד חדש..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "פתיחת מחברת א_חרת..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "פתיחה ב_חלון חדש" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "יי_בוא עמוד..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_שמירה" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "שמירת _עותק..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "יי_צוא..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "ש_ליחה אל..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "ה_עברת עמוד..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "שי_נוי שם של עמוד..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "מ_חיקת עמוד" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "מא_פיינים" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_סגירה" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "י_ציאה" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_חיפוש..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "חיפוש קישורים _מפנים..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "הע_תק מיקום" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_תבניות" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "ה_עדפות" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_רענון" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "פתיחת _תיקיית הקבצים המצורפים" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "פתיחת תיקיית ה_מחברת" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "פתיחת _שורש המסמכים" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "פתיחת תיקיית ה_מסמכים" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "צירוף _קובץ" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "צירוף קובץ חיצוני" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_פינוי הקבצים המצורפים" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "עריכת ה_מקור" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "ה_פעלת שרת אינטרנט" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "לחדש מפתח דפים" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "_כלים מותאמים" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "ח_זרה" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "חזרה לעמוד הקודם" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_קדימה" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "מעבר לעמוד הבא" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "הו_רה" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "מעבר לדף ההורה" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_צאצא" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "מעבר לעמוד הצאצא" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "ה_קודם במפתח" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "מעבר לעמוד הקודם" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "ה_בא במפתח" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "מעבר לעמוד הבא" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "דף ה_בית" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "מעבר לדף הבית" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_מעבר אל..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_תכנים" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_שאלות נפוצות" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_קיצורי מקלדת" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_תקלות" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "על _אודות" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "כל הלוחות" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "הראה כל הלוחות" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "שורת המ_צב" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "לוחות צד" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "הראה לוחות צד" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "מ_סך מלא" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "המחברת _ניתנת לעריכה" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "נעילה/שחרור המחברת לעריכה" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_ללא" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "עמודים _אחרונים" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "היס_טוריה" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "מרחב ה_שם" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "סמלים ו_טקסט" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "ס_מלים בלבד" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "טקסט _בלבד" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "סמלים _גדולים" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "סמלים _קטנים" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "סמלים קט_נטנים" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "הוסף רצועות 'זריזות' לתפריטים" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "יש להשתמש ב־<רווח> כדי לעבור לחלונית הצד" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "יש להסיר קישורים בעת מחיקת דפים" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "השאיר סמן במקום האחרון שלו בפתיחת דפים." #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "הקובץ או התיקייה שצוינו אינם קיימים.\n" "יש לבדוק האם הנתיב נכון." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "הקובץ או התיקייה אינם קיימים: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "חיפוש" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "האם לשדרג את המחברת?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "מחברת זו נוצרה בגרסה ישנה יותר של zim.\n" "האם ברצונך לשדרג אותה לגרסה העדכנית ביותר כעת?\n" "\n" "השדרוג עלול לערוך זמן מה וליצור כמה שינויים למחברת.\n" "על פי רוב מומלץ להכין גיבויים בטרם ביצוע פעולה זו.\n" "\n" "אם המחברת לא תשודרג כעת, כמה מהתכונות עלולות\n" "שלא לעבוד כמצופה." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "המחברת משתדרגת" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "האינדקס עדיין עסוק בעדכון. עד שתהליך זה יסתיים לא ניתן לעדכן קישורים כראוי. " "ביצוע פעולה זו ישבור קישורים, האם ברצונך להמשיך בכל זאת?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "הקישורים מתעדכנים" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "הקישורים מוסרים" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "האם ליצור תיקייה?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "לא ניתן לפתוח: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "לעמוד זה אין תיקיית קבצים מצורפים" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "קובץ בעריכה: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "קובץ זה נערך על ידיך ביישום חיצוני. באפשרותך לסגור את תיבת דו־שיח זו עם " "הסיום." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "ויקי לשולחן העבודה" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Beni Cherniavsky https://launchpad.net/~cben\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Yaron https://launchpad.net/~sh-yaron\n" " dotancohen https://launchpad.net/~dotancohen" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "מפתח" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "לקריאה בלבד" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i קישור מ_פנה אחד..." msgstr[1] "%i קישורים מ_פנים..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "לא ניתן לשמור את העמוד: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "כדי להמשיך ניתן לשמור עותק של עמוד זה או להתעלם\n" "משינויים כלשהם. אם ישמר עותק השינויים ייעלמו גם כן,\n" "אך ניתן לשחזר את העותק מאוחר יותר." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "ה_תעלמות מהשינויים" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_שמירת עותק" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "מעבר אל" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "מעבר לעמוד" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "תת־עמוד חדש" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "עמוד חדש" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "נא לשים לב כי קישור לעמוד שאינו קיים\n" "יוצר עמוד חדש אוטומטית." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "שם העמוד" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "תבנית דף" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "העמוד קיים" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "שמירת עותק" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "ייבוא עמוד" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "קובצי טקסט" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "העברת עמוד" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "העברת העמוד \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "%i עדכון עמוד אחד המפנה לעמוד זה" msgstr[1] "עדכון %i עמודים המפנים לעמוד זה" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "מרחב השם" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "שינוי שם העמוד" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "שינוי שם העמוד \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "עדכון כותרת עמוד זה" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "מחיקת עמוד" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "האם למחוק את העמוד \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "העמוד \"%s\" על כל תת־עמודיו\n" "והקבצים המצורפים לו ימחקו" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "%i הסרת קישורים מהעמוד המפנה לעמוד זה" msgstr[1] "הסרת קישורים מ־%i העמודים המפנים לעמוד זה" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i קובץ אחד יימחק" msgstr[1] "%i קבצים יימחקו" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "צירוף קובץ" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "לעמוד \"%s\" אין תיקייה לקבצים מצורפים" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "הוספת תמונות כקישור" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "מחברת" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "פתיחת מחברת" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "מחברת ברירת המחדל" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "הוספת מחברת" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "נא לבחור שם ותיקייה למחברת." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "תיקייה" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "המפתח מתעדכן..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_ביטול" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_ביצוע שוב" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_גזירה" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "ה_עתקה" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "ה_דבקה" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "מ_חיקה" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "החלפת מצב תיבת 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "החלפת מצב תיבת 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "עריכת _קישור או פריט..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "ה_סרת קישור" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "ת_אריך ושעה..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_תמונה..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "רשימת ת_בליטים" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "רשימה ממוספרת" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "רשימת תיבות _סימון" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "טקסט מ_קובץ..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "ק_ישור..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "הוספת קישור" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "מחיקת ה_עיצוב" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "חי_פוש..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "חיפוש _הבא" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "חיפוש _הקודם" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "הח_לפה..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "ספירת מילים..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "הת_קרבות" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "הת_רחקות" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "גודל ר_גיל" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "מצורף חדש" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "כותרת _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "כותרת 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "כותרת _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "כותרת 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "כותרת _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "כותרת 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "כותרת _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "כותרת 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "כותרת _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "כותרת 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_מחוזק" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "מחוזק" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "ה_דגשה" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "הדגשה" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_סימון" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "סימון" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "קו חו_צה" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "קו חוצה" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "כתב ת_חתי" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "כתב _עלי" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_אחיד" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "אחיד" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "יש להשתמש במקש כדי לעקוב אחר קישורים\n" "(אם אינם פעילים עדיין ניתן להשתמש ב־)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "הצגת הסמן גם לעמודים שלא ניתן לערוך" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "הפיכה אוטומטית של מילים בצורת \"CamelCase\" לקישורים" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "הפיכת נתיבי קבצים לקישורים אוטומטית" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "בחירת המילה הנבחרת אוטומטית בעת החלת עיצוב" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "מחיקת ההזחה עם \n" "(אם לא פעיל עדיין ניתן להשתמש ב־)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "לחיצה חוזרת על תיבת סימון משנה את מצב התיבה באופן מחזורי" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "הזחה וביטולה על פריט משנות גם את צאצאיו" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "סימון תיבה משנה גם תת־פריטים" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "שינוי תחביר הוויקי בעת העבודה" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "מבנה בררת המחדל להעתקת טקסט ללוח הגזירים" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "תיקייה עם טבניות לקבצים מצורפים" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "לא מוגדר כזה ויקי: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "העתק כ־" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "הזז טקסט נבחר..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "ערוך מאפיינים" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_עריכת הקישור" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "העתקת ה_קישור" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "העתקת כתובת הדוא\"ל" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "פתיחה באמצעות..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_פתיחה" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "לא מותקנות תבניות" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "תיקיית %s אינו קיים. האם ברצונך ליצור אותו כעת?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "הוספת תאריך ושעה" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "לוח _שנה" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_קישור לתאריך" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "הוספת תמונה" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "הוספת תמונה תחילה" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "סוג קובץ לא נתמך: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "עריכת תמונה" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "מיקום" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "קישור אל" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "רוחב" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "גובה" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "איפוס ה_ממדים" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "הוספת טקסט מקובץ" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "עריכת קישור" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_קישור" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "טקסט" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "ה_בא" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "ה_קודם" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "התאמת _רישיות" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "המילה _כולה" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_ביטוי רגולרי" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "ה_דגשה" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "חיפוש" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "אפשרויות" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "חיפוש והחלפה" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "מה לחפש" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "החלפה עם" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "ה_חלפה" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "החלפת ה_כול" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "ספירת המילים" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "פסקה" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "מילים" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "שורות" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "תווים" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "הזז טקסט לדף אחר" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_הזז" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "העבר טקסט אל" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "השאר קישורית לדף חדש" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "פתח בדף חדש" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "ממשק" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "עריכה" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "העדפות" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "תוספים" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "שימוש בגופן מותאם אישית" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_עוד" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "ה_גדרה" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "תלויות" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "אין תלויות" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "אישור" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "כשל" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "לא מחייב" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "יוצר" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "פעיל" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "תוסף" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "הגדרת תוסף" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "אפשרויות עבור התוסף %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "מאפיינים" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "מאפייני המחברת" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "כדי לערוך חיפוש מתקדם ניתן להשתמש בביטויים לוגיים\n" "כגון AND,‏ OR ו־NOT. ניתן לעיין במסמכי העזרה לפרטים נוספים." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "הגבלת החיפוש למרחב השם הנוכחי" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "ניקוד" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "השרת לא הופעל" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "פתחה" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "השרת הופעל" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "השרת נעצר" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "תבניות" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "העתק טבנית" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "בחירת קובץ" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "פרוש הכל" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_קפל הכל" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "נקה" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "בחירת תיקייה" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "בחירת תמונה" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "<עליון>" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "לוח שמאלי" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "לוח ימיני" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "לוח תחתון" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "לוח עליון" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "למעלה משמאל" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "למטה משמאל" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "למעלה מימין" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "למטה מימין" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "כנראה שמצאת שגיאה בתכנית" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "בעת דיווח על תקלות נא לכלול את\n" "הפרטים מתיבת הטקסט שלהלן" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "כל הקבצים" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "תמונות" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "הקובץ קיים" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "קובץ בשם \"%s\" כבר קיים. ניתן לבחור שם אחר או לשכתב את הקובץ הקיים." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_עיון" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "שכתוב" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "לא ניתן למצוא את הקובץ או התיקייה של מחברת זו" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "לא ניתן למצוא את המחברת: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "שם העמוד שהוזן אינו תקני.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "שם העמוד \"%s\" אינו תקני" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "המפתח עדיין עסוק בעדכונו בזמן שאנו מנסים\n" "לבצע פעולות הדורשות שימוש במפתח.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "לא ניתן לשנות את העמוד: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "מילת מפתח" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "דף הבית" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "שורש המסמכים" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "מאפיינים-אישיים" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "קלסר משותף" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "חשבון" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "חשבון" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "דפדפן מצורפים" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "תוסף זה מציג את תיקיית המצורפים של הדף הנוכחי בתור תצוגת סמלים בתחתית הדף.\n" "\n" "תוסף זה עדיין בשלבי פיתוח.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "מיקום בחלון" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "מצורפים" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "לא ידוע" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "גודל" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "שונה" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "ה_עבר לכאן" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "העתק כאן" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "ביטול" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "עיגון עצמאי" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מאפשר עיגון מחברות בעת הצורך. למשל, ניתן לחבר קיננים מרוחקים או " "לפתוח קונן מוצפן.\n" "תוסף זה הוא תוסף גרעין המסופק עם צים.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "לוח קישורי החזר" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף רשימת דפים המקרים אל דף הנוכחי.\n" "\n" "תוסף זה הוא תוסף מרכזי המגיע עם צים.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "קישורי החזר" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "ה_יום" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_לוח שנה" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "יום" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "שבוע" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "חודש" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "שנה" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "יש להציג לוח שנה בחלונית הצד במקום כדו־שיח" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "השתמש בדף עבור כל אחד" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "לוח שנה" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "ה_יום" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "תר_שים..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "הוספת תרשים" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "הוספת תרשים" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מהווה עורך תרשימים ל־GraphViz מבוסס zim.\n" "\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "ע_ריכת תרשים" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "מ_שוואה..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "הוספת משווה" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "הוספת משוואה" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מספק עורך משוואות עבור zim על בסיס latex.\n" "\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "ע_ריכת משוואה" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "השתל Gnuplot‏" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "תוסף זה מספק עורך גרפים מבוסס על תוכנת Gnuplot.‏\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "ערוך Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "שר_טוט GNU R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "הוספת שרטוט GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "תוסף זה מספק עורך שרטוטים עבור zim המבוסס על GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "ערי_כת שרטוט GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "שרטוט GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "ה_ערכת הביטוי המתמטי" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "המחשבון מובנה השורה לא הצליח\n" "להעריך את הביטוי במיקום של הסמן." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "מחשבון בתוך השורה" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מאפשר הערכה מהירה של ביטויים מתמטיים פשוטים ב־Zim.\n" "\n" "זהו תוסף מובנה ב־Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "לא ניתן להעריך את הביטוי" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "_סימן..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "הוספת סימן" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף את הדו־שיח 'הוספת סימן' כדי ומאפשר\n" "תווים טיפוגרפיים המתעצבים מעצמם.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_סידור השורות" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "מסדר השורות" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "תוסף זה מסדר את השורות הנבחרות בסדר אלפביתי.\n" "אם הרשימה כבר מסודרת אז הסדר יתהפך\n" "(מ־א–ת ל־ת–א או מ־A-Z ל־Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "נא לבחור יותר משורה אחת של טקסט תחילה." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "הצגת מפת קישורים" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "מפת קישורים" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מספק דו־שיח עם ייצוג גרפי של המבנה\n" "הקישורי של המחברת. ניתן להשתמש בו כמעין\n" "\"מיפוי מוח\" המציג את הקשר בין העמודים.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "הדפסה לדפדפן" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מספק מעקף למחסור בתמיכה בהדפסה\n" "ב־zim. התוסף מייצא את העמוד הנוכחי ל־html\n" "ופותח אותו בדפדפן. בהנחה שלדפדפן יש תמיכה\n" "בהדפסה פעולה זו תעביר את הנתונים שלך אל\n" "המדפסת בשני שלבים.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "ה_דפסה לדפדפן" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "הערה חטופה..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "הערה חטופה" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף דו־שיח להוספה של טקסט או את תוכן\n" "לוח הגזירים לעמוד ויקי.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "יצירת עמוד חדש עבור כל הערה" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "כותרת" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "פתח דף" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "הכנס ניקוד" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "הכנס ניקוד" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "כותרת ראשית משותף" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "כותרת תחתית משותף" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "ערוך ניקוד" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_צילום מסך..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "הוספת צילום מסך" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מאפשר צילום מסך מתוך Zim, וצירופו ישר לתוך דף Zim.\n" "\n" "זהו תוסף מובנה ל־Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "צילום כל המסך" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "בחירת חלון או אזור" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "השהייה" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "שניות" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "התרחשה שגיאה בזמן הרצת \"%s\"‏" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "בדיקת ה_איות" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "בדיקת האיות" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "התוסף מוסיף תמיכה בבדיקת איות באמצעות gtkspell.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "לא ניתן לטעון את בדיקת האיות עבור השפה: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "יכול להיות שלא מותקנים אצלך המילונים\n" "המתאימים" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "תוכן העניינים" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף תוכן עניינים לדף הנוכחי.\n" "תוסף זה הוא תוסף גרעין המסופק עם צים.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "הראה תוכן העניינים בחלון נפרד במקום בתוך מסגרת שוליים" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "תוכן העניינים" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "הרד" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "העלה" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "ללא תגית" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "מיון לפי אלפבית" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "סידור דפים לפי תגיות" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "תגיות" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "תוסף זה מספק מפתח דפים המסונן באותו האופן בו בוחרים תגיות בענן.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "רשימת משימות" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף דו־שיח המציג את כל המשימות\n" "הפתוחות במחברת זו. משימות פתוחות יכולות\n" "להיות תיבות סימון או פריטים המסומנים בתגיות\n" "כגון \"TODO\" או \"FIXME\".\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "התייחסות אל כל תיבות הסימון כאל משימות" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "שימוש בשם הדף כתגיות לפרטי משימה" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "תוויות לסימון משימות" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "יש צורך ליצור מפתח למחברת" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "זוהי הפעם הראשונה בה נפתחת רשימת המשימות.\n" "לכן יש לבנות מחדש את המפתח.\n" "בהתאם לגודל המחברת פעולה זו עלולה לארוך\n" "מספר דקות. בפעם הבאה שיעשה שימוש ברשימת\n" "המשימות פעולה זו לא תהיה הכרחית עוד." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "מסנן" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i פריט אחד פתוח" msgstr[1] "%i פריטים פתוחים" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "כל המשימות" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "ללא תגית" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "משימה" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "תאריך" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "סמל אזור המערכת" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "תוסף זה מוסיף סמל לאזור המערכת לגישה מהירה.\n" "\n" "תוסף זה תלוי ב־Gtk+‎ גרסה 2.10 או עדכנית יותר.\n" "\n" "זהו תוסף המהווה חלק מהליבה של zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "סמל דיווח קלסי.\n" "אין להשתמש בסמל בסגנון חדש באובונטו." #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "הצגת סמל נפרד עבור כל מחברת" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "הערה ח_טופה..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_אחר..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "מחברות" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "zim הוויקי השולחני" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "שמירת ה_גרסה..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "ג_רסאות..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "לא נערכו שינויים למחברת זו מאז הגרסה האחרונה שנשמרה" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "לא נערכו שינויים מאז הגרסה האחרונה" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "בקרת גרסאות" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "שמירת גרסה אוטומטית במרווחי זמן קבועים" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "גרסה שנשמרה אוטומטית מ־zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "האם לאפשר בקרת גרסאות?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "בקרת גרסאות אינה פעילה כעת עבור מחברת זו.\n" "האם ברצונך להפעיל אותה?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "תשתית" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "שמירת הגרסה" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "נא להזין תגובה לגרסה זו" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "גרסה שנשמרה מ־zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "גרסאות" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_עמוד" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "צפייה עם _פירושים" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "נא לבחור גרסה להצגת השינויים בינה ובין המצב הנוכחי. או שניתן\n" "לבחור מספר גרסאות כדי לצפות בשינויים בין גרסאות אלה.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "הערה" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "שח_זור הגרסה" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "הצגת ה_שינויים" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_זה לצד זה" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "מקור הדף עם פירושים" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "האם להחזיר את העמוד לגרסה שנשמרה?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "האם ברצונך לשחזר את העמוד: %(page)s\n" "לגרסה שנשמרה: %(version)s ?\n" "\n" "כל השינויים מאז הגרסה האחרונה שנשמרה יאבדו !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "שינויים" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "מהדורה" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "דף: %s" #~ msgid "Text Editor" #~ msgstr "עורך טקסט" #~ msgid "Web browser" #~ msgstr "דפדפן אינטרנט" #~ msgid "Pages" #~ msgstr "עמודים" #~ msgid "Output" #~ msgstr "פלט" #~ msgid "Match c_ase" #~ msgstr "התאם _רישיות" #~ msgid "Prio" #~ msgstr "עדיפות" #~ msgid "_Filter" #~ msgstr "_מסנן" #~ msgid "File browser" #~ msgstr "סייר קבצים" #~ msgid "Slow file system" #~ msgstr "מערכת קבצים אטית" #~ msgid "Email client" #~ msgstr "לקוח דוא״ל" zim-0.60/translations/nl.po0000644000175000017500000025146312137750055015620 0ustar jaapjaap00000000000000# Dutch translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-14 09:32+0000\n" "Last-Translator: Jaap Karssenberg \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Fout opgetreden bij de excutie van: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "gaf een exit code die niet nul is: %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Programma gefaald: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Standaard" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Bestand niet gevonden: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Kan bestand niet lezen: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Dit treedt meestal op wanneer het bestand ongeldige karakters bevat" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Details" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Kan bestand niet schrijven: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Bestand is veranderd: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Aanpassen..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Geen programma's gevonden" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Openen met \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Configureer een programma om \"%s\" links to openen" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Configureer een programma om bestanden\n" "van type \"%s\" te openen" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Programma's configureren" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Programma toevoegen" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Systeemstandaard" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Naam" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Commando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Maak standaard programma" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Open bestand" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Map openen" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Bestand Verwijderen" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Verwijderen" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selectie" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Bestandsnaam" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Pagina" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Opruimen Bijlagen" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Selectie Omkeren" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "De bestanden in deze lijst zijn gevonden in de map met bijlagen van\n" "dit notitieboek maar worden niet gerefereerd in de pagina's. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Geen bestanden gevonden die niet gerefereed worden" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Extra Applicaties" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Hier kunt u extra applicaties configureren die in\n" "het \"extra\" menu en in de toolbar worden toegevoegd." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Extra applicatie wijzigen" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Omschrijving" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Pictogram" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Dit commando verandert geen bestanden" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "In de werkbalk toevoegen" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "De volgende parameters worden vervangen bij\n" "het uitvoeren van het commando:\n" "\n" "%f de bron tekst van de pagina als tijdelijk bestand\n" "%d de folder voor aangehechte bestanden voor de huidige pagina\n" "%s het bestand met de bron teksts voor de huidige pagina (als deze er " "is)\n" "%n de locatie van het notitieboek (een bestand of een folder)\n" "%D de documenten folder (als deze er is)\n" "%t de geselecteerde tekst or het woord onder de cursor\n" "%T de geselecteerde tekst inclusief wiki opmaak\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exporteren" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Index aan het herladen" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Map bestaat: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Map bestaat al en bevat bestanden. Exporteren naar deze map kan bestaande " "bestanden overschrijven. Wilt u doorgaan?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Bezig met notitieboek exporteren" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Bestand bestaat al" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Dit bestand bestaat al.\n" "Wilt u het overschrijven?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Selecteer de pagina's" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Gehele _notitieboek" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Eén _pagina" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Selecteer het formaat" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Andere..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Opmaak" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Template" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Bestanden in de document root folder met de volledige bestandsnaam linken" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Map de documentenroot naar een URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Selecteer de locatie" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Map" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Index pagina" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Uitvoerbestand" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Tonen" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Bekijk _Log" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Er is een fout opgetreden bij het genereren van de \n" "afbeelding. Wilt u de brontext toch opslaan?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Logboek" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Bestand" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "Be_werken" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "Beel_d" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Invoegen" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Zoeken" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Opmaak" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "E_xtra" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Ga naar" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Hulp" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "_Lokatiebalk" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Werkbalk" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nieuwe Pagina" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nieuwe S_ub Pagina..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Open ander notitieboek..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Openen in _Nieuw Venster" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "Pagina _Importeren..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Opslaan" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "_Kopie Opslaan..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xporteren…" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Versturen..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Pagina Ver_plaatsten..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Pagina _Hernoemen..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "Pagina Ver_wijderen" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Ei_genschappen" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "Sl_uiten" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Afsluiten" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Zoeken..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Zoek _Verwijzingen..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Recente wijzigingen..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "_Locatie kopiëren" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Sjablonen" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Voorkeuren" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Herladen" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Open Map Met Bijlagen" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Open _Notitieboek Map" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Open Documentenroot" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "_Documenten Map Openen" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Bestand _Aanhechten" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Bestand aanhechten" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "Aangehechte Bestanden _Opruimen" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Brontext Bewerken" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Start _Web Server" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Index bijwerken" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "E_xtra Applicaties" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Terug" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Ga pagina terug" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Vooruit" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Ga pagina vooruit" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Omhoog" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ga pagina omhoog" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "Om_laag" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Ga pagina omlaag" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Vor_ige in de index" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ga naar de vorige pagina" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Vo_lgende in de index" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ga naar de volgende pagina" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Start" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Ga naar start" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Pagina..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "I_nhoud" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Toetsen" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bugs" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "In_fo" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Alle panelen" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Laat alle panelen zien" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statusbalk" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Zijpanelen" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Laat zijpanelen zien" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Schermvullend" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notitieboek _Wijzigen" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Notitieboek wijzigen aan/uit" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Geen" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Recente pagina's" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Recente gewijzigde paginas" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Geschiedenis" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Hierarchie" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Pictogrammen _En Tekst" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Enkel _Pictogrammen" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Alleen _Tekst" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Grote Pictogrammen" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Kleine Pictogrammen" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "K_leinere Pictogrammen" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Zet afscheurstrips boven de menus" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Gebruik om naar de index te switchen" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Verwijder snelkoppelingen bij het verwijderen van pagina's" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Altijd laatste cursor positie gebruiken bij het openen van een pagina" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Het bestand of de map die u heeft opgegeven\n" "bestaat niet. Controleer de bestandsnaam." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Bestand of map niet gevonden: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Zoeken" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Zoek paginas..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Notitiebook aanpassen?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Dit notitieboek is met een oudere versie van zim gemaakt.\n" "Wilt u het nu aanpassed naar de laatste versie?\n" "\n" "Het aanpassen van een notitieboek neemt tijd en kan\n" "diverse aanpassingen maken. Voor de zekerheid is het\n" "aan te raden om eerst een backup to maken.\n" "\n" "Als u er niet voor kiest om het notitieboek nu aan\n" "te passen houd er dan rekening mee dat zim mogenlijk\n" "niet geheel werkt zoals verwacht." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Notitieboek aan het aanpassen" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "De applicatie is nog bezig met het bijwerken van de index. Vooraleer dit " "klaar is kunnen referenties niet correct bijgewerkt worden. Als u deze actie " "nu uitvoert, kunnen er referenties ongeldig worden. Wilt u toch doorgaan ?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Snelkoppelingen bijwerken" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Links worden verwijderd" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Map creëren?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "De folder \"%s\" bestaat niet.\n" "Wilt u deze nu aanmaken?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Kan bestand niet openen: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Deze pagina heeft geen map met bijlagen" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Bestand open: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "U hebt een bestand in een andere applicatie geopend om te bewerken. Deze " "dialoog kan gesloten worden als u klaar bent met dit bestand." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Een desktop wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Bart https://launchpad.net/~bartvanherck\n" " Bernard Decock https://launchpad.net/~decockbernard\n" " Christopher https://launchpad.net/~cstandaert\n" " Frits Salomons https://launchpad.net/~salomons\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Jaap-Andre de Hoop https://launchpad.net/~j-dehoop\n" " Luc Roobrouck https://launchpad.net/~luc-roobrouck\n" " Vincent Gerritsen https://launchpad.net/~vgerrits\n" " Yentl https://launchpad.net/~yentlvt\n" " cumulus007 https://launchpad.net/~cumulus-007" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "alleen lezen" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Verwijzing..." msgstr[1] "%i _Verwijzingen..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Pagina kon niet worden opgeslagen: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Om verder te gaan kunt u of een kopie van deze pagina\n" "opslaan, of alle wijzigingen weggooien. Als u een kopie opslaat\n" "zullen wijzigingen ook worden weggegooid, maar kunt u die\n" "later herstellen door de pagina te importeren." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Wijzigingen wegwerpen" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Kopie _Opslaan" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Ga naar" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Ga naar pagina" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nieuwe Sub Pagina" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nieuwe Pagina" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Tip: Als u een link maakt naar een niet bestaande pagina\n" "wordt er ook automatisch een nieuwe pagina aangemaakt." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Pagina naam" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Pagina Opmaak" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Pagina bestaat al" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Kopie Opslaan" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Pagina Importeren" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Tekst Bestanden" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Pagina Verplaatsen" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Pagina \"%s\" verplaatsen" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Update ook de %i pagina die naar deze pagina verwijst" msgstr[1] "Update ook de %i pagina's die naar deze pagina verwijzen" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Sectie" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Pagina Hernoemen" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Pagina \"%s\" hernoemen" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Wijzig de titel van deze pagina" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Pagina Verwijderen" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Pagina \"%s\" verwijderen?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "De pagina \"%s\" and alle\n" "subpagina's en bijgevoegde bestanden\n" "zullen worden verwijderd." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Verwijder links naar deze pagina van %i pagina" msgstr[1] "Verwijder links naar deze pagina van %i pagina's" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i bestand zal verwijderd worden" msgstr[1] "%i bestanden zullen worden verwijderd" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Bijlage toevoegen" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Pagina \"%s\" heeft geen map voor de bijlagen" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Plaatjes als link invoegen" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notitieboek" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Notitieboek Openen" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Standaard Notitieboek" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Notitieboek Toevoegen" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Kies een naam en een map voor dit notitieboek" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Map" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Index aan het updaten..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Ongedaan maken" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Op_nieuw" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Knippen" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "K_opiëren" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Plakken" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Verwijderen" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Markeer checkbox 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Markeer checkbox 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "Link of Object _Wijzigen" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Link _Verwijderen" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Datum en Tijd" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Afbeelding..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Bulle_t Lijst" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Ge_nummerde lijst" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Checkbo_x Lijst" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Tekst Uit _Bestand" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Link..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Link Invoegen" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Opmaak _Verwijderen" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Vinden..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "_Volgende zoeken" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Zoek vo_rige" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Vervangen..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Woorden Tellen..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "In_zoomen" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Uitz_oomen" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normale grootte" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nieuwe _Bijlage" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Bestands _Sjablonen..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Kop _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Kop 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Kop _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Kop 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Kop _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Kop 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Kop _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Kop 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Kop _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Kop 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Vet" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Vet" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Nadruk" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Nadruk" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Markeren" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Markeren" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Doorhalen" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Doorhalen" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Subscript" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Superscript" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Letterlijk" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Letterlijk" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Gebruik de toets om links te volgen.\n" "(Wanneer deze optie uitstaat kunt nog steeds \n" " gebruiken om links te volgen.)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Laat de cursor ook zien voor pagina's die niet kunnen worden bewerkt" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Link woorden in CamelCase automatisch tijden het typen" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Link bestandsnamen automatisch tijden het typen" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Selecteer automatisch het huidige woord voor het toepassen van opmaak" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Gebruik om inspringen ongedaan te maken.\n" "(Als deze optie uitstaat kunt u nog steeds gebruiken)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Bij herhaaldelijk klikken gaat de checkbox door alle mogenlijke opties" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Het laten inspringen van een bullet lijst item neemt ook sub-items mee" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Bij het afvinken van een checkbox ook alle sub-items afvinken" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Interpreteer wiki syntax direct" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Standaard formaat om te kopiëren" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Map met sjablonen voor bijlagen" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "De wiki bestaat niet: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopiëren _Als..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Geselecteerde tekst verplaatsen" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Eigenschapen Wijzigen" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Link be_werken" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "_Link Kopiëren" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Email Adres Kopiëren" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Openen met..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Openen" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Geen Sjablonen geïnstalleerd" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "De map\n" "%s\n" "bestaat niet.\n" "Wilt u deze map aanmaken?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Datum en Tijd Invoegen" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalender" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Link datum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Afbeelding Invoegen" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Bestand eerst aanhechten" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Dit bestands type wordt niet ondersteund: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Afbeelding Bewerken" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Lokatie" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Link Naar" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Breedte" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Hoogte" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Grootte He_rstellen" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Tekst Uit Bestand Invoegen" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Link Bewerken" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Link" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Tekst" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "Vo_lgende" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "Vo_rige" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Match _hoofdletters" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Alleen hele woorden" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Reguliere expressie" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Markeren" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Zoeken" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Voorkeuren" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Zoek en vervang" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Zoek dit" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Vervang door" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Vervang" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "_Alle Vervangen" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Woorden Tellen" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Alinea" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Woorden" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Regels" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Tekens" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Tekst naar andere pagina verplaatsen" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Verplaatsen" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Verplaatsen naar" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Laat een referentie achter naar nieuwe pagina" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Nieuwe pagina openen" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Nieuw bestand" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Bediening" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Bewerken" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Voorkeuren" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Invoegtoepassingen" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Wijzig lettertype" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Meer" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigureren" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Afhankelijkheden" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Geen afhankelijkheden" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Niet gevonden" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Optioneel" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Auteur" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "In Gebruik" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Invoegtoepassing" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Invoegtoepassing instellen" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opties voor invoegtoepassing %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Eigenschappen" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Notitieboek Eigenschappen" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Recente wijzigingen" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Vandaag" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Gisteren" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Laatst gewijzigd" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Voor geavanceerde zoek opdrachten kunnen termen\n" "zoals AND, OR en NOT worden gebruikt. Zie de hulp\n" "pagina voor meer details." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Beperk de zoekactie tot de huidige pagina en subpagina's" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Score" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Webserver" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Web server nog niet gestart" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Publieke toegang toelaten" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Poort" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Web server gestart" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Web server gestopt" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Sjablonen" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Bladeren" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Sjabloon Kopiëren" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Bestand Selecteren" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "_Alles uitvouwen" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Alles _inklappen" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Wissen" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Map Selecteren" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Kies een afbeelding" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Linker zijpaneel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Rechter zijpaneel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Onderste paneel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Bovenste paneel" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Linksboven" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Linksonder" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Rechtsboven" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Rechtsonder" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "U heeft waarschijnlijk een bug gevonden" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Als u dit probleem rapporteert, voeg\n" "dan de onderstaande informatie toe" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Alle bestanden" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Afbeeldingen" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Bestand Bestaat Reeds" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Een bestand met de naam \"%s\" bestaat reeds.\n" "U kunt een andere naam opgeven of het bestaande bestand\n" "overschrijven." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Bladeren" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Overschrijf" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Map of bestand voor dit notitieboek niet gevonden." #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Kan notitieboek \"%s\" niet vinden" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Ongeldige pagina naam\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Ongeldige pagina naam \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "De index is nog bezig met updaten terwijl er een\n" "bewerking wordt gedaan die de index nodig heeft.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Kan pagina \"%s\" niet wijzigen" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwiki Keyword" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Start Pagina" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Bestanden map" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profiel" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Gedeeld notitieboek" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Arithmetic" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Deze plugin helpt met kleine berekeningen in\n" "zim paginas. Hij is gebaseerd op de \"arithmic\" module\n" "van http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Arithmetic" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Bijlagen-browser" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Deze invoegtoepassing laat de map met bijlagen zien voor\n" "de huidige pagina.\n" "\n" "Deze invoegtoepassing is in ontwikkeling.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Positie in het scherm" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Bijlagen" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Toon aangehechte bestanden" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Aangehechte bestand" msgstr[1] "%i _Bijlagen" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Niet bekend" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Type" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Grootte" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Gewijzigd" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Hiernaar verplaatsen" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Hiernaar kopieren" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Annuleren" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automatisch aankoppelen" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze invoegtoepassing kan automatisch notitieboeken aankoppelen indien " "nodig.\n" "Dit is bijvoorbeeld te gebruiken om contact te maken met netwerk \n" "schijven of om een versleutelde folder te ontsluiten wanneer zim een\n" "notitieboek op dergelijke schijf probeert te openen.\n" "Dit is een standaardinvoegtoepassing voor zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Referenties paneel" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze invoegtoepassing voegt een extra paneel toe met een\n" "lijst van pagina's die naar de huidige pagina refereren.\n" "\n" "Dit is een standaard invoegtoepassing voor zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Referenties" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Van_daag" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kalen_der" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Journaal" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Deze plugin veranderd een notitieoek sectie in een journaal\n" "met een pagina per dag, per week of per maand.\n" "De plugin voegt ook een kalender toe die toegang geeft\n" "naar deze paginas.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Dag" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Week" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Maand" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Jaar" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Kalender in zij-paneel tonen in plaats van in een apart venster" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Gebruik een pagina voor elke" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Vandaag" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Diagram Invoegen" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Diagram Invoegen" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin geeft de mogelijkheid om diagrammen in de\n" "tekst op te nemen en te wijzigen gemaakt met GraphViz.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Diagram Be_werken" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Afleiding vrij werken" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Deze plugin voegt settings toe om\n" "afleiding vrij te werken in zim.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Verberg de menubalk in schermvullende modus" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Verberg de werkbalk in schermvullende modus" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Verberg de lokatiebalk in schermvullende modus" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Verberg de statusbalk in schermvullende modus" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Maximale pagina breedte" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Verticale marge" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Tekst achtergrond kleur" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Tekst voorgrond kleur" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Scherm achtergrond kleur" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Insert Ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Insert Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een diagram editor toe op basis van Ditaa.\n" "\n" "Dit is een standaard plugin voor zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "Ditaa Be_werken" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Vergelijking" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Vergelijking invoegen" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Vergelijking Invoegen" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin geeft de mogelijkheid om vergelijkingen in de\n" "tekst op te nemen en deze te bewerken. Vergelijkingen\n" "worden geschreven in latex en zijn in de editor als plaatje te zien.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Formule Be_werken" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Insert Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Deze plugin voegt een editor toe om grafieken in te voegen gebaseerd op " "GNUplot\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "GNUplot Be_werken" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "GNU R plot invoegen" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Deze plugin voegt de mogenlijkheid toe om plots te \n" "gebruiken gebaseerd op GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "GNU R plot be_werken" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evalueer _Vergelijking" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "De rekenmachine plugin kan de vergelijking\n" "voor de cursor niet evalueren." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Rekenmachine" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze invoegtoepassing kan eenvoudige wiskundige vergelijkingen \n" "in de tekst evalueren.\n" "\n" "Dit is een standaard invoegtoepassing voor zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Kan de vergelijking niet goed interpreteren" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbool" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Symbool invoegen" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een hulpvenster toe om symbolen en\n" "speciale tekens in te voegen.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "Regels _Sorteren" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Sorteren per regel" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Deze plugin voegt een functie toe om geselecteerde\n" "regels te sorteren op alfabetische volgorde.\n" "Als de lijst al gesorteerd is wordt de volgorde omgedraaid\n" "(A-Z naar Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Selecteerd eerst meerdere regels text" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Toon Link Overzicht" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Link Overzicht" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een nieuw venster toe met een diagram\n" "van alle links en referenties rond de huidige pagina. Dit is\n" "bruikbaar als een overzicht van relaties tussen verschillende \n" "pagina's.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Printen naar webbrowser" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin stuurt de huidige pagina naar de \n" "webbrowser. Bij gebrek aan printer support\n" "in zim geeft dit de mogenlijkheid om de pagina \n" "vanuit de browser te printen.\n" "\n" "Dit is een standaard plugin voor zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Printen naar Webbrowser" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "_Korte Notitie..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Korte Notitie" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een dialoog toe om snel tekst of plakbord\n" "inhoud in een zim pagina te plakken.\n" "\n" "Dit is een hoofd plugin van zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Maak voor elke notitie een nieuwe pagina aan" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titel" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Open _Pagina" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Notitie weggooien?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "N_otenbalk" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Notenbalk invoegen" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Notenbalk Invoegen" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze invoegtoepassing voegt de mogelijkheid toe om\n" "notenbalken in te voegen door gebruik te maken \n" "van GNU Lilypond.\n" "\n" "Dit is een standaard invoegtoepassing voor zim\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Standaard header" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Standaard footer" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Bewerk notenbalk" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Schermafdruk..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Schermafdruk Invoegen" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze invoegtoepassing geeft de mogelijkheid een screenshot\n" "te nemen en deze direct in zim in te voegen.\n" "\n" "Dit is een standaard invoegtoepassing voor zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Hele scherm afdrukken" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Window of deel van het scherm selecteren" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Wachttijd" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "seconden" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Er is een fout opgetreden tijdens \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Controleer _spelling" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Spellingscontrole" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een spellingscontrole toe \n" "gebaseerd op gtkspell.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Kan spelling controle niet laden voor taal: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Dit kan betekenen dat de juiste\n" "woordenboeken niet zijn geïnstalleerd." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Inhoudsopgave" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een extra widget toe met\n" "een inhoudsopgave van de huidige pagina.\n" "\n" "Dit is een standaard plugin voor zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Laat Inhoudsopgave als \"floating\" widget zien" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Inhoud" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Degraderen" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Promoveren" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "Ongelabeld" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Op alfabet sorteren" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sorteer pagina's op labels" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Labels" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Deze plugin voegt een index toe die gesorteerd is op label\n" "en gefilterd kan worden met behulp van een \"tag cloud\".\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Takenlijst" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt een dialoog toe die alle open taken in \n" "dit notitieboek laat zien. Open taken kunnen checkboxen\n" "zijn of codes zoals \"TODO\" of \"FIXME\" in de text.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Beschouw alle checkboxen als taken" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Zet pagina namen om in labels voor de taken" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Automatische eind datum voor taken op een kalender pagina" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Markeer taken met een eind datum op Maandag of Dinsdag al voor het weekend" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Labels die taken markeren" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Label voor volgende taak" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Label voor (nog) niet actieve taken" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Sectie(s) om te indexeren" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Sectie(s) om te negeren" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Notitieboek moet worden geindexeerd" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Dit is de eerste keer dat de taken lijst wordt \n" "geopend. Daarom moet de index opnieuw \n" "worden opgebouwd. Dit een paar minuten\n" "duren afhankelijk van de grootte van dit \n" "notitieboek. De volgende keer dat de taken\n" "lijst wordt geopend is dit niet meer nodig." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Laat alleen taken zien die actief zijn" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i open taak" msgstr[1] "%i open taken" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Alle taken" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Zonder label" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Taak" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Datum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Status Icoon" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin geeft snelle toegang tot zim \n" "door een icoon toe te voegen aan de status balk.\n" "\n" "Deze plugin vereist Gtk+ versie 2.10 of nieuwer.\n" "\n" "Dit is een standaardplugin voor zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klassiek status icoon,\n" "gebruik de nieuwe style status icoon voor Ubuntu niet" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Laat een apart status icoon zien voor elk notitieboek" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Korte Notitie..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Overige..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notitieboeken" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "V_ersie Opslaan" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versies..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Er zijn geen veranderingen in dit notitieboek sinds de laatste opgeslagen " "versie" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Geen veranderingen sinds laatste versie" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Versiebeheer" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Deze plugin voegt versie controle toe voor notitieboeken.\n" "\n" "Deze plugin support de Bazaar, Git, en Mercurial versie controle systemen.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Autosave versie op regelmatige tijdstippen" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatisch opgeslagen versie van zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Versiebeheer inschakelen?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Versiebeheer is momenteel niet in gebruik voor dit notitieboek.\n" "Wilt u dit inschakelen?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Systeem" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Versie Opslaan" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Geef een korte omschrijving voor deze versie" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versie opgeslagen vanuit zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versies" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Pagina" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Bekijk Ge_annoteerde" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Selecteer een versie om de wijzigingen met die versie en de huidige staat \n" "te bekijken. Of selecteer meerdere versies om de verschillen ertussen te " "bekijken.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Beschrijving" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "He_rstel Versie" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Geef wijzigingen weer (_C)" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "Zij bij Zij (_S)" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Geannoteerde pagina bron" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Pagina herstellen naar opgeslagen versie?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Wil je pagina: %(page)s terugzetten\n" "naar de opgeslagen versie: %(version)s?\n" "\n" "Alle wijzigingen sinds de laatst opgeslagen versie zullen verloren gaan !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Wijzingen" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Log events in Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Stuur events naar de Zeitgeist service" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Zim pagina: %s" #~ msgid "Email client" #~ msgstr "Email programma" #~ msgid "Output" #~ msgstr "Formaat" #~ msgid "Slow file system" #~ msgstr "Langzaam bestands systeen" #~ msgid "File browser" #~ msgstr "Bestandsbrowser" #~ msgid "Web browser" #~ msgstr "Webbrowser" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "_Filter" #~ msgstr "_Filteren" #~ msgid "Text Editor" #~ msgstr "Tekst Editor" #~ msgid "Match c_ase" #~ msgstr "Check hoofdletters" #~ msgid "Pages" #~ msgstr "Pagina's" zim-0.60/translations/el.po0000644000175000017500000030273512137750055015606 0ustar jaapjaap00000000000000# Greek translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2012-10-06 21:09+0000\n" "Last-Translator: tzem \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Αποτυχημένη εκτέλεσης της εφαρμογής: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "Επεστράφει μη μηδενική κατάσταση εξόδου %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Προεπιλογή" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Ανύπαρκτο αρχείο: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Ανέφικτη ανάγνωση: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" "Συνήθως πρόκειται για ένδειξη ότι το αρχείο περιέχει μη αποδεκτούς χαρακτήρες" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Λεπτομέρειες" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Άνοιγμα με \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Όνομα" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Εντολή" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Άνοιγμα αρχείου" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Άνοιγμα φακέλου" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Διαγραφή Aρχείου" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Διαγραφή" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Επιλογή" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Όνομα αρχείου" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Σελίδα" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Εκκαθάριση συνημμένων" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Αντιστροφή Επιλογής" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Τα παρακάτω αρχεία βρέθηκαν στο φάκελο συνημμένων του zim\n" "αλλά δεν είναι πλέον επισυνημμένα στο σημειωματάριο. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Δεν βρέθηκαν ορφανά αρχεία." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Προσαρμοσμένα εργαλεία" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Μπορείτε να καθορίσετε ποια προσαρμοσμένα εργαλεία θα εμφανίζονται\n" "στο μενού εργαλείων και στην εργαλειοθήκη ή τα αναδυόμενα μενού" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Επεξεργασία προσαρμοσμένου εργαλείου" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Περιγραφή" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Εικονίδιο" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Η εντολή δεν τροποποιεί δεδομένα" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Εμφάνιση στην εργαλειοθήκη" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Οι ακόλουθες παράμετροι θα αντικατασταθούν\n" "στην εντολή κατά την εκτέλεσή της:\n" "\n" "%f η πηγαία σελίδα ως προσωρινό αρχείο\n" "%d ο φάκελος επισυνάψεων της τρέχουσας σελίδας\n" "%s το πραγματικό αρχείο πηγαίου κώδικα (αν υπάρχει)\n" "%n η τοποθεσία του σημειωματάριου (αρχείο ή φάκελος)\n" "%D η αφετηρία αρχείων (αν υπάρχει)\n" "%t το επιλεγμένο κείμενο ή η λέξη κάτω από τον κέρσορα\n" "%T το επιλεγμένο κείμενο με τη wiki μορφοποίηση \n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Εξαγωγή" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Ενημέρωση ευρετηρίου" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Υφιστάμενος φάκελος: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Ο φάκελος υπάρχει ήδη και δεν είναι κενός. Αν κάνετε εξαγωγή σε αυτόν, είναι " "πιθανό να επικαλύψετε υπάρχοντα αρχεία. Θέλετε να συνεχίσετε;" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Εξαγωγή σημειωματάριου" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Το αρχείο υπάρχει ήδη" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Το αρχείο υπάρχει ήδη.\n" "Θέλετε να το αντικαταστήσετε;" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Επιλογή σελίδων για εξαγωγή" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Ο_λόκληρο το σημειωματάριο" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Μία _σελίδα" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Επιλογή της μορφής εξόδου" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Άλλο..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Μορφή" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Πρότυπο" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Χρήση πλήρους διαδρομής σε δεσμούς για τοπικά αρχεία" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Αντιστοίχηση του ριζικού καταλόγου του εγγράφου σε URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Επιλογή του αρχείου ή φακέλου εξόδου" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Φάκελος εξόδου" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Σελίδα ευρετηρίου" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Αρχείο εξόδου" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Προεπισκόπηση" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Εμφάνιση _καταγραφής" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Παρουσιάστηκε σφάλμα κατά τη δημιουργία της εικόνας.\n" "Θέλετε παρόλα αυτά να αποθηκεύσετε το πηγαίο αρχείο;" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Αρχείο καταγραφής" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Αρχείο" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Επεξεργασία" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Προβολή" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "Ε_ισαγωγή" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "Ανα_ζήτηση" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "Μορ_φοποίηση" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "Ερ_γαλεία" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Μετάβαση" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Βοήθεια" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Γρ_αμμή διαδρομής" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Εργαλειο_θήκη" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Νέα σελίδα..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Νέα _υποσελίδα..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Άν_οιγμα νέου σημειωματάριου..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Άνοιγμα σε νέο παρά_θυρο" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "Ε_ισαγωγή σελίδας..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Αποθήκευση" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Αποθήκευση ενός αν_τιγράφου..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "Εξαγ_ωγή..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Αποστολή π_ρος..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Μετακίνηση σελίδας..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Μετονομασία _σελίδας..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Διαγραφή σελίδας" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Ιδιότ_ητες" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Κλείσιμο" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "'Ε_ξοδος" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "Ανα_ζήτηση..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Αναζήτηση για _Backlinks..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Π_ροτιμήσεις" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Επαναφόρτωση" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Άνοιγμα _φακέλου επισυνάψεων" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Ά_νοιγμα φακέλου σημειωματάριων" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Άνοιγμα αρχι_κού καταλόγου εγγράφου" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Άνοιγμα φακέλου του ε_γγράφου" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Επισύνα_ψη αρχείου" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Επισύναψη εξωτερικού αρχείου" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "Ε_κκαθάριση Επισυνάψεων" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Επεξεργασία _κώδικα" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Εκκίνηση εξυπηρετητή _Ιστού" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Ενημέρωση Ευρετηρίου" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Προσαρμοσμένα _εργαλεία" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Πίσω" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Μετάβαση στην προηγούμενη σελίδα" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Μπροστά" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Μετάβαση στην επόμενη σελίδα" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "Πάν_ω" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Μετάβαση στη μητρική σελίδα" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Κάτω" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Μετάβαση στη θυγατρική σελίδα" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Προη_γούμενη στο ευρετήριο" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Μετάβαση στην προηγούμενη σελίδα" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Επόμε_νη στο ευρετήριο" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Μετάβαση στην επόμενη σελίδα" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Αρχική" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Μετάβαση στην αρχική σελίδα" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Μετάβαση σε..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "Περιε_χόμενα" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_Συχνές ερωτήσεις" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "Συντομεύσεις πλη_κτρολογίου" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "Σ_φάλματα" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Περί" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Γ_ραμμή κατάστασης" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Πλήρης οθόνη" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Ε_πεξεργάσιμο σημειωματάριο" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Εναλλαγή δυνατότητας επεξεργασίας σημειωματάριου" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Τίποτα" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Π_ρόσφατες σελίδες" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Ιστορικό" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Χώρος ονομάτων" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Εικονίδι_α και κείμενο" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Ε_ικονίδια μόνο" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Κείμενο μόνο" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Μεγά_λα εικονίδια" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Μικρά εικονίδια" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Πολύ μικρά _εικονίδια" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Χρήση αποσπώμενων μενού" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Χρησιμοποίησε για μετάβαση στην πλαϊνή περιοχή" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Αφαίρεση των συνδέσμων όταν διαγράφονται σελίδες" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Να χρησιμοποιείται πάντα η τελευταία θέση του κέρσορα όταν ανοίγει μια σελίδα" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Τα αρχείο ή ο φάκελος που καθορίσατε δεν υπάρχει.\n" "Παρακαλώ σιγουρευτείτε ότι η διαδρομή είναι σωστή." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Δεν υπάρχει τέτοιο αρχείο ή κατάλογος: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Αναζήτηση" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Να γίνει αναβάθμιση του σημειωματάριου;" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Το σημειωματάριο αυτό δημιουργήθηκε με μια παλιότερη έκδοση του zim.\n" "Θέλετε να αναβαθμιστεί στην τελευταία έκδοση;\n" "\n" "Η αναβάθμιση μπορεί να διαρκέσει αρκετά και να κάνει σημαντικές αλλαγές\n" "στο σημειωματάριο. Σας προτείνουμε να κρατήσετε ένα αντίγραφο ασφαλείας\n" "πριν συνεχίσετε.\n" "\n" "Αν αποφασίσετε να μην κάνετε την αναβάθμιση τώρα, κάποιες λειτουργίες\n" "μπορεί να μην δουλεύουν όπως θα έπρεπε." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Γίνεται αναβάθμιση του σημειωματάριου" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Το ευρετήριο ενημερώνεται ακόμη. Μέχρι να ολοκληρωθεί η ενημέρωσή του, η " "τροποποίηση των δεσμών δεν μπορεί να γίνει με ασφάλεια. Αν συνεχίσετε μπορεί " "να καταλήξετε με 'σπασμένους' δεσμούς. Θέλετε να συνεχίσετε;" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Γίνεται ενημέρωση δεσμών" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Γίνεται αφαίρεση δεσμών" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Δημιουργία φακέλου;" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Αδύνατο ανοίγματος: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Αυτή η σελίδα δεν έχει φάκελο επισυνάψεων" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Επεξεργασία αρχείου: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Το αρχείο είναι ανοικτό σε μία εξωτερική εφαρμογή. Μπορείτε να κλείσετε αυτό " "το παράθυρο όταν τελειώσετε" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Ένα Wiki για την Επιφάνεια Εργασίας" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Melsi Habipi https://launchpad.net/~mhabipi\n" " Spiros Georgaras https://launchpad.net/~sngeorgaras\n" " paxatouridis https://launchpad.net/~paxatouridis-deactivatedaccount\n" " tkout https://launchpad.net/~tkout\n" " tzem https://launchpad.net/~athmakrigiannis" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Ευρετήριο" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Μόνο για ανάγνωση" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Backlink..." msgstr[1] "%i _Backlinks..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Αδύνατη η αποθήκευση της σελίδας: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Για να συνεχίσετε θα πρέπει να αποθηκεύσετε ένα αντίγραφο της σελίδας, " "αλλιώς οι\n" "αλλαγές σας θα χαθούν. Αν κάνετε αποθήκευση, οι αλλαγές θα χαθούν και πάλι, " "αλλά\n" "θα μπορείτε να τις επαναφέρετε αργότερα από το αντίγραφο." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Από_ρριψη αλλαγών" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Αποθήκευ_ση αντιγράφου" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Μετάβαση σε" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Μετάβαση στη σελίδα" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Νέα υποσελίδα" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Νέα σελίδα" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Παρακαλώ σημειώστε ότι όταν δημιουργήσετε ένα δεσμό σε μία\n" "μη υπάρχουσα σελίδα, αυτή δημιουργείται αυτόματα." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Όνομα σελίδας" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Πρότυπο Σελίδας" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Η σελίδα υπάρχει" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Αποθήκευση αντιγράφου" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Εισαγωγή σελίδας" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Αρχεία κειμένου" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Μετακίνηση σελίδας" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Μετακίνηση της σελίδας \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Ενημέρωση %i σελίδας που έχει δεσμούς σε αυτήν τη σελίδα" msgstr[1] "Ενημέρωση %i σελίδων που έχουν δεσμούς σε αυτήν τη σελίδα" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Χώρος ονομάτων" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Μετονομασία σελίδας" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Μετονομασία της σελίδας \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Ενημέρωση της κεφαλίδας αυτής της σελίδας" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Διαγραφή σελίδας" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Να διαγραφεί η σελίδα \"%s\";" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Η σελίδα \"%s\" και όλες οι υποσελίδες\n" "και επισυνάψεις της θα διαγραφούν" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Αφαίρεση δεσμών από %i σελίδα που αναφέρονται σε αυτή τη σελίδα" msgstr[1] "Αφαίρεση δεσμών από %i σελίδες που αναφέρονται σε αυτή τη σελίδα" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i αρχείο θα διαγραφεί" msgstr[1] "%i αρχεία θα διαγραφούν" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Επισύναψη αρχείου" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Η σελίδα \"%s\" δεν έχει φάκελο επισυνάψεων" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Εισαγωγή εικόνων ως δεσμοί" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Σημειωματάριο" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Άνοιγμα σημειωματάριου" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Προεπιλεγμένο σημειωματάριο" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Προσθήκη σημειωματάριου" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Παρακαλώ επιλέξτε το όνομα και ένα φάκελο για το σημειοματάριο." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Φάκελος" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Ενημέρωση σημειωματάριου..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Αναίρεση" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "Α_κύρωση αναίρεσης" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Απ_οκοπή" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "Αντι_γραφή" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "Ε_πικόλληση" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Διαγραφή" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Σημείωση ως OK (V)" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Σημείωση ως NOK (X)" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Επεξεργασία δεσμού ή αντικειμένου..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Α_φαίρεση δεσμού" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "Η_μεροηνία και ώρα" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Εικόνα..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Λίσ_τα με κουκίδες" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Αριθμημέ_νη Λίστα" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Λίστα με κουτάκια" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Κείμενο από αρ_χείο..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Δεσμός..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Εισαγωγή δεσμού" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Εκκαθάριση μορφοποίησης" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Εύρεση..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Εύρεση ε_πόμενου" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Εύρεση προη_γούμενου" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Αντικατάσταση..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Μέτρηση λέξεων" #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "Εστίαση" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Απεστίαση" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Κα_νονικό Μέγεθος" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Επικεφαλίδα _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Επικεφαλίδα 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Επικεφαλίδα _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Επικεφαλίδα 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Επικεφαλίδα _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Επικεφαλίδα 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Επικεφαλίδα _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Επικεφαλίδα 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Επικεφαλίδα _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Επικεφαλίδα 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "Έ_ντονα" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Έντονα" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "Έμ_φαση" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Έμφαση" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Μαρκάρισμα" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Μαρκάρισμα" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "Μεσο_γράμμιση" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Μεσογράμμιση" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Δείκτης" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Εκ_θέτης" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "Α_υτολεξί" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Αυτολεξί" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Χρήση του για ακολούθηση δεσμών\n" "(Αν είναι απενεργοποιημένο, χρησιμοποιήστε το )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "" "Εμφάνιση του δρομέα ακόμα και στις σελίδες οι οποίες δεν μπορούν να " "τροποποιηθούν" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "" "Αυτόματη μετατροπή λέξεων γραμμένων σε μορφή \"CamelCase\" σε δεσμούς" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Αυτόματη μετατροπή των διαδρομών αρχείων σε δεσμούς" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Αυτόματη επιλογή της τρέχουσας λέξης όταν γίνεται εφαρμογή διαμόρφωσης" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Αφαίρεση εσοχής με το \n" "(Αν είναι απενεργοποιημένο, μπορείτε να χρησιμοποιήσετε το )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Πατώντας επανειλημμένα ένα κουτάκι αλλάζουν διαδοχικά οι καταστάσεις του" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Η αλλαγή στην εσοχή ενός στοιχείου λίστας, αλλάζει και τα υποστοιχεία του" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Η επιλογή σε ένα κουτάκι να αλλάζει και τα υφιστάμενα κουτάκια" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Επαναμορφοποίηση κώδικα markup στο παρασκήνιο" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Προεπιλεγμένη μορφοποίηση για την αντιγραφή κειμένου στο πρόχειρο" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Δεν έχει οριστεί τέτοι wiki: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "_Αντιγραφή Ως..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Μετακίνηση Επιλογής..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Επεξεργασία Ιδιοτήτων" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Ε_πεξεργασία δεμού" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Αντιγραφή _δεσμού" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Αντιγραφή διεύθυνσης email" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Άνοιγμα με..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "Άν_οιγμα" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Εισαγωγή ημερομηνίας και ώρας" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "Ημερολό_γιο" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Δεσμός στην ημερομηνία" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Εισαγωγή εικόνας" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Επισύναψη εικόνων πρώτα" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Μη υποστηριζόμενος τύπος αρχείου: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Επεξεργασία εικόνας" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Τοποθεσία" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Σύνδεση με" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Πλάτος" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Ύψος" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Επαναφο_ρά μεγέθους" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Εισαγωγή κειμένου από αρχείο" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Επεξεργασία δεσμού" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Δεσμός" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Κείμενο" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Επόμενο" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Προηγούμενο" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Ταίριασμα πεζών/_κεφαλαίων" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Πλήρης _λέξη" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Κανονική έκφραση" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "Επι_σήμανση" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Αναζήτηση" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Επιλογές" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Εύρεση και Αντικατάσταση" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Αναζήτηση του" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Αντικατάσταση με" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Αντικατάσταση" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Αντικατάσταση ό_λων" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Μέτρηση λέξεων" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Παράγραφοι" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Λέξεις" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Γραμμές" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Χαρακτήρες" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Μετακίνηση Κειμένου σε Άλλη Σελίδα" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Μετακίνηση" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Μετακίνηση κειμένου σε" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Παραμονή συνδέσμου προς τη νέα σελίδα" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Άνοιγμα νέας σελίδας" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Διεπαφή" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Επεξεργασία" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Προτιμήσεις" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Πρόσθετα" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Χρήση προσαρμοσμένης γραμματοσειράς" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Περισσότερα" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "Ρύ_θμιση" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Εξαρτήσεις" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Χωρίς εξαρτήσεις" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Εντάξει" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Απέτυχε" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Προαιρετική" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Δημιουργός" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Ενεργό" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Πρόσθετο" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Ρύθμιση προσθέτου" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Επιλογές για το πρόσθετο %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Ιδιότητες" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Ιδιότητες σημειωματάριου" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Στην προχωρημένη αναζήτηση μπορείτε να χρησιμοποιήσετε\n" "τους τελεστές AND, OR και NOT. Ανατρέξτε στη σελίδα βοήθειας\n" "για περισσότερες πληροφορίες." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Αναζήτηση μόνο στον τρέχοντα χώρο ονομάτων" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Βαθμολογία" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Ο εξυπηρετητής δεν εκκινήθηκε" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Θύρα" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Ο εξυπηρετητής εκκινήθηκε" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Ο εξυπηρετητής τερματίστηκε" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Επιλογή αρχείου" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Επέκτ_αση όλων" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Σύμπτυξη όλων" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Εκκαθάριση" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Επιλογή φακέλου" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Επιλογή Εικόνας" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "<Κορυφή>" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Απ' ότι φαίνεται μόλις βρήκατε ένα σφάλμα προγραμματισμού" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Όταν καταγράφετε ένα σφάλμα παρακαλοούμε να περιλαμβάνετε\n" "την πληροφορία από το κουτί κειμένου που ακολουθεί" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Όλα τα αρχεία" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Εικόνες" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Υφιστάμενο αρχείο" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Υπάρχει ήδη ένα αρχείο με το όνομα \"%s\".\n" "Μπορείτε να δώσετε άλλο όνομα ή να αντικαταστήσετε το υφιστάμενο αρχείο." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "Περιήγηση" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Αντικατάσταση" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Αδύνατη η εύρεση του αρχείου ή φακέλου αυτού του σημειωματάριου" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Αδύνατη η εύρεση του σημειωματάριου: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Το όνομα σελίδας που δόθηκε δεν είναι έγκυρο.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Μη έγκυρο όνομα σελίδας \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Το ευρετήριο είναι υπό ανανέωση ενώ προσπαθούμε να\n" "εκτελέσουμε μια λειτουργία που απαιτεί το ευρετήριο.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Αδύνατη η τροποποίηση της σελίδας: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwiki Λέξη-κλειδί" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Αρχική σελίδα" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Ριζικός κατάλογος εγγράφου" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Προφίλ" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Κοινόχρηστο σημειωματάριο" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Αριθμητική" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Αριθμητική" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Περιηγητής επισυνάψεων" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Το πρόσθετο αυτό εμφανίζει το φάκελο Επισυνάψεων της τρέχουσας\n" "σελίδας ως λίστα εικονιδίων στο κάτω μέρος της σελίδας.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Συνημμένα" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Άγνωστη" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Μέγεθος" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Τροποποίηση" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Μετακίνηση Εδώ" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "Αντι_γραφή Εδώ" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Ακύρωση" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Αυτοσύνδεση" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Αυτό το ένθετο συνδέει (\"mount\") αυτόματα σημειωματάρα όταν απαιτείται.\n" "Για παράδειγμα, μπορεί να συνδεθεί με απομακρυσμένους δίσκους ή να\n" "ξεκλειδώσει έναν κρυπτογραφημένο δίσκο όταν το zim προσπαθεί να ανοίξει\n" "ένα συγκεκριμένο σημειωματάριο.\n" "Είναι ένα κεντρικό ένθετο που παρέχεται με τη διανομή του zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Σήμε_ρα" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Ημερολό_γιο" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Ημέρα" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Εβδομάδα" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Μήνας" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Έτος" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Εμφάνιση του ημερολογίου στην πλευρική μπάρα αντί διαλόγου" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Χρήση μίας σελίδα για κάθε" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Ημερολόγιο" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Σήμερα" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Διά_γραμμα" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Εισαγωγή διαγράμματος" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Εισαγωγή διαγράμματος" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό παρέχει έναν επεξεργαστή διαγραμμάτων\n" "για το zim βασισμένο στο GraphViz.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Ε_πεξεργασία διαγράμματος" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Εισαγωγή ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Εισαγωγή Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Αυτό το ένθετο παρέχει έναν συντάκτη διαγραμμάτων για το zim,\n" "βασισμένο στο Dita..\n" "\n" "Είναι ένα κεντρικό ένθετο που διανείμεται με το zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Επεξεργασία Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Συνάρτηση" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Εισαγωγή συνάρτησης" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Εισαγωγή συνάρτησης" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό παρέχει έναν επεξεργαστή συναρτήσεων\n" "για το zim βασισμένο στο latex.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Ε_πεξεργασία εξίσωσης" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Εισαγωγή Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Αυτό το ένθετο παρέχει ένα συντάκτη γραφημάτων για το zim,\n" "βασισμένο στο Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Επεξεργασία Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Εισαγωγή GNU R Plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Το πρόσθετο αυτό παρέχει έναν επεξεργαστή σχεδιαγραμμάτων βασισμένο στο GNU " "R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Επεξεργασία GNU R Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Υπολογισμός _μαθηματικής έκφρασης" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Το πρόσθετο υπολογισμού μαθηματικών εκφράσεων απέτυχε\n" "να υπολογίσει την έκφραση στη θέση του δρομέα." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Υπολογιστής μαθηματικών εκφράσεων" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό υπολογίζει απλές\n" "μαθηματικές εκφράσεις στο zim.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Αδύνατη η ανάλυση της έκφρασης" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Σύ_μβολο..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Εισαγωγή συμβόλου" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό εισάγει το διάλογο 'Εισαγωγή συμβόλου' και\n" "κάνει δυνατή τη χρήση τυπογραφικών χαρακτήρων.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "Ταξινόμηση γραμμών" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Ταξινόμος γραμμών" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Αυτό το ένθετο ταξινομεί τις επιλεγμένες γραμμές με\n" "αλφαβητική σειρά. Αν είναι ήδη ταξινομημένες, τότε\n" "αντιστρέφεται η ταξινόμηση (A-Ω σε Ω-Α).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Παρακαλώ επέλεξε περισσότερς από μια γραμμές." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Εμφάνιση χάρτη δεσμών" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Χάρτης δεσμών" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό παρέχει μία γραφική αναπαράσταση της διάρθρωσης\n" "των δεσμών του σημειωματάριου. μπορεί να χρησιμοποιηθεί σαν ένα είδος\n" "\"χάρτη\" που εμφανίζει τον τρόπο με τον οποίο συνδέονται οι σελίδες\n" "μεταξύ τους.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Εκτύπωση στον περιηγητή" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό αποτελεί μια προσωρινή λύση για την έλλειψη\n" "υποστήριξης εκτύπωσης στο zim. Μετατρέπει και εξάγει την τρέχουσα\n" "σελίδα σε html και την ανοίγει τον περιηγητή ιστοσελίδων σας. Εφόσον\n" "ο περιηγητής ιστοσελίδων σας έχει υποστήριξη εκτύπωσης, θα μπορέσετε\n" "να εκτυπώσετε τα δεδομένα σας, έστω και έμμεσα.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "Εμφάνι_ση στον περιηγητή" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Γρήγορη σημείωση..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Γρήγορη σημείωση" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό παρέχει ένα διάλογο μέσω του οποίου μπορείτε\n" "εύκολα να εισάγετε κείμενο ή τα περιεχόμενα του προχείρου σε\n" "μία σελίδα του zim.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Δημιουργία νέας σελίδας για κάθε σημείωση" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Τίτλος" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Άνοιγμα Σελίδας" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "Σ_τιγμιότυπο οθόνης" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Εισαγωγή στιγμιότυπου οθόνης" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό επιτρέπει τη λήψη ενός στιγμιοτύπου οθόνης\n" "και την εισαγωγή του σε μία σελίδα του zim.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Σύλληψη ολόκληρης της οθόνης" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Επιλογή παραθύρου ή περιοχής" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Καθυστέρηση" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "δευτερόλεπτα" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Παρουσιάστηκε κάποιο σφάλμα κατά την εκτέλεση του \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Έλεγχος ορ_θογραφίας" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Έλεγχος ορθογραφίας" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό προσθέτει υποστήριξη ορθογραφικού ελέγχου\n" "με χρήση του gtkspell.\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Δεν ήταν εφικτή η φόρτωση του ορθογράφου για τη γλώσσα: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Αυτό μπορεί να είναι ένδειξη ότι δεν έχουν\n" "εγκατασταθεί τα απαραίτητα λεξικά" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Πίνακας Περιεχομένων" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Αυτό το ένθετο προσθέτει ένα νέο χειριστήριο που\n" "εμφανίζει τον πίνακα περιεχομένων της τρέχουσας σελίδας.\n" "\n" "Πρόκειται για ένα βασικό ένθετο της διανομής του zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Εμφάνιση του Πίνακα ως πλεούμενου χειριστήριου αντί για πλαϊνού" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "ΠΠ" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Υποχώρηση" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Προώθηση" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "κενό" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Αλφαβητική ταξινόμηση" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Ταξινόμηση σελίδων ανά ετικέτα" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Ετικέτες" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Αυτό το ένθετο παρέχει ένα ευρετήριο σελίδων που φιλτράρεται με βάση\n" "την επιλογή ετικετών από ένα σύνεφο.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Λίστα εργασιών" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Αυτό το ένθετο προσθέτει ένα διάλογο που εμφανίζει όλες τις\n" "εκκρεμείς ενέργειες σε ένα σημειωματάριο. Εκκρεμείς ενέργειες\n" "αποτελούν είτε κουτάκια ελέγχου που δεν έχουν τσεκαρισιτεί ή\n" "στοιχεία που έχουν σημειωθεί με ετικέτες όπως \"TODO\" ή \"FIXME\".\n" "Είναι ένα κεντρικό ένθετο που παρέχεται με τη διανομή του zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Θεώρησε όλα τα κουτάκια ως εργασίες" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Μετατροπή ονομάτων σελίδων σε ετικέτες για τις ενέργειες" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Ετικέτες που καταδεικνύουν εργασίες:" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Ετικέττα για επόμενη ενέργεια" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Είναι απαραίτητη η επαναδημιουργία του ετυρετηρίου" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Είναι η πρώτη φορά που ανοίγει αυτή η λίστα ενεργειών.\n" "Για το λόγο αυτό πρέπει να ανασυνταχθεί το ευρετήριο.\n" "Ανάλογα με το μέγεθος αυτού του σημειωματάριου, \n" "μπορεί να απαιτηθούν έως και αρκετά λεπτά. Αυτό δεν \n" "ξανα-απαιτείται για το επόμενο άνοιγμα της λίστας." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Φίλτρο" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Εμφάνιση Μόνο Εκτελέσιμων Ενεργειών" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i ανοικτό αντικείμενο" msgstr[1] "%i ανοικτά αντικείμενα" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Όλες οι εργασίες" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Εργασία" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Ημερομηνία" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Εικονίδιο πλαισίου συστήματος" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Το πρόσθετο αυτό προσθέτει το Εικονίδιο πλαισίου συστήματος\n" "του zim για γρήγορη πρόσβαση στα σημειωματάρια.\n" "\n" "Το πρόσθετο εξαρτάται από την έκδοση 2.10 της Gtk+ (ή νεότερη).\n" "\n" "Είναι ένα από τα πρόσθετα του zim και παρέχεται μαζί του.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Κλασικό εικονίδιο συστήματος.\n" "Να μη χρησιμοποιηθεί το νέου στυλ εικονίδιο κατάστασης στο Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Εμφάνιση ξεχωριστού εικονιδίου για κάθε σημειωματάριο" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Γρήγορη σημείωση..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "Ά_λλα..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Σημειωματάρια" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Wiki Επιφάνειας Εργασίας" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Απο_θήκευση έκδοσης" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "Ε_κδόσεις..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Δεν έχει γίνει καμία αλλαγή από την τελευταία αποθηκευμένη έκδοση του " "σημειωματάριου" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Καμία αλλαγή από την τελευταία αποθηκευμένη έκδοση" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Έλεγχος εκδόσεων" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Αυτό το ένθετο παρέχει έλεχγο εκδόσεων για τα σημειωματάρια.\n" "Το ένθετο υποστηρίζει τα συστήματα ελέγχου εκδόσεων Bazzar,\n" "Git και Mercurial.\n" "\n" "Είναι ένα κεντρικό ένθετο που παρέχεται με τη διανομή του zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Αυτόματη αποθήκευσης έκδοσης σε τακτά χρονικά διαστήματα" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Αυτόματα αποθηκευμένη έκδοση από το zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Ενεργοποίηση του ελέγχου εκδόσεων" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Ο έλεγχος εκδόσεων δεν είναι ενεργός για αυτό το σημειωματάριο.\n" "Θέλετε να τον ενεργοποιήσετε;" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Σύστημα ελέγχου" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Αποθήκευση έκδοσης" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Εισαγάγετε σχόλιο για αυτήν την έκδοση" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Αποθηκευμένη έκδοση από το zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Εκδόσεις" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Σελίδα" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Εμφ_άνιση με Ενδείξεις" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Επιλέξτε μία έκδοση για να δείτε τις αλλαγές μεταξύ εκείνης και της\n" "τρέχουσας κατάστασης. Ή επιλέξτε πολλαπλές εκδόσεις για να δείτε\n" "τις διαφορές που έχουν μεταξύ τους.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Σχόλιο" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "Επαναφο_ρά έκδοσης" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Εμ_φάνιση αλλαγών" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Σε αντιπαραβολή" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Κώδικας Σελίδας με Ενδείξεις" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Επαναφορά σελίδας στην αποθηκευμένη έκδοση;" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Θέλετε να επαναφέρετε τη σελίδα: %(page)s\n" "στην αποθηκευμένη έκδοση: %(version)s;\n" "\n" "Όλες οι αλλαγές που έγιναν μετά την τελευταία\n" "αποθήκευση της σελίδας, θα χαθούν!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Αλλαγές" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Αναθ" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Email client" #~ msgstr "Πελάτης email" #~ msgid "Pages" #~ msgstr "Σελίδες" #~ msgid "_Filter" #~ msgstr "_Φίλτρο" #~ msgid "Output" #~ msgstr "Έξοδος" #~ msgid "Match c_ase" #~ msgstr "Τ_αίριασμα πεζών/κεφαλαίων" #~ msgid "File browser" #~ msgstr "Περιηγητής αρχείων" #~ msgid "Web browser" #~ msgstr "Περιηγητής ιστοσελίδων" #~ msgid "Slow file system" #~ msgstr "Εμφάνιση συστήματος αρχείων" #~ msgid "Prio" #~ msgstr "Προτ" #~ msgid "Text Editor" #~ msgstr "Επεξεργαστής κειμένου" zim-0.60/translations/zh_TW.po0000644000175000017500000023577212137750055016247 0ustar jaapjaap00000000000000msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-25 13:47+0000\n" "Last-Translator: YPWang \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "程式執行錯誤: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "返回碼非零 %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "執行錯誤: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "預設" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "無此檔案:%s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "無法讀取: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "通常指此檔案包含了無效的特殊字元" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "細節" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "檔案無法寫入: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "硬碟裡的檔案已被修改: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "自訂..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "未找到應用程式" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "以 \"%s\" 開啟" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "設定用于打開“%s”連結的程式" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "設定用于打開“%s”類型文件的程式" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "設定應用程式" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "新增應用程式" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "系統預設" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "名稱" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "指令" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "設定預設應用程式" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "開啟檔案" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "打開文件夾" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "刪除檔案" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "刪除" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "選取範圍" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "檔案名稱" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "頁面" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "刪除附件" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "反向選取" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "附件目錄中以下文件不再被使用 " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "未發現不被使用的附件文件" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "自訂工具" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "您可以自訂工具使其顯示於\n" "工具選單、工具列、和滑鼠右鍵選單中" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "編輯自訂工具" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "說明" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "圖示" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "指令不會更動資料" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "顯示於工具列" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "匯出" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "更新索引" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "目錄已存在: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "此為已存在並有檔案之文件夾。若匯入此文件夾將覆蓋現存檔案。要這麼做嗎?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "匯出筆記本" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "已有此檔案" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "已有此檔案\n" "是否覆蓋?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "選擇欲匯出之頁面" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "整部筆記本(_n)" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "單頁(_p)" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "選擇匯出格式" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "其它..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "格式" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "模板" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "以完整路徑鏈結文件根目錄下之文件" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "對應根目錄文件為URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "選擇匯出檔案或文件夾" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "匯出文件夾" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "索引頁" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "匯出檔案" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "預覽(_P)" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "檢視系統紀錄(_L)" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "圖像產生失敗\n" "要儲存原始文字嗎?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "系統紀錄檔" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "文件(_F)" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "編輯(_E)" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "檢視(_V)" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "加入(_I)" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "尋找(_S)" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "格式(_M)" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "工具(_T)" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "前往(_G)" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "幫助(_H)" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "路徑列(_A)" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "工具列(_T)" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "新建頁面(_N)" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "建立子頁面(_U)" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "開啟別的筆記本(_O)..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "於新視窗中開啟(_W)" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "匯入頁面(_I)" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "儲存(_S)" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "另存副本(_C)" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "匯出(_X)" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "傳送至...(_S)" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "移動頁面(_M)" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "重新命名頁面(_R)" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "刪除頁面(_R)" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "屬性(_T)" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "關閉(_C)" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "離開(_Q)" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "搜尋(_S)..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "搜尋反向鏈結(_B)..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "最近更改..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "複製位置(_L)" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "範本(_T)" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "選項(_E)" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "重新載入(_R)" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "開啟附件之文件夾(_F)" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "開啟筆記本之文件夾(_N)" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "開啟文件根目錄(_D)" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "開啟文件夾(_D)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "附加檔案(_F)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "附加外部檔案" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_刪除附件" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "編輯原始碼(_S)" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "啟動 Web 伺服器(_W)" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "更新索引" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "自行定義工具(_T)" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "回返(_B)" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "向後翻頁" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "往前(_F)" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "向前翻頁" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "父頁面(_P)" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "上層頁面" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "子頁面(_C)" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "翻至子頁面" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "上一則索引(_P)" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "上一頁" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "下一則索引(_N)" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "下一頁" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "主頁面(_H)" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "首頁" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "前往(_J)..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "內容(_C)" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "常見問題(_F)" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "快捷鍵(_K)" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "錯誤回報(_B)" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "關於(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "所有窗格(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "顯示所有窗格" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "狀態列(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "側窗格(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "顯示側窗格" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "全螢幕(_F)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "允許編輯筆記本(_E)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "切換是否允許編輯筆記本" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "無(_N)" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "最近頁面(_R)" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "最近更改的頁面(_C)..." #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "歷史(_H)" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "命名空間(_A)" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "圖示和文字(_A)" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "僅圖示(_I)" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "僅文字(_T)" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "大圖示(_L)" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "小圖示(_S)" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "微圖示(T)" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "為選單增加裁切線" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "使用來切換側面板" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "刪除頁面時移除鏈接" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "打開頁面時指標永遠位于上次位置" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "指定之文件或文件夾不存在\n" "請檢查路徑是否正確" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "無此文件或文件夾: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "尋找" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "搜索頁面..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "升級筆記本?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "此筆記本乃由較舊版本之 zim 所建立\n" "您希望現在更新至最新版本嗎?\n" "\n" "此作業需花些時間\n" "並對筆記本進行各種更動\n" "建議先備份再進行升級\n" "\n" "若不升級,某些功能\n" "或將無法正常運作" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "筆記本升級中" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "正忙著更新索引作業全部完成後,才能完整更新所有鏈結若一意執行目前命令,將破壞鏈結。仍想繼續嗎?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "更新鏈結" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "移除鏈結" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "要建立文件夾?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "文件夾\"%s\"不存在\\n\n" "你想新增它嗎?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "無法開啟: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "此頁面無附件目錄" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "正在編輯的文件:%s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "你正使用外部程式編輯檔案,當你完成編輯後再關閉對話視窗。" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "桌面維基" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " DreamerC https://launchpad.net/~dreamerwolf\n" " Henry Lee https://launchpad.net/~henrylee\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Thomas Tsai https://launchpad.net/~thomas.tsai\n" " Tsung https://launchpad.net/~tsunghao\n" " YPWang https://launchpad.net/~blue119\n" " cyberik https://launchpad.net/~cyberikee" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "索引" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "唯讀" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i 個反向鏈結..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "無法儲存頁面: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "欲繼續作業,您可儲存本頁面之副本,或捨棄任何更動\n" "若儲存副本,仍會捨棄更動\n" "但可於稍後回復副本" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "捨棄更動(_D)" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "儲存副本(_S)" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "前往" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "前往頁面" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "新的子頁面" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "新頁面" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "請留意,當鏈結至不存在之頁面\n" "將自動建立新頁面" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "頁面名稱" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "頁面樣式" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "已有此頁面" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "儲存副本" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "匯入頁面" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "文字檔案" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "搬移頁面" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "搬移頁面 \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "更新連結至此書頁共 %i 頁之頁面" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "命名空間" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "重新命名頁面" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "重新命名頁面 \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "更新此頁面之標題" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "刪除頁面" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "刪除頁面 \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "頁面 \"%s\" 及其所屬\n" "所有子頁面和附件,都將被刪除" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "移除連結至此書頁之頁面共 %i 頁之鏈結" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i 檔案將被移除" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "附加檔案" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "頁面 \"%s\" 並無附件之文件夾" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "以鏈結方式加入圖像" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "筆記本" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "開啟筆記本" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "預設筆記本" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "新增筆記本" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "請為您的筆記本選擇名字和文件夾" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "文件夾" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "更新索引..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "還原(_U)" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "取消還原(_R)" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "剪下(_T)" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "複製(_C)" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "貼上(_P)" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "刪除(_D)" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "切換成打勾之勾選框'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "切換成打叉之勾選框'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "編輯鏈結或物件(_E)..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "移除鏈結(_R)" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "日期時間(_D)..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "圖像(_I)..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "項目符號列表" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "順序(_N)列表" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "可復選列表(_x)" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "從檔案加入文字(_F)..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "鏈結(_L)..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "加入鏈結" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "清除格式(_C)" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "尋找(_F)..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "找下一個(_X)" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "找上一個(_V)" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "取代(_R)..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "字數統計..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "放大(_Z)" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "縮小(_O)" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "正常大小(_N)" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "新附件(_A)" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "文件模板(_T)" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "一級標題(_1)" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "一級標題" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "二級標題(_2)" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "二級標題" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "三級標題(_3)" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "三級標題" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "四級標題(_3)" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "四級標題" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "五級標題(_5)" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "五級標題" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "粗體字(_S)" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "粗體字" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "斜體字(_E)" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "斜體字" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "底線字(_M)" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "底線字" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "刪除線(_S)" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "刪除線" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "下標體(_S)" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "上標體(_S)" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "去格式字(_V)" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "去格式字" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "以 鍵追蹤鏈結\n" "(若不勾選,仍可用 來執行)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "於「不允許編輯」之頁面上,仍然顯示游標" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "自動將 \"CamelCase\" 文字轉換為鏈結" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "自動將檔案路徑轉換為鏈結" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "套用格式時,自動選取目前文字" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "以 鍵去除縮排\n" "(若不勾選,仍可用 來執行)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "反復點擊復選框會循環切換復選框的狀態" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "縮排或去除縮排任一條列項,將順勢更動所有子項" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "勾選任一勾選框,將順勢更動所有子項" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "即時重新格式化wiki之標示語法" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "復制到剪貼板文本的預設格式" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "包含附件文件模板的文件夾" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "內部鏈結 %s 無效" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "複製為(_A)..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "移動已選文字..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "(_E)編輯屬性" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "編輯鏈結(_E)" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "複製鏈結(_L)" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "複製電子郵址" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "以...開啟" #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "開啟檔案或鏈結(_O)" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "沒有安裝任何模板" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "\"文件夾\\n\"\n" "\"%s\\n\"\n" "\"不存在。\\n\"\n" "\"您想新增它嗎?\"" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "加入日期時間" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "日曆(_C)" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "鏈結日期(_L)" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "加入圖像" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "先附加圖像" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "不支援的文件類型: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "編輯圖像" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "位置" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "鏈結至" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "寬度" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "高度" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "重設大小(_R)" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "加入檔案裡的文字" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "編輯鏈結" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "鏈結(_L)" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "文字" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "下一個(_N)" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "上一個(_P)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "符合大小寫(_C)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "尋找完整單字(_W)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "正規表達式(_R)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "以高亮度標示(_H)" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "尋找" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "選項" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "尋找並替換" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "尋找" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "替換為" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "替換(_R)" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "替換全部(_A)" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "字數統計" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "段落" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "字" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "行" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "字符" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "移動文本到其它頁面" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "移動(_M)" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "移動文字到" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "保留到新頁面的連結" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "保留到新頁面的連結" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "新增檔案" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "界面" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "編輯" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "選項" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "外掛程式" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "使用自訂字體" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "更多(_M)" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "設定(_O)" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "依賴套件" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "無需依賴其他套件" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "確定" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "失敗" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "可選的" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "作者" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "已啟用" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "外掛程式" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "設定外掛程式" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "外掛程式 %s 之選項" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "屬性" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "筆記本屬性" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "最近更改" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "今天" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "昨天" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "最後更新" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "欲進階搜尋,可使用運算元如AND、OR、NOT\n" "細節可參考「幫助」之內容" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "限定搜索範圍於目前之命名空間" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "相符" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "網頁伺服器" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "伺服器未啟動" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "允許公開存取" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "埠" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "伺服器已啟動" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "伺服器已停止" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "範本" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "瀏覽" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "複製範本" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "選擇檔案" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "展開所有(_A)內容" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "折疊所有(_C)內容" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "清除" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "選擇文件夾" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "選擇圖像" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "左側窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "右側窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "底部窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "頂部窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "左上方" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "左下方" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "右上方" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "右下方" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "好像你發現了一個Bug" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "提交錯誤時請包含以下文字框中的信息" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "全部文件" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "圖像" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "檔案已存在" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "此檔名\"%s\"已存在\\n\n" "你可更改成其它檔名或是直接覆蓋" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "瀏覽(_B)" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "覆蓋" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "找不到此筆記本之檔案或文件夾" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "找不到筆記本: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "指定的頁面名稱無效\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "無效之頁面名稱 \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "索引更新中... \\n\n" "請等待!\\n\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "無法修改頁面: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "內部維基關鍵詞" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "首頁" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "文件根目錄" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "屬性" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "分享筆記" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "算術運算" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "此外掛可在 zim 中嵌入算數計算。\n" "此外掛基于\n" "http://pp.com.mx/python/arithmetic\n" "中的算數模塊。\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "算術(_A)" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "附件瀏覽器" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "視窗中的位置" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "附件" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "顯示附件瀏覽器" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i 個附件(_A)" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "未知狀態" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "文件類型" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "大小" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "修改日期" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "移動到此處(_M)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "複製至此(_C)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "取消" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "自動掛載" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "反向連結窗格" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "反向連結" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "今天(_D)" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "日曆(_D)" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "日誌" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "天" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "週" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "月" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "年" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "不以對話框,而於側邊窗格顯示日曆" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "每個一個頁面" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A (週幾) %d (日) %B (月) %Y (年)" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "日曆" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "今天(_T)" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "圖表(_G)..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "加入圖表" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "加入圖表" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式以 GraphViz 為基礎,提供圖表編輯器\n" "\n" "此為 zim 內附之核心外掛程式\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "編輯圖表(_E)" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "免打擾編輯模式" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "全螢幕時隱藏選單列" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "全螢幕時隱藏工具列" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "全螢幕時隱藏路徑列" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "全螢幕時隱藏狀態列" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "最大頁面寬度" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "垂直邊緣" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "文字背景顏色" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "文字的前景顏色" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "背景顏色" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "插入 ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "插入 ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "編輯(_E) Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "公式(_Q)..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "加入方程式" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "加入方程式" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式提供 latex 之方程式編輯器\n" "\n" "\n" "此為 zim 內附之核心外掛程式\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "編輯公式(_E)" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "插入 Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "該插件提供一個基于Gnuplot的繪圖編輯器\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "編輯Gnuplot(_E)" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "數據圖(_R)..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "加入數據圖" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "此外掛程式以 GNU R 為基礎,提供數據圖表設計語法編輯器\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "編輯數據圖(_E)" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "數據圖" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "執行計算(_M)" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "內置計算機" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "不能解析表達式" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "符號(_m)..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "加入符號" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式提供「加入符號」之對話框\n" "方便自動輸入特殊符號\n" "\n" "此為 zim 內附之核心外掛程式\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "排序(_S)" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "行排序" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "請先選擇多于一行的文字" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "顯示鏈結圖覽" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "鏈結圖覽" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式提供對話框\n" "以圖像顯示筆記本之鏈結結構\n" "以「心像圖覽」方式\n" "呈現頁面之交互關係\n" "\n" "此為 zim 內附之核心外掛程式\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "列印至瀏覽器" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式為尚無列印支援的 zim 提供解決之道\n" "程式將匯出目前頁面為 html 並開啟瀏覽器程式\n" "若瀏覽器具備列印支援\n" "則此方法可利用上述兩個步驟(匯出頁面、開啟瀏覽器)\n" "讓您得以列印您的資料\n" "\n" "此為 zim 內附之核心外掛程式\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "列印至瀏覽器(_P)" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "快速記筆記..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "快速記筆記" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式會使用對話框,迅速而方便的\n" "將某些文字或剪貼簿內容置入 zim 頁面\n" "\n" "此為 zim 內附之核心外掛程式\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "為每則記事建立新頁面" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "標題" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "打開頁面(_P)" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "放棄筆記?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "樂譜(_S)..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "插入樂譜" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "插入樂譜" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "編輯樂譜(_E)" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "螢幕快照(_S)..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "加入螢幕快照" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "快照整面螢幕" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "選擇視窗或區域" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "延遲" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "秒" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "執行\"%s\"時發生錯誤" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "拼字檢查(_S)" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "拼字檢查" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "藉由 gtkspell 提供拼字檢查功能\n" "\n" "此為 zim 內附之核心外掛程式\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "載入 %s 拼寫檢查器失敗" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "目錄" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "浮動顯示目錄(代替側面板)" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "目錄" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "降級" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "提升" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "無標簽" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "依英文字母排序" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "按標簽排序頁面" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "標籤" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "此外掛依據標簽雲中的所選標簽,生成頁面索引\\n\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "工作清單" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式會加入對話框,顯示此筆記本所有未完成之工作項目\n" "此類項目包含未勾選之勾選框\n" "或帶有 \"TODO\" 或 \"FIXME\" 等標籤之項目\n" "\n" "此為 zim 內附之核心外掛程式\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "將所有勾選框視為工作項目" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "將頁面名稱作為任務項的標簽" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "您沒有在日期頁中設置任務的截止日期" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "將任務標記為在週末前的週一或週二到期" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "以標籤註記工作項目" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "下一個任務的標簽" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "要索引的子樹" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "要忽略的子樹" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "需建立筆記本之索引" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "因第一次使用工作清單,需重建索引\n" "筆記本之大小\n" "將決定作業所需時間\n" "但下次重啟清單\n" "則無需再次重建" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "過濾器" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "只顯示可執行任務" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i 件未完成工作" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "所有任務" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "沒有標籤" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "工作項目" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "日期" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "系統匣圖示" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此外掛程式於系統匣增添 zim 圖示以方便存取\n" "\n" "此外掛程式需依賴 Gtk+ 之 2.10 或較新之版本\n" "\n" "此為 zim 內附之核心外掛程式\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "使用舊樣式之系統匣圖示\n" "在 Ubuntu 作業系統上不使用新風格之狀態欄圖示" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "一本筆記本一個圖示" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "快速記筆記(_Q)" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "其它(_O)..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "筆記本" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim 桌面維基" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "儲存版本(_A)" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "所有版本(_V)" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "最近儲存的版本以來,此筆記本至今尚無更動" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "最近版本以來,至今尚無更動" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "版本控制" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "每隔一段間自動儲存" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "zim 自動儲存的版本" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "啟用版本控制?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "此筆記本尚未啟用版本控制功能\n" "需啟用嗎?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "後端" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "儲存版本" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "請為此版本加註" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "zim 儲存之版本" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "版本" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "頁面(_P)" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "檢視註解(_A)" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "選擇一個版本,以檢視該版本與目前版本的差異\n" "或選擇多個版本,以檢視各版本間的差異\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "註記" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "回復版本(_R)" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "顯示更動(_C)" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "並列比較(_S)" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "註解頁面來源" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "恢復頁面至原先儲存之版本?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "您要將頁面:%(page)s\n" "回復至先前儲存的版本:%(version)s 嗎?\n" "\n" "上次儲存版本以來,至今的所有更動都將消失喔!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "更動" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "版本" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "使用 Zeitgeist 記錄事件" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "事件記錄送往 Zeitgeist 伺服器。" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "維基頁面:%s" #~ msgid "Text Editor" #~ msgstr "文字編輯器" #~ msgid "Web browser" #~ msgstr "網頁瀏覽器" #~ msgid "Output" #~ msgstr "輸出" #~ msgid "Match c_ase" #~ msgstr "大小寫相符(_a)" #~ msgid "File browser" #~ msgstr "文件瀏覽器" #~ msgid "Pages" #~ msgstr "頁面" #~ msgid "_Filter" #~ msgstr "過濾器(_F)" #~ msgid "Email client" #~ msgstr "電郵程式" #~ msgid "Slow file system" #~ msgstr "較慢的檔案系統" #~ msgid "Prio" #~ msgstr "優先等級" zim-0.60/translations/it.po0000644000175000017500000025504112137750055015617 0ustar jaapjaap00000000000000# Italian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-15 04:57+0000\n" "Last-Translator: Alessandro Sarretta \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Impossibile eseguire l'applicazione: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "ha restituito uno stato di uscita diverso da zero %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Impossibile avviare %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Predefinito" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "File non trovato: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Impossibile leggere: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Ciò di solito significa che il file contiene caratteri non validi" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Dettagli" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "il file %s non è scrivibile" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Il file %s è stato modificato sul disco" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Personalizza..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Nessuna applicazione trovata" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Apri con \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Scegli un'applicazione per aprire i collegamenti \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Scegli un'applicazione per aprire i file\n" "di tipo \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Configura applicazioni" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Aggiungi applicazione" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Predefinito di sistema" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nome" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Comando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Rendi l'applicazione predefinita" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Apri file" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Apri cartella" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Elimina file" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Elimina" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selezione" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nome file" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Pagina" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Rimuovi allegati" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inverti selezione" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "I seguenti file sono stati trovati nella cartella degli allegati di Zim ma " "non sono più \n" "collegati al blocco note. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nessun file orfano trovato." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Strumenti personalizzati" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "È possibile configurare gli strumenti personalizzati che appariranno\n" "nel menù strumenti e nella barra strumenti o nel menù contestuale." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Modifica gli strumenti personalizzati" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descrizione" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Icona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Il comando non modifica i dati" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Mostra nella barra degli strumenti" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "I seguenti parametri verranno sostituiti\n" "all'esecuzione del comando:\n" "\n" "%f il file sorgente della pagina come file temporaneo\n" "%d la cartella degli allegati della pagina corrente\n" "%s il file sorgente della pagina (se esiste)\n" "%n il percorso del blocco note (file o cartella)\n" "%D la cartella principale dei documenti (se esiste)\n" "%t il testo selezionato o la parola sotto il cursore\n" "%T il testo selezionato inclusa la formattazione wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Esporta" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Aggiornamento dell'indice in corso" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Cartella già esistente: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "La cartella esiste già e non è vuota; esportando in questa cartella i file " "contenuti potrebbero essere sovrascritti. Continuare?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Esportazione blocco note" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Il file esiste già" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Questo file esiste già.\n" "Sovrascriverlo veramente?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Seleziona pagina da esportare" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Blocco _note completo" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "_Pagina singola" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Seleziona il formato di esportazione" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Altro..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formato" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Modello" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Collega i file alla cartella principale dei documenti indicando il percorso " "completo" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Fai corrispondere la cartella principale dei documenti all'URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Seleziona il file o la cartella di destinazione" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Cartella di destinazione" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Indice" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "File di destinazione" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Anteprima" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Visualizza _registro" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Si è verificato un errore durante la creazione dell'immagine.\n" "Salvare comunque il testo sorgente?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "File di registro" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_File" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Modifica" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Visualizza" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Inserisci" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Cerca" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mato" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "S_trumenti" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Vai" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "A_iuto" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "B_arra di navigazione" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Barra degli strumenti" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nuova pagina..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nuova s_ottopagina" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Apri un altro blocco note..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Apri in una nuova _finestra" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importa pagina..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Salva" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Salva una _copia..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Esporta..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Invia a..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Sposta pagina..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Rinomina pagina..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Elimina pagina" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Proprie_tà" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Chiudi" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Esci" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Cerca..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Cerca _link entranti..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Modifiche Recenti" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copia _posizione" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Modelli" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Pr_eferenze" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Ricarica" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Apri cartella _allegati" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Apri la cartella del _blocco note" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Apri la cartella principale dei _documenti" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Apri la cartella principale dei _documenti" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Allega _file" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Allega file esterno" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Pulisci allegati" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Modifica _sorgente" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Avvia server _Web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Aggiorna indice" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Strumen_ti personalizzati" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Indietro" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Vai alla pagina precedente" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Avanti" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Vai alla pagina successiva" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Livello superiore" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Vai alla pagina superiore" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Livello inferiore" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Vai alla pagina inferiore" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "Voce _precedente nell'indice" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Vai alla pagina precedente" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "Voce _successiva dell'indice" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Vai alla pagina successiva" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Pagina iniziale" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Vai alla pagina iniziale" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Vai a..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contenuti" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "Domande _frequenti" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Scorciatoie da tastiera" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bug" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Informazioni" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "Tutti i pannelli" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Mostra tutti i pannelli" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Barra di _stato" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "Riquadri _Laterali" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Mostra Riquadri Laterali" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "Schermo _intero" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Blocco note _modificabile" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Rendi modificabile il blocco note" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Nessuno" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Pagine _recenti" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Pagine modificate recentemente" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Cronologia" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_amespace" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Testo _e icone" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Solo _icone" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Solo _testo" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Icone _grandi" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Icone _piccole" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Icone _minuscole" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Aggiungi linee tratteggiate ai menù" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Usa per passare al pannello laterale" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Rimuovi collegamenti alla cancellazione delle pagine" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Utilizza sempre l'ultima posizione del cursore quando si apre una pagina" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Il file o la cartella specificata non esiste.\n" "Controllare se il percorso è corretto." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Nessun file o cartella: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Cerca" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Aggiorna blocco note?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Questo blocco note è stato creato in una versione precedente di Zim.\n" "Aggiornarlo subito all'ultima versione?\n" "\n" "L'aggiornamento richiederà del tempo e potrebbe apportare diverse modifiche\n" "al blocco note. Di solito è una buona idea effettuare una\n" "copia di sicurezza prima di procedere.\n" "\n" "Se si sceglie di non effettuare subito l'aggiornamento, alcune " "caratteristiche\n" "potrebbero non funzionare come previsto." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Aggiornamento blocco note in corso" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "L'aggiornamento dell'indice è ancora in corso. Fino a quando non sarà " "terminato, non è possibile aggiornare correttamente i collegamenti. " "Effettuare adesso tale operazione potrebbe alterare i collegamenti. " "Continuare?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Aggiornamento dei collegamenti in corso" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Rimozione dei collegamenti in corso" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Creare la cartella?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Impossibile aprire: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Questa pagina non ha una cartella per gli allegati" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Modifica del file: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Si sta modificando un file con un'applicazione esterna. Al termine si può " "chiudere questa finestra di dialogo." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Un wiki per il desktop" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Alessandro Sarretta https://launchpad.net/~alessandro-sarretta\n" " Calogero Bonasia https://launchpad.net/~0disse0\n" " Davide Truffa https://launchpad.net/~catoblepa\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Jacopo Moronato https://launchpad.net/~jmoronat\n" " Marco Cevoli https://launchpad.net/~marco-cevoli\n" " Mario Calabrese https://launchpad.net/~mario-calabrese\n" " Martino Barbon https://launchpad.net/~martins999\n" " Matteo Ferrabone https://launchpad.net/~desmoteo-gmail\n" " Nicola Gramola https://launchpad.net/~nicola-gramola\n" " Nicola Jelmorini https://launchpad.net/~jelmorini\n" " Nicola Moretto https://launchpad.net/~nicola88\n" " Nicola Piovesan https://launchpad.net/~piovesannicola\n" " igi https://launchpad.net/~igor-cali" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Indice" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Sola lettura" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _link entranti..." msgstr[1] "%i _link entranti..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Impossibile salvare la pagina: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Per continuare è possibile salvare una copia di questa pagina o scartare\n" "tutte le modifiche. Se se ne salva una copia, le modifiche saranno comunque\n" "scartate, ma sarà possibile ripristinare la copia in seguito." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Scarta _modifiche" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Salva copia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Vai a" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Vai alla pagina" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nuova sottopagina" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nuova pagina" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Verrà creata una nuova pagina, perché si sta inserendo\n" "un collegamento a una pagina inesistente." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nome della pagina" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Modello di pagina" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Pagina già esistente" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Salva copia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importa pagina" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "File di testo" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Sposta pagina" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Sposta la pagina \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Aggiorna %i collegamento che punta alla pagina corrente" msgstr[1] "Aggiorna %i collegamenti che puntano alla pagina corrente" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Namespace" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Rinomina pagina" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Rinomina la pagina \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Aggiorna il titolo di questa pagina" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Elimina pagina" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Eliminare la pagina \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Verrà eliminata la pagina \"%s\", insieme\n" "a tutti gli allegati e le relative sottopagine." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Rimuovi i collegamenti da %i pagina che rimandano a questa pagina" msgstr[1] "Rimuovi i collegamenti da %i pagine che rimandano a questa pagina" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "Verrà eliminato %i file" msgstr[1] "Verranno eliminati %i file" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Allega file" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "La pagina \"%s\" non ha una cartella per gli allegati" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Inserisci le immagini come collegamenti" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Blocco note" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Apri blocco note" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Blocco note predefinito" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Aggiungi blocco note" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Selezionare un nome e una cartella per questo blocco note." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Cartella" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Aggiornamento indice in corso..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Annulla" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Ripeti" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Taglia" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copia" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Incolla" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Elimina" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Attiva la casella 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Attiva la casella 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Modifica oggetto o collegamento..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Rimuovi collegamento" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Data e ora..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Immagine..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Elenco pun_tato" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Elenco _numerato" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Elenco con casella di controllo" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Testo da _file..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Collegamento..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Inserisci collegamento" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Elimina formattazione" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Trova..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Trova s_uccessivo" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Trova _precedente" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Sostituisci..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Conteggio parole..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Aumenta ingrandimento" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Riduci ingrandimento" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Dimensioni _normali" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nuovo _Allegato" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "_Modelli di file..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Titolo _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Titolo 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Titolo _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Titolo 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Titolo _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Titolo 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Titolo _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Titolo 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Titolo _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Titolo 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Grassetto" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Grassetto" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Corsivo" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Corsivo" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Evidenziato" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Evidenziato" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Barrato" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Barrato" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Pedice" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Apice" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Premi il tasto per visitare i collegamenti\n" "(se disabilitato puoi comunque usare la combinazione di tasti )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Mostra il cursore anche per le pagine non modificabili" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "" "Converti automaticamente le parole composte con le iniziali maiuscole " "(\"CamelCase\") in un collegamento" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Converti automaticamente i percorsi dei file in collegamenti" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Seleziona automaticamente la parola corrente quando si applica la " "formattazione" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Premi il tasto per ridurre l'indentazione\n" "(se disabilitato puoi ancora usare la combinazione )." #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Facendo clic su una casella di controllo si alternano gli stati della " "casella stessa" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "Ridurre l'indentazione di un elemento dell'elenco la riduce anche ad ogni " "sottoelemento" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" "Contrassegnando una casella di controllo si contrassegnano anche gli " "eventuali sottoelementi" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Riformatta al volo il markup del wiki" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Formato predefinito per la copia di testo negli appunti" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Cartella con i modelli per i file allegati" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Nessun wiki definito: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copi_a come..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Sposta il testo selezionato..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Modifica Proprietà" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Modifica collegamento" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copia _collegamento" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copia indirizzo e-mail" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Apri con..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Apri" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Nessun modello installato" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "La cartella\n" "%s\n" "non esiste.\n" "Crearla adesso?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Inserisci data e ora" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendario" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Collega alla data" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Inserisci immagine" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Prima allega un'immagine" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Tipo di file non supportato: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Modifica immagine" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Percorso" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Collega a" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Larghezza" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Altezza" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Ripristina dimensioni" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Inserisci testo da file" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Modifica collegamento" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Collegamento" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Testo" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Successivo" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Precedente" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Corrispondenza _maiuscole/minuscole" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Intera _parola" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Espressione _regolare" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Evidenzia" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Trova" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opzioni" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Cerca e sostituisci" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Cerca qualcosa" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Sostituisci con" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "S_ostituisci" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Sostituisci _tutto" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Conteggio parole" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paragrafo" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Parole" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Righe" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caratteri" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Sposta il testo nell'altra pagina" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Sposta" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Sposta il testo in" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Lascia il collegamento alla nuova pagina" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Apri nuova pagina" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Nuovo file" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interfaccia" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Formattazione" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferenze" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Estensioni" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Usa carattere personalizzato" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "A_ltro" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigura" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dipendenze" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Nessuna dipendenza" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Non riuscito" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opzionale" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autore" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Attivo" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Estensione" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configura estensione" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opzioni estensione %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Proprietà" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Proprietà blocco note" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Modifiche recenti" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Oggi" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Ieri" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Ultima Modifica" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Si possono eseguire ricerche avanzate con gli operatori\n" "AND, OR e NOT. Consulta la guida in linea (Aiuto) per ulteriori dettagli." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limita la ricerca al namespace corrente" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Occorrenze" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Server Web" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server non avviato" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Porta" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server avviato" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server arrestato" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Modelli" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Esplora" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Copia Modello" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Seleziona file" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Espandi _tutto" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Collassa tutto" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Cancella" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Seleziona cartella" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Seleziona immagine" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Pannello laterale sinistro" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Pannello laterale destro" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Pannello inferiore" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Pannello superiore" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "In alto a sinistra" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "In basso a sinistra" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "In alto a destra" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "In basso a destra" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Apparentemente è stato rilevato un bug." #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Quando si segnala questo bug, includere\n" "i dati contenuti nella casella di testo sottostante." #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Tutti i file" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Immagini" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "File già esistente" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Esiste già un file con il nome \"%s\".\n" "È possibile utilizzare un altro nome o sovrascrivere il file esistente." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Sfoglia" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Sovrascrivi" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Impossibile trovare il file o la cartella di questo blocco note." #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Impossibile trovare il blocco note: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Il nome della pagina indicato non è valido.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nome dalla pagina non valido \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "L'aggiornamento dell'indice è ancora in corso al momento\n" "di realizzare un'operazione che necessita dell'indice.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Impossibile modificare la pagina: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Parola chiave interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Pagina iniziale" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Cartella principale dei documenti" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profilo" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Blocco note condiviso" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetica" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetica" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Sfoglia allegati" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Questa estensione mostra la cartella allegati della pagina attuale come\n" "un'icona nel pannello inferiore.\n" "\n" "Questa estensione è ancora in fase di sviluppo.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Posizione nella finestra" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Allegati" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Allegato" msgstr[1] "%i _Allegati" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Sconosciuto" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Tipo" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Dimensioni" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modificato" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Sposta qui" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copia qui" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Annulla" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Montaggio automatico" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione può \"montare\" automaticamente blocchi note quando è " "necessario. Ad esempio,\n" "può essere usata per connettersi a unità remote o per sbloccare un disco " "criptato\n" "quando Zim cerca di aprire uno specifico blocco note.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Pannello link entranti" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge un nuovo widget che mostra \n" "l'elenco delle pagine collegate a quella corrente.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Link entranti" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Oggi" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_dario" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Diario" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Questa estensione trasforma un namespace in un diario\n" "con una pagina per ogni giorno, settimana o mese.\n" "Aggiunge anche un widget calendario per accedere alle pagine.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Giorno" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Settimana" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mese" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Anno" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "" "Mostra il calendario nel pannello laterale anziché in una finestra di dialogo" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Usa una pagina per ogni" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendario" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Oggi" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gramma..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Inserisci diagramma" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Inserisci diagramma" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione mette a disposizione di Zim un editor di diagrammi basato " "su GraphViz.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Modifica diagramma" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Redazione senza distrazioni" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Questa estensione aggiunge alcune impostazioni per usare Zim\n" "come un editor senza distrazioni.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Nascondi la barra dei menu in modalità schermo intero" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Nascondi la barra degli strumenti in modalità schermo intero" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Nascondi la barra del percorso in modalità schermo intero" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Nascondi la barra di stato in modalità schermo intero" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Larghezza massima della pagina" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Margine verticale" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Colore di sfondo del testo" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Colore di primo piano del testo" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Colore di sfondo dello schermo" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Inserisci Ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Inserisci Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione mette a disposizione di Zim un editor di diagrammi basato " "su Ditaa.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Modifica ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_quazione..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Inserisci equazione" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Inserisci equazione" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione mette a disposizione di Zim un editor di equazioni basato " "su LaTeX.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Modifica equazione" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Inserisci Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Questa estensione mette a disposizione di Zim un editor di grafici plot " "basato su Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Modifica Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Grafico GNU _R..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Inserisci grafico GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Questa estensione mette a disposizione di Zim un editor di grafici plot " "basato su GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Modifica grafico GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Valuta espressione _matematica" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "L'estensione Calcolatrice in linea non è stata in grado\n" "di valutare l'espressione alla posizione del cursore." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calcolatrice in linea" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione permette di valutare semplici\n" "espressioni matematiche in Zim.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Impossibile analizzare l'espressione" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Si_mbolo..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Inserisci simbolo" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge la finestra di dialogo 'Inserisci simbolo' e " "permette\n" "la formattazione automatica di caratteri tipografici.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Ordina linee" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Ordina linee" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Questa estensione ordina alfabeticamente le righe selezionate.\n" "Se l'elenco è già ordinato, l'ordine viene invertito\n" "(da A-Z a Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Scegliere più di una riga di testo prima di ordinare il testo." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Mostra mappa dei collegamenti" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mappa dei collegamenti" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione mette a disposizione una finestra di dialogo con una\n" "rappresentazione grafica della struttura dei collegamenti del\n" "blocco note. Può essere utilizzata come una specie di \"mappa mentale\"\n" "che mostra le relazioni fra le pagine.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Stampa su browser" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione fornisce una soluzione alternativa alla mancanza del\n" "supporto alla stampa in Zim. Esporta la pagina corrente\n" "in formato HTML e la apre in un browser. Supponendo che il browser\n" "consenta la funzionalità di stampa, si potrà\n" "stampare la pagina con due clic.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Stampa su browser" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Annotazione veloce..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Annotazione veloce" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge una finestra di dialogo per copiare rapidamente " "del testo \n" "o il contenuto degli appunti in una pagina di Zim.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Crea una nuova pagina per ogni annotazione" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titolo" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Apri _pagina" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Elimina la nota" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "P_artitura..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Inserisci partitura" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Inserisci Partitura" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione mette a disposizione un editor di partiture per zim basato " "su GNU Lilypond.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Includi intestazione" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Includi piè di pagina" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Modifica partitura" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Screenshot..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Inserisci screenshot" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione crea un'istantanea dello schermo e la inserisce\n" "in una pagina di Zim.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Cattura l'intero schermo" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Seleziona finestra o regione" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Ritardo" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "secondi" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Si è verificato un errore mentre veniva eseguito \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Controllo _ortografico" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Controllo ortografico" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge la funzionalità di controllo ortografico mediante " "gtkspell.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Impossibile caricare il correttore ortografico per la lingua: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Probabilmente non è stato installato\n" "il dizionario corretto" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Sommario" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge un widget che visualizza il sommario\n" "della pagina corrente.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Mostra il sommario come widget mobile anziché nel pannello laterale" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Sommario" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Diminuisci di livello" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Aumenta di livello" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "senza etichetta" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Ordina alfabeticamente" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Ordina pagine per etichette" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etichette" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Questa estensione mette a disposizione l'indice delle pagine filtrato " "attraverso la selezione\n" "di una o più etichette da una tag cloud.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Elenco attività" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge una finestra di dialogo che visualizza tutte le " "attività in sospeso\n" "presenti nel blocco note. Le attività in sospeso possono essere caselle di " "controllo\n" "o elementi marcati con le etichette \"TODO\" (da fare) o \"FIXME\" (da " "risolvere).\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Considera tutte le caselle di controllo come attività" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Converti il nome della pagina in etichette per le attività" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" "Assegna automaticamente la scadenza alle attività nelle pagine del calendario" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Segnala attività in scadenza lunedì o martedì prima del fine settimana." #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Le etichette identificano le attività" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Etichetta per l'attività successiva" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Etichetta per attività non eseguibili" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Sottoalbero da indicizzare" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Sottoalbero da ignorare" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "È necessario indicizzare il blocco note" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "È la prima volta che viene aperta la lista delle attività.\n" "Pertanto l'indice dev'essere ricostruito.\n" "A seconda delle dimensioni del blocco note l'operazione può\n" "richiedere anche diversi minuti. Al prossimo uso della\n" "lista delle attività tale operazione non sarà più necessaria." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtro" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Mostra solo attività eseguibili" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i elemento aperto" msgstr[1] "%i elementi aperti" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Tutte le attività" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Nessuna etichetta" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Attività" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Data" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Icona nell'area di notifica" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge un'icona all'area di notifica per un accesso " "rapido.\n" "\n" "Questa estensione necessita di Gtk+, versione 2.10 o più recente.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Stile classico per l'icona nell'area di notifica;\n" "non utilizzare il nuovo stile per lo stato dell'icona in Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Mostra un'icona separata per ciascun blocco note" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "Annotazione _veloce..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Altro..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Blocchi note" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "S_alva versione..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versioni..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Non sono state apportate modifiche a questo blocco note rispetto all'ultima " "versione salvata." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Nessuna modifica dall'ultima versione" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Controllo versione" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Questa estensione aggiunge il controllo versione ai blocchi note.\n" "\n" "\n" "L'estensione supporta i sistemi di controllo versione Bazaar, Git e " "Mercurial.\n" "\n" "È un'estensione di base distribuita insieme a Zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Salva automaticamente ad intervalli regolari" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Versione salvata in automatico da Zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Abilitare il controllo versione?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Al momento il controllo versione non è abilitato per questo blocco note.\n" "Abilitarlo?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Backend" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Salva versione" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Inserire un commento per questa versione" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versione salvata da Zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versioni" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Pagina" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Visualizza _annotazioni" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Seleziona una versione per visualizzare i cambiamenti tra la versione scelta " "e quella\n" "corrente. Oppure seleziona versioni multiple per visualizzare i cambiamenti " "tra di esse.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Commento" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Ripristina versione" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Mostra _modifiche" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Affiancate" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Sorgente pagina annotato" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Ripristinare la pagina alla versione salvata?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Ripristinare la pagina: %(page)s\n" "alla versione salvata: %(version)s ?\n" "\n" "Verranno perse tutte le modifiche effettuate dall'ultima versione salvata." #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Modifiche" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Registra eventi con Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Invia eventi al demone di Zeitgeist" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Pagina wiki: %s" #~ msgid "Web browser" #~ msgstr "Browser Web" #~ msgid "Pages" #~ msgstr "Pagine" #~ msgid "Output" #~ msgstr "Risultato" #~ msgid "Match c_ase" #~ msgstr "M_aiuscole" #~ msgid "Prio" #~ msgstr "Priorità" #~ msgid "_Filter" #~ msgstr "_Filtro" #~ msgid "Text Editor" #~ msgstr "Editor di testi" #~ msgid "Slow file system" #~ msgstr "File system remoto" #~ msgid "File browser" #~ msgstr "File manager" #~ msgid "Email client" #~ msgstr "Client di posta elettronica" zim-0.60/translations/de.po0000644000175000017500000025430512137750055015575 0ustar jaapjaap00000000000000# German translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-21 18:48+0000\n" "Last-Translator: lootsy \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Anwendung konnte nicht gestartet werden: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "Aufruf von %(cmd)s fehlgeschlagen. Fehlercode: %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Konnte nicht starten: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Standard" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Datei nicht gefunden: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Lesen von %s nicht möglich!" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Gewöhnlich bedeutet dies, dass die Datei ungültige Zeichen enthält." #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Details" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Datei ist nicht schreibbar: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Die Datei wurde auf der Festplatte geändert: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Anpassen..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Keine Anwendungen gefunden" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Mit »%s« öffnen" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Eine Anwendung zum Öffnen von \"%s\"-Links konfigurieren" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Anwendung auswählen, mit der Dateien vom Typ \"%s\" geöffnet werden sollen." #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Anwendungen konfigurieren" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Anwendung hinzufügen" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Systemvorgabe" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Name" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Befehl" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Zur Standardanwendung machen" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Datei öffnen" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Ordner öffnen" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Datei löschen" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Löschen" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Auswahl" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Dateiname" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Seite" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Anhangverzeichnis bereinigen" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Auswahl umkehren" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Die folgenden Dateien liegen im Anhangverzeichnis von Zim, sind aber im " "Notizbuch nicht mehr verlinkt. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Keine verwaisten Dateien gefunden." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Benutzerdefinierte Werkzeuge" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Sie können benutzerdefinierte Werkzeuge erstellen, die im Werkzeugmenü,\n" "der Werkzeugleiste und in Kontextmenüs erscheinen." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Benutzerdefiniertes Werkzeug bearbeiten" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Beschreibung" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Symbol" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Befehl verändert keine Daten" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Erscheint in Werkzeugleiste" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "\"Die folgenden Parameter werden im Befehl ersetzt, wenn er ausgeführt " "wird:\\n\"\n" "\"\\n\"\n" "\"%f eine temporäre Datei mit dem Quelltext der aktuellen Seite\\n\"\n" "\"%d das Anhangverzeichnis der aktuellen Seite\\n\"\n" "\"%s die Quelltextdatei der aktuellen Seite (falls vorhanden)\\n\"\n" "\"%n der Pfad des Notizbuchs (Datei oder Ordner)\\n\"\n" "\"%D das Wurzelverzeichnis des Dokuments (falls vorhanden)\\n\"\n" "\"%t markierter Text oder Wort unter dem Cursor\\n\"\n" "\"%T markierter Text oder Wort unter dem Cursor mit Wiki-" "Formatierung\\n\"\n" "\"\\n\"\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportieren" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Index wird aktualisiert …" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Ordner besteht bereits: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Das Verzeichnis existiert bereits und enthält Dateien. Wenn Sie in dieses " "Verzeichnis exportieren, überschreiben Sie vielleicht existierende Dateien. " "Wollen Sie weiter machen?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Notizbuch wird exportiert" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Die Datei existiert bereits" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Diese Datei existierst bereits.\n" "Soll sie überschrieben werden?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Wählen Sie die zu exportierenden Seiten" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Komplettes _Notizbuch" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Einzelne _Seite" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Wählen Sie das Exportformat" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Anderes …" #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Vorlage" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Verlinke Dateien im Dokumentverzeichnis mit vollständigem Pfad" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Dokumentverzeichnis auf URL abbilden" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Wählen Sie den Ausgabeordner" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Ausgabeverzeichnis" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Indexseite" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Ausgabedatei" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Vorschau" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "_Protokoll anzeigen" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Während des Erstellen der Grafik trat ein Fehler auf.\n" "Möchten Sie den Quelltext trotzdem speichern?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Protokolldatei" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Datei" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Bearbeiten" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Ansicht" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Einfügen" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Suchen" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Werkzeuge" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Gehe zu" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Hilfe" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Pf_adleiste" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Werkzeugleiste" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Neue Seite..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Neue Unter_seite..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "Ein neues Notizbuch _öffnen" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "In neuem _Fenster öffnen" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "Seite _importieren..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Speichern" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Eine _Kopie speichern..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportieren..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Senden an …" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "Seite _verschieben..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "Seite _umbenennen..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "Seite _löschen" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Eigenschaften" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Schließen" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Beenden" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "Notizbuch durchsuchen" #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Suche nach _Backlinks..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Letzte Änderungen..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Seiten_pfad kopieren" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Vorlagen" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Einstellungen" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Neu laden" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "_Anhangverzeichnis öffnen" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "N_otizbuchverzeichnis öffnen" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "_Dokumentverzeichnis öffnen" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "_Dokumentverzeichnis öffnen" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Datei an_hängen" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Externe Datei anhängen ..." #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Anhangverzeichnis bereinigen" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "_Quelltext bearbeiten" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "_Webserver starten" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Index aktualisieren" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Benu_tzerdefinierte Werkzeuge" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Zurück" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Zurück" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Weiter" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Eine Seite weiter" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Übergeordnete Seite" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Gehe zur übergeordneten Seite" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Untergeordnete Seite" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Gehe zur untergeordneten Seite" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Vorige Seite im Index" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Gehe zur vorherigen Seite" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Nächste Seite im Index" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Gehe zur nächsten Seite" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Startseite" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Startseite" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Springe zu..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Inhalt" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Tastenkombinationen" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Fehlermeldungen" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Über" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Alle Fensterbereiche" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Zeige alle Fensterbereiche" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statuszeile" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Seitenbereiche" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Zeige Seitenbereiche" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Vollbild" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Schr_eibschutz für Notizbuch" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Schreibschutz für Notizbuch umschalten" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Nichts" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Zuletzt besuchte Seiten" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Zuletzt _geänderte Seiten" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Verlauf" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_amensraum" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Symbole _und Text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Nur _Symbole" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Nur _Text" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Große Symbole" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Kleine Symbole" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Winzige Symbole" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Menüs 'abreißbar' machen" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Mit in die Seitenleiste springen" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Links entfernen, wenn Seiten gelöscht werden" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Verwende immer die letzte Cursorposition beim Öffnen einer Seite" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Die angegebene Datei oder das Verzeichnis existiert nicht.\n" "Bitte überprüfen Sie ob die Pfadangabe korrekt ist." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Datei oder Verzeichnis %s existiert nicht" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Suche" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Seiten durchsuchen..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Notizbuch aktualisieren?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Diese Notizbuch wurde mit eine älteren Version von Zim erstellt\n" "Wollen Sie es auf den neuesten Stand aktualisieren?\n" "\n" "Die Aktualisierung wird etwas dauern und Änderungen am\n" "Notizbuch vornehmen. Es wird empfohlen, das Nozibuch vorher \n" "zu sichern.\n" "\n" "Wenn Sie die Aktualisierung jetzt nicht durchführen, arbeitet Zim\n" "unter Umständen nicht so wie erwartet." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Notizbuch wird aktualisiert" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Der Index wird gerade aktualisiert. Bis dieser Vorgang abgeschlossen ist " "können Verknüpfungen nicht korrekt aktualisiert werden. Das Ausführen dieser " "Aktion kann zu fehlerhaften Verknüpfungen führen. Wollen sie trotzdem " "fortfahren?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Anpassen der Verknüpfungen" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Links entfernen" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Verzeichnis erstellen?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "Der Ordner \"%s\" existiert nicht.\n" "Möchten Sie ihn jetzt anlegen?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "%s kann nicht geöffnet werden" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Diese Seite hat kein Verzeichnis für Anhänge" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Datei bearbeiten: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Sie bearbeiten eine Datei in einer externen Anwendung. Schließen Sie den " "Dialog, wenn dieser Vorgang beendet ist." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Ein Desktop Wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Arnold S https://launchpad.net/~arnold.s\n" " BBO https://launchpad.net/~bbo\n" " Christoph Fischer https://launchpad.net/~christoph.fischer\n" " Christoph Zwerschke https://launchpad.net/~cito\n" " Fabian Affolter https://launchpad.net/~fab-fedoraproject\n" " Fabian Moser https://launchpad.net/~fmos\n" " Ghenrik https://launchpad.net/~ghenrik-deactivatedaccount\n" " Gunnar Thielebein https://launchpad.net/~lorem-ipsum\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Johannes Reinhardt https://launchpad.net/~johannes-reinhardt\n" " Klaus Vormweg https://launchpad.net/~klaus-vormweg\n" " Matthias Mailänder https://launchpad.net/~mailaender\n" " P S https://launchpad.net/~pascal-sennhauser\n" " SanskritFritz https://launchpad.net/~sanskritfritz+launchpad\n" " hruodlant https://launchpad.net/~hruodlant\n" " lootsy https://launchpad.net/~lootsy\n" " mrk https://launchpad.net/~m-r-k\n" " smu https://launchpad.net/~smu\n" " sojusnik https://launchpad.net/~sojusnik\n" " ucn| https://launchpad.net/~ucn\n" " zapyon https://launchpad.net/~zapyon" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "schreibgeschützt" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Backlink..." msgstr[1] "%i _Backlinks..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Seite %s konnte nicht gespeichert werden" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Sie können an dieser Stelle eine Kopie dieser Seite speichern oder \n" "die Änderungen verwerfen. Wenn Sie eine Kopie speichern, werden \n" "die Änderungen auch verworfen, Sie können Sie aber später aus der \n" "Kopie wieder herstellen." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Änderungen _verwerfen" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Kopie speichern" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Gehe zu" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Gehe zur Seite" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Neue Unterseite" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Neue Seite" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Bitte beachten Sie, dass der Link auf eine nicht\n" "existierende Seite automatisch eine neue, leere \n" "Seite erzeugt" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Seitenname" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Seiten Vorlage" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Seite existiert bereits" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Kopie speichern" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Seite importieren" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Textdateien" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Seite verschieben" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Seite \"%s\" verschieben" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "%i Link auf diese Seite werden angepasst" msgstr[1] "%i Links auf diese Seite werden angepasst" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Namensraum" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Seite umbenennen" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Seite \"%s\" umbenennen" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Seitentitel wird angepasst" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Seite löschen" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Seite \"%s\" löschen?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Seite \"%s\" sowie alle Unterseiten \n" "und Anhänge werden gelöscht" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Entferne Links von %i Seite, die zu dieser Seite verlinkt" msgstr[1] "Entferne Links von %i Seiten, die zu dieser Seite verlinken" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i Datei wird gelöscht" msgstr[1] "%i Dateien werden gelöscht" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Datei anhängen" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Seite \"%s\" hat kein Verzeichnis für Anhänge" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Bild als Link einfügen" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notizbuch" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Notizbuch öffnen" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Standard-Notizbuch" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Notizbuch hinzufügen" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Bitte wählen sie einen Namen und Ort für das Notizbuch" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Verzeichnis" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Der Index wird eneuert..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Rückgängig" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Wiederherstellen" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Ausschneiden" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopieren" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Einfügen" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Löschen" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Ankreuzfeld 'v' umschalten" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Ankreuzfeld 'x' umschalten" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "Link oder Objekt _bearbeiten..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "Ve_rknüpfung entfernen" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Datum und Zeit..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Bild..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Aufz_ählung" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Nummerierte Liste" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Ankreu_zliste" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text aus _Datei..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Link..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Verknüpfung einfügen" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Formatierung entfernen" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Suchen…" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "_Weitersuchen" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "_Rückwärts suchen" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Ersetzen…" #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Wortanzahl..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "Ver_größern" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Ver_kleinern" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Standardgröße" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Neuer _Anhang" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Datei_vorlagen ..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Überschrift _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Überschrift 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Überschrift _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Überschrift 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Überschrift _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Überschrift 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Überschrift _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Überschrift 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Überschrift _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Überschrift 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Fett" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Fett" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Hervorgehoben" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Hervorgehoben" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Markieren" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Markieren" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Durchgestrichen" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Durchgestrichen" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Subskript" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Superskript" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Vorformatiert" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Vorformatiert" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Mit der -Taste können Sie Links folgen.\n" "(Wenn deaktiviert, benutzen Sie )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Auch bei schreibgeschützten Seiten Schreibmarke anzeigen" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "'KamelSchreibWeise' automatisch verlinken" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Dateien automatisch verlinken" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" "Das aktuelle Wort automatisch auswählen, wenn Sie die Formatierung ändern." #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "-Taste verringert den Einzug\n" "(Alternativ )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Wiederholtes Anklicken des Ankreuzfelds schaltet zwischen den möglichen " "Zuständen um" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Ein- oder Ausrücken von Listenpunkten ändert Unterpunkte" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Ankreuzlisten rekursiv ankreuzen" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Wiki-Markup während der Eingabe anwenden" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Standardformat für das Kopieren von Text in die Zwischenablage" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Speicherort für Vorlagen von Dateianhängen" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Kein Wiki definiert: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopieren _Als" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Ausgewählten Text verschieben" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Eigenschaften editieren." #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "Link _bearbeiten" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "_Verknüpfung kopieren" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "E-Mail-Adresse kopieren" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Öffnen mit..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "Öffnen" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Keine Vorlagen installiert" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Der Ordner\n" "%s\n" "existiert nicht.\n" "Soll er jetzt angelegt werden?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Datum und Uhrzeit einfügen" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalender" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "Ver_linke datum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Bild einfügen" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Bild zuerst anhängen" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Dateiformat wird nicht unterstützt: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Bild bearbeiten" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Ort" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Verknüpfen mit" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Breite" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Höhe" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "Größe zu_rücksetzen" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Text aus Datei einfügen" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Verknüpfung bearbeiten" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Verknüpfung erstellen" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Nächstes" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Vorheriges" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "_Groß- und Kleinschreibung beachten" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Ganzes _Wort" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regulärer Ausdruck" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Hervorheben" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Suchen" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Einstellungen" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Suchen und Ersetzen" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Suche was" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Ersetzen durch" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Ersetzen" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "_Alles ersetzen" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Wortanzahl" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Absatz" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Worte" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Zeilen" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Zeichen" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Verschiebe Text auf andere Seite" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Verschieben" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Verschieben nach" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Link zur neuen Seite einfügen" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Neue Seite öffnen" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Neue Datei" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Erscheinungsbild" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Bearbeiten" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Einstellungen" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Plugins" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Eigene Schriftart benutzen" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mehr" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "K_onfigurieren" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Abhängigkeiten" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Keine Vorraussetzungen" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Ok" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Nicht erfüllt" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Optional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Aktiviert" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Plugin" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Plugin einrichten" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Einstellungen für Plugin %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Eigenschaften" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Eigenschaften des Notizbuchs" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Letzte Änderungen" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "heute" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "gestern" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Zuletzt geändert" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Für die fortgeschrittene Suche können die logischen Verknüpfungen AND, OR " "und NOT verwendet werden. Mehr Informationen dazu finden sie aus den Hilfe " "Seiten." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Nur in aktuellem Namensraum suchen" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Bewertung" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Webserver" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server wurde nicht gestartet" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Öffentlichen Zugriff erlauben" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server gestartet" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server gestoppt" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Vorlagen" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Durchblättern" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Kopiere Vorlage" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Datei auswählen" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Alle _aufklappen" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "Alle ein_klappen" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Leeren" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Verzeichnis auswählen" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Bild auswählen" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Linker Fensterbereich" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Rechter Fensterbereich" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Unterer Fensterbereich" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Oberer Fensterbereich" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Oben links" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Unten links" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Oben rechts" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Unten rechts" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Anscheinend haben Sie einen Fehler gefunden" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Wenn Sie diesen Fehler melden wollen, senden Sie bitte die Meldungen aus der " "folgenden Textbox mit." #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Alle Dateien" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Bilder" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Datei exisiert" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Eine Datei mit dem Namen \"%s\" existiert bereits,\n" "Sie können einen anderen Namen vorschlagen oder die bestehende Datei " "überschreiben." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Durchsuchen" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Überschreiben" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Konnte für dieses Notizbuch keine Datei bzw. kein Verzeichnis finden" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Konnte Notizbuch %s nicht finden" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Der Seitenname ist ungültig\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Ungültiger Seitenname \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Ein Vorgang braucht Zugang auf den Index.\n" "Dieser wird gerade aktualisiert, daher kann nicht auf ihn zugegriffen " "werden.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Seite %s kann nicht geändert werden" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwiki Schlüsselwort" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Startseite" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Zim-Startverzeichnis" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Geteiltes Notizbuch" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Arithmetisch" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Durch dieses Plugin können arithmetische Berechnungn in Zim eingebettet " "werden.\n" "Es basiert auf dem Modul arithmetic von\n" "http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Arithmetisch" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Attachment Browser" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Dieses Plugin erstellt eine Auflistung der Anhänge der aktuellen Seite in " "Form einer Symbolansicht unterhalb der aktuellen Seite.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Position im Fenster" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Dateianhänge" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Anhänge anzeigen" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Anhang" msgstr[1] "%i _Anhänge" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Unbekannt" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Dateityp" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Größe" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Geändert" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "Hierher _verschieben" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "Hierher _kopieren" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Abbrechen" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automount" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin kann Notizbücher automatisch einbinden. Sie können\n" "es benutzen, um Notizbücher auf entfernbaren Datenträgern (wie\n" "USB-Sticks) oder verschlüsselten Partitionen einzubinden.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Fensterbereich für RückLinks" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin fügt ein zusätzliches Widget hinzu, das eine Liste\n" "von Seiten anzeigt, die auf die aktuelle Seite verweisen.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "RückLinks" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Heute" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kalen_der" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Tagebuch" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Dieses Plugin verwandelt einen Namesraum in ein Tagebuch\n" "mit einer Seite pro Tag, Woche oder Monat.\n" "Zur Navigation wird ein Kalender hinzugefügt\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Tag" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Woche" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Monat" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Jahr" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Kalender in der Seitenleiste statt als eigenen Dialog anzeigen." #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Verwende jeweils eine Seite" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d. %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Heute" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gramm" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Diagramm einfügen" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Diagramm einfügen" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin erlaubt das Erstellen von Schaubildern in zim mit Hilfe von " "GraphViz.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "Diagramm änd_ern" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Ablenkungsfreier Bearbeitungsmodus" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Dieses Plugin fügt Zim einen ablenkungsfreien \n" "Bearbeitungsmodus hinzu.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Menüleiste im Vollbildmodus verstecken" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Menüleiste im Vollbildmodus verstecken" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Pfadleiste im Vollbildmodus verstecken" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Statusleiste im Vollbildmodus verstecken" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Maximale Seitenbreite" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Vertikaler Abstand" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Farbe des Texthintergrunds" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Textfarbe" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Farbe des Bildschirmhintergrunds" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Ditaa einfügen" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Ditaa einfügen" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin ermöglicht es Ditaa basierte Diagramme in zim einzugen.\n" "Dieses Plugin gehört zum Lieferumfang von Zim\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "Ditaa _Editieren" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "_Formel" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Formel einfügen" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Formel einfügen" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt einen LaTeX-basierten Gleichungseditor zur Verfügung.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Formel b_earbeiten" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Füge Gnuplot ein" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Dieses Plugin liefert einen Ploteditor für ZIM, welcher auf Gnuplot " "basiert.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "Gnuplot b_earbeiten" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU R Diagramm" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "GNU R Diagramm einfügen" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Dieses Plugin bietet einen Editor um GNU R Diagramme in zim zu erstellen und " "einzubinden.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "GNU R Diagramm bearbeiten" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Diagramm" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "_Mathematischen Ausdruck auswerten" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Der Taschenrechner konnte die \n" "eingegebene Formel nicht berechnen." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Taschenrechner" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin ermöglicht die schnelle Berechnung einfacher mathematischer " "Ausdrücke in zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Kann Ausdruck nichtz auswerten" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbol..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Symbol einfügen" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Diese Plugin fügt den 'Symbol einfügen'-Dialog zum Menü hinzu.\n" "Der ermöglicht die automatische Formatierung typografischer \n" "Sonderzeichen.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Zeilen sortieren" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Alphabetische Sortierung" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Dieses Plugin sortiert markierte Zeilen in alphabetischer Reihenfolge. Wurde " "einmal sortiert, dann wird ein weiterer Aufruf die Reihenfolge umkehren. (A-" "Z zu Z-A)\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Bitte wählen Sie mehr als eine Zeile aus" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Zeige Link-Struktur" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Link-Struktur" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt einen Dialog mit einer graphischen \n" "Darstellung der Linkstruktur des Notizbuchs bereit. Es \n" "kann als eine Art \"mind map\" verwendet werden, um \n" "zu zeigen, wie einzelne Seiten aufeinander verweisen.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Druck in HTML-Datei" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt ein Workaround für die fehlende Druckfunktion \n" "in Zim bereit. Es exportiert die aktuelle Seite in eine HTML-Datei und \n" "öffnet diese im Browser. Darüber kann die Datei dann gedruckt werden.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Druck in HTML-Datei" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Kurz Notiz" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Kurz Notiz" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt ein Dialogfenster zur Verfügung, dass \n" "es erlaubt Text oder den Inhalt der Zwischenablage in eine\n" "Notiz einzufügen.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Erstelle eine neue Seite für jede Notiz" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Titel" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Seite _Öffnen" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Notiz verwerfen?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "Notensatz..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Notensatz einfügen" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Notensatz einfügen" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt einen Notensatz-Editor für Zim bereit, basierend auf " "GNU Lilypond.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Stets als Kopf eingefügt" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Stets als Fuß eingefügt" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "Notensatz _editieren" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Bildschirmfoto …" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Bildschirmfoto einfügen" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin ermöglicht es ein Bildschirmfoto aufzunehmen \n" "und in eine Seite einzufügen.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Ganzen Bildschirm aufnehmen" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Fenster oder Bereich auswählen" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Verzögerung" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "Sekunden" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Ein Fehler trat bei der Bearbeitung von \"%s\" auf." #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Recht_schreibung überprüfen" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Rechtschreibprüfung" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin stellt eine automatische Rechtschreibprüfung \n" "zur Verfügung.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Konnte Rechtschreibprüfung für die Sprache \"%s\" nicht laden." #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Dies könnte bedeuten, dass die richtigen Wörterbücher nicht installiert sind" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Inhaltsverzeichnis" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin fügt ein Widget hinzu, das ein\n" "Inhaltsverzeichnis für die aktuelle Seite anzeigt.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Zeige Inhalt als schwebendes Widget statt in der Seitenleiste" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Inhalt" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Herabstufen" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Heraufstufen" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "ohne Schlagworte" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Alphabetisch sortieren" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sortiere Seiten nach Schlagworten" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Schlagworte" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Dieses Plugin unterstützt eine im Verhältnis stehende Seitenindexfilterung " "von ausgewählten Schlagwörtern in einer Wolke\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Aufgabenliste" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin zeigt alle offenen Aufgaben. Offene Aufgaben sind entweder \n" "offene Ankreuzkästchen oder Elemente, die mit 'FIXME' oder 'TODO' markiert " "wurden.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Alle Ankreuzfelder als Aufgaben interpretieren" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Seitenname in tags für die Aufgabenliste umwandeln" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Implizites Fälligkeitsdatum für Aufgaben auf Kalenderseiten" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Aufgaben, die am Montag oder Dienstag fällig sind, schon vor dem Wochenende " "anzeigen" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Kennzeichnungen für Aufgaben" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Beschriftung für nächste Aufgabe" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Kennzeichen für Aufgaben, die keine Aktion erfordern" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Zu indizierende Unterbäume" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Zu überspringende Unterbäume" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Indexiere Notizbuch" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Die Aufgabenliste wird gerade zum ersten Mal verwendet.\n" "Dafür muss der Index neu erstellt werden. Abhängig von \n" "der Größe des Notizbuchs kann das einige Minuten \n" "dauern. Dieser Vorgang ist einmalig und bei der nächsten\n" " Nutzung der Aufgabenliste nicht noch einmal nötig." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Nur ausführbare Aufgaben anzeigen" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i offene Aufgabe" msgstr[1] "%i offene Aufgaben" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Alle Aufgaben" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Ohne Tags" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Aufgabe" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Datum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Informations-Symbol" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin fügt ein Informationssymbol zum Benachrichtigungsfeld hinzu\n" "Sie benötigen Gtk+ ab der Version 2.10, um es einsetzen zu können.\n" "\n" "Dieses Plugin gehört zum Lieferumfang von Zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Klassisches Informations-Symbol,\n" "verwende nicht das Symbol im neuen Ubuntu Stil" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Ein eigenes Symbol für jedes Notizbuch anzeigen" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Kurz Notiz" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Weitere …" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notizbücher" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop-Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Eine V_ersion speichern..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versionen..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "Seit der letzten Sicherung wurde dieses Notizbuch nicht geändert." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Keine Änderung seit der letzten Sicherung" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Versionskontrolle" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Dieses Plugin ermöglicht eine Versionsverwaltung in ihrem Notizbuch.\n" "Unterstützt werden Bazaar, Git und Mercurial Versionswerwaltungen.\n" "Dieses Plugin gehört zum Lieferumfang von Zim\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Automatisch speichern in regelmäßigen Abständen" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatisch gespeicherte Version" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Versionskontrolle anschalten?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Die Versionskontrolle ist für dieses Notizbuch nicht aktiviert.\n" "Wollen Sie sie aktivieren?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Backend" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Version speichern" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Bitte geben Sie eine Beschreibung für diese Fassung ein" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Gespeicherte Version aus Zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versionen" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Seite" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "_Anmerkungen" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Wählen Sie eine Version aus, um die Unterschiede zwischen der Version und \n" "dem aktuellen Stand anzeigen zu lassen. Wenn Sie zwei Versionen auswählen, \n" "werden die Unterschiede dieser Versionen angezeigt.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Kommentar" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "Version wiederherstellen" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Unterschiede anzeigen" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_nebeneinander" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Quelltext mit Anmerkungen" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Aktuellen Stand mit gespeicherter Version überschreiben?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Möchten Sie die Seite %(page)s\n" "mit der gespeicherten Version %(version)s überschreiben?\n" "\n" "Alle Änderungen seit dieser Version gehen verloren!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Änderungen" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Ereignisse mit Zeitgeist protokollieren" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Ereignisse per Zeitgeist-Dämon aufzeichnen" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Wiki-Seite: %s" #~ msgid "File browser" #~ msgstr "Dateibrowser" #~ msgid "Web browser" #~ msgstr "Web-Browser" #~ msgid "Match c_ase" #~ msgstr "_Groß- und Kleinschreibung beachten" #~ msgid "Pages" #~ msgstr "Seiten" #~ msgid "Output" #~ msgstr "Ausgabe" #~ msgid "Slow file system" #~ msgstr "Langsames Dateisystem" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "_Filter" #~ msgstr "_Filter" #~ msgid "Text Editor" #~ msgstr "Texteditor" #~ msgid "Email client" #~ msgstr "E-Mail-Programm" zim-0.60/translations/nb.po0000664000175000017500000022336612137750055015611 0ustar jaapjaap00000000000000# Norwegian Bokmal translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-14 10:12+0000\n" "Last-Translator: Per Knutsen \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Kan ikke kjøre applikasjonen: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Forvalgt" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "kalender:uke_start:0" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Kan ikke finne fil: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Kan ikke lese: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Dette betyr vanligvis at filen inneholder ugyldige tegn" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detaljer" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Filen kan ikke skrives til: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Filen endret på disk: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Tilpass" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Ingen applikasjoner funnet" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Åpne med «%s»" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Konfigurer en applikasjon til å åpne \"%s\" lenker" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Konfigurer en applikasjon til å åpne filer\n" "av typen \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Konfigurer applikasjoner" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Legg til applikasjon" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Systemstandard" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Navn" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Kommando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Opprett forvalgt applikasjon" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Åpne fil" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Åpne mappe" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Slett fil" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Slett" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Utvalg" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Filnavn" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Side" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Rydde vedlegg" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inverter utvalg" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Filene under ble funnet i Zim sin vedleggsmappe men er ikke lenger\n" "lenket til i notatene. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Ingen foreldreløse filer funnet." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "tilpassede verktøyer" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Du kan endre de brukerdefinerte verktøyinnstillingene som vil vises\n" "i verktøylinjen eller kontekstmenyer." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Rediger tilpasset verktøy" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Beskrivelse" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Data vil ikke bli endret av kommando" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Vis i verktøylinjen" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Følgende parametre vil bli erstattet\n" "i kommandoen når den blir utført:\n" "\n" "%f sidens kilde som en temporær fil\n" "%d vedleggsmappen for gjedende side\n" "%s kildefilen for den virkelige siden (hvis noen)\n" "%n notatbokens plassering (fil eller mappe)\n" "%D dokumentets rot (hvis noen)\n" "%t den markerte teksten eller ordet under skrivemerket\n" "%T den markerte teksten inkludert wiki-formatering\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Eksportér" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Oppdaterer indeks" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Mappen eksisterer: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Mappen eksisterer allerede og har innhold. Eksportering til denne mappen kan " "overskrive eksisterende filer. Vil du fortsette?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Eksporterer notebook" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Filen eksisterer" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Denne filen eksisterer allerede.\n" "Vil du overskrive den?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Velg sidene for eksport" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Komplett _notebook" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Enkel _side" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Velg eksportformat" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Annet..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Mal" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Link filer i dokumentrota med fullstendige filstier" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Rotkartdokument til nettadresse" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Mappe for utdata" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Sideregister" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Utdata-fil" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Forhåndsvis" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Vis _logg" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "En feil oppstod under generering av bildet.\n" "Ønsker du å lagre kilde teksten allikevel?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Loggfil" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Fil" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Endre" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Vis" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "Sett _inn" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Søk" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "Verk_tøy" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Gå til" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Hjelp" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "Verk_tøylinje" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Ny Side..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Ny _underside..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Åpne annen notisblokk" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Åpne i nytt _vindu" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importer side..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Lagre" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Lagre en _kopi" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_ksporter..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Send til..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Flytt side..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Omdøp side..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "Slett side" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Egenskaper" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Lukk" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Avslutt" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Søk..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Nylige endringer..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Kopier _lokasjon" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "M_aler" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Innstilling_er" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Oppdatere" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Åpne Vedleggets _Mappe" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Åpne _Notisblokkmappe" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Åpne _rotdokument" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Åpne _Dokumentmappe" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Legg til _Fil" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Legg ved ekstern fil" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Rediger _Kilde" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Start _webserver" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Oppdater indeks" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Brukerdefinerte_Verktøy" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "Til_bake" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Gå en side tilbake" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Fremover" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Gå en side fram" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Forelder" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Gå til den overordnede siden" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Under" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Gå til underside" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Forrige i registeret" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Gå til forrige side" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Neste i registeret" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Gå til neste side" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Hjem" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Gå til hjemmeområdet" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Hopp til..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Innhold" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_OSS" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Feil" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Om" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statuslinje" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Fullskjerm" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notatblokk redigerbar" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "I_ngen" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Nylig brukte sider" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Nylige endrede sider" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historikk" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_avnerom" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikoner _Og Tekst" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Kun _ikoner" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Kun _tekst" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Store Ikoner" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Små ikoner" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Små _Ikoner" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Fjern lenker når sider slettes" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Filen eller mappen du spesifiserte eksisterer ikke.\n" "Vennligst sjekk om filbanen er korrekt." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Finner ikke fil eller mappe: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Søk" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Søk i Sider..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Oppgradere Notebook?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Denne notatblokken ble opprettet av en eldre versjon av Zim.\n" "Ønsker du å oppgradere den til siste versjon nå?\n" "\n" "Oppgraderingen tar litt tid og kan resultere i endringer av\n" "innholdet i notatblokken. Det er anbefalt at du tar sikkerhets\n" "kopi før du fortsetter.\n" "\n" "Dersom du ikke ønsker å oppgradere nå er det mulig noen\n" "funksjoner i notatblokken ikke lengre vil virke som forventet." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Oppgraderer notebook" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Oppdaterer linker" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Fjerner linker" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Opprett mappe?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "Katalogen \"%s\" eksisterer ikke. Ønsker du å opprette den nå?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Kan ikke åpne: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Denne siden har ingen vedleggsmappe" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Rediger fil: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Du redigerer filen i en ekstern applikasjon. Du kan lukke denne dialogen når " "du er ferdig." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Wiki for Skrivebordet" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Bjørn Forsman https://launchpad.net/~bjorn-forsman\n" " Bjørn Olav Samdal https://launchpad.net/~bjornsam\n" " Børge Johannessen https://launchpad.net/~lmdebruker\n" " Espen Krømke https://launchpad.net/~espenk\n" " Per Knutsen https://launchpad.net/~pmknutsen\n" " Playmolas https://launchpad.net/~playmolas\n" " Terje Andre Arnøy https://launchpad.net/~terjeaar\n" " kingu https://launchpad.net/~comradekingu" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Indeks" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "Skrivebeskyttet" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "" msgstr[1] "" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Kunne ikke lagre side: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "For å fortsette kan du lagre en kopi av siden eller forkaste\n" "alle endringer. Hvis du lagrer en kopi vil endringer også\n" "forkastes, men du kan gjenopprette kopien senere." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "Forkast en_dringer" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Lagre kopi" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Gå til" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Gå til Side" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Ny underside" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Ny side" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Merk at lenker til sider som ikke eksisterer\n" "vil opprette siden automatisk." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Navn på side" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Sidemal" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Siden eksisterer" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Lagre kopi" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importer side" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Tekstfiler" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Flytt side" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Flytt side \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Oppdater %i side som lenker til denne siden" msgstr[1] "Oppdater %i sider som lenker til denne siden" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Navnerom" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Omdøp Side" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Omdøp side \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Oppdater tittel på denne siden" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Slett Side" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Slett siden \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Siden \"%s\" og alle undersider pluss\n" "vedlegg vil slettes." #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Fjern linker fra %i side som linker til denne side" msgstr[1] "Fjern linker fra %i sider som linker til denne side" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i fil vil slettes" msgstr[1] "%i filer vil slettes" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Legg ved fil" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Siden \"%s\" har ikke en mappe for vedlegg" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Sett inn bilder som link" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notisblokk" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Åpne Notisblokk" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Forvalgt notatblokk" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Legg til notisblokk" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Velg navn og mappe for notisblokken" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Mappe" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Oppdaterer register" #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Angre" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Gjenopprette" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Klipp_ut" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopier" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Lime inn" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Slett" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Rediger kobling eller objekt..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Fjern kobling" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Dato og tid..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Bilde..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Tekst fra _fil..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Kobling" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Sett inn lenke" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Nullstill formatering" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Finn..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Finn ne_ste" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Finn forr_ige" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Erstatt..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Antall ord..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Zoom Inn" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Zoom Ut" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normal Størrelse" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nytt Vedlegg" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Overskriftstittel _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Overskriftstittel 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Overskriftstittel _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Overskriftstittel 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Overskriftstittel _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Overskriftstittel 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Overskriftstittel _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Overskriftstittel 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Overskriftstittel _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Overskriftstittel 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Sterk" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Sterk" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Ettertrykk" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Ettertrykk" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Merke" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Merke" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Stryk" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "ramme" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Senket skrift" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Hevet skrift" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Bruk for å følge lenker\n" "(Om denne er slått av kan du fortsatt bruke )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Vis også peker for sider som ikke kan redigeres" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Gjør \"CamelCase\" ord om til lenker automatisk" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Gjør filstier om til lenker automatisk" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopier _som..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Flytt valgt tekst..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "Rediger _egenskaper" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Endre Kobling" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Kopier _Kobling" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopier e-postadresse" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Åpne med …" #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Åpne" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Ingen maler er installert" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Katalogen\n" "%s\n" "eksisterer ikke.\n" "Ønsker du å opprette den nå?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Sett inn dato og klokkeslett" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Kalender" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Link til dato" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Sett inn bilde" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Fil type er ikke støttet: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Rediger bilde" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Lokalisasjon" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Bredde" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Høyde" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Sett inn tekst fra fil" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Rediger lenke" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Lenke" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Tekst" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Neste" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Forrige" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Hele _ordet" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Markér" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Finn" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Alternativer" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Søk og erstatt" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Søk etter" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Erstatt med" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Erstatt" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Erstatt _alle" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Ordtelling" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Avsnitt" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Ord" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Linjer" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Tegn" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Flytt tekst til annen side" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Flytt" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Flytt tekst til" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Åpne ny side" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Ny fil" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Grensesnitt" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Redigering" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Innstillinger" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Programtillegg" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mer" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "K_onfigurer" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Avhengigheter" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Feilet" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Valgfritt" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Forfatter" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Aktivert" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Programtillegg" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Konfigurer programtillegg" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Alternativer for programtillegg %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Egenskaper" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Nylige endringer" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "I dag" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "I går" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Sist endret" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Poengsum" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Webtjener" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Tillat offentlig tilgang" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server startet" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server stanset" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Maler" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Bla gjennom" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Kopier mal" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Velg Fil" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Ekspander alle" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "S_lå sammen alle" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Velg Mappe" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Velg bilde" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Øverst til venstre" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Nederst til venstre" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Øverst til høyre" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Nederst til høyre" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Det virker som om du har funnet en programfeil" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Når du rapporterer denne programfeilen inkluder\n" "informasjonen i tekst boksen nedenfor." #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Alle filer" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Bilder" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Filen finnes" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Bla gjennom" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Skriv over" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Kan ikke finne filen eller katalogen til denne notatblokken" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Fant ikke notatblokk: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Navnet på siden er ikke gyldig.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Ugyldig navn på side \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Kan ikke redigere siden: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Startside" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Dokumentrot" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetikk" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "I _Dag" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Kalender" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Idag" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Endre sammenligning" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "" msgstr[1] "" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notatblokker" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Skrivebords-wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Vennligst legg til en kommentar til versjonen" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Side" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" #~ msgid "Text Editor" #~ msgstr "Tekstredigering" #~ msgid "File browser" #~ msgstr "Filleser" #~ msgid "Email client" #~ msgstr "E-postklient" #~ msgid "Web browser" #~ msgstr "Nettleser" #~ msgid "Pages" #~ msgstr "Sider" #~ msgid "Output" #~ msgstr "Utdata" zim-0.60/translations/pt_BR.po0000664000175000017500000025113512137750055016213 0ustar jaapjaap00000000000000# Brazilian Portuguese translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-15 15:35+0000\n" "Last-Translator: NeLaS \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Erro ao executar o programa: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "retornou status de saída não-zero %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Falha ao executar: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Padrão" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Arquivo não existe: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Não foi possível ler: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "Isso normalmente significa que o arquivo contém caracteres inválidos" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detalhes" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "Não é possível escrever no arquivo: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Arquivo foi alterado externamente: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Personalizar..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Nenhum Aplicativo Encontrado" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Abrir com \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Configure um aplicativo para abrir links \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Configure um aplicativo para abrir arquivos\n" "do tipo \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Configurar Aplicativos" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Adicionar Aplicativo" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Padrão do Sistema" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nome" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Comando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Tornar aplicativo padrão" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Abrir Arquivo" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Abrir pasta" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Apagar arquivo" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Excluir" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Seleção" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nome do arquivo" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Página" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Limpar Anexos" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Inverter seleção" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Os arquivos abaixo foram encontrados no diretório de anexos do zim,\n" "mas não existe mais nenhum link para eles no caderno de anotações. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Nenhum arquivo orfão encontrado." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Ferramentas Personalizadas" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Você pode configurar ferramentas personalizadas que irão aparecer\n" "no menu de ferramentas e na barra de ferramentas ou nos menus de contexto." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Editar Ferramenta Personalizada" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descrição" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ícone" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Comando não modifica dados" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Mostrar na barra de ferramentas" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Os parâmetros seguintes serão substituídos \n" "quando o comando for executado: \n" "\n" "%f a página de origem como arquivo temporário \n" "%d o diretório de anexos da página atual\n" "%s o arquivo real da fonte da página (se houver)\n" "%n o local do caderno de anotações (arquivo ou pasta)\n" "%D o documento raiz (se houver)\n" "%t o texto ou palavra selecionada com o cursor\n" "%T o texto selecionado incluindo o formato wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportar" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Atualizando índice" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Diretório existe: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Pasta já existe e possue conteúdo, exportar para esta pasta pode sobescrever " "arquivos existentes. você deseja continuar?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exportando caderno" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "O arquivo existe" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Este arquivo já existe.\n" "Deseja sobrescrevê-lo?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Selecione as páginas para exportar" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Todo o _Caderno" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Página única" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Selecione o formato de exportação" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Outro..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Formato" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Modelo" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Linke arquivos para o documento raiz com o caminho completo" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Mapei o documento raiz para o URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Selecione o arquivo ou pasta de saída" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Diretório de destino" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Página do índice" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Arquivo de saída" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Visualização" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Visualizar _Registro" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Um erro ocorreu durante o geração da image. \n" "Você deseja salvar a fonte do texto mesmo assim?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Arquivo de log" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Arquivo" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Editar" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Visualizar" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Inserir" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Pesquisar" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_matar" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Ferramentas" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Ir" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Ajuda" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "B_arra de Caminhos" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Barra de ferramentas" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nova Página" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nova S_ubpágina" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Abrir Novo Caderno..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Abrir em uma Nova _Janela" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importar página..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "Salvar" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Gravar uma _Cópia" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportar..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Enviar para..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Mover Página..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Renomear Página..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Excluir Página" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Propriedades" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Fechar" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Sair" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "Pe_squisar..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Buscar _Ligações de Retorno..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copiar _Localização" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Modelos" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Preferências" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Recarregar" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Abrir a Pasta de _Anexos" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Abrir Pasta do _Caderno" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Abrir a Raiz do _Documento" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Abrir a Pasta do _Documento" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Anexar _Arquivo" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Anexar arquivo externo" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Limpar Anexos" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Editar _Fonte" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Iniciar _Servidor Web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Atualizar Índice" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Ferramentas _Customizadas" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Voltar" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Voltar uma página" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Avançar" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Avançar uma página" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Pai" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ir para a página superior" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Filho" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Ir para página filha" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Anterior no índice" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ir para a página anterior" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Próximo no índice" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ir para a próxima página" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Início" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Ir para o início" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Ir para..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Conteúdo" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Atalhos do teclado" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bugs" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_Sobre" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Todos os Painéis" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Mostrar Todos os Painéis" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Barra de status" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "Painéis _Laterais" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Mostrar Painéis Laterais" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Tela Cheia" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Caderno _Editável" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Tornar o caderno editável" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Nenhum" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Páginas _recentes" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Histórico" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_ome(s)" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ícones e Texto" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Somente _Ícones" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Somente _Texto" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Ícones _Grandes" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Ícones _Pequenos" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Ícones Minúsculos" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Adicionar tiras 'tearoff' para os menus" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Use para mudar para o painel lateral" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Remover links ao excluir páginas" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Sempre use a última posição do cursor ao abrir uma página" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "O arquivo ou pasta que você especificou não existe.\n" "Por favor, verifique se o caminho está correto." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "A pasta %s não existe" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Procurar" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Buscar Páginas" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Atualizar Caderno?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Esse caderno de anotações foi criado numa versão mais antiga do zim.\n" "Você gostaria de atualizá-lo à última versão agora?\n" "\n" "A atualização tomará um tempo e poderá efetuar diversas mudanças\n" "ao caderno. É recomendado fazer uma cópia de segurança\n" "antes de atualizar.\n" "\n" "Se você escolher não atualizar agora, algumas partes\n" "do programa podem não funcionar como esperado." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Atualizando o caderno de anotações" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "O índice ainda está ocupado com a atualização. Enquanto ela não for " "concluída, links podem não ser atualizados corretamente. Continuar pode " "desvincular links, deseja continuar mesmo assim?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Atualizando links" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Removendo links" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Criar pasta?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "O diretório \"%s\" ainda não existe.\n" "Deseja criá-lo agora?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Não foi possível abrir %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Esta página não possui uma pasta de anexos." #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editando arquivo: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Você está editando um arquivo em um aplicativo externo. Você não pode fechar " "esta mensagem até que isto seja concluído." #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Uma wiki para o desktop" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " André Gondim https://launchpad.net/~andregondim\n" " Clodoaldo https://launchpad.net/~clodoaldo-carv\n" " Frederico Gonçalves Guimarães https://launchpad.net/~fgguimaraes\n" " Frederico Lopes https://launchpad.net/~frelopes\n" " Giovanni Abner de Brito Júnior https://launchpad.net/~giovannijunior\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Lewis https://launchpad.net/~akai-hen\n" " Matheus https://launchpad.net/~matheus-rwahl\n" " NeLaS https://launchpad.net/~organelas\n" " Otto Robba https://launchpad.net/~otto-ottorobba\n" " Paulo J. S. Silva https://launchpad.net/~pjssilva\n" " Thaynã Moretti https://launchpad.net/~izn\n" " ThiagoSerra https://launchpad.net/~thiagoserra\n" " Wanderson Santiago dos Reis https://launchpad.net/~wasare" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Índice" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "somente leitura" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Ligação de Retorno..." msgstr[1] "%i _Ligações de Retorno..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Não foi possível salvar a página %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Para continuar você pode salvar uma cópia desta página\n" "ou discartar as mudanças realizadas. Se você salvar uma cópia\n" "as mudanças serão perdidas mas será possível restaurá-la depois." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Descartar alterações" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "S_alvar Cópia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Pular para" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Pular para Página" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nova sub-página" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nova página" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Lembre se que criar um link para uma página não existente\n" "também cria essa página automaticamente." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nome da página" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Modelo de Página" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "A página já existe" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Salvar Cópia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importar Página" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Arquivos de texto" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Mover página" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Mover página \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Atualizar %i página vinculada à esta página" msgstr[1] "Atualizar %i páginas vinculadas à esta página" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Espaço de nomes" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Renomear página" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Renomear página \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Atualizar o cabeçalho desta página" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Excluir Página" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Excluir página \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Página \"%s\" e todas as suas\n" "sub-páginas e anexos serão deletados" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Remover ligações de %i página vinculada à esta página" msgstr[1] "Remover ligações de %i páginas vinculadas à esta página" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i arquivo será deletado" msgstr[1] "%i arquivos serão deletados" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Anexar Arquivo" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Página \"%s\" não tem uma pasta para anexos" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Inserir imagem como link" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Caderno" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Abrir Caderno" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Caderno padrão" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Adicionar Caderno" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Seleciona um nome e uma pasta para o caderno de anotações." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Pasta" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Atualizando índice..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Desfazer" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Refazer" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "_Recortar" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copiar" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Colar" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Remover" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Alternar Caixa de Seleção 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Alternar Caixa de Seleção 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Editar Ligação ou Objeto" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Remover link" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Data e Hora" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Imagem..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Lis_ta Não Numerada" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Lista Numerada" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Lista de Cai_xa de Seleção" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Texto de _Arquivo..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Link..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Inserir Link" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Limpar Formatação" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Procurar..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Procurar Pró_ximo" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Procurar An_terior" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Substituir..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Contagem de Palavras..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Ampliar" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "_Diminuir" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Tamanho _Normal" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Novo _Anexo" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Modelos de _Arquivo" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Cabeçalho _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Cabeçalho 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Cabeçalho _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Cabeçalho 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Cabeçalho _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Cabeçalho 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Cabeçalho _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Cabeçalho 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Cabeçalho _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Cabeçalho 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Negrito" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Negrito" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Ênfase" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Ênfase" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marcar" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marcar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Riscar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Sobrescrito" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Subescrito" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Sobrescrito" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Sem formatação" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Usar a tecla para seguir ligações\n" "(Se desativado você pode usar )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Mostrar o cursor também em páginas que não podem ser editadas" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automaticamente tornar palavras \"CamelCase\" em ligações" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Automaticamente tornar caminhos de arquivo em ligações" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Automaticamente selecionar a palavra atual quando aplicar formatação" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Remover recuo ao usar a tecla \n" "(Se desativado você pode usar )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" "Clicar repetidamente numa caixa de seleção rotaciona entre os possíveis " "estados de seleção" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Remover o recuo de um item da lista também altera todos os subitens" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Marcar uma caixa de seleção altera todos seus sub-items" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformatar a marcação wiki em tempo real" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Formate padrão para cópia de texto da área de transferência" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Pasta com modelos para anexos" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Nenhuma wiki desse tipo definida: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copiar _Como..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Mover Texto Selecionado..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Editar Propriedades" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Editar Link" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copiar _Link" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copiar endereço de Email" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Abrir Com..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Abrir" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Nenhum modelo instalado" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "A pasta\n" "%s\n" "não existe.\n" "Deseja criá-la agora?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Inserir Data e Hora" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendário" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Link para data" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Inserir Imagem" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Anexar imagem primeiro" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Tipo de arquivo não suportado: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Editar Imagem" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Localização" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Ligar à" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Largura" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Alturar" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Restaurar Tamanho" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Inserir Texto à Partir de um Arquivo" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Editar Link" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Link" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Texto" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Próximo" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Anterior" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Diferenciar maiúsculas e _minúsculas" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Toda a _palavra" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expressão _regular" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Destacar" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Procurar" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opções" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Encontrar e Substituir" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Localizar" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Substituir por" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Substituir" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Substituir _Tudo" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Contar Palavras" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Parágrafo" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Palavras" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Linhas" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Caractéres" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Mover Texto à Outra Página" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Mover" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Mover texto para" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Deixar ligação para nova página" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Abrir nova página" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Novo Arquivo" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interface" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editando" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferências" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Plugins" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Usar fonte personalizada" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Mais" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigurar" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependências" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Sem dependências" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Falhou" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opcional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor(a)" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Habilitar" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Plugin" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configurar Plugin" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opções para o plug-in %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Propriedades" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Propriedades do caderno" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Modificações Recentes" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Hoje" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Ontem" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Última Modificação" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Para buscas avançadas você pode usar operadores como\n" "AND, OR e NOT. Veja a página de ajuda para mais detalhes." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limitar a busca ao espaço de nomes atual" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Ocorrência(s)" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Servidor Web" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Servidor não iniciado" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Permitir acesso público" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Porta" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Servidor iniciado" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Servidor parou" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Modelos" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Copiar Modelo" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Selecione o Arquivo" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Expandir _Tudo" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Contrair Tudo" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Limpar" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Selecione a Pasta" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Selecionar Imagem" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Painel Lateral Esquerdo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Painel Lateral Direito" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Painel Inferior" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Painel Superior" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Superior Esquerdo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Inferior Esquerdo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Superior Direito" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Inferior Direito" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Parece que você encontrou um erro" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Ao reportar um erro, por favor,\n" "inclua a informação na caixa de texto abaixo." #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Todos os Arquivos" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Imagens" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Arquivo Já Existe" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "O arquivo com o nome \"%s\" já existe.\n" "Você pode usar outro nome ou sobrescrever o arquivo existente." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Navegar" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Sobrescrever" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Não foi possível encontrar o arquivo ou pasta para este caderno" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Não foi possível encontrar o caderno: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "O nome dado à página não é válido.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nome de página \"%s\" inválido" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Índice encontra-se ocupado atualizando enquanto\n" "foi realizada uma operação que o necessita.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Não foi possível modificar a página: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Palavra Chave Interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Página Inicial" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Documento Raiz" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Perfil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Caderno Compartilhado" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmética" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmética" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Navegador de Anexos" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Esse plugin mostra a pasta de anexos da página atual\n" "em ícones no painel inferior.\n" "\n" "Esse plugin ainda está sob desenvolvimento.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Posição na janela" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Anexos" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Mostrar Navegador de Anexos" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Anexo" msgstr[1] "%i _Anexos" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Desconhecido(a)" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Tipo" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Tamanho" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modificado Em" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Mover Aqui" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copiar Aqui" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Cancelar" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automontar" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin permite \"montar\" automaticamente cadernos conforme for " "necessário.\n" "Pode ser usado, por exemplo, para conectar-se com unidades remotas ou para\n" "destravar unidades criptografadas quando zim tentar abrir um caderno " "específico.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Painel do BackLinks" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin adiciona um widget extra mostrando uma lista de páginas\n" "que contêm links para a página atual.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Backlinks" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "Ho_je" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_dário" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Diário" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Dia" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Semana" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mês" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Ano" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Mostrar calendário no painel lateral e não como uma caixa diálogo" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Use uma página para cada" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d de %B de %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendário" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Hoje" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_grama" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Inserir diagrama" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Inserir Diagrama" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin fornece um editor de diagramas para o zim baseado no GraphViz.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Editar Diagrama" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Esconder menu no modo tela cheia" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Esconder ferramentas no modo tela cheia" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Largura máxima da página" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Margem vertical" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Inserir ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Inserir Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin fornece um editor de diagramas para o zim baseado no Ditaa.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Editar Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_quação" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Inserir equação" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Inserir Equação" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin fornece um editor de equações para o zim baseado no latex.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "Edit_ar Equação" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Inserir Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Esse plugin fornece um editor de plotagem para o zim baseado no Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Editar Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Inserir Plot do GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" "Esse plugin fornece um editor de plotagem para o zim baseado no GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Editar Plot do GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Plot do GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Avaliar _Matemática" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "O plugin de calculadora integrada não conseguiu\n" "avaliar a expressão no cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calculadora Integrada" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin permite avaliar rapidamente simples\n" "equações matemáticas no zim.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Não foi possível analisar a expressão" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sí_mbolo" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Inserir Símbolo" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin adiciona o diálogo \"Inserir Símbolo\" e permite\n" "a auto-formatação de caractéres tipográficos.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Ordenar linhas" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Ordenador de Linhas" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Esse plugin ordena alfabeticamente as linhas selecionadas.\n" "Se a lista já estiver ordenada, a ordem será invertida (de A-Z para Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Por favor, primeiramente, selecione mais the uma linha de texto." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Mostrar Mapa de Ligações" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa de Ligações" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin apresenta um diálogo gráfico\n" "da estrutura dos vínculos do caderno.\n" "Pode ser usado como um \"mind map\"\n" "do relacionamento das páginas.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Imprimir ao Navegador" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin fornece um método para lidar com a falta\n" "de suporte de impressão no zim. Ele exporte a página atual\n" "em html e abre-a no navegador. Assumindo um navegador\n" "com suporte à impressão isso fará sua informação\n" "ser impressa em dois passos.\n" "\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Imprimir ao Navegador" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Anotação Rápida..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Anotação Rápida" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin adiciona uma caixa de diálogo para colocar rapidamente\n" "texto ou conteúdo da área de transferência numa página do zim.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Cirar uma página nova para cada anotação" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Título" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Abrir _Página" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "P_ontuação" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Inserir pontuação" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Inserir Pontuação" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin proporciona um editor de pontuação para o zim baseado no GNU " "Lilypond.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Inclusão de cabeçalho partilhável" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Inclusão de rodapé partilhável" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Editar Pontuação" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Captura de Tela..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Inserir Captura de Tela" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin permite fazer uma captura da tela e\n" "inseri-lá diretamente numa página do zim.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Capturar toda a tela" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Selecionar janela ou área" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Atraso" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "segundos" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Algum error occoreu ao rodar \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Verficar _ortografia" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Verificador Ortográfico" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin adiciona verificação ortográfica através do gtkspell.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" "Não foi possível carregar o verificador ortográfico para a língua: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Isso pode significar que você não tem\n" "os dicionários corretos instalados." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Tabela de Conteúdos" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin adiciona uma aba extra mostrando uma\n" "tabela dos conteúdos da página atual.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Mostrar TdC como um widget flutuante e não no painel lateral" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "TdC" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Rebaixar" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Promover" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "não etiquetado" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Organizar alfabeticamente" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Organizar páginas por etiquetas" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiquetas" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Esse plugin fornece um índice de páginas filtrado através da seleção de " "etiquetas em uma nuvem.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Lista de Tarefas" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin apresenta um diálogo mostrando todas as tarefas\n" "em aberto no caderno. Tarefas em aberto podem ser caixas\n" "abertas ou items com etiquetas como \"TODO\" ou \"FIXME\".\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Considerar todas as caixas de seleção como tarefas" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Transformar o nome de páginas em etiquetas para tarefas" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Data final implícita para as tarefas nas páginas do calendário" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Sinalizar antes do final de semana as tarefas com prazo final na segunda-" "feira ou terça-feira" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Rótulos marcando tarefas" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Rótulo para a próxima tarefa" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "É preciso indexar o caderno" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Esta é a primeira vez que a lista de tarefas é aberta.\n" "O indíce precisa ser reconstruído.\n" "Dependendo do tamanho do caderno isso pode\n" "demorar vários minutos. No próximo uso da lista\n" "de tarefas, isso não será necessário." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtrar" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Mostrar Apenas Tarefas Acionáveis" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i item aberto" msgstr[1] "%i itens abertos" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Todas as Tarefas" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Sem marcadores" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Tarefa" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Data" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ícone na Área de Notificação" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin adiciona um ícone na área de notificação para acesso rápido.\n" "\n" "Esse plugin depende do Gtk+, versão 2.10 ou superior.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Ícone na área de notificação clássico,\n" "não usar o novo estilo de ícone de status do Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Mostrar um ícone separado para cada caderno" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Anotação Rápida..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Outro(s)..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Cadernos" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Gr_avar Versão..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versões" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "Não há mudanças neste caderno de anotações desde a última versão salva" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Nenhuma mudança desde a última versão" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Controle de Versão" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esse plugin adiciona controle de versão aos cadernos.\n" "\n" "Esse plugin suporta os sistemas de controle de versão: Bazaar, Git e " "Mercurial.\n" "\n" "Este é um plugin interno que acompanha o zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Salvar automaticar em intervalos regulares" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Versão automaticamente salva do zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Ativar Controle de Versão?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Controle de versão encontra-se desativado para este caderno.\n" "Deseja ativá-lo?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Backend" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Salvar Versão" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Por favor digite um comentário para esta versão" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versão salva do zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versões" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Páginas" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Ver _Anotação" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Seleciona uma versão para ver as diferenças entre aquela versão e a atual.\n" "Ou selecione múltiplas versão para ver as mudanças entre elas.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Comentário" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restaurar Versão" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Mostrar _Modificações" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Lado à Lado" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Fonte Anotada da Página" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Restaurar página à última versão salva?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Você quer restaurar a página: %(page)s\n" "à versão salva: %(version)s?\n" "\n" "Todas as modificações desde a última versão salva serão perdidas!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Modificações" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Recordar eventos com o Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Passa os eventos ao serviço Zeitgeist" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Página Wiki: %s" #~ msgid "Text Editor" #~ msgstr "Editor de texto" #~ msgid "File browser" #~ msgstr "Navegador de Arquivos" #~ msgid "Email client" #~ msgstr "Cliente de Email" #~ msgid "Web browser" #~ msgstr "Navegador Web" #~ msgid "Pages" #~ msgstr "Páginas" #~ msgid "Output" #~ msgstr "Saída" #~ msgid "Match c_ase" #~ msgstr "_Coincidir maiúsculas e minúsculas" #~ msgid "Slow file system" #~ msgstr "Sistema de arquivo lento" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "_Filter" #~ msgstr "_Filtrar" zim-0.60/translations/sl.po0000644000175000017500000024732212137750055015624 0ustar jaapjaap00000000000000# Slovenian translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-14 19:38+0000\n" "Last-Translator: Andrej Znidarsic \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Zaganjanje programa je spodletelo: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "ukaz %(cmd)s\n" "je vrnil stanje končanja %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Poganjanje je spodletelo: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Privzeto" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "Ni takšne datoteke: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Ni mogoče brati: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "To običajno pomeni, da datoteka vsebuje neveljavne znake" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Podrobnosti" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "V datoteko ni mogoče pisati: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "Datoteka se je spremenila na disku: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Prilagodi ..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "Ni bilo najdenih programov" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Odpri s programom \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Nastavite program za odpiranje povezav \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Nastavite program za odpiranje datotek\n" "vrste \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Nastavi programe" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Dodaj program" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Privzete sistemske vrednosti" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Ime" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Ukaz" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Naredi program privzet" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Odpri datoteko" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Odpri mapo" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Izbriši datoteko" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Izbriši" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Izbor" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Ime datoteke" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Stran" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Počisti priloge" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Obrni izbor" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Datoteke spodaj so bile najdene v mapi prilog zim, vendar niso več \n" "povezane v beležki. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "Osirotelih datotek ni bilo mogoče najti." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Orodja po meri" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Nastavite lahko orodja po meri, ki se bodo pojavila\n" "v orodnem meniju v v orodni vrstici ali vsebinskih menijih." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Uredi orodje po meri" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Opis" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ikona" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Ukaz ne spremeni podatkov" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Prikaži v orodni vrstici" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Ob izvedbi ukaza bodo zamenjani naslednji parametri:\n" "\n" "%f vir strani kot začasna datoteka\n" "%d mapa prilog trenutne strani\n" "%s prava izvorna datoteka strani (če obstaja)\n" "%n mesto beležke (datoteka ali mapa)\n" "%D koren dokumenta (če obstaja)\n" "%t izbrano besedilo ali beseda pod kazalko\n" "%T izbrano besedilo vključno z oblikovanjem wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Izvozi" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Posodabljanje kazala" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Mapa obstaja: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Mapa že obstaja in ima vsebino. Izvoz v to mapo lahko prepiše obstoječe " "datoteke. Ali želite nadaljevati?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Izvažanje beležke" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Datoteka že obstaja" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Ta datoteka že obstaja.\n" "Ali jo želite prepisati?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Izberite strani za izvoz" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Celotna _beležka" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Posamezna _stran" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Izberite obliko izvoza" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Drugo ..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Oblika" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Predloga" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Poveži datoteke pod korenom dokumenta s polno potjo datotek" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Preslikaj koren dokumenta v URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Izberite izhodno datoteko ali mapo" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Izhodna mapa" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Kazalo" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Izhodna datoteka" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Predogled" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Pokaži _dnevnik" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Med ustvarjanjem slike je prišlo do napake.\n" "Ali vseeno želite shraniti izvorno besedilo?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Dnevniška datoteka" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Datoteka" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Uredi" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "Po_gled" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Vstavi" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Iskanje" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "O_blika" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Orodja" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Pojdi" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "Pomo_č" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "Vrstica _poti" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Orodna vrstica" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nova stran ..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nova po_dstran ..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Odpri drugo beležko ..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Odpri v novem _oknu" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Uvozi stran ..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Shrani" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Shrani _kopijo ..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "_Izvozi ..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "Pošlji _na ..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Premakni stran ..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "P_reimenuj stran ..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Izbriši stran" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "_Lastnosti" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "Za_pri" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Končaj" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Iskanje ..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Iskanje _povratnih povezav ..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "Nedavne spremembe ..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Kopiraj _mesto" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Predloge" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "_Možnosti" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Znova naloži" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Odpri _mapo prilog" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Odpri mapo _beležk" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Odpri koren _dokumenta" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Odpri mapo _dokumenta" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Pripni _datoteko" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Pripni zunanjo datoteko" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Počisti priloge" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Uredi _vir" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Zaženi _spletni strežnik" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Posodobi kazalo" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "_Orodja po meri" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "Na_zaj" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Pojdi stran nazaj" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Naprej" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Pojdi stran naprej" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "N_adrejeni predmet" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Pojdi na nadrejeno stran" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Podrejeni predmet" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Pojdi na podrejeno stran" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "P_redhodna v kazalu" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Pojdi na predhodno stran" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Naslednja v kazalu" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Pojdi na naslednjo stran" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Domov" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Pojdi domov" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Skoči na ..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "V_sebina" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_V&O" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Tipkovne bližnjice" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Hrošči" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_O Programu" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Vsi pladnji" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Pokaže vse pladnje" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Vrstica stanja" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Stranski pladnji" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Prikaže stranske pladnje" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Celozaslonski način" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "_Uredljiva beležka" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Preklopi uredljivost beležke" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Brez" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Nedavne strani" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "Strani nedavno _spremenjeno" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Zgodovina" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "I_menski prostor" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Ikone i_n besedilo" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "Le _ikone" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Le besedilo" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Velike ikone" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Male ikone" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Drobcene ikone" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Menijem dodaj 'odtrgljive' trakove" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Za preklop na stranski pladenj uporabite " #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Odstrani povezave ob izbrisu strani" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Pri odpiranju strani vedno uporabi zadnji položaj kazalca" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "Navedena datoteka ali mapa ne obstaja.\n" "Preverite, če je pot pravilna." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "Ni takšne datoteka ali mape: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Iskanje" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "Iskanje strani ..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Ali želite posodobiti beležko?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Ta beležka je bila ustvarjena s starejšo različico programa zim.\n" "Ali jo želite nadgraditi na najnovejšo različico sedaj?\n" "\n" "Nadgrajevanje lahko vzame nekaj časa in lahko naredi različne\n" "spremembe beležke. V splošnem je pred tem dobro narediti\n" "varnostno kopijo.\n" "\n" "Če sedaj ne boste nadgradili, morda nekatere\n" "zmožnosti ne bodo delovale kot pričakovano." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Nadgrajevanje beležke" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "Kazalo se še vedno posodablja. Dokler se ne konča povezav ni mogoče pravilno " "posodabljati. Izvajanje tega dejanja sedaj bi lahko zlomilo povezave. Ali " "želite vseeno nadaljevati?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Posodabljanje povezav" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Odstranjevanje povezav" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Ali želite ustvariti mapo?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "Mapa \"%s\" še ne obstaja.\n" "Ali jo želite ustvariti zdaj?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Ni mogoče odpreti: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Ta stran nima mape prilog" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Urejanje datoteke: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Datoteko urejate v zunanjem programu. To pogovorno okno lahko zaprete, ko " "končate" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Namizni wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Andrej Znidarsic https://launchpad.net/~andrej.znidarsic\n" " Sasa Batistic https://launchpad.net/~sasa-batistic\n" " Vanja Cvelbar https://launchpad.net/~cvelbar\n" " c0dehunter https://launchpad.net/~kralj-primoz" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Kazalo" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "le za branje" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i_Povratnih povezav ..." msgstr[1] "%i_Povratna povezava ..." msgstr[2] "%i_Povratni povezavi ..." msgstr[3] "%i_Povratne povezave ..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Ni mogoče shraniti strani: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Za nadaljevanje lahko shranite kopijo te strani ali\n" "zavržete vse spremembe. Tudi v primeru shranjevanja kopije bodo\n" "vse spremembe zavržene, vendar lahko kopijo pozneje obnovite." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Zavrzi spremembe" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Shrani kopijo" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Skoči na" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Skoči na stran" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Nova podstran" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Nova stran" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Povezovanje na neobstoječo stran\n" "samodejno ustvari tudi novo stran." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Ime strani" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Predloga strani" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Stran obstaja" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Shrani kopijo" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Uvozi stran" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Besedilne datoteke" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Premakni stran" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Premakni stran \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Podosobi %i strani, ki se povezujejo na to stran" msgstr[1] "Podosobi %i stran, ki se povezuje na to stran" msgstr[2] "Podosobi %i strani, ki se povezujeta na to stran" msgstr[3] "Podosobi %i strani, ki povezujejo na to stran" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Imenski prostor" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Preimenuj stran" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Preimenuj stran \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Posodobi glavo te strani" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Izbris strani" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Ali želite izbrisati stran \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "Stran \"%s\" in vse njene\n" "podstrani in priloge bodo bile izbrisane" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Odstrani povezave iz %i strani, ki se povezujejo na to stran" msgstr[1] "Odstrani povezave iz %i strani, ki se povezuje na to stran" msgstr[2] "Odstrani povezave iz %i strani, ki se povezujeta na to stran" msgstr[3] "Odstrani povezave iz %i strani, ki se povezujejo na to stran" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i datotek bo izbrisanih" msgstr[1] "%i datoteka bo izbrisana" msgstr[2] "%i datoteki bosta izbrisani" msgstr[3] "%i datoteke bodo izbrisane" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Priloži datoteko" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Stran \"%s\" nima mape za priloge" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Vstavi slike kot povezavo" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Beležka" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Odpri beležko" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Privzeta beležka" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Dodajanje beležke" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Izberite ime in mapo za beležko." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Mapa" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Posodabljanje kazala ..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Razveljavi" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Uveljavi" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "I_zreži" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Kopiraj" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Prilepi" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Izbriši" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Preklopi izbirno polje 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Preklopi izbirno polje 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "Ur_edi povezavo ali predmet ..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Odstrani povezavo" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Datum in čas ..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Sliko ..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Vrs_tični seznam" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Oštevilčen seznam" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "S_eznam spustnih polj" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "_Besedilo iz datoteke ..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "Po_vezavo ..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Vstavljanje povezave" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "Po_čisti oblikovanje" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Najdi ..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Najdi _naslednje" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Najdi _predhodno" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Zamenjaj ..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Število besed ..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Približaj" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "O_ddalji" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "O_bičajna velikost" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nova _priloga" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "_Predloge datotek ..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Naslov_1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Naslov 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Naslov_2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Naslov 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Naslov_3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Naslov 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Naslov_4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Naslov 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Naslov_5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Naslov 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Močno" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Močno" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Poudari" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Poudari" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Označi" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Označi" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Prečrtaj" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Prečrtaj" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Po_dpisano" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Nadpisano" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Uporabite za slednje povezavam\n" "(V primeru, da je onemogočeno, lahko še vedno uporabite )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Pokaži kazalko tudi za strani, ki jih ni mogoče urejati" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Samodejno pretvori besede \"CamelCase\" v povezave" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Samodejno pretvori poti datotek v povezave" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Samodejno izberi trenutno besedo ob uveljavitvi oblikovanja" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Odstrani zamik ob \n" "(Če je onemogočeno, lahko še vedno uporabite )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Povaljajoče klikanje izbirnega polja kroži skozi njegova stanja" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "(Odstranitev)Zamik na predmetu seznama spremeni tudi podpredmete" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Izbira izbirnega polja bo spremenila tudi podpredmete" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Sproti preoblikuj označevanje wiki" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Privzeta oblika za kopiranje besedila na odložišče" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Mape s predlogami za datoteke prilog" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "Takšnega wikija ni določena: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Kopiraj _kot ..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Premakni izbrano besedilo ..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Uredi lastnosti" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Uredi povezavo" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "_Kopiraj povezavo" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Kopiraj naslov elektronske pošte" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Odpri z ..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Odpri" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "Ni nameščenih predlog" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "Mapa\n" "%s\n" "še ne obstaja.\n" "Ali jo želite ustvariti zdaj?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Vstavi datum in čas" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Koledar" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Povezava na datum" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Vstavi sliko" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Najprej pripni sliko" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Vrsta datoteke ni podprta: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Urejanje slike" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Mesto" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Poveži na" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Širina" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Višina" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Ponastavi velikost" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Vstavljanje besedila iz datoteke" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Uredi povezavo" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Povezava" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Besedilo" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Naslednji" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Predhodni" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Ujemanje _velikosti črk" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Celotna _beseda" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Logični izraz" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Poudari" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Najdi" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Možnosti" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Najdi in zamenjaj" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Besedilo iskanja" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Zamenjaj z" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Zamenjaj" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Zamenjaj _vse" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Štetje besed" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Odstavek" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Besede" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Vrstice" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Znaki" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Premakni besedilo na drugo stran" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Premakni" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Premakni besedilo v" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Pustite povezavo za ustvaritev nove strani" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Odpri novo stran" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Nova datoteka" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Vmesnik" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Urejanje" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Možnosti" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Vstavki" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Uporabi pisavo po meri" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Več" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Nastavi" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Odvisnosti" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Brez odvisnosti" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "V redu" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Spodletelo" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Izbirno" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Avtor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Omogočeno" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Vstavek" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Nastavi vstavek" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Možnosti za vstavek %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Lastnosti" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Lastnosti beležke" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "Nedavne spremembe" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "Danes" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "Včeraj" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "Zadnja sprememba" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Za napredno iskanje lahko uporabite operatorje kot\n" "AND, OR in NOT. Oglejte si stran pomoči za več podrobnosti." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Omeji iskanje na trenutni imenski prostor" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Rezultat" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Spletni strežnik" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Strežnik se ni zagnal" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "Dovoli javni dostop" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Vrata" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Strežnik se je zagnal" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Strežnik se je zaustavil" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Predloge" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "Brskaj" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Kopiraj predlogo" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Izbor datoteke" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Razširi _vse" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Zloži vse" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Počisti" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Izbor mape" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Izbor slike" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Levi stranski pladenj" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Desni stranski pladenj" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Spodnji pladenj" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Zgornji pladenj" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Zgoraj levo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Spodaj levo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Zgoraj desno" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Spodaj desno" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Videti je,da ste našli hrošča" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Pri poročanju tega hrošča vključite\n" "podrobnosti iz besedilnega polja spodaj" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Vse datoteke" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Slike" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "Datoteka že obstaja" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Datoteka z imenom \"%s\" že obstaja.\n" "Uporabite lahko drugo ime ali prepišete obstoječo datoteko." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Prebrskaj" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Prepiši" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Ni mogoče najti datoteke ali mape za to beležko" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Beležke ni bilo mogoče najti: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "Ime dane strani ni veljavno.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Neveljavno ime strani \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Kazalo se še vedno posodablja medtem ko program\n" "poskuša izvesti opravilo, ki ga potrebuje\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Ni mogoče spremeniti strani: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Ključna beseda medwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Domača stran" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Koren dokumenta" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Beležnica v souporabi" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmetika" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "Vstavek vam omogoča vstavitev arimetričnih izračunov v zim.\n" "Osnovan je na aritmetričnem modulu iz\n" "http://pp.com.mx/python/arithmetic.\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmetika" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Brskalnik prilog" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Ta brskalnik prikaže mapo prilog trenutne strani kot pogled\n" "ikone na spodnjem pladnju.\n" "\n" "Ta vstavek je še vedno v razvoju.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Položaj v oknu" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Priloge" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "Pokaži brskalnik prilog" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i_ prilog" msgstr[1] "%i_ priloga" msgstr[2] "%i_ prilogi" msgstr[3] "%i_ priloge" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Neznano" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "Vrsta" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Velikost" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Spremenjeno" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Premakni sem" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Kopiraj sem" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Prekliči" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Samodejen priklop" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek lahko samodejno \"priklopi\" beležke, ko je to potrebno.\n" "Uporabite ga lahko za povezavo z oddaljenimi pogoni ali za odklep " "šifriranega pogona,\n" "ko zim poskuša odpreti določeni beležko.\n" "\n" "To je osnovni vstavek, ki je del zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Pladenj povratnih povezav" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda dodaten gradnih, ki prikazuje seznam\n" "strani, ki se povezujejo s trenutno stranjo.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "Povratne povezave" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "D_anes" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Kole_dar" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Dnevnik" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Ta vstavek pretvori en imenski prostor v dnevnik\n" "s stranjo za vsak dan, teden ali mesec.\n" "Doda tudi gradnik koledarja za dostop do teh strani.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Dan" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Teden" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mesec" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Leto" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Pokaže koledar v stranskem pladnju namesto v pogovornem oknu" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Uporabi stran za vsako" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A, %d. %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Koledar" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Danes" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram ..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Vstavi diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Vstavi diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja urejevalnik diagramov za zim osnovan na GraphViz.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Uredi diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Urejanje brez motenj" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Ta vstavek doda nastavitev, ki pomaga pri uporabi\n" "programa zim brez motenj.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Skrij menijsko vrstico v celozaslonskem načinu" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Skrij orodno vrstico v celozaslonskem načinu" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Skrij vrstico poti v celozaslonskem načinu" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Skrij vrstico stanja v celozaslonskem načinu" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Največja širina strani" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Navpični odmik" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Barva ozadja besedila" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "Barva ospredja besedila" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "Barva ozadja zaslona" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa ..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Vstavi ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Vstavi Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja urejevalnik diagramov osnovan na Ditaa.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Vstavi Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_načba ..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Vstavi enačbo" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Vstavi enačbo" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja urejevalnik enačb za zim osnovan na latexu.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Uredi enačbo" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot ..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Vstavi Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Ta vstavek zagotavlja urejevalnik grafov za na zimu osnovan Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Uredi Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R graf ..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Vstavi GNU R graf" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Ta vstavek zagotavlja urejevalnik grafov za zim osnovan na GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Uredi GNU R graf" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R graf" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Oceni _matematiko" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "Medvstični vstavek računala ni mogel\n" "oceniti izraza na kazalki." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Medvrstično računalo" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek vam omogoča hitro oceno enostavnih\n" "matematičnih izrazov v zimu.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Ni mogoče razčleniti izraza" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Si_mbol ..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Vstavi simbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda pogovorno okno 'Vstavi simbol' in omogoča\n" "samodejno oblikovanje tipografskih znakov.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Razvrsti vrstice" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Razvrščevalnik vrstic" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Ta vstavek razvrsti izbrane vrstice v abecednem vrstnem redu.\n" "V primeru da je seznam že razvrščen, bo bil vrstni red obrnjen.\n" "(A-Ž v Ž-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Najprej izberite eno ali več vrstic besedila" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Pokaži zemljevid povezav" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Zemljevid povezav" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja pogovorno okno z grafično\n" "predstavitvijo strukture povezav beležke.\n" "Uporabiti ga je mogoče kot neke vrste \"miselni\n" "vzorec\", ki kaže, kako se strani povezujejo.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Natisni v brskalnik" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja izogibanje pomanjkanju\n" "podpore za tiskanje v programu zim. Trenutno stran izvozi\n" "v html in jo odpre v brskalniku. V primeru, da brskalnik\n" "podpira tiskanje, boste lahko svoje podatke natisnili\n" "v dveh korakih.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Natisni v brskalnik" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "HItro sporočilce ..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Hitro sporočilce" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda pogovorno okno za hitro spuščanje besedila ali\n" "vsebine odložišča na stran zim.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Ustvari novo stran za vsako sporočilce" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Naslov" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Odpri _stran" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "Ali želite zavreči sporočilo?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "Par_titura ..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Vstavi partituro" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Vstavljanje partiture" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek zagotavlja urejevalnik partitur za zim osnovan na GNU Lilypond.\n" "\n" "Je je jedrni vstavek, ki je del zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Skupna glava vključi" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Skupna noga vključi" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Uredi partituro" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Zaslonski posnetek ..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Vstavi zaslonski posnetek" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek omogoča zajemanje zaslonskega posnetka\n" "in njegovo neposredno vstavljanje v stran zim.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Zajemi celoten zaslon" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Izberite okno ali področje" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Zamik" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "sekunde" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Med poganjanjem \"%s\" je prišlo do napake" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Preveri _črkovanje" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Črkovalnik" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Doda podporo črkovanja z uporabo gtkspell.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Črkovanja za jezik \"%s\" ni bilo mogoče naložiti" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "To lahko pomeni, da nimate nameščenih\n" "ustreznih slovarjev" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Kazalo vsebine" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda dodaten gradnik, ki pokaže preglednico\n" "vsebine trenutne strani.\n" "\n" "To je osnovni vstavek, ki pride s programom zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" "Pokaži gradnik kazala vsebine kot ledbeč gradnik namesto v stranskem pladnju" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Kazalo vsebine" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Nižja raven" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Višja raven" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "neoznačeno" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Razvrsti po abecedi" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Razvrsti strani po oznakah" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Oznake" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Ta vstavek zagotavlja kazalo strani, ki je filtrirano z izbiro oznak v " "oblaku.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Seznam nalog" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda pogovorno okno, ki prikazuje vse odprte\n" "naloge v tej beležki. Odprte naloge so lahko odprta\n" "izbira polja ali stvari označene z oznakami \"TODO\" ali \"FIXME\".\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Obravnavaj vsa izbirna polja kot naloge" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Pretvori ime strani v oznake za predmete nalog" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Implicitni rok za naloge v straneh koledarja" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "Označi naloge, ki imajo rok v ponedeljek ali torek pred vikendom" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Oznake za označevanje nalog" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Oznaka za naslednjo nalogo" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Oznake za naloge brez dejanj" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Poddrevesa iz katerih naj bo ustvarjeno kazalo" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Poddrevesa za prezrtje" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Treba je pripraviti kazalo beležke" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Seznam nalog je sedaj prvič odprt.\n" "Zato je treba znova izgraditi kazalo.\n" "Glede na velikost beležke lahko to traja\n" "do nekaj minut. Ob naslednji uporabi seznama\n" "nalog to ne bo več potrebno." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Pokaži le naloge, kjer je mogoče izvesti dejanje" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i odprtih predmetov" msgstr[1] "%i odprt predmet" msgstr[2] "%i odprta predmeta" msgstr[3] "%i odprti predmeti" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Vsa opravila" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Neoznačeno" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Naloga" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Datum" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ikona sistemske vrstice" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda ikono sistemske vrstice za hiter dostop.\n" "\n" "Ta vstavek zahteva Gtk+ 2.10 ali noveši.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Običajna ikona sistemske vrstice\n" "en uporabite nove ikone stanja na Ubuntuju" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Pokaži ločeno ikono za vsako beležko" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Hitro sporočilce ..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Drugo ..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Beležke" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Namizni Wiki Zim" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "S_hrani različico ..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Različice ..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "V tej beležki od shranjevanja zadnje različice ni bilo sprememb" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Ni sprememb od zadnje različice" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Nadzor različic" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Ta vstavek doda nadzor različic za beležke.\n" "\n" "Ta vstavek podpira sisteme za nadzor različic Bazaar, Git in Mercurial.\n" "\n" "To je jedrni vstavek, ki je del zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Samodejno shrani različico ob rednih obdobjih" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Samodejno shranjena različica z zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Ali želite omogočiti nadzor različic?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Nadzor različic v tej beležki trenutno ni omogočen.\n" "Ali ga želite omogočiti?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Zaledje" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Shrani različico" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Vnesite opombo za to različico" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Shranjena različica iz programa zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Različice" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Stran" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Ogled _zabeležke" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Izberite različico za ogled sprememb med tisto različico in trenutnim " "stanjem.\n" "Izberete lahko več različic za ogled sprememb med njimi.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Opomba" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Obnovi različico" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Pokaži _spremembe" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "Stran _ob strani" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Vir zabeležene strani" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Ali želite stran obnoviti na shranjeno različico?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Ali želite obnoviti stran: %(page)s\n" "na shranjeno različico: %(version)s?\n" "\n" "Vse spremembe od zadnjega shranjevanja bodo izgubljene!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Spremembe" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Različica" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Beleži dogodke s programom Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Objavi dogodke v ozadnjemu programu Zeitgeist." #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Strani Wiki: %s" #~ msgid "Pages" #~ msgstr "Strani" #~ msgid "File browser" #~ msgstr "Brskalnik datotek" #~ msgid "Text Editor" #~ msgstr "Urejevalnik besedila" #~ msgid "Email client" #~ msgstr "Odjemalec e-pošte" #~ msgid "Web browser" #~ msgstr "Spletni brskalnik" #~ msgid "_Filter" #~ msgstr "_Filtriraj" #~ msgid "Prio" #~ msgstr "Prednost" zim-0.60/translations/zim.pot0000644000175000017500000020347412132472704016166 0ustar jaapjaap00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "" #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "" #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "" #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "" #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "" msgstr[1] "" #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "" msgstr[1] "" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "" msgstr[1] "" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "" msgstr[1] "" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "" #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "" #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "" #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "" #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "" #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "" #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "" #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "" msgstr[1] "" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "" #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "" #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "" msgstr[1] "" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "" zim-0.60/translations/es.po0000644000175000017500000025357112137750055015620 0ustar jaapjaap00000000000000# Spanish translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-03-30 23:21+0000\n" "Last-Translator: Juan Ignacio Pucheu \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "No se pudo ejecutar la aplicación: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "retornó un status de salida diferente a cero %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Error al completar el %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Predeterminado" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "No existe el archivo: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "No se pudo leer: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "" "Esto generalmente significa que el archivo contiene caracteres no válidos" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Detalles" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "El Archivo no se puede escribir: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "%s de los archivos del disco han sido cambiados" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Personalizar…" #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "No se encontraron aplicaciones" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Abrir con \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Configurar una aplicación para abrir los enlaces \"%s\"" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "Configurar una aplicación para abrir los archivos de tipo \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Configurar aplicaciones" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Añadir aplicación" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "Predeterminado del sistema" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Nombre" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Comando" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Hacer esta aplicación la aplicación por defecto" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Abrir archivo" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Abrir carpeta" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Borrar archivo" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Borrar" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selección" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Nombre del archivo" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Página" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Limpiar archivos adjuntos" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Invertir la selección" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "Los archivos debajo se encontraron en el directorio de archivosadjuntos de " "zim \n" "pero ya no están enlazados desde el cuaderno " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "No se encontraron archivos huérfanos." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Herramientas personalizadas" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "Puede configurar herramientas personalizadas que aparecerán\n" "en el menú de herramientas y en la barra de herramientas o los menús " "contextuales." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Editar herramienta personalizada" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Descripción" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Ícono" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "El comando no modifica datos" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Mostrar en la barra de herramientas" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "Los parámetros siguientes serán sustituídos\n" "en el comando cuando este se ejecute:\n" "\n" "%f la página fuente como un archivo temporal\n" "%d el directorio de adjuntos de la página actual\n" "%s el archivo fuente real de la página (si lo hay)\n" "%n la ubicación del cuaderno (archivo o carpeta)\n" "%D la raíz del documento (si la hay)\n" "%t el texto seleccionado o palabra bajo el cursor\n" "%T el texto seleccionado incluyendo formato de wiki\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Exportar" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Actualizando índice" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "La carpeta existe: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "La carpeta ya existe y tiene contenido, si exporta a esta carpeta puede " "sobreescribir archivos existentes. ¿Desea continuar?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exportando cuaderno de notas" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "Existe el archivo" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "Este archivo ya existe.\n" "¿Quiere sobrescribirlo?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Seleccione las páginas a exportar" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Cuaderno de _notas completo" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Una página" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Seleccione el formato de exportación" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Otro..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Dar formato" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Plantilla" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "" "Enlace los ficheros del directorio raíz de documentos con su ruta completa" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Mapear la raíz del documento al URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Seleccione el archivo o carpeta de salida" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Directorio de salida" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Índice de páginas" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Archivo de salida" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Vista previa" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "Ver _registro" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "Ocurrió un error mientras se generaba la imagen.\n" "¿Desea guardar el texto fuente de todos modos?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Archivo de registro" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_Archivo" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Editar" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_Ver" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Insertar" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Buscar" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "_Formato" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Herramientas" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "I_r" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "Ay_uda" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "B_arra de direcciones" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Barra de herramientas" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_Nueva página" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "Nueva s_ubpágina" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Abrir otro cuaderno de notas" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Abrir en una _ventana nueva" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Importar página..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Guardar" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Guardad una c_opia" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xportar..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Enviar a…" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Mover página..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Renombrar página..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Borrar Página" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "P_ropiedades" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Cerrar" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Salir" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Buscar..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Lo que _enlaza aquí..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copiar _lugar" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Plantillas" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Pr_eferencias" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Recargar" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Abrir _Carpeta de Adjuntos" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Abrir un directorio de libreta de notas" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Abrir Raíz de _Documentos" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Abrir la Carpeta del _Documento" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Adjuntar _Archivo" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Adjuntar archivo externo" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Limpiar adjuntos" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "Editar _Código" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Arrancar _Servidor Web" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Actualizar índice" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Herramien_tas personalizadas" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "A_trás" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Ir a página anterior" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "A_delante" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Ir a página siguiente" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Padre" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Ir a la página padre" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Hija" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Ir a página hija" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Anterior en el índice" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Ir a la página anterior" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Siguiente en el índice" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Ir a la página siguiente" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Inicio" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Ir al inicio" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "Sa_ltar a..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contenidos" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "Preguntas _frecuentes" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Atajos de teclado" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Errores" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "Acerca _de" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_Todos los paneles" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Mostrar todos los paneles" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "Barra de _estado" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_paneles laterales" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Mostrar los paneles laterales" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Pantalla completa" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Cuaderno Editable" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Marcar cuaderno como editable" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_Ninguno" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "Páginas _recientes" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_Historial" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "_Espacio de nombres" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Iconos _y Texto" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "_Sólo íconos" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "Sólo _Texto" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "Íconos _Grandes" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "Íconos _Pequeños" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "Íconos _minúsculos" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Adicionar banda de liberación a los menúes" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Use para cambiar al panel lateral" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Eliminar enlaces cuando se borren las páginas" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "" "Utilizar siempre la última posición del cursor cuando se abre una página" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "El archivo o carpeta que especificó no existe.\n" "Por favor chequee si el camino es el correcto." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "No existe el archivo o carpeta: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Buscar" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "¿Actualizar la libreta de notas?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "Esta libreta a sido creada con una versión antigua de zim.\n" "Desea actualizarla a la última versión ahora?\n" "\n" "Actualizar podría tomas algún tiempo y podría hacer algunos cambios\n" "a la libreta. En general es una buena idea hacer un\n" "respaldo antes de hacer esto.\n" "\n" "Si usted elige no actualizar ahora, algunas catacteristicas\n" "pueden no funcionar como se esperan" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Actualizando la libreta de notas" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "El índice está aún ocupado actualizando. Hasta que esto termine los enlaces " "no pueden ser actualizados correctamente. Ejecutando esta acción ahora puede " "romper enlaces, ¿desea continuar de todos modos?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Actualizando enlaces" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Eliminando enlaces" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "¿Crear carpeta?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "No se puede abrir: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "Esta página no tiene una carpeta para archivos adjuntos" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editando el archivo. %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "Está editando el archivo en una aplicación externa. Puede cerrar este " "dialogo cuando este listo" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "Una wiki de escritorio" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Adolfo Jayme Barrientos https://launchpad.net/~fitoschido\n" " Antonio Maldonado https://launchpad.net/~a.m.\n" " Carlos Albornoz https://launchpad.net/~caralbornozc\n" " DiegoJ https://launchpad.net/~diegojromerolopez\n" " Eduardo Alberto Calvo https://launchpad.net/~edu5800\n" " Felipe Hommen https://launchpad.net/~felihommen\n" " Fido https://launchpad.net/~fedevera\n" " Gonzalo Testa https://launchpad.net/~gonzalogtesta\n" " Hector A. Mantellini https://launchpad.net/~xombra\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Janzun https://launchpad.net/~janzun-w\n" " Javier Rovegno Campos https://launchpad.net/~jrovegno\n" " Jonay https://launchpad.net/~jonay-santana\n" " Juan Ignacio Pucheu https://launchpad.net/~jpucheu\n" " Ktl__XV https://launchpad.net/~jorgegil222\n" " Lex https://launchpad.net/~lex-exe\n" " Mariano Draghi https://launchpad.net/~chaghi\n" " Mariano Esteban https://launchpad.net/~mesteban\n" " Monkey https://launchpad.net/~monkey-libre\n" " Pablo Angulo https://launchpad.net/~pablo-angulo\n" " Paco Molinero https://launchpad.net/~franciscomol\n" " Reynaldo Cordero https://launchpad.net/~reynaldo-cordero\n" " Servilio Afre Puentes https://launchpad.net/~servilio\n" " Ubuntu https://launchpad.net/~invrom\n" " sanzoperez https://launchpad.net/~sanzoperez\n" " victor tejada yau https://launchpad.net/~victormtyau" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Indice" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "sólo lectura" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Enlace hacia atrás..." msgstr[1] "%i _Enlaces hacia atrás..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "No se pudo guardar la página: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "Para continuar puede guardar una copia de esta página o\n" "descartar los cambios. Si guarda una copia también se\n" "descartarán los cambios, pero podrá restaurarla más adelante." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Descartar Cambios" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "Guardar una _copia" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Saltar a" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Saltar a página" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "Sub página nueva" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "Página nueva" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Por favor, note que enlazando a una página inexistente\n" "también crea una nueva página automáticamente." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Nombre de la página" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Plantilla de página" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "La página ya existe" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Guardar una copia" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Importar página" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Archivos de Texto" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Mover página" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Mover página \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Actualizar %i página enlazando a ésta" msgstr[1] "Actualizar %i páginas enlazando a ésta" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Espacio de nombres" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Renombrar Página" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Renombrar página \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Actualizar el encabezamiento de ésta página" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Borrar página" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Borrar página \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "" "La página «%s» y todas sus\n" "sub-páginas serán borradas" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Eliminar enlaces de %i página enlazando a está página" msgstr[1] "Eliminar enlaces de %i páginas enlazando a está página" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i archivo será borrado" msgstr[1] "%i archivos serán borrados" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Adjuntar Archivo" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "La página \"%s\" no tiene una carpeta para archivos adjuntos" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Insertar imágenes como enlaces" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Cuaderno" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Abrir cuaderno" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Cuaderno predeterminado" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Añadir cuaderno" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Por favor, seleccione un nombre y carpeta para el cuaderno de notas" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Carpeta" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Actualizando el índice..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Deshacer" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Rehacer" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Cor_tar" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copiar" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Pegar" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Borrar" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Alternar marca de cotejo" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Alternar cruz" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Editar Enlace u Objeto..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Eliminar enlace" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Fecha y hora..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Imagen…" #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Lista Bulle_t" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "Lista _numerada" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Lista Checkbo_x" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Texto Desde _Archivo..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Enlace" #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Inserta un enlace" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Limpiar formatos" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Buscar…" #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Buscar _siguiente" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Buscar _anterior" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Reemplazar…" #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Conteo de palabras..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Ampliar" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Al_ejar" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "Tamaño _normal" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "Nuevo _Adjunto" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "Plantilla de _Archivo" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Encabezado _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Encabezado 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Encabezado _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Encabezado 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Encabezado _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Encabezado 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Encabezado _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Encabezado 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Encabezado _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Encabezado 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "Negrita_s" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Negritas" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Énfasis" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Énfasis" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Marcar" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Marcar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Tachar" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Tachar" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "Su_bíndice" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "Su_períndice" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Literal" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Literal" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Use la tecla para seguir enlaces\n" "(si está deshabilitado aún puede usar )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Mostrar el cursor en páginas no editables" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Convertir automáticamente palabras \"CamelCase\" en enlaces" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Convertir automáticamente rutas de archivo en enlaces" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Seleccionar automáticamente la palabra actual al aplicar un formato" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Desindentar con \n" "(Si no se activa, puede usar )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Hacer click varias veces en una casilla alterna entre sus estados" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "" "(Des-)Indentando un artículo de una lista también cambia sub-artículos" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Activar una marca de cotejo también cambia sub-artículos" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformatear marcado de wiki al vuelo" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Formato predeterminado para copiar texto a la papelera" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Carpeta con plantillas para archivos adjuntos" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "El wiki no está definido: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copiar _como…" #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Mover texto seleccionado…" #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Editar Propiedades" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Editar enlace" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copiar en_lace" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copiar dirección de correo-e" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Abrir Con..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Abrir" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "No hay ninguna plantilla instalada" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "El directorio\n" "%s\n" "no existe aún.\n" "¿Quiere crearlo ahora?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Introduzca fecha y hora" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendario" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "En_lazar a la fecha" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Insertar imagen" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Adjuntar imagen primero" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "Tipo de archivo no soportado: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Editar imagen" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Ubicación" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Enlazar con" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Ancho" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Altura" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Restaurar Tamaño" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Insertar Texto desde Archivo" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Editar enlace" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "En_lace" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Texto" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Siguiente" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Previo" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Coincidir mayúsculas y minúsculas" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Toda la _palabra" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "Expresión _regular" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "Resaltado" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Buscar" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Opciones" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Encontrar y reemplazar" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Econtrar qué" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Reemplazar con" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Reemplazar" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Reemplazar _Todos" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Contar palabras" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Párrafo" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Palabras" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Líneas" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Letras" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Mover texto a otra página" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Mover" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Mover texto a" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Dejar enlace a la página nueva" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Abrir una página nueva" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "Archivo nuevo" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interfaz" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editando" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferencias" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Extensiones" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Usar tipografía personalizada" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_Más" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "_Configurar" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependencias" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "Sin dependencias" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "Aceptar" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Falló" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Opcional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Autor" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Habilitado" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Extensión" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configurar extensión" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Opciones para la extensión %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Propiedades" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Propiedades del Cuaderno" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "Para búsquedas avanzadas puede user operadores\n" "como «AND», «OR» y «NOT». Vea la página de ayuda\n" "para más detalles." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limitar la búsqueda al espacio de nombres actual" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Puntuación" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "El servidor no ha arrancado" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Puerto" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Servidor arrancado" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Servidor detenido" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Plantillas" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Copiar Plantilla" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Seleccione el archivo" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Expandir _todo" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Contraer todo" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Vaciar" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Seleccione la carpeta" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Seleccionar Imagen" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Panel lateral izquierdo" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Panel lateral derecho" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Panel inferior" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Panel superior" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Esquina superior izquierda" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Esquina inferior izquierda" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Esquina superior derecha" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Esquina inferior derecha" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Parece que encontró un error" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "Cuando reporte este error por favor incluya\n" "la información en el recuadro de texto debajo" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "Todos los Archivos" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Imágenes" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "El archivo ya existe" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "Un archivo con el nombre \"%s\" ya existe.\n" "Puede usar otro nombre o sobreescribir el archivo existente." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Examinar" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Sobreescribir" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "No se pudo encontrar el archivo o carpeta para este cuaderno" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "No se pudo encontrar el cuaderno: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "El nombre de página introducido no es válido.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Nombre de página inválido \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "El índice está aún ocupado actualizando mientras intentamos\n" "hacer una operación que necesita el índice.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "No se puede modificar la página: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Teclado Interwiki" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Página personal" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Documento raíz" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Perfil" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Compartir Libreta" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Aritmética" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Aritmético" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Adjuntar Navegador" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "Este complemento muestra los directorios adjuntos de la página actual como " "un\n" "icono en el panel inferior\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Posición en la ventana" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Anexos" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i_Adjunto" msgstr[1] "%i_Adjuntos" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Desconocida" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Tamaño" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modificado" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Mover aquí" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copiar aquí" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Cancelar" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Montar automáticamente" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión puede \"montar\" cuadernos de notas automáticamente cuando se " "necesite.\n" "Puede utilizarse, por ejemplo, para conectar con unidades remotas o " "desbloquear una unidad\n" "encriptada cuando zim intenta abrir un cuaderno de notas concreto.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "Panel Backlinks" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin agrega un widget extra que muestra una lista de páginas\n" "enlazadas a la página actual.\n" "\n" "Es un plugin propio de zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "BackLinks" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "_Hoy" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "_Calendario" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "Diario" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" "Este plugin transforma un namespace en un diario\n" "con una página por día, semana o mes.\n" "También agrega un widget de calendario para acceder a estas páginas.\n" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Día" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Semana" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Mes" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Año" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Mostrar el calendario en el panel lateral en vez de como diálogo" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Usar una página por cada" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendario" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Hoy" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_grama..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Insertar diagrama" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Insertar diagrama" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión provee un editor de diagramas basado en GraphViz.\n" "\n" "Esta es una extensión principal que se suministra con zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Editar diagrama" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "Edición sin distracciones" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" "Este plugin agrega configuraciones que ayudan a usar zim\n" "como un editor libre de distracciones.\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "Esconder la barra de menu en el modo pantalla completa" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "Esconder la barra de herramientas en el modo pantalla completa" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "Esconder la barra de direcciones en el modo pantalla completa" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "Esconder la barra de status en el modo pantalla completa" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "Ancho de página máximo" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "Margen vertical" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "Color del texto de fondo" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "color de texto" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "color de fondo de pantalla" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Diagrama" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Insertar diagrama" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Insertar Diagrama" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión proporciona un editor de diagramas para Zim basado en Ditaa.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "Editar diagrama" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_cuación..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Insertar ecuación" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Insertar ecuación" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión provee un editor de ecuaciones basdo en LaTeX.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Editar ecuación" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Insertar Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "" "Este plugin proporciona un editor gráfico de zim basado en Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Editar Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "Gráfico de GNU _R" #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insertar gráfico de GNU R" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "Esta extensión provee un editor de gráficos basado en GNU R.\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Editar gráfico de GNU R" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "Gráfico de GNU R" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evaluar _matemática" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "El complemento de calculadora en línea\n" "no pudo evaluar la expresión en el cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "Calculadora en línea" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento le permite evaluar rápidamente\n" "expresiones matemáticas simples en Zim.\n" "\n" "Este es un complemento incluido en la base de Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "No se pudo analizar la expresión" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sí_mbolo..." #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Insertar símbolo" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión adiciona el diálogo \"Insertar símbolo\"\n" "y permite el formateado automático de caracteres\n" "tipográficos.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Ordenar líneas" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Ordenador de líneas" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "Este plugin ordena alfabéticamente las líneas seleccionadas . \n" "Si la lista ya está ordenada invierte el orden\n" " (AZ para ZA).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Por favor, seleccione más de una línea de texto primero." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Mostrar Mapa de Enlaces" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Mapa de Enlaces" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión provee un diálogo con una\n" "representación gráfica de la estructura de enlaces\n" "del cuaderno. Puede ser usada como especie de\n" "mapa mental que muestra como las páginas se\n" "relacionan entre sí.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Imprimir al Navegador" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión provee una solución alternativa para la\n" "falta de soporte de impresión en zim. La página actual\n" "se exporta a HTML y se abre en un navegador.\n" "Asumiendo que el navegador tienen soporte para\n" "impresión esto lleva sus datos a la impresora en dos\n" "pasos.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "Imprimir al na_vegador" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Nota rápida..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Nota rápida" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión adiciona una caja de diálogo para lanzar unas\n" "rápidamente un texto o el contenido del portapapeles dentro de\n" "página.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Crear una página nueva para cada nota" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Título" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Abrir _página" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "S_core..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Agregar puntaje" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Agregar puntaje" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este plugin provee a zim un editor de puntaje basado en GNU Lilypond.\n" "\n" "Este plugin viene con zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Incluir cabecera común" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Incluir pié de página común" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Edit Puntaje" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Captura de pantalla…" #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Insertar captura de pantalla" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento permite tomar una captura de pantalla\n" "e insertarla directamente en una página de Zim.\n" "\n" "Este es un complemento incluido en la base de Zim.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Capturar pantalla completa" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Seleccionar ventana o región" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Retardo" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "segundos" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "Ocurrió un error al ejecutar «%s»" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Revisar _ortografía" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Corrector ortográfico" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Adiciona corrección ortográfica usando gtkspell.\n" "\n" "Esta es una extensión principal suministrada con zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "No se pudo cargar el chequeador ortográfico para el lenguaje: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "Esto puede significar que no tiene el diccionario\n" "apropiado instalado." #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Índice de contenidos" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión añade un espacio extra que muestra una tabla de contenidos " "para la página actual.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "" "Mostrar Tabla_de_Contenido como un espacio a parte en lugar de en el panel " "principal" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "Tabla_de_Contenido" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Inferior" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Superior" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "sin etiquetar" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Ordenar alfabéticamente" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Ordenar páginas por etiquetas" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Etiquetas" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "Este plugin ofrece un índice filtrado seleccionado de las etiquetas en una " "nube.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Lista de tareas" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento añade un diálogo que muestra todas las\n" "tareas pendientes de este cuaderno, sean cajas sin marcar \n" "o listas marcadas con las etiquetas \"TODO\" o \"FIXME\".\n" "\n" "Este es un complemento principal que se suministra con zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Considerar todas las marcas de cotejo como tareas" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Convertir el nombre de la página a etiquetas para las tareas" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "La fecha límite está implícita en las tareas del calendario" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "" "Las tareas marcadas vencen el lunes o el martes antes del fin de semana" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Etiquetas que marcan tareas" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Etiqueta para la tarea siguiente" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "Etiquetas para tareas no accionables" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "Subárbol al índice" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "Sub-árbol a ignorar" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Se necesita indizar el cuaderno de notas" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "Esta es la primera vez que se abre la lista de\n" "tareas. Por tanto el índice necesita reconstruirse.\n" "Dependiendo del tamaño del cuaderno esto puede\n" "tomar varios minutos. La próxima vez que use la\n" "lista de tareas esto no será necesario de nuevo." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filtrar" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Mostrar sólo tareas con acción" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i artículo abierto" msgstr[1] "%i artículos abiertos" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "Todas las tareas" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Sin Etiqueta" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Tarea" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Fecha" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Ícono de la bandeja del sistema" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Este complemento añade un icono en la bandeja del sistema\n" "para acceso rápido.\n" "\n" "Depende de: gtk versión 2.10 o mayor.\n" "\n" "Este es un complemento principal que se suministra con zim\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Bandeja del sistema clásica,\n" "no usar el nuevo estilo de ícono de estado en Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Mostrar un ícono separado para cada cuaderno" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "Nota _rápida..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Otro…" #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Cuadernos de notas" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Wiki de escritorio" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "Gu_ardar versión" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versiones..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "No hay cambios en esta libreta de notas desde la última vez que se guardo" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "Sin cambios desde la última versión" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Control de versiones" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Esta extensión añade control de versiones para las notas.\n" "Soporta los siguientes sistemas: Bazaar, Git y Mercurial.\n" "Es una extensión integrada e incluida por defecto en Zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Auto-guardar una versión a intervalos regulares" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Versión guardada automáticamente desde zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "¿Activar control de versiones?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "El control de versiones no se ha habilitado para este cuaderno.\n" "¿Desea habilitarlo?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Administración" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Guardar versión" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Por favor, entre un comentario para esta versión" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Versión guardada desde zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versiones" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Página" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "Ver con _Anotaciones" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Seleccione una versión para ver los cambios entre esa versión y el estado " "actual.\n" "O seleccione multiples versiones para ver los cambios entre ellas.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Comentario" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restaurar versión" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Mostrar _cambios" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "Lado a lado" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Fuente anotada de la página" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "¿Restaurar la página a su versión guardada?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "¿Desea restaurar la página: %(page)s\n" "a su versión guardada: %(version)s ?\n" "\n" "¡Todos los cambios hechos desde la versión guardada se perderán!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Cambios" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev." #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Registrar los eventos con Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Envía los eventos al daemon Zeitgeist" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Página Wiki: %s" #~ msgid "Slow file system" #~ msgstr "Sistema de archivos lento" #~ msgid "Text Editor" #~ msgstr "Editor de texto" #~ msgid "File browser" #~ msgstr "Explorador de archivos" #~ msgid "Output" #~ msgstr "Salida" #~ msgid "Match c_ase" #~ msgstr "Coincidir m_ayúsculas y minúsculas" #~ msgid "Pages" #~ msgstr "Páginas" #~ msgid "Prio" #~ msgstr "Prioridad" #~ msgid "_Filter" #~ msgstr "_Filtro" #~ msgid "Web browser" #~ msgstr "Navegador web" #~ msgid "Email client" #~ msgstr "Cliente de correo-e" zim-0.60/translations/zh_CN.po0000644000175000017500000024266412137750055016213 0ustar jaapjaap00000000000000# Simplified Chinese translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-04-20 07:47+0000\n" "Last-Translator: lhquark \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "应用程序运行失败: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "返回非零的退出状态 %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "运行失败:%s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "默认" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "calendar:week_start:1" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "没有 %s 文件" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "无法读取:%s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "这通常意味着文件包含无效字符" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "详细信息" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "文件不可写:%s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "文件发生变化:%s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "自定义..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "未找到应用程序" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "使用 \"%s\" 打开" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "配置用于打开“%s”链接的程序" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "配置用于打开“%s”类型文件的程序" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "配置应用程序" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "添加应用程序" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "系统默认" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "名称" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "命令" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "设置默认程序" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "打开文件" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "打开目录" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "删除文件" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "删除" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "选中区域" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "文件名" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "页面" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "删除附件" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "反选" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "附件目录中以下文件不再被使用 " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "未发现不被使用的附件文件" #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "自定义工具" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "你可以设置自定义工具,\n" "它们会出现在菜单、工具栏和右键菜单中。" #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "编辑自定义工具" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "说明" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "图标" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "没有修改数据" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "显示在工具栏中" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "程序执行中如下的参数会被替换为相应的内容:\n" "\n" "%f 临时的页面源码文件\n" "%d 当前页面的附件目录\n" "%s 真实的页面源文件(如果存在)\n" "%n 笔记本的位置(文件或目录)\n" "%D 文档根目录(如果存在)\n" "%t 光标所选择的文本或单词\n" "%T 所选的文本包含有wiki格式化\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "导出" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "更新索引" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "文件夹已经存在: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "这是一个已存在的非空文件夹,导入到这个文件夹可能导致已存在的文件被覆盖。继续吗?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "导出笔记本" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "文件已存在" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "这个文件已经存在。" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "导出" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "整个笔记本(_N)" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "单个页面(_p)" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "选择导出的格式" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "其它..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "格式" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "模板" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "对文档目录下的文件使用完整路径链接" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "把文档根映射为URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "选择输出文件或文件夹" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "输出文件夹" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "索引页" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "输出文件" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "预览(_P)" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "查看日志(_L)" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "生成图像失败。\n" "还是需要保存文件吗?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "日志" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "文件(_F)" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "编辑(_E)" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "视图(_V)" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "插入(_I)" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "搜索(_S)" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "格式(_M)" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "工具(_T)" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "转到(_G)" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "帮助(_H)" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "路径栏(_A)" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "工具栏(_T)" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "新建页面(_N)" #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "新建子页面(_U)" #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "打开另一个笔记本(_O)" #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "在新窗口中打开(_W)" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "导入页面(_I)" #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "保存(_S)" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "另存为(_C)" #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "导出(_X)" #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "发送至...(_S)" #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "移动页面(_M)" #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "重命名页面(_R)" #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "删除页面(_R)" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "属性(_T)" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "关闭(_C)" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "退出(_Q)" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "搜索(_S)..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "搜索反向链接(_B)..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "最近更改..." #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "复制地址(_L)" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "模板(_T)" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "首选项(_E)" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "重新载入(_R)" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "打开附件目录(_F)" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "打开笔记本目录(_N)" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "打开文档根目录(_D)" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "打开文档目录(_D)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "添加附件(_F)" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "附加外部文件" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_删除附件" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "编辑源码(_S)" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "启动Web服务器(_W)" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "更新索引" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "自定义_工具" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "后退(_B)" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "向后翻页" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "前进(_F)" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "向前翻页" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "父对象(_P)" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "转到上级页面" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "子对象(_C)" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "转到子页面" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "上一页(_P)" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "转到上一页" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "下一页(_N)" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "转到下一页" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "主页(_H)" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "主页" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "跳转到(_J)..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "内容(_C)" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "常见问题(_F)" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "快捷键(_K)" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "报告错误(_B)" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "关于(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "所有窗格(_A)" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "显示所有窗格" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "状态栏(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "侧窗格(_S)" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "显示侧窗格" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "全屏(_F)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "笔记本可编辑(_E)" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "切换笔记本编辑状态" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "无(_N)" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "最近页面(_R)" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "最近更改的页面(_C)..." #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "历史(_H)" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "命名空间(_A)" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "图标和文字(_A)" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "只显示图标(_I)" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "只显示文本(_T)" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "大图标(_L)" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "小图标(_S)" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "微图标(T)" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "为菜单增加剪切线" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "使用来切换侧面板" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "删除页面时移除链接" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "打开页面时光标始终置于上一次位置" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "指定的文件或文件夹不存在。\n" "请检查路径是否正确。" #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "没有这个文件或文件夹: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "查找" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "搜索页面..." #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "升级笔记本?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "此笔记本是由一个旧版本的zim创建的\n" "你希望现在就将笔记本更新到最新版本吗?\n" "\n" "此升级需要花一点时间并且会对笔记本进行各种改动\n" "建议先备份再进行此升级\n" "\n" "如果不打算现在升级,一些功能可能会不能正常工作" #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "正在升级笔记本" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "索引更新正在更新中。链接可能发生错误直到索引更新结束。执行此动作将破坏链接,你是否仍要继续?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "更新链接" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "正在删除链接" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "创建目录吗?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" "文件夹 “%s” 不存在。\n" "您想现在创建它吗?" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "不能打开:%s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "该页面不包含附件目录" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "正在编辑文件:%s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "您正在使用外部程序编辑文件,完成后你可以关闭对话框。" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "桌面wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Exaos Lee https://launchpad.net/~exaos\n" " H https://launchpad.net/~zheng7fu2\n" " Harris https://launchpad.net/~huangchengzhi\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Junnan Wu https://launchpad.net/~mygoobox\n" " Qianqian Fang https://launchpad.net/~fangq\n" " Robin Lee https://launchpad.net/~cheeselee\n" " Saul Thomas https://launchpad.net/~stthomas\n" " Tolbkni Kao https://launchpad.net/~tolbkni\n" " Xhacker Liu https://launchpad.net/~xhacker\n" " Yang Li https://launchpad.net/~liyang-deepbrain\n" " aosp https://launchpad.net/~aosp\n" " ben https://launchpad.net/~duyujie\n" " forget https://launchpad.net/~yangchguo\n" " hutushen222 https://launchpad.net/~hutushen222\n" " lhquark https://launchpad.net/~lhquark\n" " piugkni zhang https://launchpad.net/~flamefist-163\n" " quake0day https://launchpad.net/~quake0day\n" " rns https://launchpad.net/~remotenonsense\n" " snowdream https://launchpad.net/~yanghui\n" " stein https://launchpad.net/~zhoufei715\n" " 冯超 https://launchpad.net/~rainofchaos\n" " 太和 https://launchpad.net/~tayhe\n" " 宝刀没开刃 https://launchpad.net/~xkhome" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "目录" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "只读" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i 个反向链接..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "无法保存页面: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "你可以保存此页或放弃修改。如果保存失败,稍后还可以复原。" #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "放弃更改(_D)" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "保存副本(_S)" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "跳转到" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "跳转到页面" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "新子页面" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "新建页面" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "请注意,链接到一个不存在的页面\n" "将会自动创建一个新页。" #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "页面名称" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "页模板" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "页面已存在" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "保存副本" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "导入页面" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "文本文件" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "移动页面" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "移动页面 \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "更新从 %i 到本页的页面链接" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "命名空间" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "重命名页面" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "重命名页面 \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "更新此页的标题" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "删除页面" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "确定删除\"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "页面“%s”和所有它的子页面及附件都将被删除。" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "移除从第 %i 页到本页的链接" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i文件将被删除" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "附加文件" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "页面 \"%s\" 并没有用于摆放附件的文件夹" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "以链接方式插入图像" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "记事本" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "打开笔记本" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "默认记事本" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "添加笔记本" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "请给笔记选择一个名称和目录" #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "文件夹" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "更新索引..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "撤销(_U)" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "重做(_R)" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "剪切(_T)" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "复制(_C)" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "粘贴(_P)" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "删除(_D)" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "切换复选框为“钩”" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "切换复选框为“叉”" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "编辑链接或对象(_E)..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "去除链接(_R)" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "日期与时间(_D)..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "图像(_I)..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "项目符号列表" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "顺序(_N)列表" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "可复选列表" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "来自文件(_F)..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "链接(_L)..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "插入链接" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "清除格式(_C)" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "查找(_F)..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "查找下一个(_X)" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "查找上一个(_V)" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "替换(_R)..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "字数统计..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "放大(_Z)" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "缩小(_O)" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "正常大小(_N)" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "新附件(_A)" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "文件模板(_T)" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "一级标题(_1)" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "标题 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "二级标题(_2)" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "标题 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "三级标题(_3)" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "标题 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "四级标题(_3)" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "标题 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "五级标题(_5)" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "标题 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "粗体(_S)" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "粗体" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "斜体(_E)" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "斜体" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "下划线(_M)" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "下划线" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "删除线(_S)" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "删除线" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "下标(_S)" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "上标(_S)" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "逐字(_V)" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "逐字" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "使用“回车键”跟进链接\n" "(如果禁用也可以使用“Alt + Enter”)" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "不可编辑的文档仍然显示光标" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "自动将\"CamelCase\"词转换为链接" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "自动将路径转换为链接" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "当应用格式时自动选择当前词" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "使用“删除键”取消缩进\n" "(如果禁用也可以使用“Shift + Tab”)" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "反复点击复选框会循环切换复选框的状态" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "缩进(或取消)一个列表时也缩进它的子列表" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "勾选复选框时也勾选它的子项" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "实时格式化 wiki 代码" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "复制到剪贴板文本的默认格式" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "包含附件文件模板的文件夹" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "该内部链接 %s 无效" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "拷贝为(_A)..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "移动已选文本..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_编辑属性" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "编辑链接(_E)" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "复制链接(_L)" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "复制电子邮件地址" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "打开方式..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_打开" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "没有安装模板" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "文件夹\n" "%s\n" "不存在。\n" "您想现在创建它吗?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "插入日期与时间" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "日历(_C)" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "链接到日期(_L)" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "插入图片" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "先将图片添加为附件" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "不支持的文件类型: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "编辑图像" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "位置" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "链接到" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "宽度" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "高度" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "恢复大小(_R)" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "从文件插入文本" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "编辑链接" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "链接(_L)" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "文本" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "下一个(_N)" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "上一个(_P)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "匹配大小写(_C)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "整词查找(_W)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "正则表达式(_R)" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "高亮显示(_H)" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "查找" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "选项" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "查找替换" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "查找" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "替换为" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "替换(_R)" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "替换全部(_A)" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "字数统计" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "段落" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "字数" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "行" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "字符数" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "移动文本到其它页面" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "移动(_M)" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "移动文本到" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "保留到新页面的链接" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "打开新页面" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "新建文件" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "界面" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "编辑" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "首选项" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "插件" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "使用自定义字体" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "更多(_M)" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "配置(_O)" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "依赖关系" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "无依赖关系" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "确定" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "失败" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "可选的" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "作者" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "已启用" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "插件" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "配置插件" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "插件 %s 的选项" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "属性" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "笔记本属性" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "最近更改" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "今天" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "昨天" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "最后更改" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "你可以使用操作符 AND、OR 和 NOT 实现高级搜索功能。详细内容参见帮助页。" #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "限制搜索当前命名空间" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "次数" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "Web 服务器" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "服务器未开启" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "允许公开访问" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "端口" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "服务器已启动" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "服务器已停止" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "模板" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "浏览" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "复制模板" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "选择文件" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "展开所有(_A)内容" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "折叠所有(_C)内容" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "清除" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "选择文件夹" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "选择图片" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "左侧窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "右侧窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "底部窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "顶部窗格" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "左上角" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "左下角" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "右上角" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "右下角" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "好像你发现了一个Bug" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "提交错误时请包含以下文本框中的信息" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "所有文件" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "图片" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "文件已存在" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "%s文件已存在" #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "浏览(_B)" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "覆写" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "没有找到这个笔记本的文件或文件夹" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "无法找到笔记本: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "指定的页面不可用\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "不可用的页名 \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "索引更新中... \n" "请等待!\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "不能修改页面: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "内部维基关键词" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "首页" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "文档根目录" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "属性" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "分享笔记" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "算术运算" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" "此插件可在 zim 中嵌入算数计算。\n" "此插件基于\n" "http://pp.com.mx/python/arithmetic\n" "中的算数模块。\n" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "算术(_A)" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "附件浏览器" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "该插件能够在屏幕底边以图标形式展示当前页面的附件文件夹。\n" "\n" "该插件目前仍在开发中。\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "窗口中的位置" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "附件" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "显示附件浏览器" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i 个附件(_A)" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "未知状态" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "文件类型" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "大小" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "修改日期" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "移动到此处(_M)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "复制到此处(_C)" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "取消" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "自动挂载" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件可自动加载(mount)所需要的笔记本。当 zim 试图打开指定\n" "的笔记本时,它可以用于,比如连接远程磁盘,或者解锁加密磁盘。\n" "这是 zim 自带的核心插件之一。\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "反向链接窗格" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件会在窗口中添加一个小部件,\n" "显示链接到当前页面的所有页面列表。\n" "\n" "此插件为 zim 自带的核心插件。\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "反向链接" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "今天(_D)" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "日历(_D)" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "日志" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "天" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "周" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "月" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "年" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "将日历作为侧边栏" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "每个一个页面" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%Y 年 %B 月 %d 日 %A" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "日历" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "今天(_T)" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "图形(_G)..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "插入图形" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "插入图形" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件提供一个基于 GraphViz 的图形编辑器。\n" "这是 zim 的核心插件。\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "编辑图形(_E)" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "免打扰编辑模式" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "此插件添加了部分设置以将 zim 作为免打扰编辑器使用。\n" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "全屏模式中隐藏菜单栏" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "全屏模式中隐藏工具栏" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "全屏模式中隐藏路径栏" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "在全屏模式下隐藏状态栏" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "最大页面宽度" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "垂直余量" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "文本背景颜色" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "文字的前景色" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "屏幕背景颜色" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "插入 ditaa 绘图" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "插入 ditaa 绘图" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "此插件为 zim 提供基于 Ditaa 的绘图。\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "编辑(_E) Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "公式(_Q)..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "插入公式" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "插入公式" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件提供了一个基于 Latex 的公式编辑器。\n" "此插件是随 zim 一同分发的核心插件。\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "编辑公式(_E)" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot绘图工具..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "插入Gnuplot绘图" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "该插件提供一个基于Gnuplot的绘图编辑器\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "编辑Gnuplot(_E)" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R 绘图..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "插入 GNU R 绘图" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "此插件提供 zim 基于 GNU R 的绘图编辑器。\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "编辑 GNU R Plot(_E)" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R 绘图" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "执行计算" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "内置计算器无法计算鼠标指针所处位置的表达式" #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "内置计算器" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "这个插件可以快速帮你确定一个数学表达式。\n" "这是一个核心插件。\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "不能解析表达式" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "符号(_m)" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "插入符号" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "该插件将添加“插入符号”对话框并允许\n" "可打印字符进行自动排列。\n" "\n" "这是一个由 zim 提供的核心插件。\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "排序行" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "行排序" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "该插件按字母顺序对选定的行进行排序\n" "如果选定的行已经是有序的,则会逆序\n" "(A-Z 变成 Z-A)\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "请首先选择多于一行的文本" #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "显示链接图" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "链接图" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件提供了一个记事本的图形化的链接结构描述对话框。\n" "他能用于类似于“Mind Map”这样的软件来展示页面间的关系。\n" "此插件是 zim 的核心插件。\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "打印至浏览器" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件给 zim 提供了一个更好打印解决方案。\n" "他可以将当前页导出到 HTML 页面并用浏览器打开。\n" "如果浏览器支持打印,则可以很容易的将页面打印出来。\n" "此插件是随 zim 一同分发的核心插件。\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "打印至浏览器(_P)" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "快速笔记..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "快速笔记" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件会显示一个对话框,可以将文本或剪切板内容快速的粘贴到 zim 页面中。\n" "此插件是随 zim 共同分发的核心插件。\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "为每个笔记创建一个新页面" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "标题" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "打开页面(_P)" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "丢弃笔记?" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "乐谱(_S)..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "插入乐谱" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "插入乐谱" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "此插件为 zim 提供一基于 GNU Lilypond 的乐谱编辑器。\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Common include header" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Common include footer" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "编辑乐谱(_E)" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "屏幕截图(_S)..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "插入屏幕截图" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "这个插件可以获取屏幕快照并且插入到页面中。\n" "这是一个核心插件。\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "截取全屏" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "选中的窗口或区域" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "延迟" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "秒" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "运行\"%s\"时发生错误" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "拼写检查(_S)" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "拼写检查器" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "使用 gtkspell 来增加拼写检查功能\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "加载 %s 拼写检查器失败" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "你可能没有安装合适的词典" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "目录" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件添加一个额外的控件来显示当面页面的目录。\n" "这是 zim 自带的核心插件。\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "浮动显示目录(代替侧面板)" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "目录" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "降级" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "提升" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "无标签" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "按字母排序" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "按标签排序页面" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "标签" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "该插件依据标签云中的所选标签,生成页面索引\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "任务列表" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件将会用对话框来显示记事本里面所有的开放任务。\n" "开放任务包括所有的复选项和标记有“TODO”和“FIXME”标签的项目。\n" "此插件是 zim 的核心插件。\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "将所有选中项作为任务" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "将页面名称作为任务项的标签" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "您没有在日期页中设置任务的截止日期" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "将任务标记为在周末前的周一或周二到期" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "使用标签标注任务" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "下一个(Next)任务的标签" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "要索引的子树" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "要忽略的子树" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "需要对记事本做索引" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "这是第一次打开任务列表。\n" "因此需要重建索引。\n" "根据记事本大小的不同将会花费不同的时间。\n" "下次再打开任务列表时就不再需要重建索引。" #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "过滤器" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "只显示可执行任务" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i 个打开的项目" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "所有任务" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "没有标签" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "任务" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "日期" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "系统托盘图标" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件会增加一个用以快速访问的托盘图标。\n" "这个插件依赖于 GTK+ 2.10以上版本。\n" "此插件是 zim 的核心插件。\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "经典托盘图标,\n" "不要在 Ubuntu 上使用新风格的状态图标" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "为每个笔记显示不同的图标" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "快速笔记...(_Q)" #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "其它(_O)..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "记事本" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim 桌面维基" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "保存版本(_A)" #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "所有版本(_V)" #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "自从上次保存之后到现在为止,记事本中没有做出任何修改" #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "没有做出任何修改" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "版本控制" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "此插件为笔记本添加版本控制功能。\n" "此插件支持 Bazaar, Git 及 Mercurial 版本控制系统。\n" "这是 zim 自带的核心插件。\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "以常规时间间隔自动保存版本" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "zim 自动保存的版本" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "启用版本控制?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "当前笔记本没有启用版本控制。\n" "需要在当前笔记本启用版本控制吗?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "后端" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "保存版本" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "请为此版本添加一个注释" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "zim 保存的版本" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "版本" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "页面(_P)" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "查看附加说明(_A)" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "选择一个或多个版本,用于查看这些版本与当前版本的区别。\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "备注" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "恢复版本(_R)" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "显示改动(_C)" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "并排比较" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "附注的页面源代码" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "从版本的恢复此页面" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "将要恢复此页面:%(page)s\n" "它来源于此版本:%(version)s\n" "你确定要这样吗?\n" "保存的所有改变都会丢失!" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "改动" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "版本" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "使用 Zeitgeist 记录事件" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "向 Zeitgeist 守护进程推送事件信息。" #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "维基页面:%s" #~ msgid "Text Editor" #~ msgstr "文本编辑器" #~ msgid "Email client" #~ msgstr "邮件客户端" #~ msgid "Web browser" #~ msgstr "网页浏览器" #~ msgid "Pages" #~ msgstr "页面" #~ msgid "Output" #~ msgstr "输出" #~ msgid "File browser" #~ msgstr "文件浏览器" #~ msgid "Match c_ase" #~ msgstr "匹配大小写(_A)" #~ msgid "Slow file system" #~ msgstr "慢文件系统" #~ msgid "Prio" #~ msgstr "优先级" #~ msgid "_Filter" #~ msgstr "过滤器(_F)" zim-0.60/translations/en_GB.po0000644000175000017500000024177612137750055016167 0ustar jaapjaap00000000000000# English (United Kingdom) translation for zim # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the zim package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: zim\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-04-13 13:11+0200\n" "PO-Revision-Date: 2013-01-20 07:54+0000\n" "Last-Translator: dotancohen \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-04-30 11:48+0000\n" "X-Generator: Launchpad (build 16580)\n" #. Dialog title #: zim/gui/__init__.py:3449 msgid "Attach File" msgstr "Attach File" #. Error message when external application failed, %s is the command #: zim/applications.py:41 #, python-format msgid "Failed to run application: %s" msgstr "Failed to run application: %s" #. Error message when external application failed, %(cmd)s is the command, %(code)i the exit code #: zim/applications.py:44 #, python-format msgid "" "%(cmd)s\n" "returned non-zero exit status %(code)i" msgstr "" "%(cmd)s\n" "returned non-zero exit status %(code)i" #. error when application failed to start #: zim/applications.py:251 #, python-format msgid "Failed running: %s" msgstr "Failed running: %s" #. label for default webbrowser | #. label for default application #: zim/applications.py:272 zim/applications.py:308 zim/gui/applications.py:686 msgid "Default" msgstr "Default" #. Translate to "calendar:week_start:0" if you want Sunday to be the first day of the week or to "calendar:week_start:1" if you want Monday to be the first day of the week #: zim/datetimetz.py:96 msgid "calendar:week_start:0" msgstr "" #. message for FileNotFoundError #: zim/fs.py:444 #, python-format msgid "No such file: %s" msgstr "No such file: %s" #. message for FileUnicodeError (%s is the file name) #: zim/fs.py:456 #, python-format msgid "Could not read: %s" msgstr "Could not read: %s" #. message for FileUnicodeError #: zim/fs.py:458 msgid "This usually means the file contains invalid characters" msgstr "This usually means the file contains invalid characters" #. label for detailed error | #. section for version details in "save version" dialog #: zim/fs.py:460 zim/plugins/versioncontrol/__init__.py:838 msgid "Details" msgstr "Details" #. Error message #: zim/fs.py:1417 #, python-format msgid "File is not writable: %s" msgstr "File is not writable: %s" #. error message #: zim/fs.py:1682 #, python-format msgid "File changed on disk: %s" msgstr "File changed on disk: %s" #. label to customize 'open with' menu #: zim/gui/applications.py:591 msgid "Customize..." msgstr "Customise..." #. message when no applications in "Open With" menu #: zim/gui/applications.py:617 msgid "No Applications Found" msgstr "No Applications Found" #. menu item to open a file with an application, %s is the app name #: zim/gui/applications.py:646 #, python-format msgid "Open with \"%s\"" msgstr "Open with \"%s\"" #. Text in the 'custom command' dialog, "%s" will be URL scheme like "http://" or "ssh://" #: zim/gui/applications.py:661 #, python-format msgid "Configure an application to open \"%s\" links" msgstr "Configure an application to open \"%s\" links" #. Text in the 'custom command' dialog, "%s" will be mimetype like "text/plain" #: zim/gui/applications.py:664 #, python-format msgid "" "Configure an application to open files\n" "of type \"%s\"" msgstr "" "Configure an application to open files\n" "of type \"%s\"" #. Dialog title #: zim/gui/applications.py:676 msgid "Configure Applications" msgstr "Configure Applications" #. Button for adding a new application to the 'open with' menu | #. Dialog title #: zim/gui/applications.py:690 zim/gui/applications.py:796 msgid "Add Application" msgstr "Add Application" #. Label for default application handler #: zim/gui/applications.py:738 msgid "System Default" msgstr "System Default" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog | #. Input label in the 'rename page' dialog for the new name | #. input field in 'Add Notebook' dialog | #. input for new file name | #. Heading in plugins tab of preferences dialog | #. Input label for the new name when copying a template | #. label for properties dialog | #. label for file name #: zim/gui/applications.py:800 zim/gui/customtools.py:155 #: zim/gui/__init__.py:3336 zim/gui/notebookdialog.py:402 #: zim/gui/pageview.py:6501 zim/gui/preferencesdialog.py:192 #: zim/gui/templateeditordialog.py:149 zim/notebook.py:725 #: zim/plugins/attachmentbrowser.py:722 msgid "Name" msgstr "Name" #. Field in 'custom command' dialog | #. Input in "Edit Custom Tool" dialog #: zim/gui/applications.py:801 zim/gui/customtools.py:157 msgid "Command" msgstr "Command" #. Field in 'custom command' dialog #: zim/gui/applications.py:802 msgid "Make default application" msgstr "Make default application" #. menu item #: zim/gui/cleannotebookdialog.py:26 msgid "Open File" msgstr "Open File" #. menu item | #. menu item to open containing folder of files #: zim/gui/cleannotebookdialog.py:27 zim/gui/pageview.py:5138 msgid "Open Folder" msgstr "Open Folder" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete File" msgstr "Delete File" #. menu item #: zim/gui/cleannotebookdialog.py:28 msgid "Delete" msgstr "Delete" #. label in word count dialog #: zim/gui/cleannotebookdialog.py:131 zim/gui/pageview.py:6409 msgid "Selection" msgstr "Selection" #. Column heading in 'Oprhaned Files' dialog | #. Input label #: zim/gui/cleannotebookdialog.py:139 zim/gui/widgets.py:4140 msgid "Filename" msgstr "Filename" #. Column heading in 'Oprhaned Files' dialog | #. Input field in export dialog | #. label in word count dialog | #. Column header | #. Column header search dialog | #. Column header Task List dialog #: zim/gui/cleannotebookdialog.py:148 zim/gui/exportdialog.py:124 #: zim/gui/pageview.py:6407 zim/gui/recentchangesdialog.py:54 #: zim/gui/searchdialog.py:150 zim/plugins/quicknote.py:191 #: zim/plugins/tasklist.py:924 msgid "Page" msgstr "Page" #. dialog title #: zim/gui/cleannotebookdialog.py:163 msgid "Cleanup Attachments" msgstr "Cleanup Attachments" #. Button in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:177 msgid "Invert Selection" msgstr "Invert Selection" #. help text in "Clean Notebook" dialog #: zim/gui/cleannotebookdialog.py:184 msgid "" "The files below were found in the attachment directory of zim but are no " "longer \n" "linked in the notebook. " msgstr "" "The files below were found in the attachment directory of zim but are no " "longer\n" "linked in the notebook. " #. Message dialog in "Clean Attachments" #: zim/gui/cleannotebookdialog.py:201 msgid "No orphaned files found." msgstr "No orphaned files found." #. Dialog title #: zim/gui/customtools.py:24 msgid "Custom Tools" msgstr "Custom Tools" #. help text in "Custom Tools" dialog #: zim/gui/customtools.py:29 msgid "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." msgstr "" "You can configure custom tools that will appear\n" "in the tool menu and in the tool bar or context menus." #. Dialog title #: zim/gui/customtools.py:137 msgid "Edit Custom Tool" msgstr "Edit Custom Tool" #. Input in "Edit Custom Tool" dialog | #. Heading in plugins tab of preferences dialog #: zim/gui/customtools.py:156 zim/gui/preferencesdialog.py:198 msgid "Description" msgstr "Description" #. Input in "Edit Custom Tool" dialog | #. label for properties dialog #: zim/gui/customtools.py:171 zim/notebook.py:728 msgid "Icon" msgstr "Icon" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:180 msgid "Command does not modify data" msgstr "Command does not modify data" #. Input in "Edit Custom Tool" dialog #: zim/gui/customtools.py:181 msgid "Show in the toolbar" msgstr "Show in the toolbar" #. Short help text in "Edit Custom Tool" dialog. The "%" is literal - please include the html formatting #: zim/gui/customtools.py:188 msgid "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" msgstr "" "The following parameters will be substituted\n" "in the command when it is executed:\n" "\n" "%f the page source as a temporary file\n" "%d the attachment directory of the current page\n" "%s the real page source file (if any)\n" "%n the notebook location (file or folder)\n" "%D the document root (if any)\n" "%t the selected text or word under cursor\n" "%T the selected text including wiki formatting\n" "\n" #. dialog title #: zim/gui/exportdialog.py:20 msgid "Export" msgstr "Export" #. Title of progressbar dialog #: zim/gui/exportdialog.py:53 zim/gui/__init__.py:2107 msgid "Updating index" msgstr "Updating index" #. message heading #: zim/gui/exportdialog.py:62 #, python-format msgid "Folder exists: %s" msgstr "Folder exists: %s" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:63 msgid "" "Folder already exists and has content, exporting to this folder may " "overwrite existing files. Do you want to continue?" msgstr "" "Folder already exists and is not empty, exporting to this folder may " "overwrite existing files. Do you want to continue?" #. Title for progressbar window #: zim/gui/exportdialog.py:71 msgid "Exporting notebook" msgstr "Exporting notebook" #. message heading #: zim/gui/exportdialog.py:80 msgid "File exists" msgstr "File exists" #. detailed message, answers are Yes and No #: zim/gui/exportdialog.py:81 msgid "" "This file already exists.\n" "Do you want to overwrite it?" msgstr "" "This file already exists.\n" "Do you want to overwrite it?" #. title of step in export dialog #: zim/gui/exportdialog.py:110 msgid "Select the pages to export" msgstr "Select the pages to export" #. Option in export dialog to export complete notebook | #. Option in versions dialog to show version for complete notebook #: zim/gui/exportdialog.py:116 zim/plugins/versioncontrol/__init__.py:886 msgid "Complete _notebook" msgstr "Complete _notebook" #. Option in export dialog to export selection #: zim/gui/exportdialog.py:121 msgid "Single _page" msgstr "Single _page" #. title of step in export dialog #: zim/gui/exportdialog.py:149 msgid "Select the export format" msgstr "Select the export format" #. Option in drop down menu to specify another file #: zim/gui/exportdialog.py:151 msgid "Other..." msgstr "Other..." #. Input label in the export dialog | #. label in "insert date" dialog #: zim/gui/exportdialog.py:162 zim/gui/pageview.py:5697 msgid "Format" msgstr "Format" #. Input label in the export dialog #: zim/gui/exportdialog.py:163 msgid "Template" msgstr "Template" #. radio option in export dialog #: zim/gui/exportdialog.py:166 msgid "Link files under document root with full file path" msgstr "Link files under document root with full file path" #. radio option in export dialog #: zim/gui/exportdialog.py:167 msgid "Map document root to URL" msgstr "Map document root to URL" #. title of step in export dialog #: zim/gui/exportdialog.py:240 msgid "Select the output file or folder" msgstr "Select the output file or folder" #. Label for folder selection in export dialog #: zim/gui/exportdialog.py:246 msgid "Output folder" msgstr "Output folder" #. Label for setting a name for the index of exported pages #: zim/gui/exportdialog.py:248 msgid "Index page" msgstr "Index page" #. Label for file selection in export dialog #: zim/gui/exportdialog.py:251 msgid "Output file" msgstr "Output file" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:150 msgid "_Preview" msgstr "_Preview" #. button in e.g. equation editor dialog #: zim/gui/imagegeneratordialog.py:160 msgid "View _Log" msgstr "View _Log" #. Question prompt when e.g. equation editor encountered an error generating the image to insert #: zim/gui/imagegeneratordialog.py:239 msgid "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" msgstr "" "An error occurred while generating the image.\n" "Do you want to save the source text anyway?" #. dialog title for log view dialog - e.g. for Equation Editor #: zim/gui/imagegeneratordialog.py:279 msgid "Log file" msgstr "Log file" #. Menu title #: zim/gui/__init__.py:51 msgid "_File" msgstr "_File" #. Menu title #: zim/gui/__init__.py:52 msgid "_Edit" msgstr "_Edit" #. Menu title | #. button label #: zim/gui/__init__.py:53 zim/gui/templateeditordialog.py:42 msgid "_View" msgstr "_View" #. Menu title | #. Button label #: zim/gui/__init__.py:54 zim/gui/pageview.py:5687 #: zim/plugins/insertsymbol.py:143 msgid "_Insert" msgstr "_Insert" #. Menu title #: zim/gui/__init__.py:55 msgid "_Search" msgstr "_Search" #. Menu title #: zim/gui/__init__.py:56 msgid "For_mat" msgstr "For_mat" #. Menu title #: zim/gui/__init__.py:57 msgid "_Tools" msgstr "_Tools" #. Menu title #: zim/gui/__init__.py:58 msgid "_Go" msgstr "_Go" #. Menu title #: zim/gui/__init__.py:59 msgid "_Help" msgstr "_Help" #. Menu title #: zim/gui/__init__.py:60 msgid "P_athbar" msgstr "P_athbar" #. Menu title | #. Menu item #: zim/gui/__init__.py:61 zim/gui/__init__.py:120 zim/gui/__init__.py:130 msgid "_Toolbar" msgstr "_Toolbar" #. Menu item #: zim/gui/__init__.py:64 msgid "_New Page..." msgstr "_New Page..." #. Menu item #: zim/gui/__init__.py:65 msgid "New S_ub Page..." msgstr "New S_ub Page..." #. Menu item #: zim/gui/__init__.py:66 msgid "_Open Another Notebook..." msgstr "_Open Another Notebook..." #. Menu item | #. menu item to open a link #: zim/gui/__init__.py:67 zim/gui/pageview.py:5168 #: zim/plugins/backlinkpane.py:117 msgid "Open in New _Window" msgstr "Open in New _Window" #. Menu item #: zim/gui/__init__.py:68 msgid "_Import Page..." msgstr "_Import Page..." #. Menu item #: zim/gui/__init__.py:69 msgid "_Save" msgstr "_Save" #. Menu item #: zim/gui/__init__.py:70 msgid "Save A _Copy..." msgstr "Save A _Copy..." #. Menu item #: zim/gui/__init__.py:71 msgid "E_xport..." msgstr "E_xport..." #. Menu item #: zim/gui/__init__.py:72 msgid "_Send To..." msgstr "_Send To..." #. Menu item #: zim/gui/__init__.py:73 msgid "_Move Page..." msgstr "_Move Page..." #. Menu item #: zim/gui/__init__.py:74 msgid "_Rename Page..." msgstr "_Rename Page..." #. Menu item #: zim/gui/__init__.py:75 msgid "_Delete Page" msgstr "_Delete Page" #. Menu item #: zim/gui/__init__.py:76 msgid "Proper_ties" msgstr "Proper_ties" #. Menu item #: zim/gui/__init__.py:77 msgid "_Close" msgstr "_Close" #. Menu item | #. menu item in tray icon menu #: zim/gui/__init__.py:78 zim/plugins/trayicon.py:146 msgid "_Quit" msgstr "_Quit" #. Menu item #: zim/gui/__init__.py:79 msgid "_Search..." msgstr "_Search..." #. Menu item #: zim/gui/__init__.py:80 msgid "Search _Backlinks..." msgstr "Search _Backlinks..." #. Menu item #: zim/gui/__init__.py:81 msgid "Recent Changes..." msgstr "" #. Menu item #: zim/gui/__init__.py:82 msgid "Copy _Location" msgstr "Copy _Location" #. Menu item #: zim/gui/__init__.py:83 msgid "_Templates" msgstr "_Templates" #. Menu item #: zim/gui/__init__.py:84 msgid "Pr_eferences" msgstr "Pr_eferences" #. Menu item #: zim/gui/__init__.py:85 msgid "_Reload" msgstr "_Reload" #. Menu item #: zim/gui/__init__.py:86 msgid "Open Attachments _Folder" msgstr "Open Attachments _Folder" #. Menu item #: zim/gui/__init__.py:87 msgid "Open _Notebook Folder" msgstr "Open _Notebook Folder" #. Menu item #: zim/gui/__init__.py:88 msgid "Open _Document Root" msgstr "Open _Document Root" #. Menu item #: zim/gui/__init__.py:89 msgid "Open _Document Folder" msgstr "Open _Document Folder" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach _File" msgstr "Attach _File" #. Menu item #: zim/gui/__init__.py:90 msgid "Attach external file" msgstr "Attach external file" #. Menu item #: zim/gui/__init__.py:91 msgid "_Cleanup Attachments" msgstr "_Cleanup Attachments" #. Menu item #: zim/gui/__init__.py:92 msgid "Edit _Source" msgstr "_Edit Source" #. Menu item #: zim/gui/__init__.py:93 msgid "Start _Web Server" msgstr "Start _Web Server" #. Menu item #: zim/gui/__init__.py:94 msgid "Update Index" msgstr "Update Index" #. Menu item #: zim/gui/__init__.py:95 msgid "Custom _Tools" msgstr "Custom _Tools" #. Menu item #: zim/gui/__init__.py:96 msgid "_Back" msgstr "_Back" #. Menu item #: zim/gui/__init__.py:96 msgid "Go page back" msgstr "Go page back" #. Menu item #: zim/gui/__init__.py:97 msgid "_Forward" msgstr "_Forward" #. Menu item #: zim/gui/__init__.py:97 msgid "Go page forward" msgstr "Go page forward" #. Menu item #: zim/gui/__init__.py:98 msgid "_Parent" msgstr "_Parent" #. Menu item #: zim/gui/__init__.py:98 msgid "Go to parent page" msgstr "Go to parent page" #. Menu item #: zim/gui/__init__.py:99 msgid "_Child" msgstr "_Child" #. Menu item #: zim/gui/__init__.py:99 msgid "Go to child page" msgstr "Go to child page" #. Menu item #: zim/gui/__init__.py:100 msgid "_Previous in index" msgstr "_Previous in index" #. Menu item #: zim/gui/__init__.py:100 msgid "Go to previous page" msgstr "Go to previous page" #. Menu item #: zim/gui/__init__.py:101 msgid "_Next in index" msgstr "_Next in index" #. Menu item #: zim/gui/__init__.py:101 msgid "Go to next page" msgstr "Go to next page" #. Menu item #: zim/gui/__init__.py:102 msgid "_Home" msgstr "_Home" #. Menu item #: zim/gui/__init__.py:102 msgid "Go home" msgstr "Go to home" #. Menu item #: zim/gui/__init__.py:103 msgid "_Jump To..." msgstr "_Jump To..." #. Menu item #: zim/gui/__init__.py:104 msgid "_Contents" msgstr "_Contents" #. Menu item #: zim/gui/__init__.py:105 msgid "_FAQ" msgstr "_FAQ" #. Menu item #: zim/gui/__init__.py:106 msgid "_Keybindings" msgstr "_Keybindings" #. Menu item #: zim/gui/__init__.py:107 msgid "_Bugs" msgstr "_Bugs" #. Menu item #: zim/gui/__init__.py:108 msgid "_About" msgstr "_About" #. Menu item #: zim/gui/__init__.py:114 msgid "_All Panes" msgstr "_All Panes" #. Menu item #: zim/gui/__init__.py:114 msgid "Show All Panes" msgstr "Show All Panes" #. Menu item #: zim/gui/__init__.py:121 zim/gui/__init__.py:131 msgid "_Statusbar" msgstr "_Statusbar" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "_Side Panes" msgstr "_Side Panes" #. Menu item # FIXME review text #: zim/gui/__init__.py:122 zim/gui/__init__.py:132 msgid "Show Side Panes" msgstr "Show Side Panes" #. Menu item #: zim/gui/__init__.py:123 zim/gui/__init__.py:133 msgid "_Fullscreen" msgstr "_Fullscreen" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Notebook _Editable" msgstr "Notebook _Editable" #. menu item #: zim/gui/__init__.py:124 zim/gui/__init__.py:134 msgid "Toggle notebook editable" msgstr "Toggle notebook editable" #. Menu item #: zim/gui/__init__.py:140 msgid "_None" msgstr "_None" #. Menu item #: zim/gui/__init__.py:141 msgid "_Recent pages" msgstr "_Recent pages" #. Menu item #: zim/gui/__init__.py:142 msgid "Recently _Changed pages" msgstr "" #. Menu item #: zim/gui/__init__.py:143 msgid "_History" msgstr "_History" #. Menu item #: zim/gui/__init__.py:144 msgid "N_amespace" msgstr "N_amespace" #. Menu item #: zim/gui/__init__.py:156 msgid "Icons _And Text" msgstr "Icons _And Text" #. Menu item #: zim/gui/__init__.py:157 msgid "_Icons Only" msgstr "_Icons Only" #. Menu item #: zim/gui/__init__.py:158 msgid "_Text Only" msgstr "_Text Only" #. Menu item #: zim/gui/__init__.py:164 msgid "_Large Icons" msgstr "_Large Icons" #. Menu item #: zim/gui/__init__.py:165 msgid "_Small Icons" msgstr "_Small Icons" #. Menu item #: zim/gui/__init__.py:166 msgid "_Tiny Icons" msgstr "_Tiny Icons" #. Option in the preferences dialog #: zim/gui/__init__.py:180 msgid "Add 'tearoff' strips to the menus" msgstr "Add 'tearoff' strips to the menus" #. Option in the preferences dialog #: zim/gui/__init__.py:182 msgid "Use to switch to the side pane" msgstr "Use to switch to the side pane" #. Option in the preferences dialog #: zim/gui/__init__.py:186 msgid "Remove links when deleting pages" msgstr "Remove links when deleting pages" #. Option in the preferences dialog #: zim/gui/__init__.py:188 msgid "Always use last cursor position when opening a page" msgstr "Always use last cursor position when opening a page" #. Error description for "no such file or folder" #: zim/gui/__init__.py:250 msgid "" "The file or folder you specified does not exist.\n" "Please check if you the path is correct." msgstr "" "The file or folder you specified does not exist.\n" "Please check the path you entered." #. Error message, %s will be the file path #: zim/gui/__init__.py:257 #, python-format msgid "No such file or folder: %s" msgstr "No such file or folder: %s" #. Dialog title | #. input label #: zim/gui/__init__.py:566 zim/gui/searchdialog.py:24 #: zim/gui/searchdialog.py:31 msgid "Search" msgstr "Search" #. label in search entry #: zim/gui/__init__.py:570 msgid "Search Pages..." msgstr "" #. Short question for question prompt #: zim/gui/__init__.py:1184 msgid "Upgrade Notebook?" msgstr "Upgrade Notebook?" #. Explanation for question to upgrade notebook #: zim/gui/__init__.py:1185 msgid "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected" msgstr "" "This notebook was created by an older of version of zim.\n" "Do you want to upgrade it to the latest version now?\n" "\n" "Upgrading will take some time and may make various changes\n" "to the notebook. In general it is a good idea to make a\n" "backup before doing this.\n" "\n" "If you choose not to upgrade now, some features\n" "may not work as expected." #. Title of progressbar dialog #: zim/gui/__init__.py:1197 msgid "Upgrading notebook" msgstr "Upgrading notebook" #. question dialog text #: zim/gui/__init__.py:1672 msgid "" "The index is still busy updating. Until this is finished links can not be " "updated correctly. Performing this action now could break links, do you want " "to continue anyway?" msgstr "" "The index is still busy updating. Until this is finished, links can not be " "updated correctly; performing this action now could break links. Do you want " "to continue anyway?" #. Title of progressbar dialog #: zim/gui/__init__.py:1683 msgid "Updating Links" msgstr "Updating Links" #. Title of progressbar dialog #: zim/gui/__init__.py:1710 zim/gui/__init__.py:3435 msgid "Removing Links" msgstr "Removing Links" #. Heading in a question dialog for creating a folder #: zim/gui/__init__.py:1826 zim/gui/pageview.py:5478 msgid "Create folder?" msgstr "Create folder?" #. Text in a question dialog for creating a folder, %s will be the folder base name #: zim/gui/__init__.py:1828 #, python-format msgid "" "The folder \"%s\" does not yet exist.\n" "Do you want to create it now?" msgstr "" #. error when external application fails #: zim/gui/__init__.py:1947 zim/gui/__init__.py:2064 #, python-format msgid "Could not open: %s" msgstr "Could not open: %s" #. Error message #: zim/gui/__init__.py:1962 msgid "This page does not have an attachments folder" msgstr "This page does not have an attachments folder" #. main text for dialog for editing external files #: zim/gui/__init__.py:2055 #, python-format msgid "Editing file: %s" msgstr "Editing file: %s" #. description for dialog for editing external files #: zim/gui/__init__.py:2057 msgid "" "You are editing a file in an external application. You can close this dialog " "when you are done" msgstr "" "You are editing a file in an external application. You can close this " "dialogue when you are done" #. General description of zim itself #: zim/gui/__init__.py:2247 msgid "A desktop wiki" msgstr "A desktop wiki" #. This string needs to be translated with names of the translators for this language #: zim/gui/__init__.py:2255 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Biffaboy https://launchpad.net/~curtisbull\n" " Jaap Karssenberg https://launchpad.net/~jaap.karssenberg\n" " Matthew Gadd https://launchpad.net/~darkotter\n" " Michael Mulqueen https://launchpad.net/~michael.mulqueen\n" " MoLE https://launchpad.net/~moleonthehill\n" " Nicholas Wastell https://launchpad.net/~nickwastell\n" " Otto Robba https://launchpad.net/~otto-ottorobba\n" " Rui Moreira https://launchpad.net/~rui-f-moreira\n" " Vibhav Pant https://launchpad.net/~vibhavp\n" " dotancohen https://launchpad.net/~dotancohen" #. Label for pageindex tab #: zim/gui/__init__.py:2345 msgid "Index" msgstr "Index" #. page status in statusbar #: zim/gui/__init__.py:2420 msgid "readonly" msgstr "readonly" #. Label for button with backlinks in statusbar #: zim/gui/__init__.py:2936 #, python-format msgid "%i _Backlink..." msgid_plural "%i _Backlinks..." msgstr[0] "%i _Backlink..." msgstr[1] "%i _Backlinks..." #. Heading of error dialog #: zim/gui/__init__.py:3047 #, python-format msgid "Could not save page: %s" msgstr "Could not save page: %s" #. text in error dialog when saving page failed #: zim/gui/__init__.py:3049 msgid "" "To continue you can save a copy of this page or discard\n" "any changes. If you save a copy changes will be also\n" "discarded, but you can restore the copy later." msgstr "" "To continue, you can save a copy of this page or discard\n" "any changes. If you save a copy, changes will also be\n" "discarded, but you can restore the copy later." #. Button in error dialog #: zim/gui/__init__.py:3087 msgid "_Discard Changes" msgstr "_Discard Changes" #. Button in error dialog #: zim/gui/__init__.py:3092 msgid "_Save Copy" msgstr "_Save Copy" #. Dialog title #: zim/gui/__init__.py:3129 msgid "Jump to" msgstr "Jump to" #. Label for page input #: zim/gui/__init__.py:3134 msgid "Jump to Page" msgstr "Jump to Page" #. Dialog title #: zim/gui/__init__.py:3153 msgid "New Sub Page" msgstr "New Sub Page" #. Dialog title #: zim/gui/__init__.py:3154 msgid "New Page" msgstr "New Page" #. Dialog text in 'new page' dialog #: zim/gui/__init__.py:3158 msgid "" "Please note that linking to a non-existing page\n" "also creates a new page automatically." msgstr "" "Please note that linking to a nonexistant page\n" "also creates a new page automatically." #. Input label #: zim/gui/__init__.py:3173 msgid "Page Name" msgstr "Page Name" #. Choice label #: zim/gui/__init__.py:3174 msgid "Page Template" msgstr "Page Template" #. Error when creating new page #: zim/gui/__init__.py:3193 msgid "Page exists" msgstr "Page exists" #. Dialog title of file save dialog #: zim/gui/__init__.py:3208 msgid "Save Copy" msgstr "Save Copy" #. Dialog title #: zim/gui/__init__.py:3232 msgid "Import Page" msgstr "Import Page" #. File filter for '*.txt' #: zim/gui/__init__.py:3233 msgid "Text Files" msgstr "Text Files" #. Dialog title #: zim/gui/__init__.py:3261 msgid "Move Page" msgstr "Move Page" #. Heading in 'move page' dialog - %s is the page name #: zim/gui/__init__.py:3270 #, python-format msgid "Move page \"%s\"" msgstr "Move page \"%s\"" #. label in MovePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3281 zim/gui/__init__.py:3330 #, python-format msgid "Update %i page linking to this page" msgid_plural "Update %i pages linking to this page" msgstr[0] "Update %i page linking to this page" msgstr[1] "Update %i pages linking to this page" #. Input label for namespace to move a file to | #. input label | #. text entry field #: zim/gui/__init__.py:3286 zim/plugins/calendar.py:133 #: zim/plugins/quicknote.py:192 msgid "Namespace" msgstr "Namespace" #. Dialog title #: zim/gui/__init__.py:3315 msgid "Rename Page" msgstr "Rename Page" #. label in 'rename page' dialog - %s is the page name #: zim/gui/__init__.py:3319 #, python-format msgid "Rename page \"%s\"" msgstr "Rename page \"%s\"" #. Option in the 'rename page' dialog #: zim/gui/__init__.py:3338 msgid "Update the heading of this page" msgstr "Update the heading of this page" #. Dialog title #: zim/gui/__init__.py:3373 msgid "Delete Page" msgstr "Delete Page" #. Heading in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3386 #, python-format msgid "Delete page \"%s\"?" msgstr "Delete page \"%s\"?" #. Text in 'delete page' dialog - %s is the page name #: zim/gui/__init__.py:3388 #, python-format msgid "" "Page \"%s\" and all of it's\n" "sub-pages and attachments will be deleted" msgstr "Page \"%s\" and all of its sub-pages and attachments will be deleted" #. label in DeletePage dialog - %i is number of backlinks #: zim/gui/__init__.py:3401 #, python-format msgid "Remove links from %i page linking to this page" msgid_plural "Remove links from %i pages linking to this page" msgstr[0] "Remove links from %i page linking to this page" msgstr[1] "Remove links from %i pages linking to this page" #. label in the DeletePage dialog to warn user of attachments being deleted #: zim/gui/__init__.py:3420 #, python-format msgid "%i file will be deleted" msgid_plural "%i files will be deleted" msgstr[0] "%i file will be deleted" msgstr[1] "%i files will be deleted" #. Error dialog - %s is the full page name #: zim/gui/__init__.py:3456 #, python-format msgid "Page \"%s\" does not have a folder for attachments" msgstr "Page \"%s\" does not have a folder for attachments" #. checkbox in the "Attach File" dialog #: zim/gui/__init__.py:3461 msgid "Insert images as link" msgstr "Insert image as link" #. Column heading in 'open notebook' dialog | #. Field in web server gui | #. Field to select Notebook from drop down list #: zim/gui/notebookdialog.py:173 zim/gui/server.py:97 #: zim/plugins/quicknote.py:391 msgid "Notebook" msgstr "Notebook" #. dialog title #: zim/gui/notebookdialog.py:279 msgid "Open Notebook" msgstr "Open Notebook" #. Input label in 'open notebook' dialog #: zim/gui/notebookdialog.py:328 msgid "Default notebook" msgstr "Default notebook" #. Dialog window title #: zim/gui/notebookdialog.py:382 msgid "Add Notebook" msgstr "Add Notebook" #. Label in Add Notebook dialog #: zim/gui/notebookdialog.py:384 msgid "Please select a name and a folder for the notebook." msgstr "Please select a name and a folder for the notebook." #. input field in 'Add Notebook' dialog #: zim/gui/notebookdialog.py:403 msgid "Folder" msgstr "Folder" #. statusbar message #: zim/gui/pageindex.py:754 msgid "Updating index..." msgstr "Updating index..." #. Menu item #: zim/gui/pageview.py:112 msgid "_Undo" msgstr "_Undo" #. Menu item #: zim/gui/pageview.py:113 msgid "_Redo" msgstr "_Redo" #. Menu item #: zim/gui/pageview.py:115 msgid "Cu_t" msgstr "Cu_t" #. Menu item #: zim/gui/pageview.py:116 msgid "_Copy" msgstr "_Copy" #. Menu item #: zim/gui/pageview.py:117 msgid "_Paste" msgstr "_Paste" #. Menu item #: zim/gui/pageview.py:118 msgid "_Delete" msgstr "_Delete" #. Menu item #: zim/gui/pageview.py:119 msgid "Toggle Checkbox 'V'" msgstr "Toggle Checkbox 'V'" #. Menu item #: zim/gui/pageview.py:120 msgid "Toggle Checkbox 'X'" msgstr "Toggle Checkbox 'X'" #. Menu item #: zim/gui/pageview.py:121 msgid "_Edit Link or Object..." msgstr "_Edit Link or Object..." #. Menu item #: zim/gui/pageview.py:122 zim/gui/pageview.py:5099 msgid "_Remove Link" msgstr "_Remove Link" #. Menu item #: zim/gui/pageview.py:123 msgid "_Date and Time..." msgstr "_Date and Time..." #. Menu item #: zim/gui/pageview.py:124 msgid "_Image..." msgstr "_Image..." #. Menu item | #. Menu item, #: zim/gui/pageview.py:125 zim/gui/pageview.py:128 msgid "Bulle_t List" msgstr "Bulle_t List" #. Menu item | #. Menu item, #: zim/gui/pageview.py:126 zim/gui/pageview.py:129 msgid "_Numbered List" msgstr "_Numbered List" #. Menu item, #: zim/gui/pageview.py:127 zim/gui/pageview.py:130 msgid "Checkbo_x List" msgstr "Checkbo_x List" #. Menu item #: zim/gui/pageview.py:131 msgid "Text From _File..." msgstr "Text From _File..." #. Menu item #: zim/gui/pageview.py:132 msgid "_Link..." msgstr "_Link..." #. Menu item | #. Dialog title #: zim/gui/pageview.py:132 zim/gui/pageview.py:6012 msgid "Insert Link" msgstr "Insert Link" #. Menu item #: zim/gui/pageview.py:133 msgid "_Clear Formatting" msgstr "_Clear Formatting" #. Menu item #: zim/gui/pageview.py:134 msgid "_Find..." msgstr "_Find..." #. Menu item #: zim/gui/pageview.py:136 msgid "Find Ne_xt" msgstr "Find Ne_xt" #. Menu item #: zim/gui/pageview.py:138 msgid "Find Pre_vious" msgstr "Find Pre_vious" #. Menu item #: zim/gui/pageview.py:140 msgid "_Replace..." msgstr "_Replace..." #. Menu item #: zim/gui/pageview.py:141 msgid "Word Count..." msgstr "Word Count..." #. Menu item #: zim/gui/pageview.py:142 msgid "_Zoom In" msgstr "_Zoom In" #. Menu item #: zim/gui/pageview.py:144 msgid "Zoom _Out" msgstr "Zoom _Out" #. Menu item to reset zoom #: zim/gui/pageview.py:145 msgid "_Normal Size" msgstr "_Normal Size" #. Menu title #: zim/gui/pageview.py:148 msgid "New _Attachment" msgstr "New _Attachment" #. Menu item in "Insert > New File Attachment" submenu #: zim/gui/pageview.py:151 msgid "File _Templates..." msgstr "File _Templates..." #. Menu item #: zim/gui/pageview.py:156 msgid "Heading _1" msgstr "Heading _1" #. Menu item #: zim/gui/pageview.py:156 msgid "Heading 1" msgstr "Heading 1" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading _2" msgstr "Heading _2" #. Menu item #: zim/gui/pageview.py:157 msgid "Heading 2" msgstr "Heading 2" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading _3" msgstr "Heading _3" #. Menu item #: zim/gui/pageview.py:158 msgid "Heading 3" msgstr "Heading 3" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading _4" msgstr "Heading _4" #. Menu item #: zim/gui/pageview.py:159 msgid "Heading 4" msgstr "Heading 4" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading _5" msgstr "Heading _5" #. Menu item #: zim/gui/pageview.py:160 msgid "Heading 5" msgstr "Heading 5" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "_Strong" msgstr "_Strong" #. Menu item #: zim/gui/pageview.py:161 zim/gui/pageview.py:172 msgid "Strong" msgstr "Strong" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "_Emphasis" msgstr "_Emphasis" #. Menu item #: zim/gui/pageview.py:162 zim/gui/pageview.py:173 msgid "Emphasis" msgstr "Emphasis" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "_Mark" msgstr "_Mark" #. Menu item #: zim/gui/pageview.py:163 zim/gui/pageview.py:174 msgid "Mark" msgstr "Mark" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "_Strike" msgstr "_Strike" #. Menu item #: zim/gui/pageview.py:164 zim/gui/pageview.py:175 msgid "Strike" msgstr "Strike" #. Menu item #: zim/gui/pageview.py:165 msgid "_Subscript" msgstr "_Subscript" #. Menu item #: zim/gui/pageview.py:166 msgid "_Superscript" msgstr "_Superscript" #. Menu item #: zim/gui/pageview.py:167 msgid "_Verbatim" msgstr "_Verbatim" #. Menu item #: zim/gui/pageview.py:167 msgid "Verbatim" msgstr "Verbatim" #. option in preferences dialog #: zim/gui/pageview.py:182 msgid "" "Use the key to follow links\n" "(If disabled you can still use )" msgstr "" "Use the key to follow links\n" "(If disabled you can still use )" #. option in preferences dialog #: zim/gui/pageview.py:185 msgid "Show the cursor also for pages that can not be edited" msgstr "Show the cursor even for pages that cannot be edited" #. option in preferences dialog #: zim/gui/pageview.py:188 msgid "Automatically turn \"CamelCase\" words into links" msgstr "Automatically turn \"CamelCase\" words into links" #. option in preferences dialog #: zim/gui/pageview.py:191 msgid "Automatically turn file paths into links" msgstr "Automatically turn file paths into links" #. option in preferences dialog #: zim/gui/pageview.py:194 msgid "Automatically select the current word when you apply formatting" msgstr "Automatically select the current word when applying formatting" #. option in preferences dialog #: zim/gui/pageview.py:197 msgid "" "Unindent on \n" "(If disabled you can still use )" msgstr "" "Unindent on \n" "(If disabled you can still use )" #. option in preferences dialog #: zim/gui/pageview.py:200 msgid "Repeated clicking a checkbox cyles through the checkbox states" msgstr "Repeatedly clicking a check box cycles through the check box states" #. option in preferences dialog #: zim/gui/pageview.py:203 msgid "(Un-)Indenting a list item also change any sub-items" msgstr "Changing indent level for a list item also changes any sub-items" #. option in preferences dialog #: zim/gui/pageview.py:206 msgid "Checking a checkbox also change any sub-items" msgstr "Checking a checkbox also change any sub-items" #. option in preferences dialog #: zim/gui/pageview.py:209 msgid "Reformat wiki markup on the fly" msgstr "Reformat wiki markup on the fly" #. option in preferences dialog #: zim/gui/pageview.py:212 msgid "Default format for copying text to the clipboard" msgstr "Default format for copying text to the clipboard" #. option in preferences dialog #: zim/gui/pageview.py:215 msgid "Folder with templates for attachment files" msgstr "Folder with templates for attachment files" #. error when unknown interwiki link is clicked #: zim/gui/pageview.py:4988 #, python-format msgid "No such wiki defined: %s" msgstr "No such wiki defined: %s" #. menu item for context menu of editor #: zim/gui/pageview.py:5041 msgid "Copy _As..." msgstr "Copy _As..." #. Context menu item for pageview to move selected text to new/other page #: zim/gui/pageview.py:5048 msgid "Move Selected Text..." msgstr "Move Selected Text..." #. menu item in context menu for image #: zim/gui/pageview.py:5106 msgid "_Edit Properties" msgstr "_Edit Properties" #. menu item in context menu #: zim/gui/pageview.py:5108 msgid "_Edit Link" msgstr "_Edit Link" #. context menu item #: zim/gui/pageview.py:5123 zim/gui/pageview.py:5130 msgid "Copy _Link" msgstr "Copy _Link" #. context menu item #: zim/gui/pageview.py:5127 msgid "Copy Email Address" msgstr "Copy E-mail Address" #. menu item for sub menu with applications | #. menu item #: zim/gui/pageview.py:5147 zim/gui/pageview.py:5158 #: zim/plugins/attachmentbrowser.py:683 msgid "Open With..." msgstr "Open With..." #. menu item to open a link or file | #. menu item to open file or folder #: zim/gui/pageview.py:5178 zim/plugins/attachmentbrowser.py:689 msgid "_Open" msgstr "_Open" #. message when no file templates are found in ~/Templates #: zim/gui/pageview.py:5417 msgid "No templates installed" msgstr "No templates installed" #. Text in a question dialog for creating a folder, %s is the folder path #: zim/gui/pageview.py:5480 #, python-format msgid "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" msgstr "" "The folder\n" "%s\n" "does not yet exist.\n" "Do you want to create it now?" #. Dialog title #: zim/gui/pageview.py:5686 msgid "Insert Date and Time" msgstr "Insert Date and Time" #. expander label in "insert date" dialog #: zim/gui/pageview.py:5715 msgid "_Calendar" msgstr "_Calendar" #. check box in InsertDate dialog #: zim/gui/pageview.py:5729 msgid "_Link to date" msgstr "_Link to date" #. Dialog title #: zim/gui/pageview.py:5818 msgid "Insert Image" msgstr "Insert Image" #. checkbox in the "Insert Image" dialog #: zim/gui/pageview.py:5825 msgid "Attach image first" msgstr "Attach image first" #. Error message when trying to insert a not supported file as image #: zim/gui/pageview.py:5840 #, python-format msgid "File type not supported: %s" msgstr "File type not supported: %s" #. Dialog title #: zim/gui/pageview.py:5864 msgid "Edit Image" msgstr "Edit Image" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5883 msgid "Location" msgstr "Location" #. Input in 'edit image' dialog | #. Input in 'insert link' dialog #: zim/gui/pageview.py:5884 zim/gui/pageview.py:6018 msgid "Link to" msgstr "Link to" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5885 msgid "Width" msgstr "Width" #. Input in 'edit image' dialog #: zim/gui/pageview.py:5886 msgid "Height" msgstr "Height" #. Button in 'edit image' dialog #: zim/gui/pageview.py:5894 msgid "_Reset Size" msgstr "_Reset Size" #. Dialog title #: zim/gui/pageview.py:5989 msgid "Insert Text From File" msgstr "Insert Text From File" #. Dialog title #: zim/gui/pageview.py:6011 msgid "Edit Link" msgstr "Edit Link" #. Dialog button #: zim/gui/pageview.py:6015 msgid "_Link" msgstr "_Link" #. Input in 'insert link' dialog #: zim/gui/pageview.py:6019 msgid "Text" msgstr "Text" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6118 msgid "_Next" msgstr "_Next" #. button in find bar and find & replace dialog #: zim/gui/pageview.py:6124 msgid "_Previous" msgstr "_Previous" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6130 msgid "Match _case" msgstr "Match _case" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6135 msgid "Whole _word" msgstr "Whole _word" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6140 msgid "_Regular expression" msgstr "_Regular expression" #. checkbox option in find bar and find & replace dialog #: zim/gui/pageview.py:6145 msgid "_Highlight" msgstr "_Highlight" #. label for input in find bar on bottom of page #: zim/gui/pageview.py:6231 msgid "Find" msgstr "Find" #. Options button #: zim/gui/pageview.py:6261 msgid "Options" msgstr "Options" #. Dialog title #: zim/gui/pageview.py:6306 msgid "Find and Replace" msgstr "Find and Replace" #. input label in find & replace dialog #: zim/gui/pageview.py:6316 msgid "Find what" msgstr "Search for" #. input label in find & replace dialog #: zim/gui/pageview.py:6326 msgid "Replace with" msgstr "Replace with" #. Button in search & replace dialog #: zim/gui/pageview.py:6338 msgid "_Replace" msgstr "_Replace" #. Button in search & replace dialog #: zim/gui/pageview.py:6343 msgid "Replace _All" msgstr "Replace _All" #. Dialog title #: zim/gui/pageview.py:6370 msgid "Word Count" msgstr "Word Count" #. label in word count dialog #: zim/gui/pageview.py:6408 msgid "Paragraph" msgstr "Paragraph" #. label in word count dialog #: zim/gui/pageview.py:6410 msgid "Words" msgstr "Words" #. label in word count dialog #: zim/gui/pageview.py:6411 msgid "Lines" msgstr "Lines" #. label in word count dialog #: zim/gui/pageview.py:6412 msgid "Characters" msgstr "Characters" #. Dialog title #: zim/gui/pageview.py:6445 msgid "Move Text to Other Page" msgstr "Move Text to Another Page" #. Button label #: zim/gui/pageview.py:6446 msgid "_Move" msgstr "_Move" #. Input in 'move text' dialog #: zim/gui/pageview.py:6461 msgid "Move text to" msgstr "Move text to" #. Input in 'move text' dialog #: zim/gui/pageview.py:6462 msgid "Leave link to new page" msgstr "Leave link to new page" #. Input in 'move text' dialog #: zim/gui/pageview.py:6463 msgid "Open new page" msgstr "Open new page" #. Dialog title #: zim/gui/pageview.py:6499 msgid "New File" msgstr "" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:19 msgid "Interface" msgstr "Interface" #. Tab in preferences dialog #: zim/gui/preferencesdialog.py:20 msgid "Editing" msgstr "Editing" #. Dialog title #: zim/gui/preferencesdialog.py:30 msgid "Preferences" msgstr "Preferences" #. Heading in preferences dialog #: zim/gui/preferencesdialog.py:72 msgid "Plugins" msgstr "Plugins" #. option in preferences dialog #: zim/gui/preferencesdialog.py:78 msgid "Use a custom font" msgstr "Use a custom font" #. Button in plugin tab #: zim/gui/preferencesdialog.py:170 msgid "_More" msgstr "_More" #. Button in plugin tab #: zim/gui/preferencesdialog.py:175 msgid "C_onfigure" msgstr "C_onfigure" #. Heading in plugins tab of preferences dialog #: zim/gui/preferencesdialog.py:204 msgid "Dependencies" msgstr "Dependencies" #. label in plugin info in preferences dialog #: zim/gui/preferencesdialog.py:211 msgid "No dependencies" msgstr "No dependencies" #. dependency is OK #: zim/gui/preferencesdialog.py:218 msgid "OK" msgstr "OK" #. dependency failed #: zim/gui/preferencesdialog.py:222 zim/gui/preferencesdialog.py:226 msgid "Failed" msgstr "Failed" #. optional dependency #: zim/gui/preferencesdialog.py:227 msgid "Optional" msgstr "Optional" #. Heading in plugins tab of preferences dialog | #. Column header versions dialog #: zim/gui/preferencesdialog.py:231 #: zim/plugins/versioncontrol/__init__.py:1105 msgid "Author" msgstr "Author" #. Column in plugin tab #: zim/gui/preferencesdialog.py:301 msgid "Enabled" msgstr "Enabled" #. Column in plugin tab #: zim/gui/preferencesdialog.py:304 msgid "Plugin" msgstr "Plugin" #. Dialog title #: zim/gui/preferencesdialog.py:311 msgid "Configure Plugin" msgstr "Configure Plugin" #. Heading for 'configure plugin' dialog - %s is the plugin name #: zim/gui/preferencesdialog.py:320 #, python-format msgid "Options for plugin %s" msgstr "Options for plugin %s" #. Dialog title #: zim/gui/propertiesdialog.py:11 msgid "Properties" msgstr "Properties" #. Section in notebook dialog #: zim/gui/propertiesdialog.py:13 msgid "Notebook Properties" msgstr "Notebook Properties" #. Dialog title #: zim/gui/recentchangesdialog.py:21 msgid "Recent Changes" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:68 msgid "Today" msgstr "" #. label for modified time #: zim/gui/recentchangesdialog.py:71 msgid "Yesterday" msgstr "" #. Column header #: zim/gui/recentchangesdialog.py:84 msgid "Last Modified" msgstr "" #. help text for the search dialog #: zim/gui/searchdialog.py:49 msgid "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." msgstr "" "For advanced search you can use operators like\n" "AND, OR and NOT. See the help page for more details." #. checkbox option in search dialog #: zim/gui/searchdialog.py:58 msgid "Limit search to current namespace" msgstr "Limit search to current namespace" #. Column header search dialog #: zim/gui/searchdialog.py:151 msgid "Score" msgstr "Score" #. Window title #: zim/gui/server.py:47 msgid "Web Server" msgstr "" #. Status in web server gui #: zim/gui/server.py:56 msgid "Server not started" msgstr "Server not started" #. Checkbox in web server gui #: zim/gui/server.py:81 msgid "Allow public access" msgstr "" #. Field in web server gui for HTTP port (e.g. port 80) #: zim/gui/server.py:99 msgid "Port" msgstr "Port" #. Status in web server gui #: zim/gui/server.py:146 msgid "Server started" msgstr "Server started" #. Status in web server gui #: zim/gui/server.py:183 msgid "Server stopped" msgstr "Server stopped" #. Dialog title | #. Section in dialog #: zim/gui/templateeditordialog.py:21 zim/gui/templateeditordialog.py:26 msgid "Templates" msgstr "Templates" #. button label #: zim/gui/templateeditordialog.py:58 msgid "Browse" msgstr "" #. Dialog title #: zim/gui/templateeditordialog.py:147 msgid "Copy Template" msgstr "Copy Template" #. dialog title #: zim/gui/widgets.py:561 zim/gui/widgets.py:1722 msgid "Select File" msgstr "Select File" #. menu item in context menu #: zim/gui/widgets.py:699 msgid "Expand _All" msgstr "Expand _All" #. menu item in context menu #: zim/gui/widgets.py:701 msgid "_Collapse All" msgstr "_Collapse All" #. tooltip for the inline icon to clear a text entry widget #: zim/gui/widgets.py:1524 msgid "Clear" msgstr "Clear" #. dialog title #: zim/gui/widgets.py:1718 msgid "Select Folder" msgstr "Select Folder" #. dialog title #: zim/gui/widgets.py:1720 msgid "Select Image" msgstr "Select Image" #. default text for empty namespace selection #: zim/gui/widgets.py:1853 msgid "" msgstr "" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2148 msgid "Left Side Pane" msgstr "Left Side Pane" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2149 msgid "Right Side Pane" msgstr "Right Side Pane" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2150 msgid "Bottom Pane" msgstr "Bottom Pane" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2151 msgid "Top Pane" msgstr "Top Pane" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2155 msgid "Top Left" msgstr "Top Left" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2156 msgid "Bottom Left" msgstr "Bottom Left" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2157 msgid "Top Right" msgstr "Top Right" #. Option for placement of plugin widgets #: zim/gui/widgets.py:2158 msgid "Bottom Right" msgstr "Bottom Right" #. generic error dialog #: zim/gui/widgets.py:3141 msgid "Looks like you found a bug" msgstr "Looks like you found a bug" #. generic error dialog text #: zim/gui/widgets.py:3144 msgid "" "When reporting this bug please include\n" "the information from the text box below" msgstr "" "When reporting this bug please include\n" "the information from the text box below" #. Filter in open file dialog, shows all files (*) #: zim/gui/widgets.py:3448 msgid "All Files" msgstr "All Files" #. Filter in open file dialog, shows image files only #: zim/gui/widgets.py:3475 msgid "Images" msgstr "Images" #. Dialog title #: zim/gui/widgets.py:4130 msgid "File Exists" msgstr "File Exists" #. Dialog text in 'new filename' dialog #: zim/gui/widgets.py:4131 #, python-format msgid "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." msgstr "" "A file with the name \"%s\" already exists.\n" "You can use another name or overwrite the existing file." #. Button label #: zim/gui/widgets.py:4149 msgid "_Browse" msgstr "_Browse" #. Button label #: zim/gui/widgets.py:4154 msgid "Overwrite" msgstr "Overwrite" #. Error verbose description #: zim/__init__.py:238 msgid "Could not find the file or folder for this notebook" msgstr "Could not find the file or folder for this notebook" #. Error when looking up a notebook #: zim/__init__.py:743 #, python-format msgid "Could not find notebook: %s" msgstr "Could not find notebook: %s" #. error description #: zim/notebook.py:609 msgid "The given page name is not valid.\n" msgstr "The given page name is not valid.\n" #. error message #: zim/notebook.py:615 #, python-format msgid "Invalid page name \"%s\"" msgstr "Invalid page name \"%s\"" #. error message #: zim/notebook.py:630 msgid "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" msgstr "" "Index is still busy updating while we try to do an\n" "operation that needs the index.\n" #. error message for read-only pages #: zim/notebook.py:648 #, python-format msgid "Can not modify page: %s" msgstr "Can not modify page: %s" #. label for properties dialog #: zim/notebook.py:726 msgid "Interwiki Keyword" msgstr "Interwiki Keyword" #. label for properties dialog #: zim/notebook.py:727 msgid "Home Page" msgstr "Home Page" #. label for properties dialog #: zim/notebook.py:729 msgid "Document Root" msgstr "Document Root" #. label for properties dialog #: zim/notebook.py:731 msgid "Profile" msgstr "Profile" #. label for properties dialog #: zim/notebook.py:732 msgid "Shared Notebook" msgstr "Shared Notebook" #. plugin name #: zim/plugins/arithmetic.py:14 msgid "Arithmetic" msgstr "Arithmetic" #. plugin description #: zim/plugins/arithmetic.py:15 msgid "" "This plugin allows you to embed arithmetic calculations in zim.\n" "It is based on the arithmetic module from\n" "http://pp.com.mx/python/arithmetic.\n" msgstr "" #. menu item #: zim/plugins/arithmetic.py:44 msgid "_Arithmetic" msgstr "_Arithmetic" #. plugin name | #. Menu item #: zim/plugins/attachmentbrowser.py:227 zim/plugins/attachmentbrowser.py:319 msgid "Attachment Browser" msgstr "Attachment Browser" #. plugin description #: zim/plugins/attachmentbrowser.py:228 msgid "" "This plugin shows the attachments folder of the current page as an\n" "icon view at bottom pane.\n" "\n" "This plugin is still under development.\n" msgstr "" "This plug-in shows the attachments folder of the current page as an\n" "icon view in the bottom pane.\n" "\n" "This plug-in is still under development.\n" #. option for plugin preferences | #. preferences option #: zim/plugins/attachmentbrowser.py:240 zim/plugins/backlinkpane.py:33 #: zim/plugins/calendar.py:131 zim/plugins/tableofcontents.py:79 #: zim/plugins/tags.py:913 msgid "Position in the window" msgstr "Position in the window" #. label for attachment browser pane #: zim/plugins/attachmentbrowser.py:256 msgid "Attachments" msgstr "Attachments" #. Toolbar item tooltip #: zim/plugins/attachmentbrowser.py:321 msgid "Show Attachment Browser" msgstr "" #. Label for the statusbar, %i is the number of attachments for the current page #: zim/plugins/attachmentbrowser.py:378 #, python-format msgid "%i _Attachment" msgid_plural "%i _Attachments" msgstr[0] "%i _Attachment" msgstr[1] "%i _Attachments" #. unspecified value for file modification time #: zim/plugins/attachmentbrowser.py:708 msgid "Unknown" msgstr "Unknown" #. label for file type #: zim/plugins/attachmentbrowser.py:723 msgid "Type" msgstr "" #. label for file size #: zim/plugins/attachmentbrowser.py:724 msgid "Size" msgstr "Size" #. label for file modification date #: zim/plugins/attachmentbrowser.py:725 msgid "Modified" msgstr "Modified" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:760 msgid "_Move Here" msgstr "_Move Here" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:764 msgid "_Copy Here" msgstr "_Copy Here" #. popup menu action on drag-drop of a file #: zim/plugins/attachmentbrowser.py:769 msgid "Cancel" msgstr "Cancel" #. plugin name #: zim/plugins/automount.py:17 msgid "Automount" msgstr "Automount" #. plugin description #: zim/plugins/automount.py:18 msgid "" "This plugin can automatically \"mount\" notebooks when needed. It can\n" "e.g. be used to connect with remote drives or unlock an encrypted drive\n" "when zim is trying to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin can automatically \"mount\" notebooks when needed. For\n" "example, it can be used to connect to remote drives or unlock an\n" "encrypted drive when zim tries to open a specific notebook.\n" "\n" "This is a core plugin shipping with zim.\n" #. plugin name #: zim/plugins/backlinkpane.py:20 msgid "BackLinks Pane" msgstr "BackLinks Pane" #. plugin description #: zim/plugins/backlinkpane.py:21 msgid "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds an extra widget showing a list of pages\n" "linking to the current page.\n" "\n" "This is a core plugin shipping with zim.\n" #. widget label #: zim/plugins/backlinkpane.py:59 msgid "BackLinks" msgstr "BackLinks" #. menu item #: zim/plugins/calendar.py:58 msgid "To_day" msgstr "To_day" #. menu item #: zim/plugins/calendar.py:59 msgid "Calen_dar" msgstr "Calen_dar" #. plugin name #: zim/plugins/calendar.py:111 msgid "Journal" msgstr "" #. plugin description #: zim/plugins/calendar.py:112 msgid "" "This plugin turns one namespace into a journal\n" "with a page per day, week or month.\n" "Also adds a calendar widget to access these pages.\n" msgstr "" #. option value #: zim/plugins/calendar.py:123 msgid "Day" msgstr "Day" #. option value #: zim/plugins/calendar.py:124 msgid "Week" msgstr "Week" #. option value #: zim/plugins/calendar.py:125 msgid "Month" msgstr "Month" #. option value #: zim/plugins/calendar.py:126 msgid "Year" msgstr "Year" #. preferences option #: zim/plugins/calendar.py:130 msgid "Show calendar in sidepane instead of as dialog" msgstr "Show calendar in sidepane instead of as dialog" #. preferences option, values will be "Day", "Month", ... #: zim/plugins/calendar.py:132 msgid "Use a page for each" msgstr "Use a page for each" #. strftime format for current date label #: zim/plugins/calendar.py:393 msgid "%A %d %B %Y" msgstr "%A %d %B %Y" #. dialog title #: zim/plugins/calendar.py:433 msgid "Calendar" msgstr "Calendar" #. button label #: zim/plugins/calendar.py:441 msgid "_Today" msgstr "_Today" #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Dia_gram..." msgstr "Dia_gram..." #. menu item for insert diagram plugin #: zim/plugins/diagrameditor.py:31 msgid "Insert diagram" msgstr "Insert diagram" #. plugin name | #. dialog title #: zim/plugins/diagrameditor.py:39 zim/plugins/diagrameditor.py:83 msgid "Insert Diagram" msgstr "Insert Diagram" #. plugin description #: zim/plugins/diagrameditor.py:40 msgid "" "This plugin provides a diagram editor for zim based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a diagram editor for zim, based on GraphViz.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item in context menu #: zim/plugins/diagrameditor.py:72 msgid "_Edit Diagram" msgstr "_Edit Diagram" #. plugin name #: zim/plugins/distractionfree.py:23 msgid "Distraction Free Editing" msgstr "" #. plugin description #: zim/plugins/distractionfree.py:25 msgid "" "This plugin adds settings that help using zim\n" "as a distraction free editor.\n" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:34 msgid "Hide menubar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:35 msgid "Hide toolbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:36 msgid "Hide pathbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:37 msgid "Hide statusbar in fullscreen mode" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:38 msgid "Maximum page width" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:39 msgid "Vertical margin" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:40 msgid "Text background color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:41 msgid "Text foreground color" msgstr "" #. plugin preference #: zim/plugins/distractionfree.py:42 msgid "Screen background color" msgstr "" #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Ditaa..." msgstr "Ditaa..." #. menu item for insert diagram plugin #: zim/plugins/ditaaeditor.py:41 msgid "Insert ditaa" msgstr "Insert ditaa" #. plugin name | #. dialog title #: zim/plugins/ditaaeditor.py:49 zim/plugins/ditaaeditor.py:93 msgid "Insert Ditaa" msgstr "Insert Ditaa" #. plugin description #: zim/plugins/ditaaeditor.py:50 msgid "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a diagram editor for zim based on Ditaa.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item in context menu #: zim/plugins/ditaaeditor.py:82 msgid "_Edit Ditaa" msgstr "_Edit Ditaa" #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "E_quation..." msgstr "E_quation..." #. menu item for insert equation plugin #: zim/plugins/equationeditor.py:34 msgid "Insert equation" msgstr "Insert equation" #. plugin name | #. dialog title #: zim/plugins/equationeditor.py:42 zim/plugins/equationeditor.py:88 msgid "Insert Equation" msgstr "Insert Equation" #. plugin description #: zim/plugins/equationeditor.py:43 msgid "" "This plugin provides an equation editor for zim based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides an equation editor for zim, based on latex.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item in context menu #: zim/plugins/equationeditor.py:77 msgid "_Edit Equation" msgstr "_Edit Equation" #. menu item for insert plot plugin #: zim/plugins/gnuplot_ploteditor.py:42 msgid "Gnuplot..." msgstr "Gnuplot..." #. plugin name #: zim/plugins/gnuplot_ploteditor.py:50 msgid "Insert Gnuplot" msgstr "Insert Gnuplot" #. plugin description #: zim/plugins/gnuplot_ploteditor.py:51 msgid "This plugin provides a plot editor for zim based on Gnuplot.\n" msgstr "This plugin provides a plot editor for zim based on Gnuplot.\n" #. menu item in context menu #: zim/plugins/gnuplot_ploteditor.py:81 msgid "_Edit Gnuplot" msgstr "_Edit Gnuplot" #. dialog title #: zim/plugins/gnuplot_ploteditor.py:92 msgid "Gnuplot" msgstr "Gnuplot" #. menu item for insert plot plugin #: zim/plugins/gnu_r_ploteditor.py:45 msgid "GNU _R Plot..." msgstr "GNU _R Plot..." #. plugin name #: zim/plugins/gnu_r_ploteditor.py:53 msgid "Insert GNU R Plot" msgstr "Insert GNU R Plot" #. plugin description #: zim/plugins/gnu_r_ploteditor.py:54 msgid "This plugin provides a plot editor for zim based on GNU R.\n" msgstr "This plug-in provides a plot editor for Zim based on GNU R\n" #. menu item in context menu #: zim/plugins/gnu_r_ploteditor.py:84 msgid "_Edit GNU R Plot" msgstr "_Edit GNU R Plot" #. dialog title #: zim/plugins/gnu_r_ploteditor.py:95 msgid "GNU R Plot" msgstr "GNU R Plot" #. menu item #: zim/plugins/inlinecalculator.py:38 msgid "Evaluate _Math" msgstr "Evaluate _Math" #. error description #: zim/plugins/inlinecalculator.py:207 msgid "" "The inline calculator plugin was not able\n" "to evaluate the expression at the cursor." msgstr "" "The in-line calculator plug-in was not able\n" "to evaluate the expression at the cursor." #. plugin name #: zim/plugins/inlinecalculator.py:215 msgid "Inline Calculator" msgstr "In-line Calculator" #. plugin description #: zim/plugins/inlinecalculator.py:216 msgid "" "This plugin allows you to quickly evaluate simple\n" "mathematical expressions in zim.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plug-in allows you to quickly evaluate simple\n" "mathematical expressions in Zim.\n" "\n" "This is a core plug-in and ships with Zim.\n" #. error message #: zim/plugins/inlinecalculator.py:335 msgid "Could not parse expression" msgstr "Could not parse expression" #. menu item #: zim/plugins/insertsymbol.py:30 msgid "Sy_mbol..." msgstr "Sy_mbol" #. plugin name | #. Dialog title #: zim/plugins/insertsymbol.py:41 zim/plugins/insertsymbol.py:142 msgid "Insert Symbol" msgstr "Insert Symbol" #. plugin description #: zim/plugins/insertsymbol.py:42 msgid "" "This plugin adds the 'Insert Symbol' dialog and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plug-in adds the 'Insert Symbol' dialogue and allows\n" "auto-formatting typographic characters.\n" "\n" "This is a core plug-in shipping with Zim.\n" #. menu item for insert clipboard plugin #: zim/plugins/linesorter.py:34 msgid "_Sort lines" msgstr "_Sort Lines" #. plugin name #: zim/plugins/linesorter.py:43 msgid "Line Sorter" msgstr "Line Sorter" #. plugin description #: zim/plugins/linesorter.py:44 msgid "" "This plugin sorts selected lines in alphabetical order.\n" "If the list is already sorted the order will be reversed\n" "(A-Z to Z-A).\n" msgstr "" "This plug-in sorts selected lines into alphabetical order.\n" "If the list is already sorted, the order will be reversed\n" "(A-Z to Z-A).\n" #. Error message in "" dialog, %s will be replaced by application name #: zim/plugins/linesorter.py:67 msgid "Please select more than one line of text, first." msgstr "Please select more than one line of text." #. Menu item #: zim/plugins/linkmap/gui.py:28 msgid "Show Link Map" msgstr "Show Link Map" #. plugin name #: zim/plugins/linkmap/__init__.py:15 msgid "Link Map" msgstr "Link Map" #. plugin description #: zim/plugins/linkmap/__init__.py:16 msgid "" "This plugin provides a dialog with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a dialogue with a graphical\n" "representation of the linking structure of the\n" "notebook. It can be used as a kind of \"mind map\"\n" "showing how pages relate.\n" "\n" "This is a core plugin shipping with zim.\n" #. plugin name #: zim/plugins/printtobrowser.py:19 msgid "Print to Browser" msgstr "Print to Browser" #. plugin description #: zim/plugins/printtobrowser.py:20 msgid "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides a workaround for the lack of\n" "printing support in zim. It exports the current page\n" "to html and opens a browser. Assuming the browser\n" "does have printing support this will get your\n" "data to the printer in two steps.\n" "\n" "This is a core plugin shipping with zim.\n" #. menu item #: zim/plugins/printtobrowser.py:71 msgid "_Print to Browser" msgstr "_Print to Browser" #. menu item #: zim/plugins/quicknote.py:119 msgid "Quick Note..." msgstr "Quick Note..." #. plugin name #: zim/plugins/quicknote.py:138 zim/plugins/quicknote.py:167 #: zim/plugins/quicknote.py:373 msgid "Quick Note" msgstr "Quick Note" #. plugin description #: zim/plugins/quicknote.py:139 msgid "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a dialog to quickly drop some text or clipboard\n" "content into a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" #. checkbox in Quick Note dialog #: zim/plugins/quicknote.py:193 msgid "Create a new page for each note" msgstr "Create a new page for each note" #. text entry field #: zim/plugins/quicknote.py:194 msgid "Title" msgstr "Title" #. Option in quicknote dialog #: zim/plugins/quicknote.py:231 msgid "Open _Page" msgstr "Open _Page" #. confirm closing quick note dialog #: zim/plugins/quicknote.py:267 msgid "Discard note?" msgstr "" #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "S_core..." msgstr "S_core..." #. menu item for insert score plugin #: zim/plugins/scoreeditor.py:47 msgid "Insert score" msgstr "Insert score" #. plugin name | #. dialog title #: zim/plugins/scoreeditor.py:62 zim/plugins/scoreeditor.py:112 msgid "Insert Score" msgstr "Insert Score" #. plugin description #: zim/plugins/scoreeditor.py:63 msgid "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin provides an score editor for zim based on GNU Lilypond.\n" "\n" "This is a core plugin shipping with zim.\n" #. plugin preference #: zim/plugins/scoreeditor.py:74 msgid "Common include header" msgstr "Common include header" #. plugin preference #: zim/plugins/scoreeditor.py:75 msgid "Common include footer" msgstr "Common include footer" #. menu item in context menu #: zim/plugins/scoreeditor.py:101 msgid "_Edit Score" msgstr "_Edit Score" #. menu item for insert screenshot plugin #: zim/plugins/screenshot.py:27 msgid "_Screenshot..." msgstr "_Screenshot..." #. plugin name | #. dialog title #: zim/plugins/screenshot.py:41 zim/plugins/screenshot.py:73 msgid "Insert Screenshot" msgstr "Insert Screenshot" #. plugin description #: zim/plugins/screenshot.py:42 msgid "" "This plugin allows taking a screenshot and directly insert it\n" "in a zim page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plug-in allows a screenshot to be taken and directly inserted \n" "into a Zim page.\n" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:75 msgid "Capture whole screen" msgstr "Capture whole screen" #. option in 'insert screenshot' dialog #: zim/plugins/screenshot.py:76 msgid "Select window or region" msgstr "Select window or region" #. input in 'insert screenshot' dialog #: zim/plugins/screenshot.py:82 msgid "Delay" msgstr "Delay" #. label behind timer #: zim/plugins/screenshot.py:87 msgid "seconds" msgstr "seconds" #. Error message in "insert screenshot" dialog, %s will be replaced by application name #: zim/plugins/screenshot.py:119 #, python-format msgid "Some error occurred while running \"%s\"" msgstr "An error occured while running \"%s\"" #. menu item #: zim/plugins/spell.py:39 msgid "Check _spelling" msgstr "Check _spelling" #. plugin name #: zim/plugins/spell.py:45 msgid "Spell Checker" msgstr "Spell Checker" #. plugin description #: zim/plugins/spell.py:46 msgid "" "Adds spell checking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "Adds spellchecking support using gtkspell.\n" "\n" "This is a core plugin shipping with zim.\n" #. error message - %s is replaced with language codes like "en", "en_US"m or "nl_NL" #: zim/plugins/spell.py:94 #, python-format msgid "Could not load spell checking for language: \"%s\"" msgstr "Could not load spell checking for language: \"%s\"" #. error message explanation #: zim/plugins/spell.py:96 msgid "" "This could mean you don't have the proper\n" "dictionaries installed" msgstr "" "This could mean you don't have the proper\n" "dictionaries installed" #. plugin name #: zim/plugins/tableofcontents.py:65 msgid "Table of Contents" msgstr "Table of Contents" #. plugin description #: zim/plugins/tableofcontents.py:66 msgid "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds an extra widget showing a table of\n" "contents for the current page.\n" "\n" "This is a core plugin shipping with zim.\n" #. option for plugin preferences #: zim/plugins/tableofcontents.py:81 msgid "Show ToC as floating widget instead of in sidepane" msgstr "Show ToC as floating widget instead of in the sidepane" #. widget label #: zim/plugins/tableofcontents.py:117 zim/plugins/tableofcontents.py:154 msgid "ToC" msgstr "ToC" #. action to lower level of heading in the text #: zim/plugins/tableofcontents.py:267 msgid "Demote" msgstr "Demote" #. action to raise level of heading in the text #: zim/plugins/tableofcontents.py:269 msgid "Promote" msgstr "Promote" #. label for untagged pages in side pane #: zim/plugins/tags.py:91 msgid "untagged" msgstr "untagged" #. Context menu item for tag cloud #: zim/plugins/tags.py:764 msgid "Sort alphabetically" msgstr "Sort alphabetically" #. menu option #: zim/plugins/tags.py:836 msgid "Sort pages by tags" msgstr "Sort pages by tags" #. plugin name | #. Column header for tag list in Task List dialog #: zim/plugins/tags.py:903 zim/plugins/tags.py:943 zim/plugins/tasklist.py:718 msgid "Tags" msgstr "Tags" #. plugin description #: zim/plugins/tags.py:904 msgid "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" msgstr "" "This plugin provides a page index filtered by means of selecting tags in a " "cloud.\n" #. menu item | #. plugin name | #. dialog title #: zim/plugins/tasklist.py:35 zim/plugins/tasklist.py:99 #: zim/plugins/tasklist.py:609 msgid "Task List" msgstr "Task List" #. plugin description #: zim/plugins/tasklist.py:100 msgid "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a dialog showing all open tasks in\n" "this notebook. Open tasks can be either open checkboxes\n" "or items marked with tags like \"TODO\" or \"FIXME\".\n" "\n" "This is a core plugin shipping with zim.\n" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:113 msgid "Consider all checkboxes as tasks" msgstr "Consider all checkboxes as tasks" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:115 msgid "Turn page name into tags for task items" msgstr "Turn page name into tags for task items" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:117 msgid "Implicit due date for task items in calendar pages" msgstr "Implicit due date for task items in calendar pages" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:119 msgid "Flag tasks due on Monday or Tuesday before the weekend" msgstr "Flag tasks due on Monday or Tuesday before the weekend" #. label for plugin preferences dialog - labels are e.g. "FIXME", "TODO", "TASKS" #: zim/plugins/tasklist.py:121 msgid "Labels marking tasks" msgstr "Labels marking tasks" #. label for plugin preferences dialog - label is by default "Next" #: zim/plugins/tasklist.py:123 msgid "Label for next task" msgstr "Label for next task" #. label for plugin preferences dialog #: zim/plugins/tasklist.py:125 msgid "Tags for non-actionable tasks" msgstr "" #. subtree to search for tasks - default is the whole tree (empty string means everything) #: zim/plugins/tasklist.py:127 msgid "Subtree(s) to index" msgstr "" #. subtrees of the included subtrees to *not* search for tasks - default is none #: zim/plugins/tasklist.py:129 msgid "Subtree(s) to ignore" msgstr "" #. Short message text on first time use of task list plugin #: zim/plugins/tasklist.py:578 msgid "Need to index the notebook" msgstr "Notebook indexing required" #. Long message text on first time use of task list plugin #: zim/plugins/tasklist.py:580 msgid "" "This is the first time the task list is opened.\n" "Therefore the index needs to be rebuild.\n" "Depending on the size of the notebook this can\n" "take up to several minutes. Next time you use the\n" "task list this will not be needed again." msgstr "" "This is the first time the task list has been\n" "opened, so the index needs to be rebuilt.\n" "Depending on the size of the notebook, this\n" "may take several minutes. This is only\n" "necessary for the first use of the task list." #. Input label #: zim/plugins/tasklist.py:635 msgid "Filter" msgstr "Filter" #. Checkbox in task list #: zim/plugins/tasklist.py:655 msgid "Only Show Actionable Tasks" msgstr "Only Show Actionable Tasks" #. Label for statistics in Task List, %i is the number of tasks #: zim/plugins/tasklist.py:668 #, python-format msgid "%i open item" msgid_plural "%i open items" msgstr[0] "%i open item" msgstr[1] "%i open items" #. "tag" for showing all tasks #: zim/plugins/tasklist.py:777 msgid "All Tasks" msgstr "All Tasks" #. label in tasklist plugins for tasks without a tag #: zim/plugins/tasklist.py:788 msgid "Untagged" msgstr "Untagged" #. Column header Task List dialog #: zim/plugins/tasklist.py:870 msgid "Task" msgstr "Task" #. Column header Task List dialog | #. Column header versions dialog #: zim/plugins/tasklist.py:916 zim/plugins/versioncontrol/__init__.py:1104 msgid "Date" msgstr "Date" #. plugin name #: zim/plugins/trayicon.py:43 msgid "Tray Icon" msgstr "Tray Icon" #. plugin description #: zim/plugins/trayicon.py:44 msgid "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plugin adds a tray icon for quick access.\n" "\n" "This plugin depends on Gtk+ version 2.10 or newer.\n" "\n" "This is a core plugin shipping with zim.\n" #. preferences option #: zim/plugins/trayicon.py:57 msgid "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" msgstr "" "Classic trayicon,\n" "do not use new style status icon on Ubuntu" #. preferences option #: zim/plugins/trayicon.py:58 msgid "Show a separate icon for each notebook" msgstr "Show a separate icon for each notebook" #. menu item in tray icon menu #: zim/plugins/trayicon.py:130 msgid "_Quick Note..." msgstr "_Quick Note..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:139 msgid "_Other..." msgstr "_Other..." #. menu item in tray icon menu #: zim/plugins/trayicon.py:192 msgid "Notebooks" msgstr "Notebooks" #. tooltip for tray icon | #. short description of zim #: zim/plugins/trayicon.py:251 zim/plugins/zeitgeist-logger.py:42 msgid "Zim Desktop Wiki" msgstr "Zim Desktop Wiki" #. menu item #: zim/plugins/versioncontrol/__init__.py:57 msgid "S_ave Version..." msgstr "S_ave Version..." #. menu item #: zim/plugins/versioncontrol/__init__.py:58 msgid "_Versions..." msgstr "_Versions..." #. verbose error description #: zim/plugins/versioncontrol/__init__.py:76 msgid "" "There are no changes in this notebook since the last version that was saved" msgstr "" "No changes have been made in this notebook since the last version was saved." #. Short error descriotion #: zim/plugins/versioncontrol/__init__.py:79 msgid "No changes since last version" msgstr "No changes since last version" #. option value #: zim/plugins/versioncontrol/__init__.py:95 msgid "Bazaar" msgstr "Bazaar" #. option value #: zim/plugins/versioncontrol/__init__.py:96 msgid "Mercurial" msgstr "Mercurial" #. option value #: zim/plugins/versioncontrol/__init__.py:97 msgid "Git" msgstr "Git" #. plugin name #: zim/plugins/versioncontrol/__init__.py:679 msgid "Version Control" msgstr "Version Control" #. plugin description #: zim/plugins/versioncontrol/__init__.py:680 msgid "" "This plugin adds version control for notebooks.\n" "\n" "This plugin supports the Bazaar, Git and Mercurial version control systems.\n" "\n" "This is a core plugin shipping with zim.\n" msgstr "" "This plug-in adds version control for notebooks.\n" "\n" "This plug-in supports the Bazaar, Git and Mercurial version control " "systems.\n" "\n" "This is a core plug-in shipping with zim.\n" #. Label for plugin preference #: zim/plugins/versioncontrol/__init__.py:692 msgid "Autosave version on regular intervals" msgstr "Autosave version at regular intervals" #. default version comment for auto-saved versions #: zim/plugins/versioncontrol/__init__.py:757 msgid "Automatically saved version from zim" msgstr "Automatically saved version from zim" #. Question dialog #: zim/plugins/versioncontrol/__init__.py:792 msgid "Enable Version Control?" msgstr "Enable Version Control?" #. Detailed question #: zim/plugins/versioncontrol/__init__.py:793 msgid "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" msgstr "" "Version control is currently not enabled for this notebook.\n" "Do you want to enable it?" #. option to chose versioncontrol backend #: zim/plugins/versioncontrol/__init__.py:805 msgid "Backend" msgstr "Backend" #. dialog title #: zim/plugins/versioncontrol/__init__.py:820 msgid "Save Version" msgstr "Save Version" #. Dialog text #: zim/plugins/versioncontrol/__init__.py:825 msgid "Please enter a comment for this version" msgstr "Please enter a comment for this version" #. default version comment in the "save version" dialog #: zim/plugins/versioncontrol/__init__.py:830 msgid "Saved version from zim" msgstr "Saved version from zim" #. dialog title #: zim/plugins/versioncontrol/__init__.py:866 #: zim/plugins/versioncontrol/__init__.py:881 msgid "Versions" msgstr "Versions" #. Option in versions dialog to show version for single page #: zim/plugins/versioncontrol/__init__.py:888 msgid "_Page" msgstr "_Page" #. Button label #: zim/plugins/versioncontrol/__init__.py:902 msgid "View _Annotated" msgstr "View _Annotated" #. Help text in versions dialog #: zim/plugins/versioncontrol/__init__.py:907 msgid "" "Select a version to see changes between that version and the current\n" "state. Or select multiple versions to see changes between those versions.\n" msgstr "" "Select a version to see changes between that version and the current\n" "state, or select multiple versions to see changes between those versions.\n" #. version details #: zim/plugins/versioncontrol/__init__.py:925 msgid "Comment" msgstr "Comment" #. Button label #: zim/plugins/versioncontrol/__init__.py:940 msgid "_Restore Version" msgstr "_Restore Version" #. button in versions dialog for diff #: zim/plugins/versioncontrol/__init__.py:945 msgid "Show _Changes" msgstr "Show _Changes" #. button in versions dialog for side by side comparison #: zim/plugins/versioncontrol/__init__.py:951 msgid "_Side by Side" msgstr "_Side by Side" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1041 msgid "Annotated Page Source" msgstr "Annotated Page Source" #. Confirmation question #: zim/plugins/versioncontrol/__init__.py:1050 msgid "Restore page to saved version?" msgstr "Restore page to saved version?" #. Detailed question, "%(page)s" is replaced by the page, "%(version)s" by the version id #: zim/plugins/versioncontrol/__init__.py:1051 #, python-format msgid "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" msgstr "" "Do you want to restore page: %(page)s\n" "to saved version: %(version)s ?\n" "\n" "All changes since the last saved version will be lost !" #. dialog title #: zim/plugins/versioncontrol/__init__.py:1066 msgid "Changes" msgstr "Changes" #. Column header versions dialog #: zim/plugins/versioncontrol/__init__.py:1103 msgid "Rev" msgstr "Rev" #. plugin name #: zim/plugins/zeitgeist-logger.py:26 msgid "Log events with Zeitgeist" msgstr "Log events with Zeitgeist" #. plugin description #: zim/plugins/zeitgeist-logger.py:27 msgid "Pushes events to the Zeitgeist daemon." msgstr "Pushes events to the Zeitgeist daemon." #. label for how zim pages show up in the recent files menu, %s is the page name #: zim/plugins/zeitgeist-logger.py:60 #, python-format msgid "Wiki page: %s" msgstr "Wiki page: %s" #~ msgid "Text Editor" #~ msgstr "Text Editor" #~ msgid "File browser" #~ msgstr "File browser" #~ msgid "Email client" #~ msgstr "Email client" #~ msgid "Web browser" #~ msgstr "Web browser" #~ msgid "Pages" #~ msgstr "Pages" #~ msgid "Output" #~ msgstr "Output" #~ msgid "Match c_ase" #~ msgstr "Match c_ase" #~ msgid "Slow file system" #~ msgstr "Slow file system" #~ msgid "Prio" #~ msgstr "Prio" #~ msgid "_Filter" #~ msgstr "_Filter" zim-0.60/setup.py0000755000175000017500000002226312032036457013632 0ustar jaapjaap00000000000000#!/usr/bin/env python import os import sys import shutil import subprocess try: import py2exe except ImportError: py2exe = None from distutils.core import setup from distutils.command.sdist import sdist as sdist_class from distutils.command.build import build as build_class from distutils.command.build_scripts import build_scripts as build_scripts_class from distutils.command.install import install as install_class from distutils import cmd from distutils import dep_util from zim import __version__, __url__ import msgfmt # also distributed with zim import makeman # helper script try: version_info = sys.version_info assert version_info >= (2, 5) assert version_info < (3, 0) except: print >> sys.stderr, 'zim needs python >= 2.5 (but < 3.0)' sys.exit(1) # Get environment parameter for building for maemo # We don't use auto-detection here because we want to be able to # cross-compile a maemo package on another platform build_target = os.environ.get('ZIM_BUILD_TARGET') assert build_target in (None, 'maemo'), 'Unknown value for ZIM_BUILD_TARGET: %s' % build_target if build_target == 'maemo': print 'Building for Maemo...' # Some constants PO_FOLDER = 'translations' LOCALE_FOLDER = 'locale' # Helper routines def collect_packages(): # Search for python packages below zim/ packages = [] for dir, dirs, files in os.walk('zim'): if '__init__.py' in files: package = '.'.join(dir.split(os.sep)) packages.append(package) #~ print 'Pakages: ', packages return packages def get_mopath(pofile): # Function to determine right locale path for a .po file lang = os.path.basename(pofile)[:-3] # len('.po') == 3 modir = os.path.join(LOCALE_FOLDER, lang, 'LC_MESSAGES') mofile = os.path.join(modir, 'zim.mo') return modir, mofile def include_file(file): # Check to exclude hidden and temp files if file.startswith('.'): return False else: for ext in ('~', '.bak', '.swp', '.pyc'): if file.endswith(ext): return False return True def collect_data_files(): # Search for data files to be installed in share/ data_files = [ ('share/man/man1', ['man/zim.1']), ('share/applications', ['xdg/zim.desktop']), ('share/mime/packages', ['xdg/zim.xml']), ('share/pixmaps', ['xdg/hicolor/48x48/apps/zim.png']), ] # xdg/hicolor -> PREFIX/share/icons/hicolor for dir, dirs, files in os.walk('xdg/hicolor'): if files: target = os.path.join('share', 'icons', dir[4:]) files = [os.path.join(dir, f) for f in files] data_files.append((target, files)) # mono icons -> PREFIX/share/icons/ubuntu-mono-light | -dark for theme in ('ubuntu-mono-light', 'ubuntu-mono-dark'): file = os.path.join('icons', theme, 'zim-panel.svg') target = os.path.join('share', 'icons', theme, 'apps', '22') data_files.append((target, [file])) # data -> PREFIX/share/zim for dir, dirs, files in os.walk('data'): if '.zim' in dirs: dirs.remove('.zim') target = os.path.join('share', 'zim', dir[5:]) if files: files = filter(include_file, files) files = [os.path.join(dir, f) for f in files] data_files.append((target, files)) if build_target == 'maemo': # Remove default .desktop files and replace with our set prefix = os.path.join('share', 'zim', 'applications') for i in reversed(range(len(data_files))): if data_files[i][0].startswith(prefix): data_files.pop(i) files = ['maemo/applications/%s' % f for f in os.listdir('maemo/applications') if f.endswith('.desktop')] data_files.append((prefix, files)) # .po files -> PREFIX/share/locale/.. for pofile in [f for f in os.listdir(PO_FOLDER) if f.endswith('.po')]: pofile = os.path.join(PO_FOLDER, pofile) modir, mofile = get_mopath(pofile) target = os.path.join('share', modir) data_files.append((target, [mofile])) #~ import pprint #~ print 'Data files: ' #~ pprint.pprint(data_files) return data_files def fix_dist(): # Try to update version info if os.path.exists('.bzr/'): print 'updating bzr version-info...' os.system('bzr version-info --format python > zim/_version.py') # Generate man page makeman.make() # Add the changelog to the manual # print 'copying CHANGELOG.txt -> data/manual/Changelog.txt' # shutil.copy('CHANGELOG.txt', 'data/manual/Changelog.txt') # Copy the zim icons a couple of times # Paths for mimeicons taken from xdg-icon-resource # xdg-icon-resource installs: # /usr/local/share/icons/hicolor/.../mimetypes/gnome-mime-application-x-zim-notebook.png # /usr/local/share/icons/hicolor/.../mimetypes/application-x-zim-notebook.png # /usr/local/share/icons/hicolor/.../apps/zim.png if os.path.exists('xdg/hicolor'): shutil.rmtree('xdg/hicolor') os.makedirs('xdg/hicolor/scalable/apps') os.makedirs('xdg/hicolor/scalable/mimetypes') for name in ( 'apps/zim.svg', 'mimetypes/gnome-mime-application-x-zim-notebook.svg', 'mimetypes/application-x-zim-notebook.svg' ): shutil.copy('icons/zim48.svg', 'xdg/hicolor/scalable/' + name) for size in ('16', '22', '24', '32', '48'): dir = size + 'x' + size os.makedirs('xdg/hicolor/%s/apps' % dir) os.makedirs('xdg/hicolor/%s/mimetypes' % dir) for name in ( 'apps/zim.png', 'mimetypes/gnome-mime-application-x-zim-notebook.png', 'mimetypes/application-x-zim-notebook.png' ): shutil.copy('icons/zim%s.png' % size, 'xdg/hicolor/' + dir + '/' + name) # Overloaded commands class zim_sdist_class(sdist_class): # Command to build source distribution # make sure _version.py gets build and included def initialize_options(self): sdist_class.initialize_options(self) self.force_manifest = 1 # always re-generate MANIFEST def run(self): fix_dist() sdist_class.run(self) class zim_build_trans_class(cmd.Command): # Compile mo files description = 'Build translation files' user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): for pofile in [f for f in os.listdir(PO_FOLDER) if f.endswith('.po')]: pofile = os.path.join(PO_FOLDER, pofile) modir, mofile = get_mopath(pofile) if not os.path.isdir(modir): os.makedirs(modir) if not os.path.isfile(mofile) or dep_util.newer(pofile, mofile): print 'compiling %s' % mofile msgfmt.make(pofile, mofile) else: #~ print 'skipping %s - up to date' % mofile pass class zim_build_scripts_class(build_scripts_class): # Adjust bin/zim.py -> bin/zim def run(self): build_scripts_class.run(self) if os.name == 'posix' and not self.dry_run: for script in self.scripts: if script.endswith('.py'): file = os.path.join(self.build_dir, script) print 'renaming %s to %s' % (file, file[:-3]) os.rename(file, file[:-3]) # len('.py') == 3 class zim_build_class(build_class): # Generate _version.py etc. and call build_trans as a subcommand # Also set PLATFORM in zim/__init__.py sub_commands = build_class.sub_commands + [('build_trans', None)] def run(self): fix_dist() build_class.run(self) file = os.path.join(self.build_lib, 'zim', '__init__.py') print 'Setting PLATFORM in %s' % file assert os.path.isfile(file) fh = open(file) lines = fh.readlines() fh.read() for i, line in enumerate(lines): if line.startswith('PLATFORM = '): if build_target is None: lines[i] = 'PLATFORM = None\n' else: lines[i] = 'PLATFORM = "%s"\n' % build_target break else: assert False, 'Missed line for PLATFORM' fh = open(file, 'w') fh.writelines(lines) fh.close() class zim_install_class(install_class): user_options = install_class.user_options + \ [('skip-xdg-cmd', None, "don't run XDG update commands (for packaging)")] boolean_options = install_class.boolean_options + \ ['skip-xdg-cmd'] def initialize_options(self): install_class.initialize_options(self) self.skip_xdg_cmd = 0 def run(self): install_class.run(self) if not self.skip_xdg_cmd: # Try XDG tools mimedir = os.path.join(self.install_data, 'share', 'mime') for cmd in ( ('update-desktop-database',), ('update-mime-database', mimedir), ): print 'Trying: ' + ' '.join(cmd) subprocess.call(cmd) # Distutils parameters, and main function dependencies = ['gobject', 'gtk', 'xdg'] if version_info == (2, 5): dependencies.append('simplejson') if build_target == 'maemo': scripts = ['zim.py', 'maemo/modest-mailto.sh'] else: scripts = ['zim.py'] if py2exe: py2exeoptions = { 'windows': [ { "script": "zim.py", "icon_resources": [(1, "icons/zim.ico")] # Windows 16x16, 32x32, and 48x48 icon based on PNG } ], 'zipfile': None, 'options': { "py2exe": { "compressed": 1, "optimize": 2, "ascii": 1, "bundle_files": 3, "packages": ["encodings", "cairo", "atk", "pangocairo", "zim"], } } } else: py2exeoptions = {} setup( # wire overload commands cmdclass = { 'sdist': zim_sdist_class, 'build': zim_build_class, 'build_trans': zim_build_trans_class, 'build_scripts': zim_build_scripts_class, 'install': zim_install_class, }, # provide package properties name = 'zim', version = __version__, description = 'Zim desktop wiki', author = 'Jaap Karssenberg', author_email = 'jaap.karssenberg@gmail.com', license = 'GPL v2+', url = __url__, scripts = scripts, packages = collect_packages(), data_files = collect_data_files(), requires = dependencies, **py2exeoptions ) zim-0.60/icons/0000775000175000017500000000000012140000463013211 5ustar jaapjaap00000000000000zim-0.60/icons/zim16.svg0000644000175000017500000004707711544165551014736 0ustar jaapjaap00000000000000 image/svg+xml zim-0.60/icons/zim24.png0000644000175000017500000000255611544165551014713 0ustar jaapjaap00000000000000PNG  IHDRw=bKGDԂ pHYs oy vpAgxLrIDATHœ[lTUsLg-r)% $VZBc%hFh>! ڊ<T)Pi>sn{ЩU4O׿?Oaq7B*aRha 8 /TW*ꎶ}B1.- B \*^fTļNeO/X +ymv@I7NoT ﮄwg'}r!- ͮC}@;.T9_TZJ R5іg\ÍSC3|Wr'@`(@x!lnkm?'+Gl2(RCʊ]*ʫJXk{Eȸ_fφ{qׇr a(Ko94uα0RHOdS sHɫm  `^k]OVڞUnUQI$2)24e s~W z}ؙۭa|P[6߫A*$MdyK-m-?m]o`#ɢrC2v,$70Mh8Bat:DoUc\R@uﷰؘc;abҷߤ%iG|-l< NTvcI9Bl vy_Y.8;K+,iaonBuy?1gQ5=\dI_Z9|@JfBtB(% !gA D&hx4kk(.t|(tybMICl"A/wox\ 3n !9ݱ{.ybo#ѽw&[-Y:# image/svg+xml zim-0.60/icons/zim48.png0000644000175000017500000000725311544165551014720 0ustar jaapjaap00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<(IDAThŚyp]}?{*=l8 (II\XIӤI҅d i:I)&i.4fBٍm0blk,ws~=ڌ-3}mGJD+)k0\ "0g\MéJ)4"86]%7JrtLF)* ?͚3| HN$}( 31s]LcDs]J[[<`%p%ڮ~UH ]ũC')Rg `}kK ~͟LU#8QR:?eaUjљ8J }Mh^v' i: ЦT-Qc.b)A1wp|B7g`ܥaAG%a<|"g?r 5y܉ D@^6Ӭv`UVtx'~{o4dhqq]+( )>aP$ !AQlB;72R]>U( #*@I -۶lrNQS,e;>{9˿$h]CÐ0 0È( ,J).^Qm^)~͛e1 ֭; LU9n6ƪC`c0.K, KKhlVI+Ծ(a֭;Q0|N +K-|Ab!"($ K;Qt>:ϯE*]oB^DDW"S?'[[m?^{i 4`peGfR|_]#)U|HqݼR6-/?>۟ܪtr@)IߔJEDqLFDQLē"\U%ާ籠SHNaẺ~%(>0DzUWyAa<A%kMb2%| #&VQ՜8񉪮+Vzh֭pDz G+>ޕ)%HRTxky**3d]d[5N.cZc3ַDvGTpP֎eWUK3 \k2^Z *s$M-2^q]/S5N|6:1쇂|Sg ͟$^J' F?trU7T uO(wǦcJ ΫMaF~SPB^^+7l.'C>(p"yLw_Zᥫ{>pkrw`({~̿IN[.LˊdRiDd{܎BUnEob> t97 i?+Y'Tn/Q1OovWq6]wRc<*'Z"Q$̨Rzcn*;Mw'fUL'W+U@V${^,Cm JK:-7oצ;֒2C| &Dq^e-]j]H-4E'{̱ ;z0i&3:x9;`H ^l1$DGO7o<~ғ@ZSvr* LdY"S7Ϗ?OuCWuuk1y5ѐ|fCUA kR0cD1dǎq2_ŗ' L)i ߽NjO=XQ4+Tcv0$5Z24oբ8F+.;E1QX|o%˳P; GTr@A:ʽ‘eF1ˆ/PJ&sU1 W)uwf @ɿͪՊT )Qdё)Z}a~V nXk*%;1M39"T.m9T83J k=q<6l_puMj_IENDB`zim-0.60/icons/zim22.svg0000644000175000017500000005060611544165551014723 0ustar jaapjaap00000000000000 image/svg+xml zim-0.60/icons/zim22.png0000644000175000017500000000235111544165551014702 0ustar jaapjaap00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<fIDAT8[lTU}ΙۙLhKQD,$SDDPHIxUC b /xIL( `1\ )Υ3sf朽}jz_J))u][|YcJj)7@upB2\EOҤOѻmI3lCj"4,U.hT8{7P%!U Ju|!DK9 Jui[b FD{,S w20|(4Pc*;FӪ|yćMwzG`xY׃ϭ]i`|vZݧy '.UO\6:ԸdePm'/ͭwYTCWC1}+.ty bE][pqUv7j^HrD2A&;ĵZ:==B gyBnMh$SIҙ4(bHGצ΃'v gYu~c"iK<9+K6%VF֢R,Q2N{W(/xΏLa[b7+j1 eB-jQ$R_iDSC {C&'"[sKuԜWHJ$ qSnԊb~\SSjIבW_pE)M{[ ױs_4۲M5~0gc{_{ml_ޫA>IJv@7 w},'K/|hH:ۻ԰q\!M}3U:-1rͮ7n\>8L68,ssR?d}Mެ<¢g=ӧ`be3FYV%:Xyee4q֚Rv캤,4V:3]sM#Iy1:O7, +c16:%>?^EvyoM^gWZx9zdҚm3'`- aNm;fmy-ܥ(w Ewڼ7o - a84&;W1Һr=>aPʨ;;t9ppkzv]0RZk1$P3 S XNz;]|ѩ⥆9= 2c~z5){Ӌ/v~%pbmj 덕z=BFc , 3uJȁឿӳ;w&u< |o'fA^kI\)ɹ<Z%gO_sב5/7_6hc5>oj19K_'.%Z߿زf?6m6^ԃY?$獱~`>!D'0 F5Lu8*#WIENDB`zim-0.60/icons/zim16.png0000644000175000017500000000153111544165551014704 0ustar jaapjaap00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8eMlTe}w)L F~E@B0%t BqɂDR 1jB?@@KNi8C3Ν}.؞9y{~sZbJF ^k9ik-:K k,p:1HhYĚ^5KvQ({*Z[V-FG(B|W=L(kJ\=sW»_a .v4cӓFF{EB埝}H4 ~=.:>ȗrx$q05K?F/oo:o%B@IF]Dk^x@ '`s _n޳2z^x8)Rk9;]_l:Q7ulE\|0 LȊTP4pV :zfGri^},W 6WL'-4 =5yAҌ\@כ ʌƒW|?b~SL= (+w image/svg+xml zim-0.60/icons/zim32.svg0000644000175000017500000006020311544165551014716 0ustar jaapjaap00000000000000 image/svg+xml zim-0.60/icons/zim.ico0000644000175000017500000012636611634171537014542 0ustar jaapjaap00000000000000 qF00 %>r   hPNG  IHDR\rfqIDATx}$WuܓsܼZiw%* I($D6A |71&a,D!! Wiqr\[_U鞮+VOŮu KFf\ pنPt6Խ0Q/BVH~ظ_ZUT1lÏ_qi]*!u'jEXL}H7K,G@/qum2___oϊH|TSg*;k=YnR'F]Sk&Ymx?߾ջ(]dYn*uY~Vlvn'MG х־|UY1DHlW]%uY  B28-UI 2R'ŋ0d1 e2v@eN>$r`?" jR'ŋRH hk S`_Q,p qBߕB ؎!@դN>g @v@X1WAb 0Y'I|/ (!4`Z D&uY  A$x.W\3!G90V'I|/B!ؗ=[@1@B.H&uY@FP9Y`v! `NU:,N^@ڿA9$u g)DD$ &8CP5EV048 2R'ŋD$V8숋d jR'ŋزL[6!! `&uY !ƿ`hFhuEDP5Ea$e'PW0 9ڄ\}u g"@C &V$vGd jR'ŋH!.ph3V `O&uY fV0#tp:TMx@$$ &$NG/:TMx@#@A9$ 'nN :TMx@@ZЉ!)oe4V\6ZO܃n\ f^|/hF:+zّi$`}ނ;p pw!$v|/hA9+ `ݢ:{AY@).N˧ X'ŋ "H+z8 %*O˅M-G$_yP'ŋ `_4 &^$~G/O0@_˛|+HQ'ŋ:Η `v@-" @s !%†i۴*>Fbt"48` [< ߃Kw'bq{$S 4&@ *3¾uPO" E]HƬK<&ocːA%R9bSiP m9yj~ ȢFyLO$4UW_F'3AmI"f@@1=˩Ŝ#UOA`p !a\u 0˅@| PS\cl(5q/𶭴cUz2bh jqPCYVgȓ@2g$ߠ.>M @T7׏!plשԾRIдZ,xZ.=)\;BUiz6g)*(H ʴ( xmvp`->8 I:,aW|}k=XYf!fԖYjElZX!B]? BDb }6 .Bxf/#|N"Oz ~ltc-3Sxπk*p`c5o؆) z?]g3Y |bYi<s$ `N\N/:O2C3VC[p)(&GbM{VV-T2lIB M.D T߄J i,7vPdj؍zrfu)\`_-ZBd(:O©$OHUJ͸.4l6^X!B h8eNX_a#6dw BX?+ky_ ,c}.\,Zl(5wR'O423K"=x44nM}o'%(WO%ӐE@PfeJ*< BC&z3+| )s5O-(˜e„ʷ^zݥ [ Qp<QѲ!g΁؜F)ZW KIK^y|Q! ZDP/{ G:~u# o$;O[6-y_T,  |WbH_B*R5>)@ͽAϙ`{J g4o*D!}_ d]9OM*%?rCτB5;7%ÔΪ lOKVCC|@;ءQ7' )p3\uu^"=)Ԗby_Oœ|&P_|g}kA:̍΍ `2QǮZZ }w&3; o6 QY i?=gб& а&2?ʛ׀?We FOlխr'(xh4,DW }2ΡV@(Fd}_pC;%vyih>%]xЫzrs $ۢ p$%ش4v= ` T]Jڽ$;#| |bð_U8*}vHm@6~ i|̜|+VC o~Jɽ 8(ݠ܀UAt.DUow3u ׂWXFt1zv,>nD" S," e @HeSa r/s Ak?^0͸ ߜB>r5HC(e4@b7q6 ^πi쐯 驲5>zZO_^PdFe.Ne`zr2٬7kDXDsPvcͼSB,H@s&*%9,EiD@ĶaI`~M '6 C5tdڦLGࢧб}!փ؀ `ioHO%S)_TB a#Nc}n 7R<P pMHL m2/\*.A >NE3мFѻbv rNK\ eͩW% s'~3 ] s +:XZ X#ːާ^UAznJ4- $$YC}fJ Qԗhg dr{9oA𿧘k$$'HPL `JAZР \K w1yh

    n;+ 3^&#HKz%>בW%77 " ]^Ψc (YV' Lzhk7mػ ;&XAh,l%XjxӑrKXV8 ..HSuX ƥ!TiȳW] Wв󀳁^Dn~k뇳d M}gPi]炐yTU)HJ$bdA$ &U-'\:@s|#(P\tlQqZfR L̬Vgn&?kji`| ,:&33xv$+r\cHK/2)d~]+f!H,m7H$$fDppyvl7U'?Vkzd#/ן{$#pXrQ$CAE}$r0+~*E=ki[S@~Qi@t*SȾwnS<΄??&PPUVs(/Cg6@f[ws߂L 0ۄu>M(0Z/~DTQ pdNlNWS|UsiȊѧ [o1A4>ck EmEcsrƱ^_ 2 h2/Bz+4s@R81"Xܿ z.:qKO@Hx%_{a6\@ʻGeH@2!Uo<Bfyl' Ph{#0/Hz B77Nj81 'HaGp!U56vx6v`;أt ('f0ks z5׬ڛ4@p /e! HQLg8!/n!ޠzKOU1XwQTf mey.1S+LgvV{vVTDH<iwr5#< @4Hpq"_A zB[p{ |MT%~015eѬ=;Sb69cit_Gg>#U9r?$vst3}I[ݰvٳPGw14;7<-|M9/Y(Z>|Egn=㘾yP]Q|oO-^J dhUrV}K7 $̧KQv#[0/X{$Q߿QYF?{ְׂ{_Rx@Fchb[J紈5!]ggSuDžF6zbP3qS]$s0~*;;7j*m쳃ck =­s.W.f_Rz8A&0ss ]s^F8 `n{) E9i};$vP `M|ϪJABWKW/rpՂ_J%d47_ <&`;пU/\◤,LL@:U{v8"Ovȇ-0H/p.M/]ٷ` ]^6TneajA* AN:xyMM xIϖl+"@s0;?e{ZXm=k5RDݦ=ƶJ[G W~=Ap"?W 4 @odXsg7㨙R y>n+Rhߎ󶕲=*5_a\  s>nQ8gNMžm omP$hjQ[Z$ןM0vLn=a!`4\Xos*A>[ $ng =ؚ~I:uS.^VMJ!t8w <;Ol_Eˁp&den fe&ˏ YQ|y\ ڿwcA>ݽZ]|.=ӏvKQ+W}puy5o%\#yOxw~}&G~x7O?e['w9{.MD@Zh>ՂH]{}誛X*{6sHF'wi==zHhOܹ7ȇdZ/BX/@3%\N><-DJC*E;C{ϕ`5>{>L>srg Tš 擁+@"~:zD"L57=1e 4̝14Nᡩvx䏐[6 WoI=bP-U#դtGMem皠w;zI.]W 8s`oW6ܨe7rL? #\ ~tiw_1N9><8Uh~>Gޤ=SU>{ҍQcV`{oX7|fYo=xw[ahvLg@B{z0:_bO>KAlz1j2S~Q>w*lz{h[>-/Y~n-0`6p}S?V{+JQwe=ywqz&pz~ɲ'zY_~ K(G@)[LPAaaAox5fg0DZ_DubmmZty-nJ~BX|? yKC2,~ufQFW7P\n4cЊ $r$mC#)I }OqnH,Msl: lQ+E%I=f7e)4w f0:oU45Y_a19Q>K=}|߹TG!khf0v{?)N_A/CS̚2v+SkZv!iIϵ/v2TͼqX#DDIChۇ [oc]awu2tnD-%2_/a*x2Q;ή~C*vs_VPm0] /s 彘cXLЏƸ-G ~fEO#<_{!)K'H׊"z̏LwC%/>މއ܃˛AA1};lY' A,v*_?S˙gjEve< +6 =?h21Mr|4z6{ }.ׂ.$l+Hv .XK(G( Hsއ kD k܀;Yu/jΈ)o5eC7oZ$nDM\#dQ!yݐ\hy'|{3=y^01SP׀/V 6*;hx )aS<4Ł~>ߟ ؝܊$}ǿ t3|rAn@ѣ W,+i dtEPȟ⫆tQAT5p+jB>gO> ?xI y [8=O\@"Fz!&{0OdFnJ >K@Ǟ_7?8!$x g@]B?1rE/"x^\D8}Ї7s0[}Ѩޣ0|y`}0d:lڮػYQXS p$lKѬ;w3-eDO>RO#1ʇ5ܲa{B~d%e{NJYlA7`mۏ E` >*JQsm7d&XA T춯 ,$u( HWQlt,V;k-<~Ev[Ǽ _ |ؼ~d ^g"N2+C mF܀eQE _P,T#o,_r/I:G:YJ.:_."ˌ׺PA=31ug WM%!i޾nW?_jj0|@PB .ϔeE$ ١-xRZצmN>4 p;eEFZ1S>3m]|Nͯ5S|r{v=gKhD,*9#ryr D):"G4KPShfn'@iN[<T5vBz74{b- ):H@ 0U}l/PUÌnk=)b՚iKq8v9]HԁSMЛ91fIJ$ꧣ:\۝2lFio_}d9u[Kp[& g1~{𛗼l lz4%{#ZU_F(md9=ewWΡ4qPg%8L~gsk^+^˟f%m$_>.oڛc&^uYlNLz;؝9^ (~>׳{?ѻ;!5NT1̴AӍwU g(FNlcD[xshf~0[Rw!z D[ioMV2gHR|{`[s'`/{OB~;R -* z6J1,P"I*CR`,~pQy[aϪN1FӮKBըѯue2N{,6]t0q,s_%8 ` P\,|_!74Awo6 wvܼ/"(!*P-ЛB9> I$J ^ܙIߏ2$46mn?]l>s*k[n] xzr{?`@\ެCC{a~E~4D9bFz3YXRNep/q̹iwwVkS~ݔ7?fЏvZLXr fMqotks>[/hV}N_:ǎrP9гؿ)+ A1ߔ6|mj^ Ww9pYzΒ}63ydK{c@ͣky}pw>#7É{ ǩފZ?EWe:$;R4퉶FxrwKn䲒66_̻& X?\~jK/-j^cI1+ǩAO}~6=mq_)zI>gZZm|$@9v u kސ Q#GZz#3~-ο%F g ̫Flm$PWmty8@W`d Fk$2LK4q5@ϮoBl|~29 8ؤWuoI@8.Lnh~?[Gz+`߂ z8t{Oг筀rybNA=\τaN;IQL B:gW \}Ĺ= mU>sD9'Y#HDpZR5>~Pr<[k~nm3 L? {}R0WIoLV 'AS;cޜx i )"`'߿o7j쿪{ƽ+hu\j0ˣ_Pby!uAkp,yPw_ h,Nښ& #\ϊeہ|̬8}Kn>꽬дo5 .]0Tk]E9Bi"cXbNe ^lҾ%}'!pLI>)IӪʾ/`@oj}.M kitsx~=v24$FsR@ ?"/i@Ne q)h 2 ƀݗYRL> L;l?+0ZH3`+c7)>}> 1\g.7OB'Q!S6 +2$[)[OЛ_=ŷf?+uX )O& D8 M=|:Rde X9?jU2f?|DіG m_` YV=z:& f0~o$G}"6 -9M>C1@9Ϳ!9Cj+uX }n#L3 d@.=\SO"[> z+釽 Xfr>\.;؀]1+#)z{~g7/Ԋzpw4FɡxiUrP8V^R'8B0M8b]y3Z=Jqhoɿ5|6b4wg75ۀO"`n2B0-m,k9h\E"?KT@P  ZB]C^ef裟cEh|k{f n 0,{>H4ukQ[Ys0"tO4< ʜk-(‾)<zߒ?IJ# D:$v(r-ܻOܒW' f`X'Qp4B5oE]0lK6S O`TGPA2N0.e^O :PP2ï趭8 ZЫ[qh"1zfl~\QXwj{N شr7ow *mkci00Fk(wwQݲ}FIE?7k-f^t AA凵/}kN&AWbT}17Y|9I9||7w_u1UeVh?Oۀom_+~Z{ ؁o#&s:/[kUAX$6W)a\n>Yq"~r0mӧI >@s}. c@/@ &>6cj+0D#ɖYivE=ݿasBD@Ia?>s"Hw6 u84Ҽ`L*IL>qy@.svM~"r>> T6x Ƥ #gINW3=])(AP%@%\}jT-GOzpV3{1k|@@_L~V > qGS* K i}I Di+/ _gqk'u(R(of"5|I` 'm1@;h}pכP&?!i?Qa ~w`얂%!2 `T6R'"WY:<d#G濬h=uR7H ,sr[CjA|PV @wX"G`2g~nj:jBUg%NE1D͇ $2{h:/I+wfYRP"6 > tR`Eɓ-g}?گ h'Ϲw B1 q lIR~$tj6_+?S 3`7|h~[oA2#̐^UST!_%g`an@S2ڲ1hd?4ĩ q2Ɋ%<j[ J`R\il5Ynd(?TA@͇@`jZQ`d_i3Ý|6~˪R?LJk@"N"X3hUؒWb`mr8xXޚ+gwif= 4Ogh8I6]*R6Eڴd}'gmdIo-迬(@.^ᣃp}ZW e."o~|gqT^l`,ag`;L?Y8o~%)22zE 'eLF;0-ka蜙}iOHxc(+hkʽ΍6ퟏ@Ϯ jsSz %|!hh&Hq4G`'L?Z3wv,ZN\:V)ȣji^ZEYCdžҲˊ!u{4mXkV?z\unxtm6ug59p d}j7ۉݩ۴k @*2j%p.\B!h/Lw'.*|.*1, 9i =W .IBu8΀:lu۱%5*(~軐ML ᖎV[4@ k_Eo ȏ("d_?@&(vk ;& M oL$:H@o  z7.#oǸHcj9b|D|h jf?X# Elzeۜǜ6ǺT܁*457@Cc,\܁dUL0$*N~&~)A/9,6$(0=T'j+KݨC(룈 jD G lVI;h;W  s40c h]/J7R>@vquP#?S=(GD}3ѹ a$!{Dl pgpyx~.Y  ԍKڴPeQ[hK)Kq}6P=}9б0݁Tǟyv"0$p3~/$+Z`x;ڊ|\Z:P視F-ɇ+#0l.CD)3kjK޹;|`z뽵6ǤdjzB8QߦX) ݩo]o9ZW 72?<}{0x!޾6|-6@3 H 8p?iŠ`n6]N49 h,2j߶ԀOCo{@R`~owT;#O":2ۆnFiÓއ!}JP@7n3h=~Lr|w_0k/z?f0 >hL!AjjzkuUZ.;Q2Lamjxo)L~6璹FH̄16Ҥ&`tC}=o -}zOs~p"67@Y$;`lH܈}*G\&gX(n߿VB>J!*|/t-ʪ*J-w JȬ[)Л(rKih7i#iB?9eRӭťec?g<baow=P+(mU?csFt7wPoP2poAr\  p }ADܠ^[& `(}P6 ٗ y$IRm20+)^h -LBkژ#wU'?%fP45"YcO'^pm!X@i"KpKΞߡv|D(;U 22rk{WBߝ|p㵙n&جY--&[[@e@oM= a +?只J .8U >M鏸vE{>d$Zϝx?c(-(B2Q 4T` wv9]ZK8BGَ<RDuCrWg_@86f!>mRL$?s?z+܊৛}.u{.Qj\_pnF`e@O/ga}ZܝqеMF +HJF^5:C SAm{K4dW;f8^&̸w4@,o+TW'V/)ৢaZF~ Ņr{N-~Kp;\1)Z`R=λ;}AnD+@q22Z,/ kD~$*|!^Hh$dxg oYO34}=Jsl{2eg@УN[C(/`!<H!M +3%szN~~֖* $&xp ~ۜtD`3xlDS_9F0v,&S(_gn=ʐ)3=7'JirFG?ЋR\FBhp {r]ZQQ2Ne{vqoM6u RN<d%#7#K!d`fA> p8 dͤ'.qfu^c  APTSビnO 3 6l"eDa@LqAAnES?LOCSAw@#_ |rI{p<1 BDBD?UFP@ke>Z܃B2 Şie|3vػ؉7I뷨TH3οGqfAo]kꆡ.r~CP / UOlT}ݫkF%~QM"h~|w6*B^Vm<MHLF;R_GW +r7X[m2?!y fm*P>MҢ})-PUV6o9ZkMYNoWA:qڦ/(Y jށ/{FH̱4s,#U&npE[M>_ .co'界w @WՄ2Znz~6Og213;L\H+Ʊx⻽ \I&Oc=ʹ۫31ʸߞw")[#^ 7.rb(Q$vLS% OhݩWN㛤2&k[w:oHvZz`PJ%a1t | }犊*΋rxoL}U4H|Ib92ߣ>XmGiW1# [ ~eD1$VY @ caA\rٟ s_ﶋ ep۲8?n,׈`dJ8j1ssL fqtg4S܆5 >͜?q'sU~?,w-#31=7>*w: Z]TYIH̥J.W}!t.0M0dS0+uGpыîr ÂH"r,71ʴ󀧦67NLB8m4!7Dp,#hglwY{LTkkuUйZ%hKɩϑxĉa$! ٭CK˒F9zlM3 {A rxDCcn䡷G]NN[ 6((zbbs7~<!2#NEmCz' UP*Rb?4\N<#Q$ |̌S{M4J؅c`Q0AiL)dQ'P! LYV፦- SW<*n="<2􎟀@2?{!2"F|.\E 襁Ac}:{'~3tb6l{5vU}ڇFP:éTkIt=4'i<~̟!ZG# 2"&|nTE~WyW!8ʝx/'/=z'Mr7Q)1uCPUeߓ;s/=gb@ k@/]ތH#LrH}_-t޹wޏ#pm*~_ LJ)PG<~Lʗ*84r43p*/N{ :?%'n&1zƅA(;ĒGq>} Z2~tϻ :Gox'DuЛCiiq5'陚գc`ʞ"ɶ3j"<r!(ˈZ{ 3>_E8n F~Qx!=?[9}g\%~yPB(}wF_}^8 # PiZZN85:pDW0aI'umiQctG#)C;Hsv[uֽO}=;ᙻ~\6B _+MHzTFCе`J682 @Aww>Bm|=jd}n @Pգ Nv)|/r `CTnۚƒ4=hn#DN;o~6%@&&v[ϟҺkTUZ yZB fL!iF瀵5yصez^w](>!71 }EgHcvwGX`Vx6e QN-#hg\!'HpGPwa~N|vxs~(@JIw[fw}^܈;^c7R#G/ny9hKs9(\?.|Ce "b,ɜf @ٌ~n/> Dr3})v ;jΌ] Tiq}h41'[L4eg-۶A$P\(D ۈI. x@#`K *I){EhbB.BC)e][ :}vO7k8~j$Fu`f(Gc X=l}}Q ]zDe}5V!`Ľy/E )Q28Ob *ٸzʹ}eE_O(qY T]} H<Dzտ^DRgϿ'JҜoۡ4!~;huP 9d]ҹ}>S<Oq{^:7[zUU2Gvzkx/J/_8ɚ3uSPJgK.6 9߉r۞ KO$Q@V}m$8閭189@Nsf.ۿEW?g mnM헢̕Pb|ig/xpLiM}y -B@\WRbP[/׆$#@(QQ`"ѧ 1hrPNU\Ӏ:`kNKo:. \- /-&C ==4E)\pV#{ЮwHf#;~w `,Ut +(Hh{Sv7_⵨ n$' K^& _n+;/)jFO1~i[Ter(8vQH˧>U;? 8rB?XvC_On:4VwWq&4~ IsmJL(KQR [u46[@8*'d4?K;)^dت×G]]ġ?N߀pV3 /a=߀GC 5a5DI9E_,Ux;M_ҩ܍;oi^%#Oq~`M=ߟ14 K1cC"?MIPs[ŊW߿Sz0w-Rh [yR5IkG^im$gM%4dś]< TV}swS(_/{OǟNqx4-k;i 'tW9y#Tj~?S{u|?ȿT wo߇tsJN$ LɨRRϼoP:fC4\y=9+4 !`QQ@x;\Ҁ >Ul߽t|44?=fM*޼ݡ5dؼrhoaMS>h&ԀQ-td&rT,(gFLeԔN9EӬ5(讌s!d;h6r)`EIepޱ.~3 cU^  \E,i=}g-ZjOөw}ȈǫD/Yxf6@c`qZ"W@U=sQMڏ}IN y7oEGrWASGo״}u48_#f0b޶1)f_;V6 B+I᩺;믜lM ~Pnŝ@-GM9?M?@If|X&?*H?GiUN L߹7ی} xLVv0j8U <{i¶mLtOsȢ#vZ5Z m>(|[)ADʄ2&=’J)deIIs}n oo V QNNNNNO T^,Y<^T@H_SWURWVSWUSWU+.{^|!.!V^ZX U RONNNNP^%]>dQMZSRWVSWUTWVJN[MN^g9)ea`^\Y U QNNNNN[!b=hSK[SSWUKPZ25k.0}E@ת ū7t\jgfdc`]Y UPNNNNZ!e=iSGVV8;g47x2502=@`P=bP$n!l m kjhd`[ W RNNNN[$g=gTdS?H_NRXTVURWVSWUSVVk@@@=cP3g30}3~3~1|.y)t#nic^X RNNNb(h?bQPXTSWUSWUTVUSXTSWUoUUU M6XX2t7Ѓ7ς:҅:҅7ς3~-x&qke^X SNNNf+e@bPRXUSWUSWUSWUSWUSVVkN ;cY6ˀ<Ն>ՈA׋A֋<ӆ6̀/z(s me`Y TNNO i0aA`QRXUSWUTVUSWUTVUSVVeX=jY:ʁAڌEَJݒGܐA֋9Ђ0|)u!mf_Y TNN P!l4\D_QSWURXUSWUTVUSWUTWTXc~>gR<ȁEݑKޔQMߕC،:у1|)u!me`Y RNN T$m9uVA`QRVTyRVURXUSWUSWUUUU'n@`P)?dP;{JMTLߔA׋9Ђ0{(t ld^X RNNY$j=hR@`P>IIITWTISWUSWURVTz@`P;_R:lIMߕLޔGې>Ո6̀.y&r kc] V QNN_$d>cQ@`PUUUZZZCHHHHHHH ,1qbP`*%;k@y]K֏N9Ѓ.y)s"nhb\ W QNN Sc;kS@`PI`*%7jU=cPBrKޔ=ԇ*u#nid^Y TNNNW]>cQ@`P`+,@`P?aPf?nWA€Cٍ.z je`[ V QNNN['W=cP`+,@`P=cP@c<Ɂ8у#oa\ W RNNNO\8mR@`Pd`,+@`P;=cPdP7c,ui WPNNNN T%S=cPz+-*@`P?aPv=fR/a!j_ QNNNO T=dQ@`P 9````}z```_@`P=cP>eQ,[`YQNN P'{P>bP@`P>bP>dQ,VY V QP$P=cP @`P>bP>bP8lR+{R&~Q>bP@`P! @`P@`P0@`Pe>bP@`P        < <         @   ?     ?       03 x x x x x x x x x          ( @ -y]KC ,; C.umfvUVSRVVY]T25i %%n)6Iz  >g\KZQNURV\S47i.0H',f&V YPT UAdQ:Ce01.1tQUUrUVV#Ѥk lMNNPX,W:V_79mUYSSXV24tJ 7KdH W V QNNMT]aP!n jiga[ TNNNc\Nw,k'u)s'r"mg_ XPNNem@DaVZTRVVaSVVޏF؎Fۏ<҆0{%qf\ TM S*hD^QTWURWUTVUSWTWTVTk?fDPN>Շ1|%qe\ RM Y/bEVNRXVxRXUSWUSUT2r>9B4;`HݎOGې;҄/z#odZ QL_3[BDD%VWTSWU}}y]'>sJ}K>҈4~*v kaXPMb8sU9aM Z? d AgL<Ԇ+v#nf] UNOa@aQBiU azl>lQG~<؉'seaYPMR$[@[Nx>bP bd89<bP=dQEZPcD@`P>bP?*???? @@/ @ <@@@@(  }@z HRa.8   O^[#?o*~cQHJSLW4z)ߗ&(q3wQDL^)'MY;  SVVIOS5f_\UP"&{ M."`dXNS9~Y;6rVX,/2j,z%pa PS7rcTOQT\VV&'!'=~A׎/zf R WBqZTTTRWUgw,5_UgHͅL/zfPZDgVTWUvRVT` image/svg+xml zim-0.60/xdg/0000775000175000017500000000000012140000463012660 5ustar jaapjaap00000000000000zim-0.60/xdg/zim.xml0000644000175000017500000000201512061711165014207 0ustar jaapjaap00000000000000 Zim notebook Zim wiki page Gjots notebook zim-0.60/xdg/zim.desktop0000644000175000017500000000726611721161552015076 0ustar jaapjaap00000000000000[Desktop Entry] Version=1.0 Type=Application Exec=zim Icon=zim StartupNotify=true Terminal=false Categories=Utility;TextEditor;GTK; MimeType=application/x-zim-notebook;text/x-zim-wiki;application/x-gjots; Name=Zim Desktop Wiki Comment=Edit text files "wiki style" GenericName=Text Editor Name[cs]=Zim Desktop Wiki Comment[cs]=Upravujte textové soubory jako wiki GenericName[cs]=Textový wiki editor Name[de]=Zim Desktop Wiki Comment[de]=Bearbeite Textdateien im 'Wiki-Stil' GenericName[de]=Texteditor Name[es]=Zim Wiki de escritorio Comment[es]=Editar archivos de texto "estilo wiki" GenericName[es]=Editor de texto Name[fr]=Zim, le Wiki de bureau Comment[fr]=Modifier les fichiers textes « à la façon wiki » GenericName[fr]=Éditeur de texte Name[he]=זים הוויקי השולחני Comment[he]=ערוך קבצי טקסט "בסגנון ויקי" GenericName[he]=עורך טקסט Name[it]=Zim Desktop Wiki Comment[it]=Crea file di testo in stile "Wiki" GenericName[it]=Editor di Testo Name[nl]=Zim Desktop Wiki Comment[nl]=Bewerk tekstbestanden ""wiki style"' GenericName[nl]=Tekst Verwerker Name[pt]=Wiki Pessoal Zim Comment[pt]=Editor de texto "tipo wiki" GenericName[pt]=Editor de Texto Name[sv]=Zim Desktop Wiki Comment[sv]=Redigera textfiler i wikimiljö GenericName[sv]=Textredigerare Name[da]=Zim Desktop Wiki Comment[da]=Redigér tekst filer i "wikistil" GenericName[da]=Tekstredigeringsprogram Name[ca]=Zim Wiki d'escriptori Comment[ca]=Editar arxius de text "wiki style" GenericName[ca]=Editor de text Name[et]=Zim Töölaua Viki Comment[et]="Viki stiilis" teksti kirjutamine GenericName[et]=Tekstiredator Name[gl]=Wiki Personal Zim Comment[gl]=Editor de texto "ó xeito Wiki" GenericName[gl]=Editor de textos Name[ja]=Zim デスクトップ・ウィキ Comment[ja]="ウィキ形式"の文書を作成します GenericName[ja]=テキスト・エディタ Name[pt_BR]=Zim Desktop Wiki Comment[pt_BR]=Edite arquivos de texto no "estilo wiki" GenericName[pt_BR]=Editor de texto Name[ru]=Zim Desktop Wiki Comment[ru]=Редактировать текстовые файлы в стиле "wiki" GenericName[ru]=Редактор текста Name[zh_CN]=Zim 桌面维基 Comment[zh_CN]=编辑文本文件“维基风格” GenericName[zh_CN]=文本编辑器 GenericName[ar]=محرّر النصّ Name[en_GB]=Zim Desktop Wiki Comment[en_GB]=Edit text files "wiki style" GenericName[en_GB]=Text Editor GenericName[fa]=ویرایشگر متن Name[fi]=Zim työpöytä-wiki Comment[fi]=Muokkaa tekstitiedostoja "wiki-tyylillä" GenericName[fi]=Tekstieditori GenericName[ko]=텍스트 편집기 Name[ml]=സിം പണിയിട വിക്കി GenericName[ml]=ടെക്സ്റ്റ് എഴുത്തിടം Name[nb]=Zim Skrivebords-wiki Comment[nb]=Endre tekstfiler "på wiki måten" GenericName[nb]=Tekstbehandler Comment[pl]=Edytuj w stylu Wiki GenericName[pl]=Edytor tekstu Name[tr]=Zim Desktop Wiki Comment[tr]=Metin dosyalarını "wiki tarzı"nda düzenleyin GenericName[tr]=Metin Düzenleyici Comment[bg]=Редактирай текстовите файлове като wiki GenericName[bg]=Текстов редактор Name[eu]=Zim Mahaigaineko Wikia Comment[eu]=Editatu testu fitxategiak "wiki erara" GenericName[eu]=Testu-editorea GenericName[sk]=Textový editor GenericName[sr]=Уређивач текста Name[zh_TW]=Zim 桌面維基 Comment[zh_TW]=以維基樣式編輯文字檔案 GenericName[zh_TW]=文字編輯器 X-Ayatana-Desktop-Shortcuts=X-QuickNote;X-QuickNoteClipboard; [X-QuickNote Shortcut Group] Name=Quick Note Exec=zim --plugin quicknote TargetEnvironment=Unity [X-QuickNoteClipboard Shortcut Group] Name=Quick Note from Clipboard Exec=zim --plugin quicknote input=clipboard TargetEnvironment=Unity zim-0.60/xdg/hildon/0000775000175000017500000000000012140000463014135 5ustar jaapjaap00000000000000zim-0.60/xdg/hildon/zim.desktop0000644000175000017500000000025611544165551016351 0ustar jaapjaap00000000000000[Desktop Entry] Version=1.0.0 Encoding=UTF-8 Type=Application Name=Zim Comment=A desktop wiki and all purpose TODO and GTD application Exec=/usr/bin/zim --no-daemon Icon=zim zim-0.60/epydoc.conf0000644000175000017500000000060111622405211014227 0ustar jaapjaap00000000000000[epydoc] # Information about the project. name: Zim Desktop Wiki url: http://zim-wiki.org modules: zim # Write html output to the directory "apidocs" output: html target: apidocs/ include-log: yes # Graph options graph: classtree # Code parsing options parse: yes introspect: no # Exclude private methods and signal handlers private: no exclude: zim\.inc\..* .*\.on_.* .*\.do_.* zim-0.60/PKG-INFO0000664000175000017500000000042312140000463013172 0ustar jaapjaap00000000000000Metadata-Version: 1.1 Name: zim Version: 0.60 Summary: Zim desktop wiki Home-page: http://www.zim-wiki.org Author: Jaap Karssenberg Author-email: jaap.karssenberg@gmail.com License: GPL v2+ Description: UNKNOWN Platform: UNKNOWN Requires: gobject Requires: gtk Requires: xdg zim-0.60/makeman.py0000644000175000017500000000311211544165551014075 0ustar jaapjaap00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2009 Jaap Karssenberg import os from time import strftime from zim import __version__, __url__, \ __author__, __copyright__, __license__, \ usagehelp, optionhelp def get_about(): '''Get the tagline and short description from the README''' readme = open('README.txt') lines = [] for line in readme: if line.startswith('===') and 'ABOUT' in line: for line in readme: if line.startswith('==='): break else: lines.append(line) break lines = ''.join(lines).strip().splitlines(True) assert lines and lines[0].startswith('Zim - ') tagline = lines[0][6:].strip() about = ''.join(lines[1:]).strip() return tagline, about def make(): '''Generate man page for zim''' tagline, about = get_about() try: os.mkdir('man') except OSError: pass # dir already exists manpage = open('man/zim.1', 'w') manpage.write('.TH ZIM "1" "%s" "zim %s" "User Commands"\n' % (strftime('%B %Y'), __version__)) manpage.write('.SH NAME\nzim \\- %s\n\n' % tagline) manpage.write('.SH SYNOPSIS\n%s\n' % usagehelp.replace('-', r'\-')) manpage.write('.SH DESCRIPTION\n%s\n' % about) manpage.write('.SH OPTIONS\n%s\n' % optionhelp.replace('-', r'\-')) manpage.write('.SH AUTHOR\n%s\n\n' % __author__) manpage.write( '''\ .SH "SEE ALSO" The full documentation for .B zim is maintained as a zim notebook. The command .IP .B zim --manual .PP should give you access to the complete manual. The website for .B zim can be found at .I %s ''' % __url__) manpage.close() if __name__ == '__main__': make() zim-0.60/test.py0000755000175000017500000002072511752544547013466 0ustar jaapjaap00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This is a wrapper script to run tests using the unittest # framework. It setups the environment properly and defines some # commandline options for running tests. # # Copyright 2008 Jaap Karssenberg import os import sys import shutil import getopt import logging import tests from tests import unittest def main(argv=None): '''Run either all tests, or those specified in argv''' if argv is None: argv = sys.argv # parse options coverage = None failfast = False loglevel = logging.WARNING opts, args = getopt.gnu_getopt(argv[1:], 'hVD', ['help', 'coverage', 'fast', 'failfast', 'debug', 'verbose']) for o, a in opts: if o in ('-h', '--help'): print '''\ usage: %s [OPTIONS] [MODULES] Where MODULE should a module name from ./tests/ If no module is given the whole test suite is run. Options: -h, --help print this text --fast skip a number of slower tests (assumes --failfast) --failfast stop after the first test that fails --coverage report test coverage statistics -V, --verbose run with verbose output from logging -D, --debug run with debug output from logging ''' % argv[0] return elif o == '--coverage': try: import coverage as coverage_module except ImportError: print >>sys.stderr, '''\ Can not run test coverage without module 'coverage'. On Ubuntu or Debian install package 'python-coverage'. ''' sys.exit(1) #~ coverage = coverage_module.coverage(data_suffix=True, auto_data=True) coverage = coverage_module.coverage(data_suffix=True) coverage.erase() # clean up old date set coverage.exclude('assert ') coverage.exclude('raise NotImplementedError') coverage.start() elif o == '--fast': failfast = True tests.FAST_TEST = True # set before any test classes are loaded ! elif o == '--failfast': failfast = True elif o in ('-V', '--verbose'): loglevel = logging.INFO elif o in ('-D', '--debug'): loglevel = logging.DEBUG else: assert False # Set logging handler logging.basicConfig(level=loglevel, format='%(levelname)s: %(message)s') # Build the test suite loader = unittest.TestLoader() if args: suite = unittest.TestSuite() for module in [ 'tests.'+name for name in args ]: test = loader.loadTestsFromName(module) suite.addTest(test) else: suite = tests.load_tests(loader, None, None) # And run it unittest.installHandler() # Fancy handling for ^C during test result = \ unittest.TextTestRunner(verbosity=2, failfast=failfast, descriptions=False).run(suite) # Check the modules were loaded from the right location # (so no testing based on modules from a previous installed version...) mylib = os.path.abspath('./zim') for module in [m for m in sys.modules.keys() if m == 'zim' or m.startswith('zim.')]: if sys.modules[module] is None: continue file = sys.modules[module].__file__ assert file.startswith(mylib), \ 'Module %s was loaded from %s' % (module, file) test_report(result, 'test_report.html') print '\nWrote test report to test_report.html\n' # Create coverage output if asked to do so if coverage: coverage.stop() #~ coverage.combine() print 'Writing coverage reports...' pyfiles = list(tests.zim_pyfiles()) #~ coverage.report(pyfiles, show_missing=False) #~ coverage.html_report(pyfiles, directory='./coverage', omit=['zim/inc/*']) coverage_report(coverage, pyfiles, './coverage') print 'Done - Coverage reports can be found in ./coverage/' ## #################################### ## ## Functions to produce various reports ## ## #################################### ## def test_report(result, file): '''Produce html report of test failures''' output = open(file, 'w') output.write('''\ Zim unitest Test Report

    Zim unitest Test Report

    %i tests run
    %i skipped
    %i errors
    %i failures


    ''' % ( result.testsRun, len(result.skipped), len(result.errors), len(result.failures), )) def escape_html(text): return text.replace('&', '&').replace('<', '<').replace('>', '>') def add_errors(flavour, errors): for test, err in errors: output.write("

    %s: %s

    \n" % (flavour, escape_html(result.getDescription(test)))) output.write("
    %s\n
    \n" % escape_html(err)) output.write("
    \n") add_errors('ERROR', result.errors) add_errors('FAIL', result.failures) output.close() def coverage_report(coverage, pyfiles, directory): '''Produce annotated text and html reports. Alternative for coverage.html_report(). ''' if os.path.exists(directory): shutil.rmtree(directory) # cleanup os.mkdir(directory) # reports per source file index = [] for path in pyfiles: if any(n in path for n in ('inc', '_version', '__main__')): continue txtfile = path[:-3].replace('/', '.') + '.txt' htmlfile = path[:-3].replace('/', '.') + '.html' p, statements, excluded, missing, l = coverage.analysis2(path) nstat = len(statements) nexec = nstat - len(missing) index.append((path, htmlfile, nstat, nexec)) write_coverage_txt(path, directory+'/'+txtfile, missing, excluded, statements) write_coverage_html(path, directory+'/'+htmlfile, missing, excluded, statements) # Index for detailed reports html = open(directory + '/index.html', 'w') html.write('''\ Test Coverage Index

    Test Coverage Index

    ''') total_stat = reduce(int.__add__, [r[2] for r in index]) total_exec = reduce(int.__add__, [r[3] for r in index]) total_perc = int( float(total_exec) / total_stat * 100 ) if total_perc >= 90: type = 'good' elif total_perc >= 80: type = 'close' elif total_perc >= 60: type = 'ontrack' elif total_perc >= 40: type = 'lacking' else: type = 'bad' html.write('' '' '\n' % (total_stat, total_exec, type, total_perc) ) for report in index: pyfile, htmlfile, statements, executed = report if statements: percentage = int( float(executed) / statements * 100 ) else: percentage = 100 if percentage >= 90: type = 'good' elif percentage >= 80: type = 'close' elif percentage >= 60: type = 'ontrack' elif percentage >= 40: type = 'lacking' else: type = 'bad' html.write('' '' '\n' % (htmlfile, pyfile, statements, executed, type, percentage) ) html.write('''\
    FileStmtsExecCover
    Total%i%i%.0f%%
    %s%i%i%.0f%%
    ''') html.close() def write_coverage_txt(sourcefile, txtfile, missing, excluded, statements): txt = open(txtfile, 'w') file = open(sourcefile) i = 0 for line in file: i += 1 if i in missing: prefix = '!' elif i in excluded: prefix = '.' elif i in statements: prefix = ' ' else: prefix = ' ' txt.write(prefix + line) txt.close() def write_coverage_html(sourcefile, htmlfile, missing, excluded, statements): html = open(htmlfile, 'w') html.write('''\ Coverage report for %s

    Coverage report for %s

    ''' % (sourcefile, sourcefile)) file = open(sourcefile) i = 0 for line in file: i += 1 if i in missing: type = 'missing' elif i in excluded: type = 'excluded' elif i in statements: type = 'executed' else: type = 'comment' line = line.rstrip().replace('&', '&').replace('<', '<').replace('>', '>') html.write('\n' % (type, i, line) ) html.write('''\
     Executed statement
     Untested statement
     Ignored statement
      
    %i%s
    ''') html.close() if __name__ == '__main__': main()