mirage-0.9.5.1/0000755000175000017500000000000011422311374012744 5ustar fredricfredricmirage-0.9.5.1/mirage_blank.png0000644000175000017500000001670711422310710016071 0ustar fredricfredricPNG  IHDRzzpYGsRGBbKGD pHYs  tIME &:GIDATx]ypT}covVX؃R' fOImLfҙ&4s4L 6%#$@Xi%!}?x{/D7Ҿ}lzq+2V^q:EQ0 EM?>%<08:T]͏ JM6y9#֊(b}@?in:, S}N5AǤ?wJzk.tnApQ\|ֈ;ǙSF>1T˔B)(rR]s֭*cp!ab(Z0 `0rebX>%TWh4 TxrZ7aaE~%TGQ tUWJ'VԞM)Z;:1 W b^ @ 7n(4Ҋb^0Ynh4Bرcx"@Ra֭0@ V (Sf`ZQ[k'Fx~Pn^X vMMMpݸr =A(B{{;j5m066x< l6l۶ @ 9i* aEх*#N:EM E^ϟG4WfYVZՉ8mX,㨼6kPScjyaZat:155E(H.]᠚zOOΟ?OŎnV:weхt,t6|9Rl6SՅeb(v(W=; A;?ҏMBp p8`066FMX,iCѠ]]]իWKY󨫫;6F ^3U1S6irh.-[ȾsL'D9FʺS]4z,2(5AVC\~}\f555شi#0`J7',l6e8rj5uB!HweSR?55ET.M!!Day&چ)WO>eR5+Ĺnj!eSJ zɀF$Vf,3o%\#q,XZF__LnVK5yatqi݅LիWyZZZ Jq)ؾTzX6Т400 ](bjj$2:W&eY_ZZfB ]]P70fB +!"Idu((T@5\ٲ5Qw4Jd1biIjdYVffJ-NuogK?CRccctFJVE0N):eg^aS\ڼ^m'lW "*eEeZ566~O(ZʙH(3]1e,!祥%bШ4vK&l@(n7"&ӢHv,+KFt1KÎ.K1NZ2:yH)`0PV':]VX겂Capn45no#|Oz^e:AͲDߐF ފwpf*n%M9$aaxȔ(w!N… p:PxWC᭷B4MqK~汱13p[V0Χ3D"2\_ ;vYVwll O? ?Ьߏ~# e}>(\9ƶm<"Ϛ3RVqX:oU@bT8MMMx≿+?CG"|`}D"yw6 9ڵk3q[/EEG4_>(v;tuuS]F`/Y"/߫j2*Bt:az.JD"B0Ur2LJxyY\p~W_ņ E̓4đ{1ٳ*/?b1g?Áя>~_h-yS\:9/IRjVUyo@ Js8z(>0== زe{~Fҽ0_Á_W<.^ujMMOpr&yR_U)c&nt-unjz<vJॗ^o(`0_z{*jcc#3q Δ&Zϫ  hR'̇o4ta+.[Whii$n7- 2goLU~_ՒD2M>[,ڵ+cHhLD&''e7A3IcJs1-@bV4|>D**$eYx<^:O=lƾ}{k?Fkkkl.Tkk$%1,KY" BaNE D8N0 `0D~:?T*=xFI*JΥdp_ImKSs@skϳT_4QqW^˲}T6 Nz>o4R<44$BrAu3looO˶oaY͹\.d5hYE0ʋgJhhlLTS`rrRL:6#uY]]]e{a[xȤh4sJOxOy] ̒As_ÏZ0gMRer044${&TI`/9"m%4:̕ɞ={fhZ|>N:[ޔxU' O>YA9۶m7I7V:200FGG1:: Ʉ6 b,˻XXX0==w'qHՅTNnƨE%*͑I;`bb t~n t?Iê$Ӄ۷}v,;eU]$aش{/jjj022B8Kz~},ksGEd( `ӦM뮻v<]쪤蒹zmܸ8vBD\zjj F4`0`0D Drn&$ vhooJM\J7¥A{;pqh4zxm-!KdF_F^Bބ'}Vw}0L\F2SR]Re,_ؑL&"td2aVrX* sڎj5 b˲0 BGGn7fff@ Rd2 ]]]ԗINn8ԤL<lRxDbl6zj=#x{NN x SEXwV>Œ aٹt/+ҕ\TWRVJN\Y**WjU*!8RRt*R|ΑMȵKBсܲ"QD*D?_o0p)ŵL+#pm,S6&bBWh'N.{lzq07[/[s`.g?e%;\ 7SYUhGW +c蕱(EAchIJIENDB`mirage-0.9.5.1/TRANSLATORS0000644000175000017500000000117711422310710014502 0ustar fredricfredricMirage provides a quick and easy way of creating a translation for your language. If you find this software useful and are capable of adding a language that has not yet been translated, it would be greatly appreciated. 1. Download the latest messages.po file. Please use the SVN version, which can be found at: http://svn.berlios.de/viewvc/mirageiv/trunk/po/messages.po 2. Use poedit (http://www.poedit.org/) to create translations for all of the strings. 3. Join the mirageiv-translators mailing list: https://lists.berlios.de/mailman/listinfo/mirageiv-translations 4. Submit your po file and keep it updated for future releases ;-) mirage-0.9.5.1/update-po0000755000175000017500000000026211422310710014561 0ustar fredricfredric#!/bin/sh xgettext mirage.py mv -f messages.po po/ (cd po for i in *.po do if [ "$i" = "messages.po" ] then continue fi msgmerge -U $i messages.po done ) mirage-0.9.5.1/TODO0000644000175000017500000000144611422310710013432 0ustar fredricfredric+ Pluralized words using gettext 1.0 + Allow zooming in crop dialog (default to same view as main window so that the user can essentially 'crop visible' by clicking ok right away?) + why is light/dark grey no longer used for transparency? (argh) + Printing support (requires gtk 2.10, pygtk) (Bjoern Martensen) + Try to highlight selected region of cropped image (or darken unselected region) + remote images - load in separate thread to prevent blocking... + code cleanup... (preload_*, animtest stuff, rename funcs) + Location of thumbpane? Future + Ability to specify save compression level? + Test on Windows/Mac? (requires new pygtk) + Try to make zooming smoother (is this even possible with pygtk?) + UPnP support? + mirage --add to add image to current instance instead of opening new window mirage-0.9.5.1/stock_fullscreen.png0000644000175000017500000000077111422310710017015 0ustar fredricfredricPNG  IHDRagAMA a pHYs  ~tIME L,IDATxڍ10E_@h5{`9Yl`_i ()}(Ğ?|>c){||vn(|gbW*O+1Ɖt:m[^|^9u]9"x<&I8FDЎda\Z^n Ap~{`Zoޡw0-\\5oZ,r56Mx:ڶKӔz9dY>c/""y4⏀f,,(˒rx@?Ob]r&2u:_ma4$ a>;pd2JE!AcH?"֚((REa&|lR?k]IENDB`mirage-0.9.5.1/stock_leave-fullscreen.png0000644000175000017500000000061411422310710020103 0ustar fredricfredricPNG  IHDRabKGD pHYs  tIME|T5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDATxڝ?@? G4;+#x+_ !!d, ]I&ۙ/ k !›%} ' '=@Ok1PXs.}4Zk{( ,t| ??wN,iyN:ѹZ<5^'ڶrj5:Ҍq9Y_~mn8xIENDB`mirage-0.9.5.1/mirage0000644000175000017500000000176111422310710014131 0ustar fredricfredric#!/usr/bin/env python """Mirage is a fast GTK+ Image Viewer """ __author__ = "Scott Horowitz" __email__ = "stonecrest@gmail.com" __license__ = """ Mirage, a simple GTK+ Image Viewer Copyright 2007 Scott Horowitz This file is part of Mirage. Mirage 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 3 of the License, or (at your option) any later version. Mirage 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, see . """ import mirage if __name__ == "__main__": app = mirage.Base() try: app.main() except KeyboardInterrupt: pass mirage-0.9.5.1/mirage.svg0000644000175000017500000000623711422310710014732 0ustar fredricfredric image/svg+xml mirage-0.9.5.1/mirage.desktop0000644000175000017500000000071111422310710015573 0ustar fredricfredric[Desktop Entry] Name=Mirage Comment=A fast GTK+ Image Viewer Exec=mirage %f Terminal=false Type=Application Icon=mirage Categories=GTK;Graphics;2DGraphics;Viewer; MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/x-bmp;image/x-pcx;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-sun-raster;image/x-tga;image/x-xbitmap;image/x-xpixmap;image/svg+xml; mirage-0.9.5.1/setup.py0000755000175000017500000000567111422311234014465 0ustar fredricfredric#!/usr/bin/env python # $HeadURL: https://fredricj@svn.berlios.de/svnroot/repos/mirageiv/branches/mirage-0.9.x/setup.py $ # $Id: setup.py 299 2010-07-23 12:52:26Z fredricj $ import os from distutils.core import setup, Extension def removeall(path): if not os.path.isdir(path): return files=os.listdir(path) for x in files: fullpath=os.path.join(path, x) if os.path.isfile(fullpath): f=os.remove rmgeneric(fullpath, f) elif os.path.isdir(fullpath): removeall(fullpath) f=os.rmdir rmgeneric(fullpath, f) def rmgeneric(path, __func__): try: __func__(path) except OSError, (errno, strerror): pass # Create mo files: if not os.path.exists("mo/"): os.mkdir("mo/") for lang in ('it', 'de', 'pl', 'es', 'fr', 'ru', 'hu', 'cs', 'pt_BR', 'zh_CN', 'nl'): pofile = "po/" + lang + ".po" mofile = "mo/" + lang + "/mirage.mo" if not os.path.exists("mo/" + lang + "/"): os.mkdir("mo/" + lang + "/") print "generating", mofile os.system("msgfmt %s -o %s" % (pofile, mofile)) setup(name='Mirage', version='0.9.5.1', description='A fast GTK+ image viewer', author='Scott Horowitz', author_email='stonecrest@gmail.com', maintainer= 'Fredric Johansson', maintainer_email='fredric.miscmail@gmail.com', url='http://mirageiv.berlios.de', classifiers=[ 'Environment :: X11 Applications', 'Intended Audience :: End Users/Desktop', 'License :: GNU General Public License (GPL)', 'Operating System :: Linux', 'Programming Language :: Python', 'Topic :: Multimedia :: Graphics :: Viewers' ], py_modules = ['mirage'], ext_modules = [Extension(name='imgfuncs', sources=['imgfuncs.c']), Extension(name='xmouse', sources=['xmouse.c'], libraries=['X11'])], scripts = ['mirage'], data_files=[('share/mirage', ['README', 'COPYING', 'CHANGELOG', 'TODO', 'TRANSLATORS', 'stock_shuffle.png', 'stock_leave-fullscreen.png', 'stock_fullscreen.png', 'mirage_blank.png']), ('share/applications', ['mirage.desktop']), ('share/pixmaps', ['mirage.png']), ('share/locale/ru/LC_MESSAGES', ['mo/ru/mirage.mo']), ('share/locale/pl/LC_MESSAGES', ['mo/pl/mirage.mo']), ('share/locale/fr/LC_MESSAGES', ['mo/fr/mirage.mo']), ('share/locale/es/LC_MESSAGES', ['mo/es/mirage.mo']), ('share/locale/de/LC_MESSAGES', ['mo/de/mirage.mo']), ('share/locale/hu/LC_MESSAGES', ['mo/hu/mirage.mo']), ('share/locale/cs/LC_MESSAGES', ['mo/cs/mirage.mo']), ('share/locale/nl/LC_MESSAGES', ['mo/nl/mirage.mo']), ('share/locale/pt_BR/LC_MESSAGES', ['mo/pt_BR/mirage.mo']), ('share/locale/zh_CN/LC_MESSAGES', ['mo/zh_CN/mirage.mo']), ('share/locale/it/LC_MESSAGES', ['mo/it/mirage.mo'])], ) # Cleanup (remove /build, /mo, and *.pyc files: print "Cleaning up..." try: removeall("build/") os.rmdir("build/") except: pass try: removeall("mo/") os.rmdir("mo/") except: pass try: for f in os.listdir("."): if os.path.isfile(f): if os.path.splitext(os.path.basename(f))[1] == ".pyc": os.remove(f) except: pass mirage-0.9.5.1/README0000644000175000017500000000167211422310710013623 0ustar fredricfredricMirage, a fast and simple GTK+ Image Viewer Copyright 2007 Scott Horowitz REQUIREMENTS: (Required) PyGTK 2.12.0 or newer (Required) GTK 2.10.0 or newer (Optional) Gnome-python if you want Mirage's toolbar to follow your Gnome setting (Building) GCC (Building) python-dev and libX11-dev (on some distros) INSTALLATION: Just run 'python setup.py install' as root. USAGE: Simply run mirage to open a blank new window. Note that you can select multiple files/folders from the 'Open' dialogs. 'mirage --help' is also available. FEATURES: + Supports png, jpg, svg, xpm, gif, bmp, tiff, and others + Cycling through multiple images (with preloading) + Thumbnail pane for quick navigation + Slideshow and fullscreen modes + Rotating, zooming, flipping, resizing, cropping + Saving, deleting, renaming + Screenshot support + Custom actions + Command-line access + Configurable interface + Available in many languages mirage-0.9.5.1/po/0000755000175000017500000000000011422311027013355 5ustar fredricfredricmirage-0.9.5.1/po/it.po0000644000175000017500000005613011422310710014334 0ustar fredricfredric# 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: Mirage\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2007-01-03 15:54+0100\n" "Last-Translator: \n" "Language-Team: Scott Horowitz \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" #: mirage.py:344 msgid "_File" msgstr "_File" #: mirage.py:345 msgid "_Edit" msgstr "_Modifica" #: mirage.py:346 msgid "_View" msgstr "_Vista" #: mirage.py:347 msgid "_Go" msgstr "V_ai" #: mirage.py:348 msgid "_Help" msgstr "_Aiuto" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Azioni Personalizzate" #: mirage.py:350 msgid "_Open Image..." msgstr "_Apri Immagine" #: mirage.py:350 msgid "Open Image" msgstr "Apri Immagine" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "_Apri Immagine" #: mirage.py:351 #, fuzzy msgid "Open Remote Image" msgstr "Apri Immagine" #: mirage.py:352 msgid "Open _Folder..." msgstr "Apri _Cartella" #: mirage.py:352 msgid "Open Folder" msgstr "Apri Cartella" #: mirage.py:353 msgid "_Save Image" msgstr "_Salva Immagine" #: mirage.py:353 msgid "Save Image" msgstr "Salva Immagine" #: mirage.py:354 msgid "Save Image _As..." msgstr "_Salva come" #: mirage.py:354 msgid "Save Image As" msgstr "Salva come ..." #: mirage.py:355 msgid "_Crop..." msgstr "_Ritaglia..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Ritaglia Immagine" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "_Ridimensiona" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Ridimensiona Immagine" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Saturazione..." #: mirage.py:357 msgid "Modify saturation" msgstr "Modifica saturazione" #: mirage.py:358 msgid "_Quit" msgstr "_Esci" #: mirage.py:358 msgid "Quit" msgstr "Esci" #: mirage.py:359 msgid "_Previous Image" msgstr "Immagine Pr_ecedente" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Immagine Precedente" #: mirage.py:360 msgid "_Next Image" msgstr "Immagine _Successiva" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Immagine Successiva" #: mirage.py:361 msgid "_Previous" msgstr "_Precedente" #: mirage.py:361 msgid "Previous" msgstr "Precedente" #: mirage.py:362 msgid "_Next" msgstr "_Successiva" #: mirage.py:362 msgid "Next" msgstr "Successiva" #: mirage.py:363 msgid "_Random Image" msgstr "Immagine _Casuale" #: mirage.py:363 msgid "Random Image" msgstr "Immagine Casuale" #: mirage.py:364 msgid "_First Image" msgstr "_Prima Immagine" #: mirage.py:364 msgid "First Image" msgstr "Prima Immagine" #: mirage.py:365 msgid "_Last Image" msgstr "_Ultima Immagine" #: mirage.py:365 msgid "Last Image" msgstr "Ultima Immagine" #: mirage.py:366 msgid "Zoom _In" msgstr "_Aumenta Zoom" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Aumenta Zoom" #: mirage.py:367 msgid "Zoom _Out" msgstr "_Diminuisci Zoom" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Diminuisci Zoom" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "Ada_tta Zoom" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Adatta" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Ruota a _Sinistra" #: mirage.py:370 msgid "Rotate Left" msgstr "Ruota a Sinistra" #: mirage.py:371 msgid "Rotate _Right" msgstr "Ruota a Dest_ra" #: mirage.py:371 msgid "Rotate Right" msgstr "Ruota a Destra" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Capovolgi _Verticale" #: mirage.py:372 msgid "Flip Vertically" msgstr "Capovolgi Verticale" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Capovolgi _Orizzontale" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Capovolgi Orizzontale" #: mirage.py:374 msgid "_About" msgstr "_Info" #: mirage.py:374 msgid "About" msgstr "Info" #: mirage.py:375 msgid "_Contents" msgstr "_Contenuti" #: mirage.py:375 msgid "Contents" msgstr "Contenuti" #: mirage.py:376 msgid "_Preferences..." msgstr "_Preferenze..." #: mirage.py:376 msgid "Preferences" msgstr "Preferenze" #: mirage.py:377 msgid "_Full Screen" msgstr "Schermo _Intero" #: mirage.py:377 msgid "Full Screen" msgstr "Schermo Intero" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "Esci da Sc_hermo Intero" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Esci da Schermo Intero" #: mirage.py:379 msgid "_Start Slideshow" msgstr "Inizia _Presentazione" #: mirage.py:379 msgid "Start Slideshow" msgstr "Inizia Presentazione" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "Ferma Presenta_zione" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Ferma Presentazione" #: mirage.py:381 msgid "_Delete..." msgstr "_Cancella" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Cancella Immagine" #: mirage.py:382 msgid "Re_name..." msgstr "Ri_nomina" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Rinomina Immagine" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "" #: mirage.py:383 msgid "Take Screenshot" msgstr "" #: mirage.py:384 msgid "_Properties..." msgstr "Pr_oprietà" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Proprietà" #: mirage.py:385 msgid "_Configure..." msgstr "_Configura" #: mirage.py:385 msgid "Custom Actions" msgstr "Azioni Personalizzate" #: mirage.py:409 msgid "_Status Bar" msgstr "Barra di _Stato" #: mirage.py:409 msgid "Status Bar" msgstr "Barra di Stato" #: mirage.py:410 msgid "_Toolbar" msgstr "Barra degli S_trumenti" #: mirage.py:410 msgid "Toolbar" msgstr "Barra degli Strumenti" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Dimensione file" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Azione" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Per favore specifica un comando valido dal menu Modifica > Azioni " "Personalizzate" #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Azione Personalizzata non valida" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Versione: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "SitoWeb: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Utilizzo: mirage [OPZIONI]... FILES|CARTELLE..." #: mirage.py:1397 msgid "Options" msgstr "Opzioni" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Mostra questo aiuto ed esci" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Mostra informazioni sulla versione ed esci" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Mostra più informazioni dettagliate" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Includi ricorsivamente tutte le immagini trovate in" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "sottocartelle o CARTELLE" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Inizia in modalità Presentazione" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Inizia in modalità Schermo Intero" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Esegui 'cmd' quando viene caricata un immagine" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(usa la stessa sintassi delle Azioni Personalizzate," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "esempio: mirage -o 'echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Salva Come" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Salva" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Impossibile salvare" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "L'immagine attuale è stata modificata. Salvare i cambiamenti?" #: mirage.py:1714 msgid "Save?" msgstr "Salva?" #: mirage.py:1752 #, fuzzy msgid "Open Remote" msgstr "Apri Immagine" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "" #: mirage.py:1788 msgid "Open" msgstr "Apri" #: mirage.py:1791 msgid "Images" msgstr "Immagini" #: mirage.py:1795 msgid "All files" msgstr "Tutti i file" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Includi le immagini nelle sottocartelle" #: mirage.py:1960 msgid "Cannot load image." msgstr "Impossibile caricare l'immagine." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Scannerizzando" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Configura Azioni Personalizzate" #: mirage.py:1988 msgid "Batch" msgstr "In Serie" #: mirage.py:1989 msgid "Action" msgstr "Azione" #: mirage.py:1990 msgid "Shortcut" msgstr "Scorciatoie" #: mirage.py:2002 msgid "Add action" msgstr "Aggiungi azione" #: mirage.py:2006 msgid "Edit selected action." msgstr "Modifica l'azione selezionata" #: mirage.py:2010 msgid "Remove selected action." msgstr "Rimuovi l'azione selezionata" #: mirage.py:2014 msgid "Move selected action up." msgstr "Sposta in su l'azione selezionata " #: mirage.py:2018 msgid "Move selected action down." msgstr "Sposta in giu l'azione selezionata " #: mirage.py:2021 msgid "Parameters" msgstr "Parametri" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Percorso FIle, nome, ed estensione" #: mirage.py:2021 msgid "File path" msgstr "Percorso File" #: mirage.py:2021 msgid "File name without file extension" msgstr "Nome File senza estensione" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Estensione file (esempio: \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Lista dei file, separati da spazi" #: mirage.py:2024 msgid "Operations" msgstr "Operazioni" #: mirage.py:2024 msgid "Go to next image" msgstr "Vai alla prossima immagine" #: mirage.py:2024 msgid "Go to previous image" msgstr "Vai all'immagine precedente" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Qui puoi definire le azioni personalizzate con le scorciatoie da tastiera. " "Le Azioni usano dei parametri interni e le operazioni elencate qua sotto " "possono avere dichiarazioni multiple separate da un punto e virgola. Le " "operazioni in serie vengono applicate a tutte le immagini in lista." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Aggiungi Azione Personalizzata" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Modifica Azione Personalizzata" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Nome Azione" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Comando" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Scorciatoie" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Esegui l'azione su tutte le immagini (In Serie)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "L'Azione Personalizzata specificata è incompleta." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Scorciatoia per l'azione" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Premi la scorciatoia desiderata." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Scorciatoia invalida" #: mirage.py:2297 msgid "Screenshot" msgstr "" #: mirage.py:2298 msgid "_Snap" msgstr "" #: mirage.py:2303 #, fuzzy msgid "Location" msgstr "Azione" #: mirage.py:2306 msgid "Entire screen" msgstr "" #: mirage.py:2307 msgid "Window under pointer" msgstr "" #: mirage.py:2312 msgid "Delay" msgstr "" #: mirage.py:2320 #, fuzzy msgid " seconds" msgstr "secondi" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Nome file" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Nome file" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Dimensioni" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Dimensione file" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Tipo di file" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Trasparenza" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animazione" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bit di esempio" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Canali" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "SI" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "No" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Preferenze di Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interfaccia" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Colore di Sfondo" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Iposta il colore di sfondo per l'applicazione" #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Colore di Sfondo" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Apri Mirage a Schermo Intero" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Dimensione file" #: mirage.py:2522 msgid "Open Behavior" msgstr "Comportamento all'apertura" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Apri nuova immagine in" #: mirage.py:2527 msgid "Smart Mode" msgstr "Modalità Compatta" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Modalità Adatta Zoom" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Modalità 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Ultima Modalità Attiva" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Carica tutte le immagini nella cartella corrente" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Se abilitato, aprendo un immagine in Mirage verranno caricate " "automaticamente tutte le immagini presenti nella stessa cartella." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Usa l'ultima cartella selezionata" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "La cartella aperta di default sarà l'ultima cartella usata." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Usa sempre questa cartella" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "La cartella aperta di default sarà questa cartella specificata." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigazione" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Precarica le immagini per una navigazione più veloce" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Se abilitata, l'immagine successiva e precedente a quella attuale, saranno " "precaricate in memoria durante i tempi di inattività. Nota Bene che " "l'abilitazione di questa opzione incide sull'uso della memoria, si " "raccomanda di disabilitare questa opzione su machine con poca memoria RAM." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Cicla la lista immagini" #: mirage.py:2587 msgid "Prompt User" msgstr "Chiedi all'utente" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Modalità Presentazione" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Attesa tra immagini" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Rendi casuale l'ordine delle immagini" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Se abilitato, durante la modalità presentazione l'ordine di visualizzazione " "darà casuale ( ma senza caricare più volte un immagine)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Disabilita il salvaschermo durante la modalità Presentazione" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" "Se abilitato, durante la presentazione, il salvaschermo sarà temporaneamente " "disabilitato." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Parti sempre a Schermo Intero" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "Se abilitato, le Presentazioni partiranno sempre a Schermo Intero." #: mirage.py:2639 msgid "Image Editing" msgstr "Modifica Immagine" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Conferma cancellazione immagine" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Qualità visualizzazione" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "La più vicina (Veloce)" #: mirage.py:2648 #, fuzzy msgid "Tiles" msgstr "Scalata" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilineare" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Migliore)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Modifiche all'immagine" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignora Cambiamenti" #: mirage.py:2659 msgid "Auto-Save" msgstr "Auto-Salvataggio" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Chiedi cosa fare" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Impossibile salvare" #: mirage.py:2688 msgid "Behavior" msgstr "Comportamento" #: mirage.py:2691 msgid "Slideshow" msgstr "Presentazione" #: mirage.py:2692 msgid "Image" msgstr "Immagine" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Rinomina" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Immetti il nuovo nome" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Impossibile rinominare" #: mirage.py:2811 msgid "Unable to rename" msgstr "Impossibile rinominare" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Sei sicuro di voler cancellare permanentemente" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Impossibile da cancellare" #: mirage.py:2892 msgid "Unable to delete" msgstr "Impossibile da cancellare" #: mirage.py:2900 msgid "Choose directory" msgstr "Scegli una cartella" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Un veloce Visualizzatore di Immagini basato sulle GTK+" #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Impossibile aprire un browser adatto." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Ritaglia" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Larghezza" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Altezza" #: mirage.py:3493 msgid "Saturation" msgstr "Saturazione" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Satura" #: mirage.py:3505 #, fuzzy msgid "Saturation level:" msgstr "Saturazione" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Ridimensiona" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pixels" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Mantieni le proporzioni" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Stai vedendo la prima immagine della lista. Vuoi essere portato all'ultima " "immagine?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Stai vedendo l'ultima immagine della lista. Vuoi essere portato alla prima " "immagine?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "" "Tutte le immagini sono state viste. Vuoi rivedere dall'inizio tutte le " "immagini?" #: mirage.py:3717 #, fuzzy msgid "Wrap?" msgstr "Ciclo?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Sto caricando" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Pre-Caricando" #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "_Azioni Personalizzate" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Schermo Intero" #~ msgid "Unable to launch" #~ msgstr "Impossibile eseguire" #~ msgid "The" #~ msgstr "Il" #~ msgid "Custom actions" #~ msgstr "Azioni personalizzate" #~ msgid "of" #~ msgstr "di" #~ msgid "The shortcut " #~ msgstr "La scorciatoia" #~ msgid " is already used for " #~ msgstr "è attualmente usata da" #~ msgid "Found" #~ msgstr "Trovato" #~ msgid "seconds" #~ msgstr "secondi" #~ msgid "File date" #~ msgstr "Data File" #~ msgid "list" #~ msgstr "lista" mirage-0.9.5.1/po/zh_CN.po0000644000175000017500000005351511422310710014725 0ustar fredricfredric# zh_CN locale. # Copyright (C) 2008 # This file is distributed under the same license as the mirage package. # Jayden Suen , 2008. # msgid "" msgstr "" "Project-Id-Version: Mirage 0.9.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2008-07-28 17:16+0800\n" "Last-Translator: Jayden Suen \n" "Language-Team: Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" "X-Poedit-SourceCharset: utf-8\n" #: mirage.py:344 msgid "_File" msgstr "文件(_F)" #: mirage.py:345 msgid "_Edit" msgstr "编辑(_E)" #: mirage.py:346 msgid "_View" msgstr "查看(_V)" #: mirage.py:347 msgid "_Go" msgstr "转到(_G)" #: mirage.py:348 msgid "_Help" msgstr "帮助(_H)" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "自定义操作" #: mirage.py:350 msgid "_Open Image..." msgstr "打开图片...(_O)" #: mirage.py:350 msgid "Open Image" msgstr "打开图片" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "打开远程图片...(_N)" #: mirage.py:351 msgid "Open Remote Image" msgstr "打开远程图片" #: mirage.py:352 msgid "Open _Folder..." msgstr "打开文件夹...(_F)" #: mirage.py:352 msgid "Open Folder" msgstr "打开文件夹" #: mirage.py:353 msgid "_Save Image" msgstr "保存图片(_S)" #: mirage.py:353 msgid "Save Image" msgstr "保存图片" #: mirage.py:354 msgid "Save Image _As..." msgstr "另存为...(_A)" #: mirage.py:354 msgid "Save Image As" msgstr "另存为" #: mirage.py:355 msgid "_Crop..." msgstr "剪裁...(_C)" #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "剪裁图片" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "调整大小..." #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "调整图片尺寸" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "饱和度..." #: mirage.py:357 msgid "Modify saturation" msgstr "调整饱和度" #: mirage.py:358 msgid "_Quit" msgstr "退出(_Q)" #: mirage.py:358 msgid "Quit" msgstr "退出" #: mirage.py:359 msgid "_Previous Image" msgstr "上一张图片(_P)" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "上一张图片" #: mirage.py:360 msgid "_Next Image" msgstr "下一张图片(_N)" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "下一张图片" #: mirage.py:361 msgid "_Previous" msgstr "向前(_P)" #: mirage.py:361 msgid "Previous" msgstr "向前" #: mirage.py:362 msgid "_Next" msgstr "向后(_N)" #: mirage.py:362 msgid "Next" msgstr "向后" #: mirage.py:363 msgid "_Random Image" msgstr "随机图片(_R)" #: mirage.py:363 msgid "Random Image" msgstr "随机图片" #: mirage.py:364 msgid "_First Image" msgstr "第一张图片(_F)" #: mirage.py:364 msgid "First Image" msgstr "第一张图片" #: mirage.py:365 msgid "_Last Image" msgstr "最后一张图片(_L)" #: mirage.py:365 msgid "Last Image" msgstr "最后一张图片" #: mirage.py:366 msgid "Zoom _In" msgstr "放大图片(_I)" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "放大图片" #: mirage.py:367 msgid "Zoom _Out" msgstr "缩小图片(_O)" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "缩小图片" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "适合窗口(_F)" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "适合窗口" #: mirage.py:369 msgid "_1:1" msgstr "1:1(_1)" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "逆时针旋转(_L)" #: mirage.py:370 msgid "Rotate Left" msgstr "逆时针旋转" #: mirage.py:371 msgid "Rotate _Right" msgstr "顺时针旋转(_R)" #: mirage.py:371 msgid "Rotate Right" msgstr "顺时针旋转" #: mirage.py:372 msgid "Flip _Vertically" msgstr "上下翻转(_V)" #: mirage.py:372 msgid "Flip Vertically" msgstr "上下翻转" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "左右翻转(_H)" #: mirage.py:373 msgid "Flip Horizontally" msgstr "左右翻转" #: mirage.py:374 msgid "_About" msgstr "关于(_A)" #: mirage.py:374 msgid "About" msgstr "关于" #: mirage.py:375 msgid "_Contents" msgstr "内容(_C)" #: mirage.py:375 msgid "Contents" msgstr "内容" #: mirage.py:376 msgid "_Preferences..." msgstr "首选项...(_P)" #: mirage.py:376 msgid "Preferences" msgstr "首选项" #: mirage.py:377 msgid "_Full Screen" msgstr "全屏(_F)" #: mirage.py:377 msgid "Full Screen" msgstr "全屏" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "离开全屏(_x)" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "离开全屏" #: mirage.py:379 msgid "_Start Slideshow" msgstr "播放幻灯片(_S)" #: mirage.py:379 msgid "Start Slideshow" msgstr "播放幻灯片" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "停止幻灯片(_S)" #: mirage.py:380 msgid "Stop Slideshow" msgstr "停止幻灯片" #: mirage.py:381 msgid "_Delete..." msgstr "删除(_D)" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "删除图片" #: mirage.py:382 msgid "Re_name..." msgstr "重命名...(_n)" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "重命名图片" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "截图(_S)" #: mirage.py:383 msgid "Take Screenshot" msgstr "截图" #: mirage.py:384 msgid "_Properties..." msgstr "属性...(_P)" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "属性" #: mirage.py:385 msgid "_Configure..." msgstr "配置...(_C)" #: mirage.py:385 msgid "Custom Actions" msgstr "自定义操作" #: mirage.py:409 msgid "_Status Bar" msgstr "状态栏(_S)" #: mirage.py:409 msgid "Status Bar" msgstr "状态栏" #: mirage.py:410 msgid "_Toolbar" msgstr "工具栏(_T)" #: mirage.py:410 msgid "Toolbar" msgstr "工具栏" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "缩略图" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "缩略图" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "命令" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "命令返回值: %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "请在 编辑 > 自定义操作 中设置有效的命令。" #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "自定义操作无效" #: mirage.py:1389 msgid "Version: Mirage" msgstr "版本: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "主页: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "用法: mirage [选项]... 文件|文件夹..." #: mirage.py:1397 msgid "Options" msgstr "选项" #: mirage.py:1398 msgid "Show this help and exit" msgstr "显示帮助后退出" #: mirage.py:1399 msgid "Show version information and exit" msgstr "显示版本信息后退出" #: mirage.py:1400 msgid "Show more detailed information" msgstr "显示更多信息" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "包含所有找到的图片" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "文件夹的子目录" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "以幻灯片模式开启程序" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "以全屏模式开启程序" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "载入图片后运行命令'cmd'" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(语法格式同自定义操作," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "例如 mirage -o 'echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "另存为" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "保存" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "无法保存" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "当前图片被修改过。是否要保存?" #: mirage.py:1714 msgid "Save?" msgstr "保存?" #: mirage.py:1752 msgid "Open Remote" msgstr "打开远程文件" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "图片地址(URL)" #: mirage.py:1788 msgid "Open" msgstr "打开" #: mirage.py:1791 msgid "Images" msgstr "图片" #: mirage.py:1795 msgid "All files" msgstr "所有文件" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "包含子目录中的图片" #: mirage.py:1960 msgid "Cannot load image." msgstr "不能载入图片。" #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "正在扫描" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "配置自定义操作" #: mirage.py:1988 msgid "Batch" msgstr "批处理" #: mirage.py:1989 msgid "Action" msgstr "命令" #: mirage.py:1990 msgid "Shortcut" msgstr "快捷键" #: mirage.py:2002 msgid "Add action" msgstr "添加" #: mirage.py:2006 msgid "Edit selected action." msgstr "编辑。" #: mirage.py:2010 msgid "Remove selected action." msgstr "删除。" #: mirage.py:2014 msgid "Move selected action up." msgstr "上移。" #: mirage.py:2018 msgid "Move selected action down." msgstr "下移。" #: mirage.py:2021 msgid "Parameters" msgstr "变量" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "文件路径,名称和扩展名" #: mirage.py:2021 msgid "File path" msgstr "文件路径" #: mirage.py:2021 msgid "File name without file extension" msgstr "名称" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "扩展名(例如\".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "文件列表" #: mirage.py:2024 msgid "Operations" msgstr "操作" #: mirage.py:2024 msgid "Go to next image" msgstr "转到下一张图片" #: mirage.py:2024 msgid "Go to previous image" msgstr "转到上一张图片" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "你可以使用下面列出的内置变量和操作定义快捷键和相应的命令。" #: mirage.py:2079 msgid "Add Custom Action" msgstr "添加自定义操作" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "编辑自定义操作" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "操作名称" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "命令" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "快捷键" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "作用于所有图片" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "自定义操作不完整。" #: mirage.py:2229 msgid "Action Shortcut" msgstr "操作快捷键" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "请按要使用的快捷键。" #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "无效快捷键" #: mirage.py:2297 msgid "Screenshot" msgstr "截图" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "快照" #: mirage.py:2303 msgid "Location" msgstr "位置" #: mirage.py:2306 msgid "Entire screen" msgstr "整个屏幕" #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "鼠标坐在窗口" #: mirage.py:2312 msgid "Delay" msgstr "延时" #: mirage.py:2320 msgid " seconds" msgstr "秒" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "文件名" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "文件名" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "尺寸" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "文件大小" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "文件类型" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "透明度" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "动画" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bits per sample" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "通道" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "是" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "否" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Mirage首选项" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "界面" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "背景色" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "设置程序的背景色" #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "背景色" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "以全屏模式打开Mirage" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "缩略图大小" #: mirage.py:2522 msgid "Open Behavior" msgstr "打开选项" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "图片打开方式" #: mirage.py:2527 msgid "Smart Mode" msgstr "聪明模式" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "适合窗口模式" #: mirage.py:2529 msgid "1:1 Mode" msgstr "1:1 模式" #: mirage.py:2530 msgid "Last Active Mode" msgstr "最后活动模式" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "在当前目录载入所有图片" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "如果选定此项,在Mirage中打开一个图片会自动载入图片所在目录中的所有图片。" #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "载入隐藏文件" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "如果选定此项,Mirage将打开隐藏文件,否则忽略隐藏文件。" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "最后使用的目录" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "默认打开目录是最后使用的目录。" #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "使用固定目录" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "默认打开目录是这个特定目录。" #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "导航" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "为快速导航重新载入图片" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "如果选定此项,预读取列表中的上一张和下一张图片。 这会使用更多的内存,在内存受" "限的机器上推荐禁用此选项。" #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr " 回绕图片列表" #: mirage.py:2587 msgid "Prompt User" msgstr "提示用户" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "幻灯片模式" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "图片停留" #: mirage.py:2614 msgid "Randomize order of images" msgstr "乱序" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "如果选定此项,播放幻灯片时采取随机顺序(单一图片不重复)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "播放幻灯片时禁用屏幕保护" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "如果选定此项,播放幻灯片时临时禁用屏幕保护。" #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "总是以全屏模式开始" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "如果选定此项,开始播放幻灯片将自动进入全屏模式。" #: mirage.py:2639 msgid "Image Editing" msgstr "正在编辑图片" #: mirage.py:2641 msgid "Confirm image delete" msgstr "确认删除图片" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "缩放品质" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "最近点算法(速度最快)" #: mirage.py:2648 msgid "Tiles" msgstr "拼贴算法" #: mirage.py:2649 msgid "Bilinear" msgstr "双线性算法" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "平滑算法(质量最好)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "修改图片" #: mirage.py:2658 msgid "Ignore Changes" msgstr "忽略更改" #: mirage.py:2659 msgid "Auto-Save" msgstr "自动保存" #: mirage.py:2660 msgid "Prompt For Action" msgstr "提示操作" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "无法保存" #: mirage.py:2688 msgid "Behavior" msgstr "行为" #: mirage.py:2691 msgid "Slideshow" msgstr "幻灯片" #: mirage.py:2692 msgid "Image" msgstr "图片" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "重命名" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "填写新名称" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "无法重命名" #: mirage.py:2811 msgid "Unable to rename" msgstr "无法重命名" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "确定要永久删除吗" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "无法删除" #: mirage.py:2892 msgid "Unable to delete" msgstr "无法删除" #: mirage.py:2900 msgid "Choose directory" msgstr "选择文件夹" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "GTK+高速看图程序" #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "无法运行浏览器" #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "剪裁" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "宽" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "高" #: mirage.py:3493 msgid "Saturation" msgstr "饱和度" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "饱和度" #: mirage.py:3505 msgid "Saturation level:" msgstr "饱和级别" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "调整图片尺寸" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "像素" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "保持图片纵横比" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "正在显示图片列表中的第一张图片,是否回绕到最后一张图片?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "正在显示图片列表中的最后一张图片,是否回绕到第一张图片?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "所有图片都看过了,是否要再看一遍?" #: mirage.py:3717 msgid "Wrap?" msgstr "回绕" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "载入中" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "正在预读" #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "正在略过" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "自定义操作(_C)" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "全屏" #~ msgid "_Thumbnails Pane" #~ msgstr "缩略图(_T)" #~ msgid "Unable to launch" #~ msgstr "不能启动" #~ msgid "The" #~ msgstr "The" #~ msgid "Custom actions" #~ msgstr "自定义操作" #~ msgid "of" #~ msgstr "of" #~ msgid "The shortcut " #~ msgstr "快捷键" #~ msgid " is already used for " #~ msgstr "已被用于" #~ msgid "Found" #~ msgstr "发现" #~ msgid "seconds" #~ msgstr "秒" #~ msgid "File date" #~ msgstr "文件日期" mirage-0.9.5.1/po/es.po0000644000175000017500000005621011422310710014326 0ustar fredricfredric# translation of mirage.po to # 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: mirage\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2006-12-08 00:29-0500\n" "Last-Translator: Isidro Arribas \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: mirage.py:344 msgid "_File" msgstr "Archi_vo" #: mirage.py:345 msgid "_Edit" msgstr "_Editar" #: mirage.py:346 msgid "_View" msgstr "_Presentación " #: mirage.py:347 msgid "_Go" msgstr "_Ir" #: mirage.py:348 msgid "_Help" msgstr "Ay_uda" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Acciónes Personalizadas" #: mirage.py:350 msgid "_Open Image..." msgstr "Abrir _Imagen..." #: mirage.py:350 msgid "Open Image" msgstr "Abrir Imagen" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "Abrir _Imagen..." #: mirage.py:351 #, fuzzy msgid "Open Remote Image" msgstr "Abrir Imagen" #: mirage.py:352 msgid "Open _Folder..." msgstr "_Abrir Archivo..." #: mirage.py:352 msgid "Open Folder" msgstr "Abrir Archivo" #: mirage.py:353 msgid "_Save Image" msgstr "_Guardar Imagen" #: mirage.py:353 msgid "Save Image" msgstr "Guardar Imagen" #: mirage.py:354 msgid "Save Image _As..." msgstr "Guardar Imagen _Como" #: mirage.py:354 msgid "Save Image As" msgstr "Guardar Imagen Como" #: mirage.py:355 msgid "_Crop..." msgstr "_Recortar..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Recortar Imagen" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "Re_dimensionar" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Redimensionar Imagen" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Saturación..." #: mirage.py:357 msgid "Modify saturation" msgstr "Modificar la saturación" #: mirage.py:358 msgid "_Quit" msgstr "_Salir" #: mirage.py:358 msgid "Quit" msgstr "Salir" #: mirage.py:359 msgid "_Previous Image" msgstr "Imagen An_terior" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Imagen Anterior" #: mirage.py:360 msgid "_Next Image" msgstr "Imagen Si_guiente" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Imagen Siguiente" #: mirage.py:361 msgid "_Previous" msgstr "An_terior" #: mirage.py:361 msgid "Previous" msgstr "Anterior" #: mirage.py:362 msgid "_Next" msgstr "Si_guiente" #: mirage.py:362 msgid "Next" msgstr "Siguiente" #: mirage.py:363 msgid "_Random Image" msgstr "Imagen al A_zar" #: mirage.py:363 msgid "Random Image" msgstr "Imagen al Azar" #: mirage.py:364 msgid "_First Image" msgstr "_Primera Imagen" #: mirage.py:364 msgid "First Image" msgstr "Primera Imagen" #: mirage.py:365 msgid "_Last Image" msgstr "_Ultima Imagen" #: mirage.py:365 msgid "Last Image" msgstr "Ultima Imagen" #: mirage.py:366 msgid "Zoom _In" msgstr "Ale_jar" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Alejar" #: mirage.py:367 msgid "Zoom _Out" msgstr "A_cercar" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Acercar" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "Enfo_que Ajustable" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Ajustar" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Rotar a la _Izquierda" #: mirage.py:370 msgid "Rotate Left" msgstr "Rotar a la Izquierda" #: mirage.py:371 msgid "Rotate _Right" msgstr "Rotar a la _Derecha" #: mirage.py:371 msgid "Rotate Right" msgstr "Rotar a la Derecha" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Virar _Vertical" #: mirage.py:372 msgid "Flip Vertically" msgstr "Virar Vertical" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Virar _Horizontal" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Virar Horizontal" #: mirage.py:374 msgid "_About" msgstr "Acerca _de..." #: mirage.py:374 msgid "About" msgstr "Acerca de..." #: mirage.py:375 msgid "_Contents" msgstr "_Contenido" #: mirage.py:375 msgid "Contents" msgstr "Contenido" #: mirage.py:376 msgid "_Preferences..." msgstr "_Preferencias..." #: mirage.py:376 msgid "Preferences" msgstr "Preferencias" #: mirage.py:377 msgid "_Full Screen" msgstr "_Pantalla Completa" #: mirage.py:377 msgid "Full Screen" msgstr "Pantalla Completa" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "_Salir de la Pantalla Completa" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Salir de la Pantalla Completa" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Empezar Exposición de Imágenes" #: mirage.py:379 msgid "Start Slideshow" msgstr "Empezar Exposición de Imágenes" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Parar Exposición de Imágenes" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Parar Exposición de Imágenes" #: mirage.py:381 msgid "_Delete..." msgstr "Borrar" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Imagen Siguiente" #: mirage.py:382 msgid "Re_name..." msgstr "Renombrar" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Renombrar Imagen" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "" #: mirage.py:383 msgid "Take Screenshot" msgstr "" #: mirage.py:384 msgid "_Properties..." msgstr "Carac_terísticas" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Características" #: mirage.py:385 msgid "_Configure..." msgstr "Confi_gurar..." #: mirage.py:385 msgid "Custom Actions" msgstr "Acciónes Personalizadas" #: mirage.py:409 msgid "_Status Bar" msgstr "Barra de _Estado" #: mirage.py:409 msgid "Status Bar" msgstr "Barra de Estado" #: mirage.py:410 msgid "_Toolbar" msgstr "Barra de _Herramientas" #: mirage.py:410 msgid "Toolbar" msgstr "Barra de Herramientas" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Tamaño del fichero" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Acción" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Por favor especifique una aplicación valida en Editar > Acciónes " "Personalizadas" #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Acción Personalizada Incorrecta" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Versión:Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Websitio: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Uso: mirage [OPCION]... FICHEROS|ARCHIVOS..." #: mirage.py:1397 msgid "Options" msgstr "Opciones" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Enseñar esta ayuda y salir" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Ensenar la informacion de la version y cerrar" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Ensenar informacion más detallada" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Recursivamente incluir todas las imágenes encontradas en" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "subdirectorios de ARCHIVOS" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Empezar Exposición de Imágenes" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Empezar en modo pantalla completa" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Ejecutar 'cmd' cuando una imagen cargue" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(usa el mismo sintaxis que acción," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "ejemplo, mirage -o 'echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Guardar Como" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Guardar" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Incapaz de guardar" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "La imagen actual a sido modificada. Guardar los cambios?" #: mirage.py:1714 msgid "Save?" msgstr "Guardar?" #: mirage.py:1752 #, fuzzy msgid "Open Remote" msgstr "Abrir Imagen" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "" #: mirage.py:1788 msgid "Open" msgstr "Abrir" #: mirage.py:1791 msgid "Images" msgstr "Imágenes" #: mirage.py:1795 msgid "All files" msgstr "Todos los ficheros" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Incluir imagenes en subdirectorios" #: mirage.py:1960 msgid "Cannot load image." msgstr "No se puede cargar la imagen" #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Escaneando" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Configurar Acción Personalizadas" #: mirage.py:1988 msgid "Batch" msgstr "Grupo" #: mirage.py:1989 msgid "Action" msgstr "Acción" #: mirage.py:1990 msgid "Shortcut" msgstr "Combinación" #: mirage.py:2002 msgid "Add action" msgstr "Añadir Acción" #: mirage.py:2006 msgid "Edit selected action." msgstr "Editar acción seleccionada" #: mirage.py:2010 msgid "Remove selected action." msgstr "Borrar acción seleccionada" #: mirage.py:2014 msgid "Move selected action up." msgstr "Mover acción seleccionada para arriba." #: mirage.py:2018 msgid "Move selected action down." msgstr "Mover acción seleccionada para abajo." #: mirage.py:2021 msgid "Parameters" msgstr "Parámetros" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Ruta, nombre, y extensión del fichero" #: mirage.py:2021 msgid "File path" msgstr "Ruta del fichero" #: mirage.py:2021 msgid "File name without file extension" msgstr "Nombre del fichero sin la extensión" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Extensión del ficher " #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Lista de ficheros, seperados por espacios" #: mirage.py:2024 msgid "Operations" msgstr "Operaciones" #: mirage.py:2024 msgid "Go to next image" msgstr "Ir a la Imagen Siguiente" #: mirage.py:2024 msgid "Go to previous image" msgstr "Ir a la Imagen Anterior" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Aquí puedes definir acciónes personalizadas con combinaciónes de teclas. " "Acciónes usan parametros y operaciones incorporados, están listados abajo y " "pueden tener múltiple declaraciones separadas por un punto y coma. Acciónes " "de grupos aplican para todas las imágenes en la lista." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Añadir Acción Personalizadas" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Cambiar Acción Personalizada" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Nombre de la acción" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Orden" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Combinación" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Realizar acción a todas las imágenes (Grupo)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Acción personalizada incompleta especificada." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Combinación para la Acción" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Apriete la combinación preferida para la acción." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Combinación Incorrecta" #: mirage.py:2297 msgid "Screenshot" msgstr "" #: mirage.py:2298 msgid "_Snap" msgstr "" #: mirage.py:2303 #, fuzzy msgid "Location" msgstr "Acción" #: mirage.py:2306 msgid "Entire screen" msgstr "" #: mirage.py:2307 msgid "Window under pointer" msgstr "" #: mirage.py:2312 msgid "Delay" msgstr "" #: mirage.py:2320 #, fuzzy msgid " seconds" msgstr "segundos" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Nombre del fichero" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Nombre del fichero" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Dimensiones" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Tamaño del fichero" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Tipo de fichero" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Transparencia" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animación" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bits por muestra" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Canales" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Sí" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "No" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Preferencias de Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interfaz" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Color del Fondo" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Cambia el color del fondo de la aplicación." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Color del Fondo" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Abrir Mirage en modo pantalla completa" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Tamaño del fichero" #: mirage.py:2522 msgid "Open Behavior" msgstr "Comportamiento del Abrir" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Abrir nueva imagen en" #: mirage.py:2527 msgid "Smart Mode" msgstr "Modo Inteligente" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Modo Enfoque Ajustable" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Modo 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Ultimo Modo Activo" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Abrir todas las imagenes en el directorio actual" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Si activado, abriendo una imagen en Mirage causa que todas las imágenes en " "el directorio se cargen automaticamente." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Usar el ultimo directorio escogido" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "El directorio abierto por 'Abrir' va a ser el ultimo directorio usado." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Usar este directorio fijo" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "El directorio abierto por 'Abrir' va a ser el directorio especificado." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navegación" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Cargar las imágenes antes para navegar más rapido" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Si activado, la proxima y anterior imagen en la lista serán cargadas antes, " "mientras el tiempo quieto. El aumento de velocidad viene con el costo de más " "uso de memoria, por eso es recomendado que se desactive esta opción en " "computadoras con ram limitado." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Envolver alrededor de la lista de imágenes" #: mirage.py:2587 msgid "Prompt User" msgstr "Aviso al Usario" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Modo Exposición" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Tiempo entre imágenes" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Ordenar las imágenes al azar" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Si activado, una imagen será escojida al azar mientras la exposición de " "imágenes (sin cargar la imagen dos veces)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Quitar el salvapantallas en la exposición de imágenes" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" "Si activado, xscreensaver será temporalmente desactivado mientras en modo " "exposición de imágenes." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Siempre empezar en modo pantalla completa" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Si activado, empezando la exposición de imágenes pondra el programa en " "pantalla completa." #: mirage.py:2639 msgid "Image Editing" msgstr "Editando Imagen" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Confirmar antes de borrar la imagen" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Calidad del escalamiento" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Nearest (Rapido)" #: mirage.py:2648 msgid "Tiles" msgstr "Tiles" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilineal" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Mejor)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Imágenes Modificadas" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignorar Cambios" #: mirage.py:2659 msgid "Auto-Save" msgstr "Auto-Guardar" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Avisar antes de tomar acción" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Incapaz de guardar" #: mirage.py:2688 msgid "Behavior" msgstr "Comportamiento" #: mirage.py:2691 msgid "Slideshow" msgstr "Exposición" #: mirage.py:2692 msgid "Image" msgstr "Imagen" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Renombrar" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Ponga el nuevo nombre" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Incapaz de renombrar" #: mirage.py:2811 msgid "Unable to rename" msgstr "Incapaz de renombrar" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Esta seguro que desea borrar permanente" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Incapaz de borrar" #: mirage.py:2892 msgid "Unable to delete" msgstr "Incapaz de borrar" #: mirage.py:2900 msgid "Choose directory" msgstr "Escoja el directorio" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Un mostrador de imágenes rapido en GTK+." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Incapaz de executar un navegador" #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Recortar" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Ancho" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Altura" #: mirage.py:3493 msgid "Saturation" msgstr "Saturación" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Saturar" #: mirage.py:3505 #, fuzzy msgid "Saturation level:" msgstr "Saturación" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Redimensionar" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "píxeles" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Preservar Proporciones" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Estas viendo la primera imagen en la lista. Envolver alrededor de la ultima " "imagen?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Estas viendo la ultima imagen en la lista. Envolver alrededor de la primera " "imagen?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Todas las imágenes han sido vista. Quisiera verlas otra ves?" #: mirage.py:3717 msgid "Wrap?" msgstr "Envolver?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Cargando" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Carga de Antermanos" #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "Acciónes Personali_zadas" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Pantalla Completa" #~ msgid "Unable to launch" #~ msgstr "Incapaz de cargar" #~ msgid "The" #~ msgstr "El" #~ msgid "Custom actions" #~ msgstr "Acciónes Personalizadas" #~ msgid "of" #~ msgstr "de" #~ msgid "The shortcut " #~ msgstr "La combinación " #~ msgid " is already used for " #~ msgstr " ya esta en uso " #~ msgid "Found" #~ msgstr "Econtrado" #~ msgid "seconds" #~ msgstr "segundos" #~ msgid "File date" #~ msgstr "Fecha del fichero" #~ msgid "list" #~ msgstr "lista" mirage-0.9.5.1/po/fr.po0000644000175000017500000005730011422310710014327 0ustar fredricfredric# 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: r76\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2007-11-26 12:59+0100\n" "Last-Translator: Mike Massonnet \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" "X-Poedit-Country: FRANCE\n" "X-Poedit-SourceCharset: utf-8\n" #: mirage.py:344 msgid "_File" msgstr "_Fichier" #: mirage.py:345 msgid "_Edit" msgstr "É_dition" #: mirage.py:346 msgid "_View" msgstr "_Afficher" #: mirage.py:347 msgid "_Go" msgstr "A_ller" #: mirage.py:348 msgid "_Help" msgstr "_Aide" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Actions personnalisées" #: mirage.py:350 msgid "_Open Image..." msgstr "_Ouvrir une image…" #: mirage.py:350 msgid "Open Image" msgstr "Ouvrir une image…" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "Ouvrir suivant l’e_mplacement…" #: mirage.py:351 msgid "Open Remote Image" msgstr "Ouvrir suivant l’emplacement…" #: mirage.py:352 msgid "Open _Folder..." msgstr "Ouvrir un _répertoire…" #: mirage.py:352 msgid "Open Folder" msgstr "Ouvrir un répertoire…" #: mirage.py:353 msgid "_Save Image" msgstr "_Enregistrer" #: mirage.py:353 msgid "Save Image" msgstr "Enregistrer" #: mirage.py:354 msgid "Save Image _As..." msgstr "Enregistrer _sous…" #: mirage.py:354 msgid "Save Image As" msgstr "Enregistrer sous" #: mirage.py:355 msgid "_Crop..." msgstr "Dé_couper…" #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Découper" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "Red_imensionner…" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Redimensionner" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Sat_uration…" #: mirage.py:357 msgid "Modify saturation" msgstr "Modifier la saturation" #: mirage.py:358 msgid "_Quit" msgstr "_Quitter" #: mirage.py:358 msgid "Quit" msgstr "Quitter" #: mirage.py:359 msgid "_Previous Image" msgstr "Image p_récédente" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Image précédente" #: mirage.py:360 msgid "_Next Image" msgstr "Image _suivante" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Image suivante" #: mirage.py:361 msgid "_Previous" msgstr "_Précédent" #: mirage.py:361 msgid "Previous" msgstr "Précédent" #: mirage.py:362 msgid "_Next" msgstr "_Suivant" #: mirage.py:362 msgid "Next" msgstr "Suivant" #: mirage.py:363 msgid "_Random Image" msgstr "Image _aléatoire" #: mirage.py:363 msgid "Random Image" msgstr "Image aléatoire" #: mirage.py:364 msgid "_First Image" msgstr "_Première image" #: mirage.py:364 msgid "First Image" msgstr "Première image" #: mirage.py:365 msgid "_Last Image" msgstr "_Dernière image" #: mirage.py:365 msgid "Last Image" msgstr "Dernière image" #: mirage.py:366 msgid "Zoom _In" msgstr "Zoom a_vant" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Zoom avant" #: mirage.py:367 msgid "Zoom _Out" msgstr "Zoom a_rrière" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Zoom arrière" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "Adapter à la fenê_tre" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Adapter" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Rotation sens _anti-horaire" #: mirage.py:370 msgid "Rotate Left" msgstr "Rotation sens anti-horaire" #: mirage.py:371 msgid "Rotate _Right" msgstr "Rotation sens ho_raire" #: mirage.py:371 msgid "Rotate Right" msgstr "Rotation sens horaire" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Retournement _vertical" #: mirage.py:372 msgid "Flip Vertically" msgstr "Retournement vertical" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Retournement _horizontal" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Retournement horizontal" #: mirage.py:374 msgid "_About" msgstr "À _propos" #: mirage.py:374 msgid "About" msgstr "À propos" #: mirage.py:375 msgid "_Contents" msgstr "_Contenu" #: mirage.py:375 msgid "Contents" msgstr "Contenu" #: mirage.py:376 msgid "_Preferences..." msgstr "P_références…" #: mirage.py:376 msgid "Preferences" msgstr "Préférences" #: mirage.py:377 msgid "_Full Screen" msgstr "_Plein écran" #: mirage.py:377 msgid "Full Screen" msgstr "Plein écran" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "_Quitter le plein écran" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Quitter le plein écran" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Lancer le diaporama" #: mirage.py:379 msgid "Start Slideshow" msgstr "Lancer le diaporama" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Suspendre le diaporama" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Suspendre le diaporama" #: mirage.py:381 msgid "_Delete..." msgstr "_Effacer…" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Supprimer l’Image" #: mirage.py:382 msgid "Re_name..." msgstr "Re_nommer…" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Renommer l’Image" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "_Capture d’écran…" #: mirage.py:383 msgid "Take Screenshot" msgstr "Capture d’écran" #: mirage.py:384 msgid "_Properties..." msgstr "_Propriétés…" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Propriétés" #: mirage.py:385 msgid "_Configure..." msgstr "_Configurer…" #: mirage.py:385 msgid "Custom Actions" msgstr "Actions personnalisées" #: mirage.py:409 msgid "_Status Bar" msgstr "Barre de _statut" #: mirage.py:409 msgid "Status Bar" msgstr "Barre de statut" #: mirage.py:410 msgid "_Toolbar" msgstr "Barre d’_outils" #: mirage.py:410 msgid "Toolbar" msgstr "Barre d’outils" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Miniatures" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Miniatures" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Action" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Code retour de l’action : %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Veuillez spécifier une commande valide dans Édition > Actions personnalisées." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Action Personnalisée Invalide" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Version : Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Site web : http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Usage : mirage [OPTION]... FILES|FOLDERS..." #: mirage.py:1397 msgid "Options" msgstr "Options " #: mirage.py:1398 msgid "Show this help and exit" msgstr "Affiche cette aide et quitte" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Affiche la version et quitte" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Affiche plus d’information" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Inclure récursivement les images des" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "sous-répertoires de FOLDERS" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Démarrer avec le diaporama" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Démarrer en plein écran" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Exécute `cmd' lorsqu’une image est chargée" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(même syntaxe que les actions personnalisées," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "i.e. mirage -o `echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Enregistrer sous" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Enregistrer" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Sauvegarde impossible" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "L’image a été modifiée. Enregistrer les changements ?" #: mirage.py:1714 msgid "Save?" msgstr "Sauvegarder ?" #: mirage.py:1752 msgid "Open Remote" msgstr "Ouvrir" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "Indiquer l’emplacement (URI) " #: mirage.py:1788 msgid "Open" msgstr "Ouvrir" #: mirage.py:1791 msgid "Images" msgstr "Images" #: mirage.py:1795 msgid "All files" msgstr "Tous les fichiers" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Inclure les images des sous-répertoires" #: mirage.py:1960 msgid "Cannot load image." msgstr "Ne peut pas ouvrir l’image." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Analyse" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Configurer les Actions Personnalisées" #: mirage.py:1988 msgid "Batch" msgstr "Par lot" #: mirage.py:1989 msgid "Action" msgstr "Action" #: mirage.py:1990 msgid "Shortcut" msgstr "Raccourci " #: mirage.py:2002 msgid "Add action" msgstr "Ajouter une action." #: mirage.py:2006 msgid "Edit selected action." msgstr "Éditer l’action sélectionnée." #: mirage.py:2010 msgid "Remove selected action." msgstr "Supprimer l’action sélectionnée." #: mirage.py:2014 msgid "Move selected action up." msgstr "Déplacer l’action sélectionnée vers la haut." #: mirage.py:2018 msgid "Move selected action down." msgstr "Déplacer l’action sélectionnée vers la bas." #: mirage.py:2021 msgid "Parameters" msgstr "Paramètres " #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Chemin absolu, nom et extension" #: mirage.py:2021 msgid "File path" msgstr "Chemin absolu" #: mirage.py:2021 msgid "File name without file extension" msgstr "Nom du fichier sans extension" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Extension du fichier (i.e. \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Liste de fichiers, séparés par des espaces" #: mirage.py:2024 msgid "Operations" msgstr "Opérations " #: mirage.py:2024 msgid "Go to next image" msgstr "Image suivante" #: mirage.py:2024 msgid "Go to previous image" msgstr "Image précédente" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Ici vous pouvez définir des actions personnalisées avec des raccourcis. Les " "actions utilisent les paramètres et opérations intégrés listés en dessous, " "et peuvent avoir plusieurs expressions séparées par un point-virgule. Les " "actions traitées en lot s’appliquent à toutes les images dans la liste." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Ajouter une Action Personnalisée" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Éditer une Action Personnalisée" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Nom de l’action " #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Commande " #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Raccourci " #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Exécuter l’action sur toutes les images (Traitement par lot)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "L’action spécifiée est incomplète." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Raccourci" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Pressez le raccourci pour l’action." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Raccourci Invalide" #: mirage.py:2297 msgid "Screenshot" msgstr "Capture d’écran" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "Capturer" #: mirage.py:2303 msgid "Location" msgstr "Région" #: mirage.py:2306 msgid "Entire screen" msgstr "Prendre une capture de l’écran entier" #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "Prendre une capture de la fenêtre sous le curseur de la souris" #: mirage.py:2312 msgid "Delay" msgstr "Délai" #: mirage.py:2320 msgid " seconds" msgstr " secondes" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Nom du fichier " #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Nom du fichier " #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Dimensions " #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Taille du fichier " #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Type de fichier " #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Transparence " #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animation " #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bits par échantillon" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Canaux " #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Oui" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Non" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Mirage Préférences" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interface" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Couleur d’arrière-plan " #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Paramètre la couleur d’arrière plan pour l’application." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Couleur d’arrière-plan " #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Toujours démarrer en plein écran" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Taille d’une miniature " #: mirage.py:2522 msgid "Open Behavior" msgstr "Ouverture" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Ouvrir une nouvelle image " #: mirage.py:2527 msgid "Smart Mode" msgstr "Mode intelligent" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Adapter à la fenêtre" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Taille originale" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Dernier mode actif" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Charger toutes les images du répertoire courant" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Si actif, ouvrir une image dans Mirage chargera automatiquement toutes les " "images du même répertoire." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Charger les fichiers cachés" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Si actif, Mirage ouvrira les fichiers cachés. Autrement, le les fichiers " "cachés seront ignorés." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Utiliser le dernier répertoire" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "Le répertoire ouvert par défaut sera le dernier répertoire utilisé." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Utiliser ce répertoire " #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Le répertoire ouvert par défaut sera ce répertoire spécifié." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigation" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Précharger les images pour accélérer la navigation" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Si actif, les images suivante et précédente de la liste seront préchargées " "durant un temps inactif. Notez que le gain en vitesse se suit d’un usage " "supplémentaire de la mémoire, donc il est recommandé de désactiver cette " "option sur des machines limitées." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Tourner en boucle " #: mirage.py:2587 msgid "Prompt User" msgstr "Demander" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Mode diaporama" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Durée entre les images " #: mirage.py:2614 msgid "Randomize order of images" msgstr "Mélanger l’ordre des images" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Si actif, une image aléatoire sera sélectionnée durant le diaporama (sans " "chargement double d’une image)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Désactiver l’écran de veille en mode diaporama" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "Désactiver l’écran de veille durant le diaporama." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Toujours démarrer en plein écran" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Si actif, le démarrage d’un diaporama passera l’application en plein écran." #: mirage.py:2639 msgid "Image Editing" msgstr "Édition d’Image" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Confirmer la suppression" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Qualité " #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Plus proche (Rapide)" #: mirage.py:2648 msgid "Tiles" msgstr "Tuiles" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilinéaire" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Meilleure)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Images modifiées " #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignorer les changements" #: mirage.py:2659 msgid "Auto-Save" msgstr "Sauvegarde automatique" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Demander" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Sauvegarde impossible" #: mirage.py:2688 msgid "Behavior" msgstr "Comportement" #: mirage.py:2691 msgid "Slideshow" msgstr "Diaporama" #: mirage.py:2692 msgid "Image" msgstr "Image" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Renommer" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Entrez le nouveau nom " #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Impossible de renommer" #: mirage.py:2811 msgid "Unable to rename" msgstr "Impossible de renommer" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Êtes-vous certain de vouloir définitivement effacer" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Suppression impossible" #: mirage.py:2892 msgid "Unable to delete" msgstr "Suppression impossible" #: mirage.py:2900 msgid "Choose directory" msgstr "Sélectionner un répertoire" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Un visualiseur d’images rapide en GTK+." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Impossible de trouver un navigateur." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Découper" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Largeur" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Hauteur" #: mirage.py:3493 msgid "Saturation" msgstr "Saturation" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Saturer" #: mirage.py:3505 msgid "Saturation level:" msgstr "Niveau de saturation :" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Redimensionner " #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pixels" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Préserver l’aspect du ratio" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Vous visualisez la première image de la liste. Voulez-vous boucler sur la " "dernière image ?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Vous visualisez la dernière image de la liste. Voulez-vous boucler sur la " "première image ?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Toutes les images ont été vues. Voulez-vous revoir les images ?" #: mirage.py:3717 msgid "Wrap?" msgstr "Boucler ?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Chargement " #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Préchargement " #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "Fichier sauter " #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "Actions Pers_onnalisées" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Plein écran" #~ msgid "_Thumbnails Pane" #~ msgstr "_Miniatures" #~ msgid "Unable to launch" #~ msgstr "Impossible d’exécuter" #~ msgid "The" #~ msgstr "Le" #~ msgid "Custom actions" #~ msgstr "Actions personnalisées" #~ msgid "of" #~ msgstr "de" #~ msgid "The shortcut " #~ msgstr "Le raccourci " #~ msgid " is already used for " #~ msgstr " est déjà utilisé pour " #~ msgid "Found" #~ msgstr "Trouvée(s) " #~ msgid "seconds" #~ msgstr "secondes" #~ msgid "File date" #~ msgstr "Date du fichier " #~ msgid "list" #~ msgstr "liste" mirage-0.9.5.1/po/cs.po0000644000175000017500000006047411422310710014333 0ustar fredricfredric# Czech translation of mirage # Copyright (C) 2007 Scott Horowitz (msgids) # This file is distributed under the same license as the mirage package. # Petr Pisar , 2008 # msgid "" msgstr "" "Project-Id-Version: mirage r238\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2008-03-26 15:41+0100\n" "Last-Translator: Petr Pisar \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: mirage.py:344 msgid "_File" msgstr "_Soubor" #: mirage.py:345 msgid "_Edit" msgstr "_Upravit" #: mirage.py:346 msgid "_View" msgstr "_Zobrazit" #: mirage.py:347 msgid "_Go" msgstr "_Jít" #: mirage.py:348 msgid "_Help" msgstr "_Nápověda" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Uživatelské akce" #: mirage.py:350 msgid "_Open Image..." msgstr "_Otevřít obrázek…" #: mirage.py:350 msgid "Open Image" msgstr "Otevřít obrázek" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "Otevřít vz_dálený obrázek…" #: mirage.py:351 msgid "Open Remote Image" msgstr "Otevřít vzdálený obrázek" #: mirage.py:352 msgid "Open _Folder..." msgstr "Otevřít s_ložku…" #: mirage.py:352 msgid "Open Folder" msgstr "Otevřít složku" #: mirage.py:353 msgid "_Save Image" msgstr "_Uložit obrázek" #: mirage.py:353 msgid "Save Image" msgstr "Uložit obrázek" #: mirage.py:354 msgid "Save Image _As..." msgstr "Uložit obrázek _jako…" #: mirage.py:354 msgid "Save Image As" msgstr "Uložit obrázek jako" #: mirage.py:355 msgid "_Crop..." msgstr "_Oříznout…" #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Oříznout obrázek" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "Změnit veliko_st…" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Změnit velikost" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Sytost…" #: mirage.py:357 msgid "Modify saturation" msgstr "Upravit sytost" #: mirage.py:358 msgid "_Quit" msgstr "U_končit" #: mirage.py:358 msgid "Quit" msgstr "Ukončit" # FIXME: do i18n on shortcut name. E.g. "Left" is "Vlevo" in Czech, "Ctrl" is # "Strg" in German. #: mirage.py:359 msgid "_Previous Image" msgstr "_Předchozí obrázek" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Předchozí obrázek" #: mirage.py:360 msgid "_Next Image" msgstr "_Následující obrázek" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Následující obrázek" #: mirage.py:361 msgid "_Previous" msgstr "_Předchozí" #: mirage.py:361 msgid "Previous" msgstr "Předchozí" #: mirage.py:362 msgid "_Next" msgstr "_Následující" #: mirage.py:362 msgid "Next" msgstr "Následující" #: mirage.py:363 msgid "_Random Image" msgstr "Náhodný ob_rázek" #: mirage.py:363 msgid "Random Image" msgstr "Náhodný obrázek" #: mirage.py:364 msgid "_First Image" msgstr "Pr_vní obrázek" #: mirage.py:364 msgid "First Image" msgstr "První obrázek" #: mirage.py:365 msgid "_Last Image" msgstr "Pos_lední obrázek" #: mirage.py:365 msgid "Last Image" msgstr "Poslední obrázek" #: mirage.py:366 msgid "Zoom _In" msgstr "Př_iblížit" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Přiblížit" #: mirage.py:367 msgid "Zoom _Out" msgstr "_Oddálit" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Oddálit" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "_Vměstnat do okna" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Vměstnat" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Rotovat do_leva" #: mirage.py:370 msgid "Rotate Left" msgstr "Rotovat doleva" #: mirage.py:371 msgid "Rotate _Right" msgstr "Rotovat dop_rava" #: mirage.py:371 msgid "Rotate Right" msgstr "Rotovat doprava" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Překlopit s_visle" #: mirage.py:372 msgid "Flip Vertically" msgstr "Překlopit svisle" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Překlopit _vodorovně" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Překlopit vodorovně" #: mirage.py:374 msgid "_About" msgstr "O _aplikaci" #: mirage.py:374 msgid "About" msgstr "O aplikaci" #: mirage.py:375 msgid "_Contents" msgstr "_Obsah" #: mirage.py:375 msgid "Contents" msgstr "Obsah" #: mirage.py:376 msgid "_Preferences..." msgstr "_Předvolby…" #: mirage.py:376 msgid "Preferences" msgstr "Předvolby" #: mirage.py:377 msgid "_Full Screen" msgstr "_Přes celou obrazovku" #: mirage.py:377 msgid "Full Screen" msgstr "Přes celou obrazovku" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "U_končit zobrazení přes celou obrazovku" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Ukončit zobrazení přes celou obrazovku" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Spustit prezentaci" #: mirage.py:379 msgid "Start Slideshow" msgstr "Spustit prezentaci" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "Za_stavit prezentaci" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Zastavit prezentaci" #: mirage.py:381 msgid "_Delete..." msgstr "_Smazat…" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Smazat obrázek" #: mirage.py:382 msgid "Re_name..." msgstr "Přejme_novat…" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Přejmenovat obrázek" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "_Sejmout obrazovku" #: mirage.py:383 msgid "Take Screenshot" msgstr "Sejmout obrazovku" #: mirage.py:384 msgid "_Properties..." msgstr "_Vlastnosti…" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Vlastnosti" #: mirage.py:385 msgid "_Configure..." msgstr "_Nastavit…" #: mirage.py:385 msgid "Custom Actions" msgstr "Uživatelské akce" #: mirage.py:409 msgid "_Status Bar" msgstr "_Stavový řádek" #: mirage.py:409 msgid "Status Bar" msgstr "Stavový řádek" #: mirage.py:410 msgid "_Toolbar" msgstr "Nás_trojová lišta" #: mirage.py:410 msgid "Toolbar" msgstr "Nástrojová lišta" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Panel s náhledy" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Panel s náhledy" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Akce" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Návratový kód akce: %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "Prosím, určete platný příkaz z Upravit → Uživatelské akce." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Neplatná uživatelská akce" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Verze: Mirage" # FIXME: missing trailing slash #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Webová stránka: http://mirageiv.berlios.de/" # FIXME: "FILES|FOLDERS..." is non-standard notation. # Use "[FILE|FOLDER]..." instead. #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Použití: mirage [PŘEPÍNAČ]… SOUBOR|SLOŽKA…" #: mirage.py:1397 msgid "Options" msgstr "Přepínače" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Ukáže tuto nápovědu a skončí" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Ukáže informace o verzi a skončí" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Ukáže více podrobností" # FIXME: Use whole message #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Rekurzivně zahrne všechny obrázky nalezené" # FIXME: Use whole message # FIXME: So, we're on UNIX with (sub)folders or on Windows with folders? #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "v podadresářích SLOŽEK" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Začne v režimu prezentace" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Začne v celoobrazovkovém režimu" # FIXME: do i18n of complete usage lines with option strings #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Až se obrázek nahraje, provede „cmd“" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(používá stejnou syntax jako uživatelské akce," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "např. mirage -o 'echo Soubor je %F')" #: mirage.py:1641 msgid "Save As" msgstr "Uložit jako" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Uložit" # FIXME: Need whole message. Czech has different word orderd. #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Nelze uložit " #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "Současný obrázek byl změněn. Uložit změny?" #: mirage.py:1714 msgid "Save?" msgstr "Uložit?" #: mirage.py:1752 msgid "Open Remote" msgstr "Otevřít vzdálený" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "Umístění obrázku (URL)" #: mirage.py:1788 msgid "Open" msgstr "Otevřít" #: mirage.py:1791 msgid "Images" msgstr "Obrázek" #: mirage.py:1795 msgid "All files" msgstr "Všechny soubory" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Zahrnout soubory v podadresářích" #: mirage.py:1960 msgid "Cannot load image." msgstr "Obrázek nelze načíst." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 msgid "Scanning..." msgstr "" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Nastavit uživatelské akce" #: mirage.py:1988 msgid "Batch" msgstr "Dávka" #: mirage.py:1989 msgid "Action" msgstr "Akce" #: mirage.py:1990 msgid "Shortcut" msgstr "Zkratka" # FIXME: full stop missing #: mirage.py:2002 msgid "Add action" msgstr "Přidat akci" #: mirage.py:2006 msgid "Edit selected action." msgstr "Upravit vybranou akci." #: mirage.py:2010 msgid "Remove selected action." msgstr "Odstranit vybra|nou akci." #: mirage.py:2014 msgid "Move selected action up." msgstr "Posunout vybranou akci nahoru." #: mirage.py:2018 msgid "Move selected action down." msgstr "Posunout vybranou akci dolu." # FIXME: Append colon. E.g. French inserts space. #: mirage.py:2021 msgid "Parameters" msgstr "Parametry" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Cesta, název a přípona souboru" #: mirage.py:2021 msgid "File path" msgstr "Cesta k souboru" #: mirage.py:2021 msgid "File name without file extension" msgstr "Název souboru be přípony" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Přípona souboru (např. „.png“)" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Seznam souborů dělený mezerou" #: mirage.py:2024 msgid "Operations" msgstr "Operace" #: mirage.py:2024 msgid "Go to next image" msgstr "Přejít na následující obrázek" #: mirage.py:2024 msgid "Go to previous image" msgstr "Přejít na předchozí obrázek" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Zde lze definovat uživatelské akce se zkratkami. Akce používají vestavěné " "parametry a operace uvedené níže a mohou mít více bloků oddělených " "středníkem. Dávkové akce se provedou s každým obrázkem ze seznamu." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Přidat uživatelskou akci" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Upravit uživatelskou akci" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Název akce" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Příkaz" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Zkratka" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Provést akci na všech obrázcích (dávka)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Zadána neúplná uživatelská akce." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Zkratka akce" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Stiskněte zkratku zamýšlenou pro tuto akci." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Neplatná zkratka" #: mirage.py:2297 msgid "Screenshot" msgstr "Snímek obrazovky" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "Zachytit" #: mirage.py:2303 msgid "Location" msgstr "Umístnění" #: mirage.py:2306 msgid "Entire screen" msgstr "Celá obrazovka" # FIXME: Don't say "mouse". One can use tabled, touch screen, etc. # Use "pointer" as provided in X11 terminology #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "Okno pod kurzorem myši" #: mirage.py:2312 msgid "Delay" msgstr "Zpoždění" # FIXME: Use plural forms #: mirage.py:2320 msgid " seconds" msgstr " sekund" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Název souboru" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Název souboru" # FIXME: use whole string. Especially the dimension delimiter can be (and # should in Czech) translated (as cross insted of ex) #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Rozměry" # FIXME: use whole message. There can be delimiter betwean value and unit and # special thousand delimiters too. #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Velikost souboru" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Druh souboru" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Průhlednost" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animace" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bitů na vzorek" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Kanálů" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Ano" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Ne" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Nastavení Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Rozhraní" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Barva pozadí" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Nastaví barvu pozadí aplikace." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Barva pozadí" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Spouštět Mirage v celoobrazovkovém režimu" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Velikost náhledů" #: mirage.py:2522 msgid "Open Behavior" msgstr "Způsob otevírání" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Otevřít nový obrázek v" #: mirage.py:2527 msgid "Smart Mode" msgstr "Chytrém režimu" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Režimu vměstnání do okna" #: mirage.py:2529 msgid "1:1 Mode" msgstr "režimu 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Poslední aktivním režimu" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Načítat všechny obrázky v současném adresáři" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Je-li zapnuto, otevření obrázku v Mirage automaticky načte všechny obrázky, " "které se nacházejí v tomtéž adresáři." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Načítat skryté soubory" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Je-li zapnuto, Mirage bude načítat i skryté soubory. V opačném případě budou " "ignorovány." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Použít poslední vybraný adresář" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "Výchozí adresář pro „Otevřít“ bude adresář posledně požitý." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Vždy použít tento adresář" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Výchozí adresář pro „Otevřít“ bude adresář zde určený." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigace" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Pro rychlejší pohyb načítat obrázky dopředu" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Je-li zapnuto, následující a předcházející obrázek v seznamu bude v době " "nečinnosti přednačten. Uvědomte si, že zvýšení rychlosti je na úkor " "spotřebované paměti. Takže na strojích s malou pamětí je lepší tuto funkci " "vypnout." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Spojit seznam obrázků do kruhu" #: mirage.py:2587 msgid "Prompt User" msgstr "Zeptat se uživatele" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Režim prezentace" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Zpoždění mezi obrázky" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Zamíchat pořadím obrázků" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Je-li zapnuto, budou obrázky během prezentace vybírány náhodně (avšak žádný " "dva krát)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Během prezentace vypnout šetřič obrazovky" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "Je-li povoleno, xscreensaver bude po dobu prezentace dočasně zakázán." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Vždy začít v režimu přes celou obrazovku" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Je-li zapnuto, zahájení prezentace přepne aplikaci do celoobrazovkového " "režimu." #: mirage.py:2639 msgid "Image Editing" msgstr "Úprava obrázků" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Potvrzovat mazání obrázku" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Kvalita škálování" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Nejbližší (nejrychlejší)" #: mirage.py:2648 msgid "Tiles" msgstr "Dlaždice" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilineární" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Nejlepší)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Pozměněné obrázky" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignorovat změny" #: mirage.py:2659 msgid "Auto-Save" msgstr "Automaticky uložit" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Zeptat se" # FIXME: Need whole message. Czech has different word orderd. #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Nelze uložit " #: mirage.py:2688 msgid "Behavior" msgstr "Chování" #: mirage.py:2691 msgid "Slideshow" msgstr "Prezentace" #: mirage.py:2692 msgid "Image" msgstr "Obrázek" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Přejmenovat" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Zadejte nový název" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Nelze přejmenovat" #: mirage.py:2811 msgid "Unable to rename" msgstr "Nelze přejmenovat" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Opravdu chcete na trvalo smazat" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Nelze smazat" #: mirage.py:2892 msgid "Unable to delete" msgstr "Nelze smazat" #: mirage.py:2900 msgid "Choose directory" msgstr "Vyberte adresář" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Rychlý prohlížeč obrázků v GTK." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Nelze spustit vhodný prohlížeč." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Oříznout" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Šířka" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Výška" #: mirage.py:3493 msgid "Saturation" msgstr "Sytost" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Sytit" #: mirage.py:3505 msgid "Saturation level:" msgstr "Úroveň sytosti" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Změnit velikost" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pixelů" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Zachovat poměr stran" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Právě se díváte na první obrázek v seznamu. Přejít na poslední obrázek?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Právě se díváte na poslední obrázek v seznamu. Přejít na první obrázek?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Všechny obrázky byly shlédnuty. Přejete si je vidět znova od začátku?" #: mirage.py:3717 msgid "Wrap?" msgstr "Vrátit se?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Nahrávám" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Načítám dopředu" #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "Přeskakuji" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "_Uživatelské akce" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Přes celou obrazovku" #~ msgid "_Thumbnails Pane" #~ msgstr "Panel s _náhledy" #~ msgid "Unable to launch" #~ msgstr "Nelze spustit" # FIXME: Export whole message #~ msgid "Custom actions" #~ msgstr "Uživatelské akce" # FIXME: Use whole message #~ msgid "The shortcut " #~ msgstr "Zkratka " #~ msgid " is already used for " #~ msgstr " je již použita pro " #~ msgid "Found" #~ msgstr "Nalezen" # FIXME: use plural forms #~ msgid "seconds" #~ msgstr "sekund" # FIXME: use l10ned date format %c #~ msgid "File date" #~ msgstr "Čas souboru" mirage-0.9.5.1/po/ru.po0000644000175000017500000006417111422310710014352 0ustar fredricfredric# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Roxana Kolosova , 2006. # msgid "" msgstr "" "Project-Id-Version: Mirage 0.7.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2006-08-18 22:08+0400\n" "Last-Translator: Roxana Kolosova \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: mirage.py:344 msgid "_File" msgstr "_Файл" #: mirage.py:345 msgid "_Edit" msgstr "_Правка" #: mirage.py:346 msgid "_View" msgstr "П_росмотр" #: mirage.py:347 msgid "_Go" msgstr "П_ереход" #: mirage.py:348 msgid "_Help" msgstr "_Справка" #: mirage.py:349 msgid "Custom _Actions" msgstr "" #: mirage.py:350 msgid "_Open Image..." msgstr "_Открыть изображение..." #: mirage.py:350 msgid "Open Image" msgstr "Открыть изображение" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "_Открыть изображение..." #: mirage.py:351 #, fuzzy msgid "Open Remote Image" msgstr "Открыть изображение" #: mirage.py:352 msgid "Open _Folder..." msgstr "Открыть _каталог..." #: mirage.py:352 msgid "Open Folder" msgstr "Открыть каталог" #: mirage.py:353 #, fuzzy msgid "_Save Image" msgstr "_Следующее изображение" #: mirage.py:353 #, fuzzy msgid "Save Image" msgstr "Последнее изображение" #: mirage.py:354 #, fuzzy msgid "Save Image _As..." msgstr "_Открыть изображение..." #: mirage.py:354 #, fuzzy msgid "Save Image As" msgstr "Изображения" #: mirage.py:355 #, fuzzy msgid "_Crop..." msgstr "_Открыть изображение..." #: mirage.py:355 mirage.py:3297 #, fuzzy msgid "Crop Image" msgstr "Открыть изображение" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "_Открыть изображение..." #: mirage.py:356 mirage.py:3542 #, fuzzy msgid "Resize Image" msgstr "Удалить изображение" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Параметры:" #: mirage.py:357 msgid "Modify saturation" msgstr "" #: mirage.py:358 msgid "_Quit" msgstr "_Выход" #: mirage.py:358 msgid "Quit" msgstr "Выход" #: mirage.py:359 msgid "_Previous Image" msgstr "_Предыдущее изображение" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Предыдущее изображение" #: mirage.py:360 msgid "_Next Image" msgstr "_Следующее изображение" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Следующее изображение" #: mirage.py:361 msgid "_Previous" msgstr "_Предыдущее" #: mirage.py:361 msgid "Previous" msgstr "Предыдущее" #: mirage.py:362 msgid "_Next" msgstr "_Следующее" #: mirage.py:362 msgid "Next" msgstr "Следующее" #: mirage.py:363 msgid "_Random Image" msgstr "_Случайное изображение" #: mirage.py:363 msgid "Random Image" msgstr "Случайное изображение" #: mirage.py:364 msgid "_First Image" msgstr "П_ервое изображение" #: mirage.py:364 msgid "First Image" msgstr "Первое изображение" #: mirage.py:365 msgid "_Last Image" msgstr "П_оследнее изображение" #: mirage.py:365 msgid "Last Image" msgstr "Последнее изображение" #: mirage.py:366 msgid "Zoom _In" msgstr "У_величить" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Увеличить" #: mirage.py:367 msgid "Zoom _Out" msgstr "У_меньшить" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Уменьшить" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "К размеру _окна" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "К размеру окна" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Повернуть в_лево" #: mirage.py:370 msgid "Rotate Left" msgstr "Повернуть влево" #: mirage.py:371 msgid "Rotate _Right" msgstr "Повернуть в_право" #: mirage.py:371 msgid "Rotate Right" msgstr "Повернуть вправо" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Отразить в_ертикально" #: mirage.py:372 msgid "Flip Vertically" msgstr "Отразить вертикально" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Отразить _горизонтально" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Отразить горизонтально" #: mirage.py:374 msgid "_About" msgstr "_О программе" #: mirage.py:374 msgid "About" msgstr "О программе" #: mirage.py:375 msgid "_Contents" msgstr "" #: mirage.py:375 msgid "Contents" msgstr "" #: mirage.py:376 #, fuzzy msgid "_Preferences..." msgstr "Па_раметры" #: mirage.py:376 msgid "Preferences" msgstr "Параметры" #: mirage.py:377 msgid "_Full Screen" msgstr "Полно_экранный режим" #: mirage.py:377 msgid "Full Screen" msgstr "Полноэкранный режим" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "Выйти и_з полноэкранного режима" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Выйти из полноэкранного режима" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Начать просмотр слайдов" #: mirage.py:379 msgid "Start Slideshow" msgstr "Начать просмотр слайдов" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Остановить просмотр слайдов" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Остановить просмотр слайдов" #: mirage.py:381 #, fuzzy msgid "_Delete..." msgstr "Удалить изображение" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Удалить изображение" #: mirage.py:382 #, fuzzy msgid "Re_name..." msgstr "_Открыть изображение..." #: mirage.py:382 mirage.py:2761 #, fuzzy msgid "Rename Image" msgstr "Удалить изображение" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "" #: mirage.py:383 msgid "Take Screenshot" msgstr "" #: mirage.py:384 #, fuzzy msgid "_Properties..." msgstr "Па_раметры" #: mirage.py:384 mirage.py:2374 #, fuzzy msgid "Properties" msgstr "Параметры:" #: mirage.py:385 msgid "_Configure..." msgstr "" #: mirage.py:385 msgid "Custom Actions" msgstr "" #: mirage.py:409 msgid "_Status Bar" msgstr "Строка _состояния" #: mirage.py:409 msgid "Status Bar" msgstr "Строка состояния" #: mirage.py:410 msgid "_Toolbar" msgstr "Панель _инструментов" #: mirage.py:410 msgid "Toolbar" msgstr "Панель инструментов" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Удалить изображение" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, python-format msgid "Action: %s" msgstr "" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "Укажите правильную команду для запуска приложения (Правка->Параметры)." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Версия: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Сайт: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Использование: mirage [OPTION]... FILES|FOLDERS..." #: mirage.py:1397 #, fuzzy msgid "Options" msgstr "Параметры:" #: mirage.py:1398 msgid "Show this help and exit" msgstr "" #: mirage.py:1399 #, fuzzy msgid "Show version information and exit" msgstr " -v, --version Показать версию" #: mirage.py:1400 #, fuzzy msgid "Show more detailed information" msgstr " -V, --verbose Показать более подробную информацию" #: mirage.py:1401 #, fuzzy msgid "Recursively include all images found in" msgstr "" " -R, --recursive Рекурсивно включать все изобажения, найденные " "в" #: mirage.py:1402 #, fuzzy msgid "subdirectories of FOLDERS" msgstr " дочерних каталогах FOLDERS" #: mirage.py:1403 #, fuzzy msgid "Start in slideshow mode" msgstr "Начать просмотр слайдов" #: mirage.py:1404 #, fuzzy msgid "Start in fullscreen mode" msgstr "Запускать показ в полноэкранном режиме" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "" #: mirage.py:1406 msgid "uses same syntax as custom actions,\n" msgstr "" #: mirage.py:1407 msgid "i.e. mirage -o 'echo file is %F'" msgstr "" #: mirage.py:1641 msgid "Save As" msgstr "" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Невозможно удалить " #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "" #: mirage.py:1714 msgid "Save?" msgstr "" #: mirage.py:1752 #, fuzzy msgid "Open Remote" msgstr "Открыть изображение" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "" #: mirage.py:1788 msgid "Open" msgstr "Открыть" #: mirage.py:1791 msgid "Images" msgstr "Изображения" #: mirage.py:1795 msgid "All files" msgstr "Все файлы" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Включать файлы в дочерних каталогах" #: mirage.py:1960 msgid "Cannot load image." msgstr "Невозможно загрузить изображение." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 msgid "Scanning..." msgstr "" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "" #: mirage.py:1988 msgid "Batch" msgstr "" #: mirage.py:1989 msgid "Action" msgstr "" #: mirage.py:1990 msgid "Shortcut" msgstr "" #: mirage.py:2002 msgid "Add action" msgstr "" #: mirage.py:2006 msgid "Edit selected action." msgstr "" #: mirage.py:2010 msgid "Remove selected action." msgstr "" #: mirage.py:2014 msgid "Move selected action up." msgstr "" #: mirage.py:2018 msgid "Move selected action down." msgstr "" #: mirage.py:2021 msgid "Parameters" msgstr "" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "" #: mirage.py:2021 msgid "File path" msgstr "" #: mirage.py:2021 msgid "File name without file extension" msgstr "" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "" #: mirage.py:2024 #, fuzzy msgid "Operations" msgstr "Параметры:" #: mirage.py:2024 #, fuzzy msgid "Go to next image" msgstr "Следующее изображение" #: mirage.py:2024 #, fuzzy msgid "Go to previous image" msgstr "Предыдущее изображение" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" #: mirage.py:2079 msgid "Add Custom Action" msgstr "" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "" #: mirage.py:2084 msgid "Action Name:" msgstr "" #: mirage.py:2086 msgid "Command:" msgstr "" #: mirage.py:2088 msgid "Shortcut:" msgstr "" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "" #: mirage.py:2229 msgid "Action Shortcut" msgstr "" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "" #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "" #: mirage.py:2297 msgid "Screenshot" msgstr "" #: mirage.py:2298 msgid "_Snap" msgstr "" #: mirage.py:2303 #, fuzzy msgid "Location" msgstr "Загрузка:" #: mirage.py:2306 msgid "Entire screen" msgstr "" #: mirage.py:2307 msgid "Window under pointer" msgstr "" #: mirage.py:2312 msgid "Delay" msgstr "" #: mirage.py:2320 #, fuzzy msgid " seconds" msgstr "секунд" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Удалить изображение" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Удалить изображение" #: mirage.py:2392 msgid "Dimensions:" msgstr "" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Удалить изображение" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Удалить изображение" #: mirage.py:2398 msgid "Transparency:" msgstr "" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Перемещение" #: mirage.py:2402 msgid "Bits per sample:" msgstr "" #: mirage.py:2404 msgid "Channels:" msgstr "" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Да" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Нет" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Параметры Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Интерфейс" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Цвет фона" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "" #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Цвет фона" #: mirage.py:2492 #, fuzzy msgid "Open Mirage in fullscreen mode" msgstr "Запускать показ в полноэкранном режиме" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Удалить изображение" #: mirage.py:2522 msgid "Open Behavior" msgstr "Поведение команды \"Открыть\"" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Открывать новое изображение в" #: mirage.py:2527 msgid "Smart Mode" msgstr "смешанном режиме" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "режиме \"к размеру окна\"" #: mirage.py:2529 msgid "1:1 Mode" msgstr "режиме 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "последнем использованном режиме" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Загружать все изображения текущего каталога" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "При включении этой функции все изображения из текущего каталога будут " "загружены автоматически." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Использовать последний выбранный каталог" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "Последний выбранный каталог будет каталогом по умолчанию." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Использовать указанный каталог:" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Укаанный каталог всегда будет каталогом по умолчанию." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Перемещение" #: mirage.py:2579 #, fuzzy msgid "Preload images for faster navigation" msgstr "Использовать колесо мыши для смены изображения" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Автоматически переходить к началу списка:" #: mirage.py:2587 msgid "Prompt User" msgstr "По выбору" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Просмотр слайдов" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Показывать изображение:" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Перемешать изображения" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Отключить хранитель экрана во время показа слайдов" #: mirage.py:2619 #, fuzzy msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "Отключить хранитель экрана во время показа слайдов" #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Запускать показ в полноэкранном режиме" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" #: mirage.py:2639 msgid "Image Editing" msgstr "" #: mirage.py:2641 msgid "Confirm image delete" msgstr "" #: mirage.py:2645 msgid "Scaling quality:" msgstr "" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "" #: mirage.py:2648 #, fuzzy msgid "Tiles" msgstr "_Файл" #: mirage.py:2649 msgid "Bilinear" msgstr "" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "" #: mirage.py:2656 msgid "Modified images:" msgstr "" #: mirage.py:2658 msgid "Ignore Changes" msgstr "" #: mirage.py:2659 msgid "Auto-Save" msgstr "" #: mirage.py:2660 msgid "Prompt For Action" msgstr "" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Невозможно удалить " #: mirage.py:2688 msgid "Behavior" msgstr "Поведение" #: mirage.py:2691 msgid "Slideshow" msgstr "Слайды" #: mirage.py:2692 #, fuzzy msgid "Image" msgstr "Изображения" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "_Открыть изображение..." #: mirage.py:2778 msgid "Enter the new name:" msgstr "" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Невозможно удалить " #: mirage.py:2811 #, fuzzy msgid "Unable to rename" msgstr "Невозможно удалить " #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Вы уверены, что хотите удалить " #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Невозможно удалить " #: mirage.py:2892 #, fuzzy msgid "Unable to delete" msgstr "Невозможно удалить " #: mirage.py:2900 msgid "Choose directory" msgstr "Выбор каталога" #: mirage.py:2948 #, fuzzy msgid "A fast GTK+ Image Viewer." msgstr "Быстрый просмотрщик изображений на GTK+." #: mirage.py:2990 #, fuzzy msgid "Unable to launch a suitable browser." msgstr "Невозможно запустить" #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "_Открыть изображение..." #: mirage.py:3340 mirage.py:3553 msgid "Width:" msgstr "" #: mirage.py:3347 mirage.py:3564 msgid "Height:" msgstr "" #: mirage.py:3493 #, fuzzy msgid "Saturation" msgstr "Параметры:" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Параметры:" #: mirage.py:3505 #, fuzzy msgid "Saturation level:" msgstr "Параметры:" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Удалить изображение" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "Вы просматриваете первое изображение в списке. Перейти к последнему?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "Вы просматриваете последнее изображение в списке. Перейти к первому?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Все изображения просмотрены. Вы хотите просмотреть список сначала?" #: mirage.py:3717 msgid "Wrap?" msgstr "" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Загрузка:" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Загрузка:" #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Полноэкранный режим" #~ msgid "Unable to launch" #~ msgstr "Невозможно запустить" #~ msgid "of" #~ msgstr "из" #, fuzzy #~ msgid "Found" #~ msgstr "Найдено:" #~ msgid "seconds" #~ msgstr "секунд" #~ msgid "Use mousewheel for imagelist navigation" #~ msgstr "Использовать колесо мыши для смены изображения" #~ msgid "" #~ "If enabled, mousewheel-down (up) will go to the next (previous) image." #~ msgstr "" #~ "При включении этой функции изображения можно пролистывать с помощью " #~ "колеса мыши." #~ msgid "Do not ask again" #~ msgstr "Больше не спрашивать" #~ msgid "Open in _Editor" #~ msgstr "Открыть в _редакторе" #~ msgid "Open in Editor" #~ msgstr "Открыть в редакторе" #~ msgid " -h, --help Show this help and exit" #~ msgstr " -h, --help Показать справку" #~ msgid " -s, --slideshow Start in slideshow mode" #~ msgstr " -s, --slideshow Запускать в режиме показа слайдов" #~ msgid " -f, --fullscreen Start in fullscreen mode" #~ msgstr " -f, --fullscreen Запускать в полноэкранном режиме" #~ msgid "Zoom Quality" #~ msgstr "Качество масштабирования" #~ msgid "Fastest" #~ msgstr "Скорость" #~ msgid "Best" #~ msgstr "Качество" #~ msgid "" #~ "Smart mode uses 1:1 for images smaller than the window and Fit To Window " #~ "for images larger." #~ msgstr "" #~ "В смешанном режиме изображение открывается в режиме 1:1, если оно меньше " #~ "размера окна, или в режиме \"к размеру окна\", если оно больше окна." #~ msgid "External Image Editor" #~ msgstr "Внешний редактор изображений" #~ msgid "" #~ "The application specified below is used as the default editor. It is " #~ "assumed to be in the user's PATH or can be explicitly set (e.g., \"/usr/" #~ "bin/gimp-remote\")." #~ msgstr "" #~ "Приложение, указанное здесь, используется как редактор по умолчанию. Оно " #~ "может быть в пользовательской переменной PATH или указано в качестве " #~ "команды (например, \"/usr/bin/gimp-remote\")." #~ msgid "Editor" #~ msgstr "Редактор" #~ msgid "?" #~ msgstr "?" mirage-0.9.5.1/po/POTFILES.in0000644000175000017500000000003011422310710015121 0ustar fredricfredric./setup.py ./mirage.py mirage-0.9.5.1/po/de.po0000644000175000017500000006213511422310710014312 0ustar fredricfredric# translation of PACKAGE. # Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Björn Martensen , 2006. # # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2006-12-15 18:11+0100\n" "Last-Translator: Björn Martensen \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: mirage.py:344 msgid "_File" msgstr "_Datei" #: mirage.py:345 msgid "_Edit" msgstr "_Bearbeiten" #: mirage.py:346 msgid "_View" msgstr "_Ansicht" #: mirage.py:347 msgid "_Go" msgstr "_Gehe zu" #: mirage.py:348 msgid "_Help" msgstr "_Hilfe" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Benutzerdefinierte Aktionen" #: mirage.py:350 msgid "_Open Image..." msgstr "_Bild öffnen" #: mirage.py:350 msgid "Open Image" msgstr "Bild öffnen" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "_Bild öffnen" #: mirage.py:351 #, fuzzy msgid "Open Remote Image" msgstr "Bild öffnen" #: mirage.py:352 msgid "Open _Folder..." msgstr "_Verzeichnis öffnen..." #: mirage.py:352 msgid "Open Folder" msgstr "Verzeichnis öffnen..." #: mirage.py:353 msgid "_Save Image" msgstr "Bild _speichern" #: mirage.py:353 msgid "Save Image" msgstr "Bild speichern" #: mirage.py:354 msgid "Save Image _As..." msgstr "Bild speichern _unter..." #: mirage.py:354 msgid "Save Image As" msgstr "Bild speichern unter" #: mirage.py:355 msgid "_Crop..." msgstr "Bild_ausschnitt wählen..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Bildausschnitt wählen" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "_Größe ändern..." #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Bildgröße ändern" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Sättigung..." #: mirage.py:357 msgid "Modify saturation" msgstr "Sättigung verändern" #: mirage.py:358 msgid "_Quit" msgstr "_Beenden" #: mirage.py:358 msgid "Quit" msgstr "Beenden" #: mirage.py:359 msgid "_Previous Image" msgstr "_Vorheriges Bild" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Vorheriges Bild" #: mirage.py:360 msgid "_Next Image" msgstr "_Nächstes Bild" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Nächstes Bild" #: mirage.py:361 msgid "_Previous" msgstr "_Vorheriges" #: mirage.py:361 msgid "Previous" msgstr "Vorheriges" #: mirage.py:362 msgid "_Next" msgstr "_Nächstes" #: mirage.py:362 msgid "Next" msgstr "Nächstes" #: mirage.py:363 msgid "_Random Image" msgstr "_Zufällige Bildauswahl" #: mirage.py:363 msgid "Random Image" msgstr "Zufällige Bildauswahl" #: mirage.py:364 msgid "_First Image" msgstr "_Erstes Bild" #: mirage.py:364 msgid "First Image" msgstr "Erstes Bild" #: mirage.py:365 msgid "_Last Image" msgstr "_Letztes Bild" #: mirage.py:365 msgid "Last Image" msgstr "Letztes Bild" #: mirage.py:366 msgid "Zoom _In" msgstr "Hin_einzoomen" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Hineinzoomen" #: mirage.py:367 msgid "Zoom _Out" msgstr "Hera_uszoomen" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Herauszoomen" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "An Fenstergröße anpassen" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Anpassen" #: mirage.py:369 msgid "_1:1" msgstr "_Originalgröße" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "Originalgröße" #: mirage.py:370 msgid "Rotate _Left" msgstr "Nach links rotieren" #: mirage.py:370 msgid "Rotate Left" msgstr "Nach links rotieren" #: mirage.py:371 msgid "Rotate _Right" msgstr "Nach rechts rotieren" #: mirage.py:371 msgid "Rotate Right" msgstr "Nach rechts rotieren" #: mirage.py:372 msgid "Flip _Vertically" msgstr "_Vertikal spiegeln" #: mirage.py:372 msgid "Flip Vertically" msgstr "Vertikal spiegeln" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "_Horizontal spiegeln" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Horizontal spiegeln" #: mirage.py:374 msgid "_About" msgstr "_Info" #: mirage.py:374 msgid "About" msgstr "Info" #: mirage.py:375 msgid "_Contents" msgstr "_Inhalte" #: mirage.py:375 msgid "Contents" msgstr "Inhalte" #: mirage.py:376 msgid "_Preferences..." msgstr "_Einstellungen..." #: mirage.py:376 msgid "Preferences" msgstr "Einstellungen" #: mirage.py:377 msgid "_Full Screen" msgstr "_Vollbild" #: mirage.py:377 msgid "Full Screen" msgstr "Vollbild" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "_Vollbild verlassen" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Vollbild verlassen" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Diashow starten" #: mirage.py:379 msgid "Start Slideshow" msgstr "Diashow starten" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Diashow stoppen" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Diashow stoppen" #: mirage.py:381 msgid "_Delete..." msgstr "_Löschen..." #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Nächstes Bild" #: mirage.py:382 msgid "Re_name..." msgstr "Um_benennen..." #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Bild umbenennen" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "" #: mirage.py:383 msgid "Take Screenshot" msgstr "" #: mirage.py:384 msgid "_Properties..." msgstr "_Bildeigenschaften..." #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Bildeigenschaften" #: mirage.py:385 msgid "_Configure..." msgstr "_Konfigurieren" #: mirage.py:385 msgid "Custom Actions" msgstr "Benutzerdefinierte Aktionen" #: mirage.py:409 msgid "_Status Bar" msgstr "_Statusleiste" #: mirage.py:409 msgid "Status Bar" msgstr "Statusleiste" #: mirage.py:410 msgid "_Toolbar" msgstr "_Werkzeugleiste" #: mirage.py:410 msgid "Toolbar" msgstr "Werkzeugleiste" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Dateigröße" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Aktion" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "Bitte ein gültiges Kommando unter Edit > Custom Actions." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Ungültige Benutzerdefinierte Aktion" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Programmversion" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Website: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Verwendung: mirage [OPTION]... DATEIEN|VERZEICHNISSE..." #: mirage.py:1397 msgid "Options" msgstr "Optionen" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Diese Hilfe anzeigen und beenden" #: mirage.py:1399 msgid "Show version information and exit" msgstr " Programmversion anzeigen und beenden" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Detailiertere Informationen anzeigen" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Rekursives Miteinbeziehen aller gefundenen Bilder in" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "Untergeordnete VERZEICHNISSE" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Im Diashow-Modus starten" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Im Vollbild-Modus starten" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Führe 'cmd' aus, sobald das Bild geladen wurde" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(verwendet die gleiche Syntax wie die Benutzerdefinierten Aktionen," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "z.b. mirage -o 'echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Speichern unter" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Speichern" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Speichern fehlgeschlagen" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "Das aktuelle Bild wurde verändert. Änderungen speichern?" #: mirage.py:1714 msgid "Save?" msgstr "Speichern?" #: mirage.py:1752 #, fuzzy msgid "Open Remote" msgstr "Bild öffnen" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "" #: mirage.py:1788 msgid "Open" msgstr "Öffnen" #: mirage.py:1791 msgid "Images" msgstr "Bilder" #: mirage.py:1795 msgid "All files" msgstr "Alle Dateien" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Bilder in Untergeordneten Verzeichnissen einbeziehen" #: mirage.py:1960 msgid "Cannot load image." msgstr "Das Bild konnte nicht geladen werden" #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Scannen" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Benutzerdefinierte Aktionen konfigurieren" #: mirage.py:1988 msgid "Batch" msgstr "Stapelverarbeitung" #: mirage.py:1989 msgid "Action" msgstr "Aktion" #: mirage.py:1990 msgid "Shortcut" msgstr "Tastenkombination" #: mirage.py:2002 msgid "Add action" msgstr "Aktion hinzufügen" #: mirage.py:2006 msgid "Edit selected action." msgstr "Gewählte Aktion bearbeiten." #: mirage.py:2010 msgid "Remove selected action." msgstr "Gewählte Aktion löschen." #: mirage.py:2014 msgid "Move selected action up." msgstr "Gewählte Aktion nach oben." #: mirage.py:2018 msgid "Move selected action down." msgstr "Gewählte Aktion nach unten." #: mirage.py:2021 msgid "Parameters" msgstr "Parameter" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Dateipfad, -name und -erweiterung" #: mirage.py:2021 msgid "File path" msgstr "Dateipfad" #: mirage.py:2021 msgid "File name without file extension" msgstr "Dateiname ohne -erweiterung" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Dateierweiterung (z.b. \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Liste der Dateien, durch Leerzeichen getrennt" #: mirage.py:2024 msgid "Operations" msgstr "Operationen" #: mirage.py:2024 msgid "Go to next image" msgstr "Zum nächsten Bild gehen" #: mirage.py:2024 msgid "Go to previous image" msgstr "Zum vorherigen Bild gehen" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Hier können sie Benutzerdefinierte Aktionen mit Tastenkombinationen " "definieren. Aktionen verwenden die vorhandenen Parameter und die unten " "angegebenen Operationen können mehrere mit Semikolon getrennte Angaben " "besitzen. Stapelverarbeitungsaktionen werden auf alle Bilder in der Liste " "angewandt." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Benutzerdefinierte Aktion hinzufügen" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Benutzerdefinierte Aktion bearbeiten" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Aktionsname" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Kommando" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Tastenkombination" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Aktion auf alle Bilder anwenden (Stapelverarbeitung)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Unvollständige Benutzerdefinierte Aktion angegeben." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Tastenkombination hinzufügen" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Drücken sie die gewünschte Tastenkombination für die Aktion." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Ungültige Tastenkombination" #: mirage.py:2297 msgid "Screenshot" msgstr "" #: mirage.py:2298 msgid "_Snap" msgstr "" #: mirage.py:2303 #, fuzzy msgid "Location" msgstr "Aktion" #: mirage.py:2306 msgid "Entire screen" msgstr "" #: mirage.py:2307 msgid "Window under pointer" msgstr "" #: mirage.py:2312 msgid "Delay" msgstr "" #: mirage.py:2320 #, fuzzy msgid " seconds" msgstr "Sekunden" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Dateiname" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Dateiname" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Dimensionen" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Dateigröße" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Dateityp" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Transparenz" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animation" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bits pro sample" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Kanäle" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Ja" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Nein" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Einstellungen von Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Oberfläche" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Hintergrundfarbe" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Legt die Hintergrundfarbe der Anwendung fest." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Hintergrundfarbe" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Mirage im Vollbild-Modus starten" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Dateigröße" #: mirage.py:2522 msgid "Open Behavior" msgstr "\"Öffnen\"-Einstellungen" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Zoom-Modus des nächsten Bildes" #: mirage.py:2527 msgid "Smart Mode" msgstr "Intelligente Bildgröße" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "An Fenstergröße anpassen" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Originalgröße" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Zuletzt aktiver Modus" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Alle Bilder im aktuellen Verzeichnis laden" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Wenn aktiviert, wird Mirage automatisch alle im sich im Verzeichnis " "befindenden Bilder laden." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Das zuletzt gewählte Verzeichnis verwenden" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "Das 'Öffnen'-Verzeichnis wird das zuletzt verwendete sein." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Dieses Verzeichnis verwenden" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Das 'Öffnen'-Verzeichnis wird das angegebene sein." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigation" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Bilder für schnellere Navigation vorladen" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Wenn aktiviert, werden das nächste und das vorherige Bild während des " "Programmleerlaufs vorgeladen. Beachten sie, dass der Geschwindigkeitszuwachs " "eine höhere Speichernutzung mit sich bringt. Es wird daher empfohlen, diese " "Option auf Maschinen mit wenig Speicher zu deaktivieren." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Umbruch der Bilderliste" #: mirage.py:2587 msgid "Prompt User" msgstr "Nachfragen" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Diashow-Einstellungen" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Pause zwischen den Bildern" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Zufällige Bildauswahl" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Wenn aktiviert, wird ein zufälliges Bild während der Diashow geladen (ohne " "zweimal das selbe Bild zu laden)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Bildschirmschoner während der Diashow deaktivieren" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "Bildschirmschoner während der Diashow deaktivieren" #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Immer im Vollbild-Modus starten" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Wenn aktiviert, wird das Programm beim Start der Diashow in den Vollbild-" "Modus versetzt." #: mirage.py:2639 msgid "Image Editing" msgstr "Bildbearbeitung" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Bitte Löschen bestätigen" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Skalierungsqualität" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Nearest (Am schnellsten)" #: mirage.py:2648 msgid "Tiles" msgstr "Kacheln" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilinear" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Am besten)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Modifizierte Bilder" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Änderungen ignorieren" #: mirage.py:2659 msgid "Auto-Save" msgstr "Auto-Speichern" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Aktion nachfragen" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Speichern fehlgeschlagen" #: mirage.py:2688 msgid "Behavior" msgstr "Verhalten" #: mirage.py:2691 msgid "Slideshow" msgstr "Diashow" #: mirage.py:2692 msgid "Image" msgstr "Bild" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Umbenennen" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Bitte neuen Namen eingeben" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Umbenennen fehlgeschlagen" #: mirage.py:2811 msgid "Unable to rename" msgstr "Umbenennen fehlgeschlagen" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Sind sie sicher, dass sie das Bild wirklich löschen möchten" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Löschen fehlgeschlagen" #: mirage.py:2892 msgid "Unable to delete" msgstr "Löschen fehlgeschlagen" #: mirage.py:2900 msgid "Choose directory" msgstr "Verzeichnis wählen" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Ein schneller GTK+ Bildbetrachter" #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Konnte keinen geeigneten Browser starten." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Ausschnitt" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Breite" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Höhe" #: mirage.py:3493 msgid "Saturation" msgstr "Sättigung" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Sättigen" #: mirage.py:3505 #, fuzzy msgid "Saturation level:" msgstr "Sättigung" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Größe ändern" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "Pixel" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Seitenverhältnis beibehalten" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Sie sehen das erste Bild in der Liste. Möchten Sie mit dem letzten Bild " "fortfahren?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Sie sehen das letzte Bild in der Liste. Möchten Sie mit dem ersten Bild " "fortfahren?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Alle Bilder wurden betrachtet. Möchten Sie die Diashow wiederholen?" #: mirage.py:3717 msgid "Wrap?" msgstr "Umbrechen?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Lade..." #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Lade..." #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "_Benutzerdefinierte Aktionen" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Vollbild" #~ msgid "Unable to launch" #~ msgstr "Folgendes Programm konnte nicht ausgeführt werden: " #~ msgid "The" #~ msgstr "Die" #~ msgid "Custom actions" #~ msgstr "Benutzerdefinierte Aktionen" #~ msgid "of" #~ msgstr "von" #~ msgid "The shortcut " #~ msgstr "Die Tastenkombination" #~ msgid " is already used for " #~ msgstr "wird bereits benutzt für" #~ msgid "Found" #~ msgstr "Gefunden" #~ msgid "seconds" #~ msgstr "Sekunden" #~ msgid "File date" #~ msgstr "Dateidatum" #~ msgid "list" #~ msgstr "Liste" #~ msgid "Custom _Actions..." #~ msgstr "Benutzerdefinierte _Aktionen" #~ msgid "Use mousewheel for imagelist navigation" #~ msgstr "Das Mausrad zur Navigation zwischen den Bilder verwenden" #~ msgid "" #~ "If enabled, mousewheel-down (up) will go to the next (previous) image." #~ msgstr "" #~ "Wenn aktiviert, kann mit dem Mausrad-runter (hoch) das nächste " #~ "(vorherige) Bild ausgewählt werden." #~ msgid "Do not ask again" #~ msgstr "Nicht wieder nachfragen" #~ msgid "Open in _Editor" #~ msgstr "In _Editor öffnen" #~ msgid "Open in Editor" #~ msgstr "In Editor öffnen" #~ msgid " -h, --help Show this help and exit" #~ msgstr " -h, --help diese Hilfe anzeigen und beenden" #~ msgid " -s, --slideshow Start in slideshow mode" #~ msgstr " -s, --slideshow Im Diashow-Modus starten" #~ msgid " -f, --fullscreen Start in fullscreen mode" #~ msgstr " -f, --fullscreen Im Vollbild-Modus starten" #~ msgid "Zoom Quality" #~ msgstr "Zoom-Qualitätsstufe" #~ msgid "Fastest" #~ msgstr "Gering (am schnellsten)" #~ msgid "Best" #~ msgstr "Am besten" #~ msgid "" #~ "Smart mode uses 1:1 for images smaller than the window and Fit To Window " #~ "for images larger." #~ msgstr "" #~ "Der intelligente Modus zeigt kleine Bilder in der Originalgröße und passt " #~ "große Bilder an die Fenstergröße an." #~ msgid "External Image Editor" #~ msgstr "Externes Bildbearbeitungsprogramm" #~ msgid "" #~ "The application specified below is used as the default editor. It is " #~ "assumed to be in the user's PATH or can be explicitly set (e.g., \"/usr/" #~ "bin/gimp-remote\")." #~ msgstr "" #~ "Das angegebene Programm wird als Standard-Editor genutzt. Es wird " #~ "angenommen, dass es sich im PATH des Benutzers befindet, kann aber auch " #~ "explizit angegeben werden (z.B. \"/usr/bin/gimp-remote\")" #~ msgid "Editor" #~ msgstr "Editor" mirage-0.9.5.1/po/messages.po0000644000175000017500000004113111422310710015522 0ustar fredricfredric# 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: 2010-07-23 14:39+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: mirage.py:344 msgid "_File" msgstr "" #: mirage.py:345 msgid "_Edit" msgstr "" #: mirage.py:346 msgid "_View" msgstr "" #: mirage.py:347 msgid "_Go" msgstr "" #: mirage.py:348 msgid "_Help" msgstr "" #: mirage.py:349 msgid "Custom _Actions" msgstr "" #: mirage.py:350 msgid "_Open Image..." msgstr "" #: mirage.py:350 msgid "Open Image" msgstr "" #: mirage.py:351 msgid "Open _Remote image..." msgstr "" #: mirage.py:351 msgid "Open Remote Image" msgstr "" #: mirage.py:352 msgid "Open _Folder..." msgstr "" #: mirage.py:352 msgid "Open Folder" msgstr "" #: mirage.py:353 msgid "_Save Image" msgstr "" #: mirage.py:353 msgid "Save Image" msgstr "" #: mirage.py:354 msgid "Save Image _As..." msgstr "" #: mirage.py:354 msgid "Save Image As" msgstr "" #: mirage.py:355 msgid "_Crop..." msgstr "" #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "" #: mirage.py:356 msgid "R_esize..." msgstr "" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "" #: mirage.py:357 msgid "_Saturation..." msgstr "" #: mirage.py:357 msgid "Modify saturation" msgstr "" #: mirage.py:358 msgid "_Quit" msgstr "" #: mirage.py:358 msgid "Quit" msgstr "" #: mirage.py:359 msgid "_Previous Image" msgstr "" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "" #: mirage.py:360 msgid "_Next Image" msgstr "" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "" #: mirage.py:361 msgid "_Previous" msgstr "" #: mirage.py:361 msgid "Previous" msgstr "" #: mirage.py:362 msgid "_Next" msgstr "" #: mirage.py:362 msgid "Next" msgstr "" #: mirage.py:363 msgid "_Random Image" msgstr "" #: mirage.py:363 msgid "Random Image" msgstr "" #: mirage.py:364 msgid "_First Image" msgstr "" #: mirage.py:364 msgid "First Image" msgstr "" #: mirage.py:365 msgid "_Last Image" msgstr "" #: mirage.py:365 msgid "Last Image" msgstr "" #: mirage.py:366 msgid "Zoom _In" msgstr "" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "" #: mirage.py:367 msgid "Zoom _Out" msgstr "" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "" #: mirage.py:369 msgid "_1:1" msgstr "" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "" #: mirage.py:370 msgid "Rotate _Left" msgstr "" #: mirage.py:370 msgid "Rotate Left" msgstr "" #: mirage.py:371 msgid "Rotate _Right" msgstr "" #: mirage.py:371 msgid "Rotate Right" msgstr "" #: mirage.py:372 msgid "Flip _Vertically" msgstr "" #: mirage.py:372 msgid "Flip Vertically" msgstr "" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "" #: mirage.py:373 msgid "Flip Horizontally" msgstr "" #: mirage.py:374 msgid "_About" msgstr "" #: mirage.py:374 msgid "About" msgstr "" #: mirage.py:375 msgid "_Contents" msgstr "" #: mirage.py:375 msgid "Contents" msgstr "" #: mirage.py:376 msgid "_Preferences..." msgstr "" #: mirage.py:376 msgid "Preferences" msgstr "" #: mirage.py:377 msgid "_Full Screen" msgstr "" #: mirage.py:377 msgid "Full Screen" msgstr "" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "" #: mirage.py:379 msgid "_Start Slideshow" msgstr "" #: mirage.py:379 msgid "Start Slideshow" msgstr "" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "" #: mirage.py:380 msgid "Stop Slideshow" msgstr "" #: mirage.py:381 msgid "_Delete..." msgstr "" #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "" #: mirage.py:382 msgid "Re_name..." msgstr "" #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "" #: mirage.py:383 msgid "Take Screenshot" msgstr "" #: mirage.py:384 msgid "_Properties..." msgstr "" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "" #: mirage.py:385 msgid "_Configure..." msgstr "" #: mirage.py:385 msgid "Custom Actions" msgstr "" #: mirage.py:409 msgid "_Status Bar" msgstr "" #: mirage.py:409 msgid "Status Bar" msgstr "" #: mirage.py:410 msgid "_Toolbar" msgstr "" #: mirage.py:410 msgid "Toolbar" msgstr "" #: mirage.py:411 msgid "Thumbnails _Pane" msgstr "" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, python-format msgid "Action: %s" msgstr "" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "" #: mirage.py:1262 #, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "" #: mirage.py:1389 msgid "Version: Mirage" msgstr "" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "" #: mirage.py:1397 msgid "Options" msgstr "" #: mirage.py:1398 msgid "Show this help and exit" msgstr "" #: mirage.py:1399 msgid "Show version information and exit" msgstr "" #: mirage.py:1400 msgid "Show more detailed information" msgstr "" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "" #: mirage.py:1406 msgid "uses same syntax as custom actions,\n" msgstr "" #: mirage.py:1407 msgid "i.e. mirage -o 'echo file is %F'" msgstr "" #: mirage.py:1641 msgid "Save As" msgstr "" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "" #: mirage.py:1693 #, python-format msgid "Unable to save %s" msgstr "" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "" #: mirage.py:1714 msgid "Save?" msgstr "" #: mirage.py:1752 msgid "Open Remote" msgstr "" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "" #: mirage.py:1788 msgid "Open" msgstr "" #: mirage.py:1791 msgid "Images" msgstr "" #: mirage.py:1795 msgid "All files" msgstr "" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "" #: mirage.py:1960 msgid "Cannot load image." msgstr "" #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 msgid "Scanning..." msgstr "" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "" #: mirage.py:1988 msgid "Batch" msgstr "" #: mirage.py:1989 msgid "Action" msgstr "" #: mirage.py:1990 msgid "Shortcut" msgstr "" #: mirage.py:2002 msgid "Add action" msgstr "" #: mirage.py:2006 msgid "Edit selected action." msgstr "" #: mirage.py:2010 msgid "Remove selected action." msgstr "" #: mirage.py:2014 msgid "Move selected action up." msgstr "" #: mirage.py:2018 msgid "Move selected action down." msgstr "" #: mirage.py:2021 msgid "Parameters" msgstr "" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "" #: mirage.py:2021 msgid "File path" msgstr "" #: mirage.py:2021 msgid "File name without file extension" msgstr "" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "" #: mirage.py:2024 msgid "Operations" msgstr "" #: mirage.py:2024 msgid "Go to next image" msgstr "" #: mirage.py:2024 msgid "Go to previous image" msgstr "" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" #: mirage.py:2079 msgid "Add Custom Action" msgstr "" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "" #: mirage.py:2084 msgid "Action Name:" msgstr "" #: mirage.py:2086 msgid "Command:" msgstr "" #: mirage.py:2088 msgid "Shortcut:" msgstr "" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "" #: mirage.py:2229 msgid "Action Shortcut" msgstr "" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "" #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "" #: mirage.py:2297 msgid "Screenshot" msgstr "" #: mirage.py:2298 msgid "_Snap" msgstr "" #: mirage.py:2303 msgid "Location" msgstr "" #: mirage.py:2306 msgid "Entire screen" msgstr "" #: mirage.py:2307 msgid "Window under pointer" msgstr "" #: mirage.py:2312 msgid "Delay" msgstr "" #: mirage.py:2320 msgid " seconds" msgstr "" #: mirage.py:2388 msgid "File name:" msgstr "" #: mirage.py:2390 msgid "File modified:" msgstr "" #: mirage.py:2392 msgid "Dimensions:" msgstr "" #: mirage.py:2394 msgid "File size:" msgstr "" #: mirage.py:2396 msgid "File type:" msgstr "" #: mirage.py:2398 msgid "Transparency:" msgstr "" #: mirage.py:2400 msgid "Animation:" msgstr "" #: mirage.py:2402 msgid "Bits per sample:" msgstr "" #: mirage.py:2404 msgid "Channels:" msgstr "" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "" #: mirage.py:2473 msgid "Background color:" msgstr "" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "" #: mirage.py:2483 msgid "Simple background color:" msgstr "" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "" #: mirage.py:2495 msgid "Thumbnail size:" msgstr "" #: mirage.py:2522 msgid "Open Behavior" msgstr "" #: mirage.py:2525 msgid "Open new image in:" msgstr "" #: mirage.py:2527 msgid "Smart Mode" msgstr "" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "" #: mirage.py:2529 msgid "1:1 Mode" msgstr "" #: mirage.py:2530 msgid "Last Active Mode" msgstr "" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" #: mirage.py:2540 msgid "Use last chosen directory" msgstr "" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "" #: mirage.py:2542 msgid "Use this fixed directory:" msgstr "" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "" #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" #: mirage.py:2583 msgid "Wrap around imagelist:" msgstr "" #: mirage.py:2587 msgid "Prompt User" msgstr "" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "" #: mirage.py:2609 msgid "Delay between images in seconds:" msgstr "" #: mirage.py:2614 msgid "Randomize order of images" msgstr "" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" #: mirage.py:2639 msgid "Image Editing" msgstr "" #: mirage.py:2641 msgid "Confirm image delete" msgstr "" #: mirage.py:2645 msgid "Scaling quality:" msgstr "" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "" #: mirage.py:2648 msgid "Tiles" msgstr "" #: mirage.py:2649 msgid "Bilinear" msgstr "" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "" #: mirage.py:2656 msgid "Modified images:" msgstr "" #: mirage.py:2658 msgid "Ignore Changes" msgstr "" #: mirage.py:2659 msgid "Auto-Save" msgstr "" #: mirage.py:2660 msgid "Prompt For Action" msgstr "" #: mirage.py:2666 msgid "Quality to save in:" msgstr "" #: mirage.py:2688 msgid "Behavior" msgstr "" #: mirage.py:2691 msgid "Slideshow" msgstr "" #: mirage.py:2692 msgid "Image" msgstr "" #: mirage.py:2767 msgid "_Rename" msgstr "" #: mirage.py:2778 msgid "Enter the new name:" msgstr "" #: mirage.py:2810 #, python-format msgid "Unable to rename %s" msgstr "" #: mirage.py:2811 msgid "Unable to rename" msgstr "" #: mirage.py:2830 #, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "" #: mirage.py:2891 #, python-format msgid "Unable to delete %s" msgstr "" #: mirage.py:2892 msgid "Unable to delete" msgstr "" #: mirage.py:2900 msgid "Choose directory" msgstr "" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "" #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "" #: mirage.py:3298 msgid "C_rop" msgstr "" #: mirage.py:3340 mirage.py:3553 msgid "Width:" msgstr "" #: mirage.py:3347 mirage.py:3564 msgid "Height:" msgstr "" #: mirage.py:3493 msgid "Saturation" msgstr "" #: mirage.py:3494 msgid "_Saturate" msgstr "" #: mirage.py:3505 msgid "Saturation level:" msgstr "" #: mirage.py:3543 msgid "_Resize" msgstr "" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "" #: mirage.py:3717 msgid "Wrap?" msgstr "" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, python-format msgid "Loading: %s" msgstr "" #: mirage.py:4090 mirage.py:4142 #, python-format msgid "Preloading: %s" msgstr "" #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" mirage-0.9.5.1/po/pt_BR.po0000644000175000017500000005670111422310710014732 0ustar fredricfredric# 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: Mirage\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2008-03-27 18:15-0300\n" "Last-Translator: Danilo Martins \n" "Language-Team: Danilo Martins \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: Brazil\n" #: mirage.py:344 msgid "_File" msgstr "_Arquivo" #: mirage.py:345 msgid "_Edit" msgstr "_Editar" #: mirage.py:346 msgid "_View" msgstr "_Visualizar" #: mirage.py:347 msgid "_Go" msgstr "_Ir" #: mirage.py:348 msgid "_Help" msgstr "Aj_uda" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Ações Personalizadas" #: mirage.py:350 msgid "_Open Image..." msgstr "_Abrir Imagem..." #: mirage.py:350 msgid "Open Image" msgstr "Abrir Imagem" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "_Abrir Imagem Remota..." #: mirage.py:351 msgid "Open Remote Image" msgstr "Abrir Imagem Remota" #: mirage.py:352 msgid "Open _Folder..." msgstr "Abrir _Pasta" #: mirage.py:352 msgid "Open Folder" msgstr "Abrir Pasta" #: mirage.py:353 msgid "_Save Image" msgstr "_Salvar Imagem" #: mirage.py:353 msgid "Save Image" msgstr "Salvar Imagem" #: mirage.py:354 msgid "Save Image _As..." msgstr "Salvar Imagem _Como..." #: mirage.py:354 msgid "Save Image As" msgstr "Salvar Imagem Como" #: mirage.py:355 msgid "_Crop..." msgstr "_Recortar..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Recortar Imagem" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "Re_dimensionar" #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Redimensionar Imagem" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Saturação..." #: mirage.py:357 msgid "Modify saturation" msgstr "Modificar saturação" #: mirage.py:358 msgid "_Quit" msgstr "_Sair" #: mirage.py:358 msgid "Quit" msgstr "Sair" #: mirage.py:359 msgid "_Previous Image" msgstr "Imagem _Anterior" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Imagem Anterior" #: mirage.py:360 msgid "_Next Image" msgstr "_Próxima Imagem" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Próxima Imagem" #: mirage.py:361 msgid "_Previous" msgstr "_Anterior" #: mirage.py:361 msgid "Previous" msgstr "Anterior" #: mirage.py:362 msgid "_Next" msgstr "_Próxima" #: mirage.py:362 msgid "Next" msgstr "Próxima" #: mirage.py:363 msgid "_Random Image" msgstr "Imagem Aleató_ria" #: mirage.py:363 msgid "Random Image" msgstr "Imagem Aleatória" #: mirage.py:364 msgid "_First Image" msgstr "Pr_imeira Imagem" #: mirage.py:364 msgid "First Image" msgstr "Primeira Imagem" #: mirage.py:365 msgid "_Last Image" msgstr "Ú_ltima Imagem" #: mirage.py:365 msgid "Last Image" msgstr "Última Imagem" #: mirage.py:366 msgid "Zoom _In" msgstr "Aumentar _Zoom" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Aumentar Zoom" #: mirage.py:367 msgid "Zoom _Out" msgstr "Diminuir Z_oom" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Diminuir Zoom" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "Melhor A_juste" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Ajuste" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Girar para a _Esquerda" #: mirage.py:370 msgid "Rotate Left" msgstr "Girar para a Esquerda" #: mirage.py:371 msgid "Rotate _Right" msgstr "Girar para a _Direita" #: mirage.py:371 msgid "Rotate Right" msgstr "Girar para a Direita" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Inverter _Verticalmente" #: mirage.py:372 msgid "Flip Vertically" msgstr "Inverter Verticalmente" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Inverter _Horizontalmente" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Inverter Horizontalmente" #: mirage.py:374 msgid "_About" msgstr "_Sobre" #: mirage.py:374 msgid "About" msgstr "Sobre" #: mirage.py:375 msgid "_Contents" msgstr "_Conteúdos" #: mirage.py:375 msgid "Contents" msgstr "Conteúdos" #: mirage.py:376 msgid "_Preferences..." msgstr "_Preferências..." #: mirage.py:376 msgid "Preferences" msgstr "Preferências" #: mirage.py:377 msgid "_Full Screen" msgstr "_Tela Cheia" #: mirage.py:377 msgid "Full Screen" msgstr "Tela Cheia" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "Sai_r de Tela Cheia" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Sair de Tela Cheia" #: mirage.py:379 msgid "_Start Slideshow" msgstr "Iniciar Apresentação de _Slides" #: mirage.py:379 msgid "Start Slideshow" msgstr "Iniciar Apresentação de Slides" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "Parar Apresentação de _Slides" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Parar Apresentação de Slides" #: mirage.py:381 msgid "_Delete..." msgstr "_Excluir..." #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Excluir Imagem" #: mirage.py:382 msgid "Re_name..." msgstr "Re_nomear..." #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Renomear Imagem" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "Ca_ptura de Tela..." #: mirage.py:383 msgid "Take Screenshot" msgstr "Captura de Tela" #: mirage.py:384 msgid "_Properties..." msgstr "_Propriedades" #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Propriedades" #: mirage.py:385 msgid "_Configure..." msgstr "_Configurar..." #: mirage.py:385 msgid "Custom Actions" msgstr "Ações Personalizadas" #: mirage.py:409 msgid "_Status Bar" msgstr "Barra de _Status" #: mirage.py:409 msgid "Status Bar" msgstr "Barra de Status" #: mirage.py:410 msgid "_Toolbar" msgstr "Barra de _Ferramentas" #: mirage.py:410 msgid "Toolbar" msgstr "Barra de Ferramentas" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Painel de Miniaturas" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Painel de Miniaturas" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Ação" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Código de retorno da ação: %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Por favor especifique um comando válido em Editar > Ações Personalizadas" #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Ação Personalizada Inválida" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Versão: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Website: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Uso: mirage [OPÇÃO]... ARQUIVOS|PASTAS..." #: mirage.py:1397 msgid "Options" msgstr "Opções" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Mostrar esta ajuda e sair" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Mostrar informações de versão e sair" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Mostrar informações mais detalhadas" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Recursivamente incluir todas as imagens encontradas" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "subdiretórios de PASTAS" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Iniciar em modo de apresentação de slides" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Inicar em modo de tela cheia" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Executar 'cmd' quando uma imagem for carregada" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(usa a mesma sintaxe das ações personalizadas," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "i.e. mirage -o 'echo file is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Salvar Como" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Salvar" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Impossível salvar " #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "A imagem atual foi modificada. Salvar mudanças?" #: mirage.py:1714 msgid "Save?" msgstr "Salvar?" #: mirage.py:1752 msgid "Open Remote" msgstr "Abrir Remoto" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "Localização da Imagem (URL)" #: mirage.py:1788 msgid "Open" msgstr "Abrir" #: mirage.py:1791 msgid "Images" msgstr "Imagens" #: mirage.py:1795 msgid "All files" msgstr "Todos os arquivos" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Incluir imagens em subdiretórios" #: mirage.py:1960 msgid "Cannot load image." msgstr "Não foi possível carregar imagem." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Escaneando" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Configurando Ações Personalizadas" #: mirage.py:1988 msgid "Batch" msgstr "Grupo" #: mirage.py:1989 msgid "Action" msgstr "Ação" #: mirage.py:1990 msgid "Shortcut" msgstr "Atalho" #: mirage.py:2002 msgid "Add action" msgstr "Adicionar ação" #: mirage.py:2006 msgid "Edit selected action." msgstr "Editar ação selecionada." #: mirage.py:2010 msgid "Remove selected action." msgstr "Remover ação selecionada." #: mirage.py:2014 msgid "Move selected action up." msgstr "Mover ação selecionada para cima." #: mirage.py:2018 msgid "Move selected action down." msgstr "Mover ação selecionada para baixo." #: mirage.py:2021 msgid "Parameters" msgstr "Parâmetros" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Caminho, nome e extensão do arquivo" #: mirage.py:2021 msgid "File path" msgstr "Caminho do arquivo" #: mirage.py:2021 msgid "File name without file extension" msgstr "Nome do arquivo sem extensão" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Extensão do arquivo (ex. \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Lista de arquivos, separada por espaços" #: mirage.py:2024 msgid "Operations" msgstr "Operações" #: mirage.py:2024 msgid "Go to next image" msgstr "Ir para a próxima imagem" #: mirage.py:2024 msgid "Go to previous image" msgstr "Ir para imagem anterior" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Aqui você pode definir ações personalizadas com atalhos. Ações usam as " "operações e parâmetros embutidos listados abaixo e pode ter múltiplas " "declarações separadas por ponto e vírgula. Ações agrupadas são aplicadas a " "todas as imagens na lista." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Adicionar Ação Personalizada" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Editar Ação Personalizada" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Nome da Ação" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Comando" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Atalho" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Executar ação em todas as imagens (Grupo)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Ação personalizada incompleta especificada." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Atalho de Ação" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Pressione o atalho desejado para a ação." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Atalho Inválido" #: mirage.py:2297 msgid "Screenshot" msgstr "Captura de Tela" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "Snap" #: mirage.py:2303 msgid "Location" msgstr "Localizaçào" #: mirage.py:2306 msgid "Entire screen" msgstr "Tela inteira" #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "Janela sob o cursor do mouse" #: mirage.py:2312 msgid "Delay" msgstr "Atraso" #: mirage.py:2320 msgid " seconds" msgstr " segundos" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Nome do arquivo" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Nome do arquivo" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Dimensões" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Tamanho do arquivo" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Tipo do arquivo" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Transparência" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animação" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bits por amostragem" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Canais" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Sim" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Não" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Preferências do Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interface" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Cor de fundo" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Configura a cor de fundo para a aplicação" #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Cor de fundo" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Abrir Mirage em modo de tela cheia" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Tamanho da miniatura" #: mirage.py:2522 msgid "Open Behavior" msgstr "Comportamento de Abertura" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Abrir nova imagem em" #: mirage.py:2527 msgid "Smart Mode" msgstr "Modo Inteligente" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Modo de Melhor Ajuste" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Modo 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Último Modo Usado" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Carregar todas as imagens no diretório atual" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Se habilitado, ao abrir uma imagem no Mirage todas as imagens no diretório " "serão automaticamente carregadas." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Permitir abertura de arquivos ocultos" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Se marcado, durante a abertura o Mirage irá abrir arquivos ocultos. Caso " "contrário, arquivos ocultos serão ignorados." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Use o último diretório escolhido" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "O diretório de 'Abertura' padrão será o último diretório usado." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Use este diretório fixo" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "O diretório de 'Abertura' padrão será este diretório especificado." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navegação" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Precarregar imagens para navegação mais rápida" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Se habilitado, a próxima imagem e a imagem anterior na lista será pré-" "carregada durante o tempo ocioso. Note que a o aumento de velocidade vem ao " "custo de uso de memória, então é recomendado que se desabilite esta opção em " "máquinas com memória limitada." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Lista rotativa" #: mirage.py:2587 msgid "Prompt User" msgstr "Perguntar ao Usuário" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Modo de Apresentação de Slide" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Intervalo entre imagens" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Embaralhar lista de imagens" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Se habilitado, uma imagem aleatória será escolhida durante apresentação de " "imagem (sem repetir imagens)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Desabilitar proteção de tela em mode de apresentação de slides" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" "Se habilitado, xscreensaver será temporariamente desabilitada durante modo " "de apresentação de slides." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Sempre iniciar em modo de tela cheia" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Se habilitado, ao iniciar uma apresentação de slides a aplicação irá para " "modo de tela cheia." #: mirage.py:2639 msgid "Image Editing" msgstr "Edição de Imagens" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Confirmar exclusão de imagens" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Qualidade de Escala" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Nearest (Mais rápido)" #: mirage.py:2648 msgid "Tiles" msgstr "Tiles" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilinear" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Melhor)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Imagens modificadas" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignorar Mudanças" #: mirage.py:2659 msgid "Auto-Save" msgstr "Auto-Salvar" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Perguntar por Ação" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Impossível salvar " #: mirage.py:2688 msgid "Behavior" msgstr "Comportamento" #: mirage.py:2691 msgid "Slideshow" msgstr "Apresentação de Slides" #: mirage.py:2692 msgid "Image" msgstr "Imagem" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Renomear" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Digite o novo nome" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Incapaz de renomear" #: mirage.py:2811 msgid "Unable to rename" msgstr "Incapaz de renomear" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Tem certeza que quer excluir permanentemente" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Impossível excluir" #: mirage.py:2892 msgid "Unable to delete" msgstr "Impossível excluir" #: mirage.py:2900 msgid "Choose directory" msgstr "Escolher diretório" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Um Visualizador de Imagens Veloz em GTK+." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Incapaz de executar um navegador apropriado." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Recortar" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Largura" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Altura" #: mirage.py:3493 msgid "Saturation" msgstr "Saturação" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Saturar" #: mirage.py:3505 msgid "Saturation level:" msgstr "Nível de saturação:" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Redimensionar" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pixels" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Preservar proporção" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "Você está vendo a primeira imagem da lista. Ir para a última imagem?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "Você está vendo a última imagem da lista. Ir para a primeira imagem?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Todas as imagens foram visualizadas. Quer ver as imagens novamente? " #: mirage.py:3717 msgid "Wrap?" msgstr "Rodar?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Carregando" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Precarregando" #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "Pulando" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "Ações _Personalizadas" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Tela Cheia" #~ msgid "_Thumbnails Pane" #~ msgstr "Painel de Mina_turas" #~ msgid "Unable to launch" #~ msgstr "Incapaz de executar" #~ msgid "The" #~ msgstr "O" #~ msgid "Custom actions" #~ msgstr "Ações Personalizadas" #~ msgid "of" #~ msgstr "de" #~ msgid "The shortcut " #~ msgstr "O atalho " #~ msgid " is already used for " #~ msgstr " já está sendo usado para " #~ msgid "Found" #~ msgstr "Encontrado" #~ msgid "seconds" #~ msgstr "segundos" #~ msgid "File date" #~ msgstr "Data do arquivo" mirage-0.9.5.1/po/nl.po0000644000175000017500000005661311422310710014337 0ustar fredricfredric# 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: Mirage 0.9.5 (rev295)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2010-07-23 11:52+0100\n" "Last-Translator: Pascal De Vuyst \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: mirage.py:344 msgid "_File" msgstr "_Bestand" #: mirage.py:345 msgid "_Edit" msgstr "Be_werken" #: mirage.py:346 msgid "_View" msgstr "Bee_ld" #: mirage.py:347 msgid "_Go" msgstr "_Ga" #: mirage.py:348 msgid "_Help" msgstr "_Help" #: mirage.py:349 msgid "Custom _Actions" msgstr "Aangepaste _acties" #: mirage.py:350 msgid "_Open Image..." msgstr "Afbeelding _openen..." #: mirage.py:350 msgid "Open Image" msgstr "Afbeelding openen" #: mirage.py:351 msgid "Open _Remote image..." msgstr "Afbeelding op a_fstand openen..." #: mirage.py:351 msgid "Open Remote Image" msgstr "Afbeelding op afstand openen" #: mirage.py:352 msgid "Open _Folder..." msgstr "_Map openen..." #: mirage.py:352 msgid "Open Folder" msgstr "Map openen" #: mirage.py:353 msgid "_Save Image" msgstr "Afbeelding op_slaan" #: mirage.py:353 msgid "Save Image" msgstr "Afbeelding opslaan" #: mirage.py:354 msgid "Save Image _As..." msgstr "Afbeelding opslaan a_ls..." #: mirage.py:354 msgid "Save Image As" msgstr "Afbeelding opslaan als" #: mirage.py:355 msgid "_Crop..." msgstr "_Bijsnijden..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Afbeelding bijsnijden" #: mirage.py:356 msgid "R_esize..." msgstr "_Schalen..." #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Afbeelding schalen" #: mirage.py:357 msgid "_Saturation..." msgstr "Ver_zadiging..." #: mirage.py:357 msgid "Modify saturation" msgstr "Verzadiging aanpassen" #: mirage.py:358 msgid "_Quit" msgstr "_Afsluiten" #: mirage.py:358 msgid "Quit" msgstr "Afsluiten" #: mirage.py:359 msgid "_Previous Image" msgstr "Vo_rige afbeelding" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Vorige afbeelding" #: mirage.py:360 msgid "_Next Image" msgstr "Vol_gende afbeelding" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Volgende afbeelding" #: mirage.py:361 msgid "_Previous" msgstr "Vo_rige" #: mirage.py:361 msgid "Previous" msgstr "Vorige" #: mirage.py:362 msgid "_Next" msgstr "Vol_gende" #: mirage.py:362 msgid "Next" msgstr "Volgende" #: mirage.py:363 msgid "_Random Image" msgstr "_Willekeurige afbeelding" #: mirage.py:363 msgid "Random Image" msgstr "Willekeurige afbeelding" #: mirage.py:364 msgid "_First Image" msgstr "_Eerste afbeelding" #: mirage.py:364 msgid "First Image" msgstr "Eerste afbeelding" #: mirage.py:365 msgid "_Last Image" msgstr "_Laatste afbeelding" #: mirage.py:365 msgid "Last Image" msgstr "Laatste afbeelding" #: mirage.py:366 msgid "Zoom _In" msgstr "_Inzoomen" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Inzoomen" #: mirage.py:367 msgid "Zoom _Out" msgstr "_Uitzoomen" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Uitzoomen" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "_Passend zoomen" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Passend" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "_Links draaien" #: mirage.py:370 msgid "Rotate Left" msgstr "Links draaien" #: mirage.py:371 msgid "Rotate _Right" msgstr "_Rechts draaien" #: mirage.py:371 msgid "Rotate Right" msgstr "Rechts draaien" #: mirage.py:372 msgid "Flip _Vertically" msgstr "_Verticaal spiegelen" #: mirage.py:372 msgid "Flip Vertically" msgstr "_Verticaal spiegelen" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "_Horizontaal spiegelen" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Horizontaal spiegelen" #: mirage.py:374 msgid "_About" msgstr "_Over" #: mirage.py:374 msgid "About" msgstr "Over" #: mirage.py:375 msgid "_Contents" msgstr "_Inhoudstafel" #: mirage.py:375 msgid "Contents" msgstr "Inhoudstafel" #: mirage.py:376 msgid "_Preferences..." msgstr "Voor_keuren..." #: mirage.py:376 msgid "Preferences" msgstr "Voorkeuren" #: mirage.py:377 msgid "_Full Screen" msgstr "_Volledig scherm" #: mirage.py:377 msgid "Full Screen" msgstr "Volledig scherm" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "Volledig scherm _verlaten" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Volledig scherm verlaten" #: mirage.py:379 msgid "_Start Slideshow" msgstr "Diavoorstelling _starten" #: mirage.py:379 msgid "Start Slideshow" msgstr "Diavoorstelling starten" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "Diavoorstelling _stoppen" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Diavoorstelling stoppen" #: mirage.py:381 msgid "_Delete..." msgstr "Ver_wijderen..." #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Afbeelding verwijderen" #: mirage.py:382 msgid "Re_name..." msgstr "Her_noemen..." #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Afbeelding hernoemen" #: mirage.py:383 msgid "_Take Screenshot..." msgstr "Screenshot _nemen..." #: mirage.py:383 msgid "Take Screenshot" msgstr "Screenshot nemen" #: mirage.py:384 msgid "_Properties..." msgstr "_Eigenschappen..." #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Eigenschappen" #: mirage.py:385 msgid "_Configure..." msgstr "_Instellen..." #: mirage.py:385 msgid "Custom Actions" msgstr "Aangepaste acties" #: mirage.py:409 msgid "_Status Bar" msgstr "_Statusbalk" #: mirage.py:409 msgid "Status Bar" msgstr "Statusbalk" #: mirage.py:410 msgid "_Toolbar" msgstr "_Werkbalk" #: mirage.py:410 msgid "Toolbar" msgstr "Werkbalk" #: mirage.py:411 msgid "Thumbnails _Pane" msgstr "_Miniatuurweergave paneel" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Miniatuurweergave paneel" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "Kon de afbeelding %s niet vinden. Controleer a.u.b uw installatie." #: mirage.py:1257 #, python-format msgid "Action: %s" msgstr "Actie: %s" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Actie return code: %s" #: mirage.py:1262 #, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Kan \"%s\" niet uitvoeren. Stel a.u.b. een geldig commando in onder Bewerken " "> Aangepaste acties." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Ongeldige aangepaste actie" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Versie: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Website: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Gebruik: mirage [OPTIE]... BESTANDEN|MAPPEN..." #: mirage.py:1397 msgid "Options" msgstr "Opties" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Toon deze help en beëindig" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Toon versie-informatie en beëindig" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Toon meer gedetailleerde informatie" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Alle afbeeldingen gevonden in submappen" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "van MAPPEN recursief toevoegen" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Start in diavoorstellingsmodus" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Start in volledig scherm modus" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "'cmd' uitvoeren wanneer een afbeelding wordt" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "geladen (gebruikt dezelfde syntax als aangepaste " #: mirage.py:1407 msgid "i.e. mirage -o 'echo file is %F'" msgstr "acties, bvb. mirage -o 'echo bestand is %F')" #: mirage.py:1641 msgid "Save As" msgstr "Opslaan als" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" "Het formaat %s is niet ondersteund voor opslaan. Wilt u het bestand in een " "ander formaat opslaan?" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Opslaan" #: mirage.py:1693 #, python-format msgid "Unable to save %s" msgstr "Kan %s niet opslaan" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "De huidige afbeelding is gewijzigd. Wijzigingen opslaan?" #: mirage.py:1714 msgid "Save?" msgstr "Opslaan?" #: mirage.py:1752 msgid "Open Remote" msgstr "Op afstand openen" #: mirage.py:1757 msgid "Image Location (URL):" msgstr "Afbeeldingslocatie (URL):" #: mirage.py:1788 msgid "Open" msgstr "Openen" #: mirage.py:1791 msgid "Images" msgstr "Afbeeldingen" #: mirage.py:1795 msgid "All files" msgstr "Alle bestanden" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Afbeeldingen in submappen openen" #: mirage.py:1960 msgid "Cannot load image." msgstr "Kan afbeelding niet laden." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "Aangepaste acties: %(current)i van %(total)i" #: mirage.py:1966 msgid "Scanning..." msgstr "Scannen..." #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Configureer aangepaste acties" #: mirage.py:1988 msgid "Batch" msgstr "Batch" #: mirage.py:1989 msgid "Action" msgstr "Actie" #: mirage.py:1990 msgid "Shortcut" msgstr "Sneltoets" #: mirage.py:2002 msgid "Add action" msgstr "Actie toevoegen" #: mirage.py:2006 msgid "Edit selected action." msgstr "Geselecteerde actie bewerken." #: mirage.py:2010 msgid "Remove selected action." msgstr "Geselecteerde actie verwijderen." #: mirage.py:2014 msgid "Move selected action up." msgstr "Verplaats geselecteerde actie naar omhoog." #: mirage.py:2018 msgid "Move selected action down." msgstr "Verplaats geselecteerde actie naar omlaag." #: mirage.py:2021 msgid "Parameters" msgstr "Parameters" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Bestandspad, -naam en -extensie" #: mirage.py:2021 msgid "File path" msgstr "Bestandspad" #: mirage.py:2021 msgid "File name without file extension" msgstr "Bestandsnaam zonder bestandsextensie" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Bestandsextensie (bvb. \"png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Bestandslijst, gescheiden door spaties" #: mirage.py:2024 msgid "Operations" msgstr "Bewerkingen" #: mirage.py:2024 msgid "Go to next image" msgstr "Ga naar volgende afbeelding" #: mirage.py:2024 msgid "Go to previous image" msgstr "Ga naar vorige afbeelding" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Hier kan u aangepaste acties met sneltoetsen definiëren. Acties gebruiken de " "hieronder weergeven ingebouwde parameters en bewerkingen, en kunnen meerdere " "statements gescheiden door puntkomma's bevatten. Batch acties zijn van " "toepassing op alle afbeeldingen in de lijst." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Aangepaste actie toevoegen" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Aangepaste actie bewerken" #: mirage.py:2084 msgid "Action Name:" msgstr "Actienaam:" #: mirage.py:2086 msgid "Command:" msgstr "Commando:" #: mirage.py:2088 msgid "Shortcut:" msgstr "Sneltoets:" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Actie toepassen op alle afbeeldingen (batch)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" "[PREV] en [NEXT] zijn enkel geldig op zichzelf of op het einde van een " "commando" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Onvolledige aangepaste actie gespecifieerd." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Actie sneltoets" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Druk de gewenste sneltoets voor de actie." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "De sneltoets '%(shortcut)s' is al gebruikt voor '%(key)s'." #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Ongeldige sneltoets" #: mirage.py:2297 msgid "Screenshot" msgstr "Screenshot" #: mirage.py:2298 msgid "_Snap" msgstr "_Nemen" #: mirage.py:2303 msgid "Location" msgstr "Gebied" #: mirage.py:2306 msgid "Entire screen" msgstr "Volledig scherm" #: mirage.py:2307 msgid "Window under pointer" msgstr "Venster onder de muiscursor" #: mirage.py:2312 msgid "Delay" msgstr "Vertraging" #: mirage.py:2320 msgid " seconds" msgstr " seconden" #: mirage.py:2388 msgid "File name:" msgstr "Bestandsnaam:" #: mirage.py:2390 msgid "File modified:" msgstr "Bestand gewijzigd:" #: mirage.py:2392 msgid "Dimensions:" msgstr "Afmetingen:" #: mirage.py:2394 msgid "File size:" msgstr "Bestandsgrootte:" #: mirage.py:2396 msgid "File type:" msgstr "Bestandstype:" #: mirage.py:2398 msgid "Transparency:" msgstr "Transparantie:" #: mirage.py:2400 msgid "Animation:" msgstr "Animatie:" #: mirage.py:2402 msgid "Bits per sample:" msgstr "Bits per sample:" #: mirage.py:2404 msgid "Channels:" msgstr "Kanalen:" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Ja" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Nee" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Mirage voorkeuren" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interface" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Achtergrondkleur:" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Stelt de achtergrondkleur van de toepassing in." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Achtergrondkleur:" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Open Mirage in volledig scherm modus" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Grootte miniatuurweergave:" #: mirage.py:2522 msgid "Open Behavior" msgstr "Gedrag bij openen" #: mirage.py:2525 msgid "Open new image in:" msgstr "Open nieuwe afbeelding in:" #: mirage.py:2527 msgid "Smart Mode" msgstr "Slimme modus" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Passend zoomen modus" #: mirage.py:2529 msgid "1:1 Mode" msgstr "1:1 modus" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Laatste actieve modus" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Alle afbeeldingen in de huidige map laden" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Indien geactiveerd zal 'Afbeelding openen' in Mirage automatisch alle " "afbeeldingen in de map van die afbeelding laden." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Toelaten om verborgen bestanden te laden" #: mirage.py:2538 msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Indien aangevinkt dan zal Mirage verborgen bestanden openen. Anders zullen " "verborgen bestanden worden genegeerd." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Gebruik laatst gekozen map" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "De laatst gebruikte map als standaardmap voor openen gebruiken." #: mirage.py:2542 msgid "Use this fixed directory:" msgstr "Gebruik deze vaste map:" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "De gespecifieerde map als standaardmap voor openen gebruiken." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigatie" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Afbeeldingen voorladen voor snellere navigatie" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Indien geactiveerd dan zullen de volgende en vorige afbeeldingen in de lijst " "worden voorgeladen gedurende niet-benutte tijd. Merk op dat de geboekte " "snelheidswinst ten koste gaat van het geheugengebruik, het is aangeraden om " "deze optie uit te schakelen op machines met beperkt geheugen." #: mirage.py:2583 msgid "Wrap around imagelist:" msgstr "Doorlopen bij afbeeldingslijst:" #: mirage.py:2587 msgid "Prompt User" msgstr "Gebruiker vragen" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Diavoorstelling" #: mirage.py:2609 msgid "Delay between images in seconds:" msgstr "Vertraging tussen afbeeldingen in seconden:" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Afbeeldigen in willekeurige volgorde" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Indien geactiveerd dan zal een willekeurige afbeelding worden gekozen " "tijdens diavoorstellingsmodus (zonder de afbeelding tweemaal te laden)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Schermbeveiliging in diavoorstellingsmodus uitschakelen" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" "Indien geactiveerd dan zal xscreensaver tijdelijk worden uitgeschakeld " "tijdens diavoorstellingsmodus." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Altijd in volledig scherm modus starten" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Indien geactiveerd dan zal het starten van een diavoorstelling de toepassing " "in volledige scherm modus plaatsen." #: mirage.py:2639 msgid "Image Editing" msgstr "Afbeelding bewerken" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Verwijderen van afbeeldingen bevestigen" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Schaalkwaliteit:" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Dichtse benadering (snelst)" #: mirage.py:2648 msgid "Tiles" msgstr "Tegels" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilinear" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (best)" #: mirage.py:2656 msgid "Modified images:" msgstr "Gewijzigde afbeeldingen:" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Wijzigingen negeren" #: mirage.py:2659 msgid "Auto-Save" msgstr "Automatisch opslaan" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Vragen wat er dient te gebeuren" #: mirage.py:2666 msgid "Quality to save in:" msgstr "Opslaan in kwaliteit:" #: mirage.py:2688 msgid "Behavior" msgstr "Gedrag" #: mirage.py:2691 msgid "Slideshow" msgstr "Diavoorstelling" #: mirage.py:2692 msgid "Image" msgstr "Afbeelding" #: mirage.py:2767 msgid "_Rename" msgstr "_Hernoemen" #: mirage.py:2778 msgid "Enter the new name:" msgstr "Geef de nieuwe naam:" #: mirage.py:2810 #, python-format msgid "Unable to rename %s" msgstr "Kan %s niet hernoemen" #: mirage.py:2811 msgid "Unable to rename" msgstr "Kan niet hernoemen" #: mirage.py:2830 #, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Bent u zeker dat u %s definitief wilt verwijderen?" #: mirage.py:2891 #, python-format msgid "Unable to delete %s" msgstr "Kan %s niet verwijderen" #: mirage.py:2892 msgid "Unable to delete" msgstr "Kan niet verwijderen" #: mirage.py:2900 msgid "Choose directory" msgstr "Kies map" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Een snel GTK+ afbeeldingsweergaveprogramma." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Kan geen geschikte browser starten." #: mirage.py:3298 msgid "C_rop" msgstr "_Bijsnijden" #: mirage.py:3340 mirage.py:3553 msgid "Width:" msgstr "Breedte:" #: mirage.py:3347 mirage.py:3564 msgid "Height:" msgstr "Hoogte:" #: mirage.py:3493 msgid "Saturation" msgstr "Verzadiging" #: mirage.py:3494 msgid "_Saturate" msgstr "_Verzadigen" #: mirage.py:3505 msgid "Saturation level:" msgstr "Verzadigingsniveau:" #: mirage.py:3543 msgid "_Resize" msgstr "_Schalen" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pixels" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Verhouding behouden" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "U bekijkt de eerste afbeelding in de lijst. Doorlopen naar de laatste " "afbeelding?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "U bekijkt de laatste afbeelding in de lijst. Doorlopen naar de eerste " "afbeelding?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "" "Alle afbeeldingen zijn bekeken. Wilt u de afbeeldingen opnieuw doorlopen?" #: mirage.py:3717 msgid "Wrap?" msgstr "Doorgaan?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, python-format msgid "Loading: %s" msgstr "Laden: %s" #: mirage.py:4090 mirage.py:4142 #, python-format msgid "Preloading: %s" msgstr "Voorladen: %s" #: mirage.py:4213 mirage.py:4393 #, python-format msgid "Skipping: %s" msgstr "Overslaan: %s" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "Gevonden: %(item)s [%(number)i]" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "Gevonden: %(fullpath)s [%(number)i]" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "[%(current)i van %(total)i]" #~ msgid "Use Numerical aware sort" #~ msgstr "Gebruik numeriekbewuste sortering" #~ msgid "" #~ "If checked, Mirage will sort the images based on a numerical aware sort." #~ msgstr "Indien aangevinkt zal Mirage de afbeeldingen numeriek sorteren." #~ msgid "Casesensitive sort" #~ msgstr "Hoofdlettergevoelige sortering" #~ msgid "If checked, a case-sensitive sort will be used" #~ msgstr "" #~ "Indien aangevinkt zal een hoofdlettergevoelige sortering gebruikt worden" mirage-0.9.5.1/po/pl.po0000644000175000017500000006325011422310710014334 0ustar fredricfredric# Polish translation of PACKAGE. # Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Tomasz Dominikowski , 2006. # # msgid "" msgstr "" "Project-Id-Version: Mirage\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2007-11-26 14:25+0100\n" "Last-Translator: Tomasz Dominikowski \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: Poland\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: mirage.py:344 msgid "_File" msgstr "_Plik" #: mirage.py:345 msgid "_Edit" msgstr "M_odyfikuj" #: mirage.py:346 msgid "_View" msgstr "_Widok" #: mirage.py:347 msgid "_Go" msgstr "_Idź" #: mirage.py:348 msgid "_Help" msgstr "Pomo_c" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Własne działania" #: mirage.py:350 msgid "_Open Image..." msgstr "_Otwórz obraz..." #: mirage.py:350 msgid "Open Image" msgstr "Otwórz obraz..." #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "Otwórz _zdalny obraz..." #: mirage.py:351 msgid "Open Remote Image" msgstr "Otwarcie zdalnego obrazu" #: mirage.py:352 msgid "Open _Folder..." msgstr "Otwórz _folder..." #: mirage.py:352 msgid "Open Folder" msgstr "Otwórz folder..." #: mirage.py:353 msgid "_Save Image" msgstr "Zapi_sz obraz" #: mirage.py:353 msgid "Save Image" msgstr "Zapisz obraz" #: mirage.py:354 msgid "Save Image _As..." msgstr "Z_apisz obraz jako..." #: mirage.py:354 msgid "Save Image As" msgstr "Zapisz obraz jako" #: mirage.py:355 msgid "_Crop..." msgstr "Prz_ytnij..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Przytnij obraz" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "_Zmień rozmiar..." #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Zmień rozmiar obrazu" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Nasycenie..." #: mirage.py:357 msgid "Modify saturation" msgstr "Zmień nasycenie" #: mirage.py:358 msgid "_Quit" msgstr "Za_kończ" #: mirage.py:358 msgid "Quit" msgstr "Zakończ" #: mirage.py:359 msgid "_Previous Image" msgstr "P_oprzedni obraz" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Poprzedni obraz" #: mirage.py:360 msgid "_Next Image" msgstr "_Następny obraz" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Następny obraz" #: mirage.py:361 msgid "_Previous" msgstr "P_oprzedni" #: mirage.py:361 msgid "Previous" msgstr "Poprzedni" #: mirage.py:362 msgid "_Next" msgstr "_Następny" #: mirage.py:362 msgid "Next" msgstr "Następny" #: mirage.py:363 msgid "_Random Image" msgstr "_Losowy obraz" #: mirage.py:363 msgid "Random Image" msgstr "Losowy obraz" #: mirage.py:364 msgid "_First Image" msgstr "P_ierwszy obraz" #: mirage.py:364 msgid "First Image" msgstr "Pierwszy obraz" #: mirage.py:365 msgid "_Last Image" msgstr "O_statni obraz" #: mirage.py:365 msgid "Last Image" msgstr "Ostatni obraz" #: mirage.py:366 msgid "Zoom _In" msgstr "P_rzybliż" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Przybliż" #: mirage.py:367 msgid "Zoom _Out" msgstr "O_ddal" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Oddal" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "D_opasuj do okna" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Dopasuj" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Obróć w _lewo" #: mirage.py:370 msgid "Rotate Left" msgstr "Obróć w_lewo" #: mirage.py:371 msgid "Rotate _Right" msgstr "Obróć w p_rawo" #: mirage.py:371 msgid "Rotate Right" msgstr "Obróć w prawo" #: mirage.py:372 msgid "Flip _Vertically" msgstr "Odbij w p_ionie" #: mirage.py:372 msgid "Flip Vertically" msgstr "Odbij w pionie" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "Odbij w p_oziomie" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Odbij w poziomie" #: mirage.py:374 msgid "_About" msgstr "_O programie" #: mirage.py:374 msgid "About" msgstr "O programie" #: mirage.py:375 msgid "_Contents" msgstr "_Zawartość" #: mirage.py:375 msgid "Contents" msgstr "Zawartość" #: mirage.py:376 msgid "_Preferences..." msgstr "_Preferencje..." #: mirage.py:376 msgid "Preferences" msgstr "Preferencje" #: mirage.py:377 msgid "_Full Screen" msgstr "_Pełny ekran" #: mirage.py:377 msgid "Full Screen" msgstr "Pełny ekran" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "_Opuść pełny ekran" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Opuść pełny ekran" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Rozpocznij pokaz slajdów" #: mirage.py:379 msgid "Start Slideshow" msgstr "Rozpocznij pokaz slajdów" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Zatrzymaj pokaz slajdów" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Zatrzymaj pokaz slajdów" #: mirage.py:381 msgid "_Delete..." msgstr "_Usuń..." #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Następny obraz" #: mirage.py:382 msgid "Re_name..." msgstr "Zmi_eń nazwę..." #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Zmień nazwę obrazu" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "Pobranie zrzutu _ekranu..." #: mirage.py:383 msgid "Take Screenshot" msgstr "Pobierz zrzut ekranu" #: mirage.py:384 msgid "_Properties..." msgstr "_Właściwości..." #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Właściwości" #: mirage.py:385 msgid "_Configure..." msgstr "_Konfiguruj..." #: mirage.py:385 msgid "Custom Actions" msgstr "Własne działania" #: mirage.py:409 msgid "_Status Bar" msgstr "Pasek _stanu" #: mirage.py:409 msgid "Status Bar" msgstr "Pasek stanu" #: mirage.py:410 msgid "_Toolbar" msgstr "Pasek _narzędzi" #: mirage.py:410 msgid "Toolbar" msgstr "Pasek narzędzi" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Panel miniaturek" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Panel miniaturek" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Działanie" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Kod zwrotny działania: %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "Proszę wybrać odpowiednie polecenie z Modyfikuj > Własne działania." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Nieprawidłowe działanie własne" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Wersja: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Strona WWW: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Składnia: mirage [OPCJE]... PLIKI|FOLDERY..." #: mirage.py:1397 msgid "Options" msgstr "Opcje" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Wyświetlenie tego tekstu pomocy i zakończenie" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Wyświetlenie informacji o wersji i zakończenie" #: mirage.py:1400 msgid "Show more detailed information" msgstr "Wyświetlenie większej ilości informacji" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Dołącz rekursywnie wszystkie obrazy znalezione w" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "podkatalogach FOLDERÓW" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Uruchom w trybie pokazu slajdów" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Uruchamianie w trybie pełnoekranowym" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "Wykonaj 'polecenie' kiedy obraz zostanie wczytany" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(używa tej samej składni co własne działania," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "przykładowo mirage -o 'echo plik jest %F')" #: mirage.py:1641 msgid "Save As" msgstr "Zapisz jako" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Zapisz" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Zapis niemożliwy " #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "Bieżący obraz został zmodyfikowany. Zapisać zmiany?" #: mirage.py:1714 msgid "Save?" msgstr "Zapisać?" #: mirage.py:1752 msgid "Open Remote" msgstr "Otwarcie zdalnego" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "Położenie obrazu (URL)" #: mirage.py:1788 msgid "Open" msgstr "Otwórz" #: mirage.py:1791 msgid "Images" msgstr "Obrazy" #: mirage.py:1795 msgid "All files" msgstr "Wszystkie pliki" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Dołączaj obrazy w podkatalogach" #: mirage.py:1960 msgid "Cannot load image." msgstr "Nie można wczytać obrazu." #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Skanowanie" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Konfiguracja własnych działań" #: mirage.py:1988 msgid "Batch" msgstr "Przetwarzanie wsadowe" #: mirage.py:1989 msgid "Action" msgstr "Działanie" #: mirage.py:1990 msgid "Shortcut" msgstr "Skrót" #: mirage.py:2002 msgid "Add action" msgstr "Dodaj działanie" #: mirage.py:2006 msgid "Edit selected action." msgstr "Modyfikuj wybrane działanie." #: mirage.py:2010 msgid "Remove selected action." msgstr "Usuń wybrane działanie." #: mirage.py:2014 msgid "Move selected action up." msgstr "Przesuń wybrane działanie w górę." #: mirage.py:2018 msgid "Move selected action down." msgstr "Przesuń wybrane działanie w dół." #: mirage.py:2021 msgid "Parameters" msgstr "Parametry" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Ścieżka do pliku, nazwa i rozszerzenie" #: mirage.py:2021 msgid "File path" msgstr "Ścieżka do pliku" #: mirage.py:2021 msgid "File name without file extension" msgstr "Nazwa pliku bez rozszerzenia" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Rozszerzenie pliku (np. \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Lista plików, oddzielana spacjami" #: mirage.py:2024 msgid "Operations" msgstr "Operacje" #: mirage.py:2024 msgid "Go to next image" msgstr "Przejście do następnego obrazu" #: mirage.py:2024 msgid "Go to previous image" msgstr "Przejście do poprzedniego obrazu" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Tutaj można zdefiniować własne działania za pomocą skrótów. Działania " "wykorzystują wbudowane parametry i operacje wymienione poniżej i mogą " "zawierać wielokrotne deklaracje oddzielane średnikiem. Działania " "przetwarzania wsadowego są aplikowane na wszystkich obrazach na liście." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Dodaj własne działanie" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Modyfikuj własne działanie" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Nazwa działania" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Polecenie" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Skrót" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Wykonanie działania na wszystkich obrazach (przetwarzanie wsadowe)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Zdefiniowano niekompletne działanie własne." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Skrót do działania" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Proszę wykonać żądany skrót klawiaturowy dla tego działania." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Niepoprawny skrót" #: mirage.py:2297 msgid "Screenshot" msgstr "Zrzut ekranu" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "Pobierz" #: mirage.py:2303 msgid "Location" msgstr "Obszar" #: mirage.py:2306 msgid "Entire screen" msgstr "Cały ekran" #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "Okno pod wskaźnikiem kursora" #: mirage.py:2312 msgid "Delay" msgstr "Opóźnienie" #: mirage.py:2320 msgid " seconds" msgstr " sekund" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Nazwa pliku" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Nazwa pliku" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Rozmiary" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Rozmiar pliku" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Typ pliku" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Przezroczystość" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animacja" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bitów na próbkę" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Kanałów" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Tak" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Nie" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Preferencje Mirage" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Interfejs" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Kolor tła" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Ustawia kolor tła dla aplikacji." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Kolor tła" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Uruchamianie Mirage w trybie pełnoekranowym" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Rozmiar miniaturki" #: mirage.py:2522 msgid "Open Behavior" msgstr "Zachowanie podczas otwarcia" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Tryb przy otwarciu nowego obrazu" #: mirage.py:2527 msgid "Smart Mode" msgstr "Tryb inteligentny" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Tryb przybliżenia, aby dopasować" #: mirage.py:2529 msgid "1:1 Mode" msgstr "Tryb 1:1" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Ostatnio aktywny tryb" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Wstępne wczytywanie wszystkich obrazów w bieżącym katalogu" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Określa, czy otworzenie obrazu w Mirage automatycznie wczyta wstępnie " "wszystkie obrazy znalezione w katalogu z tym obrazem." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Wczytywanie ukrytych plików" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Jeśli zaznaczone, Mirage będzie otwierać ukryte pliki. Inaczej będą " "ignorowane." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Używanie ostatnio wybranego katalogu" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "Domyślnym katalogiem \"Otwórz\" będzie ostatnio otwarty katalog." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Używanie tego katalogu stałego" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Domyślny katalog \"Otwórz\" będzie tym określonym katalogiem." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Nawigacja" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Wstępne wczytywanie obrazów dla szybszej nawigacji" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Określa, czy następne i poprzednie obrazy na liście zostaną wstępnie " "wczytane w czasie bezczynności. Przyspieszenie działania zwiększa zużycie " "pamięci, wyłączenie tej funkcji jest zalecane dla komputerów z niewielką " "ilością pamięci RAM." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Zawijanie listy obrazów" #: mirage.py:2587 msgid "Prompt User" msgstr "Pytaj użytkownika" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Tryb pokazu slajdów" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Opóźnienie przed zmianą obrazu" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Losowanie kolejności obrazów" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Określa, czy podczas trybu pokazu slajdów obrazy będą wybierane losowo (bez " "wczytywania jakiegokolwiek obrazu dwukrotnie)." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Wyłączenie wygaszacza ekranu w trybie pokazu slajdów" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "Określa, czy xscreensaver zostanie wyłączony w trybie pokazu slajdów." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Uruchamianie w trybie pełnoekranowym" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Określa, czy uruchomienie pokazu slajdów przełączy aplikację w tryb " "pełnoekranowy." #: mirage.py:2639 msgid "Image Editing" msgstr "Modyfikowanie obrazów" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Potwierdzanie usunięcia obrazów" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Jakość skalowania" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Najbliższe sąsiedztwo (najszybsza)" #: mirage.py:2648 msgid "Tiles" msgstr "Kafelkowanie" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilinearna" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (najlepsza)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Zmodyfikowane obrazy" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Ignoruj zmiany" #: mirage.py:2659 msgid "Auto-Save" msgstr "Automatyczny zapis" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Pytaj użytkownika" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Zapis niemożliwy " #: mirage.py:2688 msgid "Behavior" msgstr "Zachowanie" #: mirage.py:2691 msgid "Slideshow" msgstr "Pokaz slajdów" #: mirage.py:2692 msgid "Image" msgstr "Obraz" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Zmiana nazwy" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Podaj nową nazwę" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Zmiana nazwy niemożliwa" #: mirage.py:2811 msgid "Unable to rename" msgstr "Zmiana nazwy niemożliwa" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Czy na pewno nieodwracalnie usunąć" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Usunięcie niemożliwe" #: mirage.py:2892 msgid "Unable to delete" msgstr "Usunięcie niemożliwe" #: mirage.py:2900 msgid "Choose directory" msgstr "Wybierz katalog" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Szybka przeglądarka obrazów GTK+." #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Uruchomienie odpowiedniej przeglądarki niemożliwe." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Przytnij" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Szerokość" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Wysokość" #: mirage.py:3493 msgid "Saturation" msgstr "Nasycenie" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Nasyć" #: mirage.py:3505 msgid "Saturation level:" msgstr "Poziom nasycenia:" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Zmień rozmiar" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "pikseli" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Zachowaj proporcje obrazu" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "" "Wyświetlanie pierwszego obrazu na liście. Zawinąć do ostatniego obrazu?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "" "Wyświetlanie ostatniego obrazu na liście. Zawinąć do pierwszego obrazu?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Wszystkie obrazy zostały wyświetlone. Rozpocząć pokaz od nowa?" #: mirage.py:3717 msgid "Wrap?" msgstr "Zawinąć?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Wczytywanie" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Wczytywanie wstępne" #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "Pomijanie" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "Własne _działania" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Pełny ekran" #~ msgid "_Thumbnails Pane" #~ msgstr "Panel minia_turek" #~ msgid "Unable to launch" #~ msgstr "Uruchomienie niemożliwe" #~ msgid "The" #~ msgstr " " #~ msgid "Custom actions" #~ msgstr "Własne działania" #~ msgid "of" #~ msgstr "z" #~ msgid "The shortcut " #~ msgstr "Skrót " #~ msgid " is already used for " #~ msgstr "jest już używany przez " #~ msgid "Found" #~ msgstr "Znaleziono" #~ msgid "seconds" #~ msgstr "sekund" #~ msgid "File date" #~ msgstr "Data pliku" #~ msgid "list" #~ msgstr "lista" #~ msgid "Custom _Actions..." #~ msgstr "Wł_asne czynności..." #~ msgid "Use mousewheel for imagelist navigation" #~ msgstr "Użyj kółka myszy do nawigacji na liście obrazów" #~ msgid "" #~ "If enabled, mousewheel-down (up) will go to the next (previous) image." #~ msgstr "" #~ "Określa, czy ruch w górę (dół) kółkiem myszy zmieni obraz na następny " #~ "(poprzedni)." #~ msgid "Do not ask again" #~ msgstr "Nie pytaj ponownie" #~ msgid "Open in _Editor" #~ msgstr "Otwórz w _edytorze" #~ msgid "Open in Editor" #~ msgstr "Otwórz w edytorze" #~ msgid " -h, --help Show this help and exit" #~ msgstr "" #~ " -h, --help Wyświetlenie tej pomocy i zakończenie" #~ msgid " -s, --slideshow Start in slideshow mode" #~ msgstr " -s, --slideshow Uruchom w trybie pokazu slajdów" #~ msgid " -f, --fullscreen Start in fullscreen mode" #~ msgstr " -f, --fullscreen Uruchom w trybie pełnoekranowym" #~ msgid "Zoom Quality" #~ msgstr "Jakość przybliżenia" #~ msgid "Fastest" #~ msgstr "Najszybsza" #~ msgid "Best" #~ msgstr "Najlepsza" #~ msgid "" #~ "Smart mode uses 1:1 for images smaller than the window and Fit To Window " #~ "for images larger." #~ msgstr "" #~ "Tryb inteligentny wyświetla obrazy 1:1, jeśli są mniejsze od okna, a " #~ "obrazy większe dopasowuje do jego rozmiaru." #~ msgid "External Image Editor" #~ msgstr "Zewnętrzny edytor obrazów" #~ msgid "" #~ "The application specified below is used as the default editor. It is " #~ "assumed to be in the user's PATH or can be explicitly set (e.g., \"/usr/" #~ "bin/gimp-remote\")." #~ msgstr "" #~ "Aplikacja określona poniżej jest używana jako domyślny edytor. Zakładana " #~ "jest jej obecność w PATH użytkownika, może być też określana pełną " #~ "ścieżką (np. \"/usr/bin/gimp-remote\")." #~ msgid "Editor" #~ msgstr "Edytor" #~ msgid "?" #~ msgstr "?" mirage-0.9.5.1/po/hu.po0000644000175000017500000005666511422310710014351 0ustar fredricfredric# translation of hu.po to hungarian # translation of PACKAGE. # Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # # Björn Martensen , 2006. # Lisovszki , 2008. msgid "" msgstr "" "Project-Id-Version: hu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-23 14:39+0200\n" "PO-Revision-Date: 2008-02-28 19:58+0100\n" "Last-Translator: Lisovszki \n" "Language-Team: hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" # livágás #: mirage.py:344 msgid "_File" msgstr "_Fájl" #: mirage.py:345 msgid "_Edit" msgstr "_Szerkesztés" #: mirage.py:346 msgid "_View" msgstr "_Nézet" #: mirage.py:347 msgid "_Go" msgstr "_Ugrás" #: mirage.py:348 msgid "_Help" msgstr "_Súgó" #: mirage.py:349 #, fuzzy msgid "Custom _Actions" msgstr "Egyéni műveletek" #: mirage.py:350 msgid "_Open Image..." msgstr "_Kép megnyitása..." #: mirage.py:350 msgid "Open Image" msgstr "Kép megnyitása" #: mirage.py:351 #, fuzzy msgid "Open _Remote image..." msgstr "_Távoli kép megnyitása" #: mirage.py:351 msgid "Open Remote Image" msgstr "Távoli kép megnyitása" #: mirage.py:352 msgid "Open _Folder..." msgstr "_Mappa megnyitása..." #: mirage.py:352 msgid "Open Folder" msgstr "Mappa megnyitása" #: mirage.py:353 msgid "_Save Image" msgstr "_Kép mentése" #: mirage.py:353 msgid "Save Image" msgstr "Kép mentése" #: mirage.py:354 msgid "Save Image _As..." msgstr "Kép mentése _mint..." #: mirage.py:354 msgid "Save Image As" msgstr "Mentés másként" #: mirage.py:355 msgid "_Crop..." msgstr "_Levágás..." #: mirage.py:355 mirage.py:3297 msgid "Crop Image" msgstr "Kép levágása" #: mirage.py:356 #, fuzzy msgid "R_esize..." msgstr "Át_méretezés..." #: mirage.py:356 mirage.py:3542 msgid "Resize Image" msgstr "Kép átméretezése" #: mirage.py:357 #, fuzzy msgid "_Saturation..." msgstr "Telítettség..." #: mirage.py:357 msgid "Modify saturation" msgstr "Telítettség módosítása" #: mirage.py:358 msgid "_Quit" msgstr "_Kilépés" #: mirage.py:358 msgid "Quit" msgstr "Kilépés" #: mirage.py:359 msgid "_Previous Image" msgstr "_Előző kép" #: mirage.py:359 mirage.py:399 mirage.py:401 mirage.py:403 msgid "Previous Image" msgstr "Előző kép" #: mirage.py:360 msgid "_Next Image" msgstr "_Következő kép" #: mirage.py:360 mirage.py:391 mirage.py:400 mirage.py:402 msgid "Next Image" msgstr "Következő kép" #: mirage.py:361 msgid "_Previous" msgstr "_Előző" #: mirage.py:361 msgid "Previous" msgstr "Előző" #: mirage.py:362 msgid "_Next" msgstr "_Következő" #: mirage.py:362 msgid "Next" msgstr "Következő" #: mirage.py:363 msgid "_Random Image" msgstr "_Véletlenszerű kép" #: mirage.py:363 msgid "Random Image" msgstr "Véletlen kép" #: mirage.py:364 msgid "_First Image" msgstr "_Első kép" #: mirage.py:364 msgid "First Image" msgstr "Első kép" #: mirage.py:365 msgid "_Last Image" msgstr "_Utolsó kép" #: mirage.py:365 msgid "Last Image" msgstr "Utolső kép" #: mirage.py:366 msgid "Zoom _In" msgstr "_Nagyítás" #: mirage.py:366 mirage.py:389 mirage.py:390 mirage.py:395 mirage.py:405 msgid "Zoom In" msgstr "Nagyítás" #: mirage.py:367 msgid "Zoom _Out" msgstr "_Kicsinyítés" #: mirage.py:367 mirage.py:388 mirage.py:394 mirage.py:406 msgid "Zoom Out" msgstr "Kicsinyítés" #: mirage.py:368 msgid "Zoom To _Fit" msgstr "Nagyítás _igazítás" #: mirage.py:368 mirage.py:392 mirage.py:396 msgid "Fit" msgstr "Igazítás" #: mirage.py:369 msgid "_1:1" msgstr "_1:1" #: mirage.py:369 mirage.py:393 mirage.py:397 mirage.py:404 msgid "1:1" msgstr "1:1" #: mirage.py:370 msgid "Rotate _Left" msgstr "Forgatás _balra" #: mirage.py:370 msgid "Rotate Left" msgstr "Forgatás balra" #: mirage.py:371 msgid "Rotate _Right" msgstr "Forgatás _jobbra" #: mirage.py:371 msgid "Rotate Right" msgstr "Forgatás jobbra" #: mirage.py:372 msgid "Flip _Vertically" msgstr "_Függőleges tükrözés" #: mirage.py:372 msgid "Flip Vertically" msgstr "Tükrözés függőlegesen" #: mirage.py:373 msgid "Flip _Horizontally" msgstr "_Vízszintes tükrözés" #: mirage.py:373 msgid "Flip Horizontally" msgstr "Tükrözés vízszintesen" #: mirage.py:374 msgid "_About" msgstr "_Névjegy" #: mirage.py:374 msgid "About" msgstr "Névjegy" #: mirage.py:375 msgid "_Contents" msgstr "_Tartalom" #: mirage.py:375 msgid "Contents" msgstr "Tartalom" #: mirage.py:376 msgid "_Preferences..." msgstr "_Beállítások..." #: mirage.py:376 msgid "Preferences" msgstr "Beállítások" #: mirage.py:377 msgid "_Full Screen" msgstr "_Teljes képernyő" #: mirage.py:377 msgid "Full Screen" msgstr "Teljes képernyő" #: mirage.py:378 msgid "E_xit Full Screen" msgstr "N_ormál képernyő" #: mirage.py:378 mirage.py:387 msgid "Exit Full Screen" msgstr "Normál képernyő" #: mirage.py:379 msgid "_Start Slideshow" msgstr "_Diavetítés" #: mirage.py:379 msgid "Start Slideshow" msgstr "Diavetítés" #: mirage.py:380 msgid "_Stop Slideshow" msgstr "_Diavetítés leállítása" #: mirage.py:380 msgid "Stop Slideshow" msgstr "Diavetítés leálítása" #: mirage.py:381 msgid "_Delete..." msgstr "_Törlés..." #: mirage.py:381 mirage.py:2828 msgid "Delete Image" msgstr "Kép törlése" #: mirage.py:382 msgid "Re_name..." msgstr "Át_nevezés..." #: mirage.py:382 mirage.py:2761 msgid "Rename Image" msgstr "Kép átnevezése" #: mirage.py:383 #, fuzzy msgid "_Take Screenshot..." msgstr "_Képernyőkép készítése..." #: mirage.py:383 msgid "Take Screenshot" msgstr "Képernyőkép készítése" #: mirage.py:384 msgid "_Properties..." msgstr "_Tulajdonságok..." #: mirage.py:384 mirage.py:2374 msgid "Properties" msgstr "Tulajdonságok" #: mirage.py:385 msgid "_Configure..." msgstr "_Beállítás..." #: mirage.py:385 msgid "Custom Actions" msgstr "Egyéni műveletek" #: mirage.py:409 msgid "_Status Bar" msgstr "_Állapotsor" #: mirage.py:409 msgid "Status Bar" msgstr "Állapotsor" #: mirage.py:410 msgid "_Toolbar" msgstr "_Eszköztár" #: mirage.py:410 msgid "Toolbar" msgstr "Eszköztár" #: mirage.py:411 #, fuzzy msgid "Thumbnails _Pane" msgstr "Gyorsnézeti képek" #: mirage.py:411 msgid "Thumbnails Pane" msgstr "Gyorsnézeti képek" #: mirage.py:1036 #, python-format msgid "Couldn't find the image %s. Please check your installation." msgstr "" #: mirage.py:1257 #, fuzzy, python-format msgid "Action: %s" msgstr "Művelet" #: mirage.py:1260 #, python-format msgid "Action return code: %s" msgstr "Műveleti visszatérés kód: %s" #: mirage.py:1262 #, fuzzy, python-format msgid "" "Unable to launch \"%s\". Please specify a valid command from Edit > Custom " "Actions." msgstr "" "Kérlek adj meg egy érvényes parancsot a Szerkesztés > Egyéni műveleteknél." #: mirage.py:1264 mirage.py:2117 mirage.py:2152 msgid "Invalid Custom Action" msgstr "Érvénytelen egyéni művelet" #: mirage.py:1389 msgid "Version: Mirage" msgstr "Verzió: Mirage" #: mirage.py:1390 msgid "Website: http://mirageiv.berlios.de" msgstr "Weboldal: http://mirageiv.berlios.de" #: mirage.py:1395 msgid "Usage: mirage [OPTION]... FILES|FOLDERS..." msgstr "Használat: mirage [OPCIÓ]... FÁJLOK|MAPPÁK..." #: mirage.py:1397 msgid "Options" msgstr "Beállítások" #: mirage.py:1398 msgid "Show this help and exit" msgstr "Súgó megjelenítése és kilépés" #: mirage.py:1399 msgid "Show version information and exit" msgstr "Verzió információ megjelenítése és kilépés" #: mirage.py:1400 msgid "Show more detailed information" msgstr "További információk megjelenítése" #: mirage.py:1401 msgid "Recursively include all images found in" msgstr "Minden megtalált képet tartalmazzon" #: mirage.py:1402 msgid "subdirectories of FOLDERS" msgstr "MAPPÁK alkönyvtárjai" #: mirage.py:1403 msgid "Start in slideshow mode" msgstr "Indítás diavetítés módban" #: mirage.py:1404 msgid "Start in fullscreen mode" msgstr "Indítás teljes képernyős módban" #: mirage.py:1405 msgid "Execute 'cmd' when an image is loaded" msgstr "'cmd' végrehajtása, ha egy kép betöltődik" #: mirage.py:1406 #, fuzzy msgid "uses same syntax as custom actions,\n" msgstr "(ugyanazon szintaktika használata az egyéni műveleteknél," #: mirage.py:1407 #, fuzzy msgid "i.e. mirage -o 'echo file is %F'" msgstr "pl. mirage -o echo fájl %F )" #: mirage.py:1641 msgid "Save As" msgstr "Mentés másként" #: mirage.py:1682 #, python-format msgid "" "The %s format is not supported for saving. Do you wish to save the file in a " "different format?" msgstr "" #: mirage.py:1683 mirage.py:1694 msgid "Save" msgstr "Mentés" #: mirage.py:1693 #, fuzzy, python-format msgid "Unable to save %s" msgstr "Nem tudom menteni" #: mirage.py:1710 msgid "The current image has been modified. Save changes?" msgstr "A jelenlegi kép megváltozott. Mented a módosításokat?" #: mirage.py:1714 msgid "Save?" msgstr "Mentés?" #: mirage.py:1752 msgid "Open Remote" msgstr "Távoli megnyitása" #: mirage.py:1757 #, fuzzy msgid "Image Location (URL):" msgstr "Kép helye (URL)" #: mirage.py:1788 msgid "Open" msgstr "Megnyitás" #: mirage.py:1791 msgid "Images" msgstr "Képek" #: mirage.py:1795 msgid "All files" msgstr "Minden fájl" #: mirage.py:1805 msgid "Include images in subdirectories" msgstr "Az alkönyvtárakból is" #: mirage.py:1960 msgid "Cannot load image." msgstr "Nem tudom betölteni a képet " #: mirage.py:1964 #, python-format msgid "Custom actions: %(current)i of %(total)i" msgstr "" #: mirage.py:1966 #, fuzzy msgid "Scanning..." msgstr "Keresés" #: mirage.py:1970 msgid "Configure Custom Actions" msgstr "Egyéni műveletek beállítása" #: mirage.py:1988 msgid "Batch" msgstr "Sarzs" #: mirage.py:1989 msgid "Action" msgstr "Művelet" #: mirage.py:1990 msgid "Shortcut" msgstr "Gyorsbillentyű" #: mirage.py:2002 msgid "Add action" msgstr "Folyamat hozzáadása" #: mirage.py:2006 msgid "Edit selected action." msgstr "Kijelölt folyamat szerkesztése" #: mirage.py:2010 msgid "Remove selected action." msgstr "Kijelölt folyamat eltávolítása." #: mirage.py:2014 msgid "Move selected action up." msgstr "Kijelölt folyamat mozgatása fel." #: mirage.py:2018 msgid "Move selected action down." msgstr "Kijelölt folyamat mozgatása le." #: mirage.py:2021 msgid "Parameters" msgstr "Paraméterek" #: mirage.py:2021 msgid "File path, name, and extension" msgstr "Fájl útvonal, név és kiterjesztés" #: mirage.py:2021 msgid "File path" msgstr "Fájl útvonal" #: mirage.py:2021 msgid "File name without file extension" msgstr "Fájlnév, fájl kiterjesztés nélkül" #: mirage.py:2021 msgid "File extension (i.e. \".png\")" msgstr "Fájl kiterjesztés (pl. \".png\")" #: mirage.py:2021 msgid "List of files, space-separated" msgstr "Fájl lista, hely szükséges" #: mirage.py:2024 msgid "Operations" msgstr "Műveletek" #: mirage.py:2024 msgid "Go to next image" msgstr "Következő kép" #: mirage.py:2024 msgid "Go to previous image" msgstr "Előző kép" #: mirage.py:2043 msgid "" "Here you can define custom actions with shortcuts. Actions use the built-in " "parameters and operations listed below and can have multiple statements " "separated by a semicolon. Batch actions apply to all images in the list." msgstr "" "Itt meghatározhatsz egyéni műveleteket, gyorsbillentyűkkel együtt. A " "folyamat minden, a listában szereplő képre érvényes lesz." #: mirage.py:2079 msgid "Add Custom Action" msgstr "Egyéni művelet hozzáadása" #: mirage.py:2081 msgid "Edit Custom Action" msgstr "Egyéni művelet szerkesztése" #: mirage.py:2084 #, fuzzy msgid "Action Name:" msgstr "Művelet név" #: mirage.py:2086 #, fuzzy msgid "Command:" msgstr "Parancs" #: mirage.py:2088 #, fuzzy msgid "Shortcut:" msgstr "Gyorsbillentyű" #: mirage.py:2102 msgid "Perform action on all images (Batch)" msgstr "Folyamat végrehajtása minden képen (Sarzs)" #: mirage.py:2116 msgid "[PREV] and [NEXT] are only valid alone or at the end of the command" msgstr "" #: mirage.py:2151 msgid "Incomplete custom action specified." msgstr "Teljesítetlen egyéni művelet meghatározva." #: mirage.py:2229 msgid "Action Shortcut" msgstr "Művelet gyorsbillentyű" #: mirage.py:2230 msgid "Press the desired shortcut for the action." msgstr "Nyomd le a kivánt gyorsbillentyűt a folyamathoz." #: mirage.py:2247 mirage.py:2254 #, python-format msgid "The shortcut '%(shortcut)s' is already used for '%(key)s'." msgstr "" #: mirage.py:2248 mirage.py:2255 msgid "Invalid Shortcut" msgstr "Érvénytelen gyorsbillentyű" #: mirage.py:2297 msgid "Screenshot" msgstr "Képernyőkép" #: mirage.py:2298 #, fuzzy msgid "_Snap" msgstr "Elkap" #: mirage.py:2303 msgid "Location" msgstr "Hely" #: mirage.py:2306 msgid "Entire screen" msgstr "Egész képernyő" #: mirage.py:2307 #, fuzzy msgid "Window under pointer" msgstr "Ablak az egér mutató alatt" #: mirage.py:2312 msgid "Delay" msgstr "Késleltetés" #: mirage.py:2320 msgid " seconds" msgstr " másodperc" #: mirage.py:2388 #, fuzzy msgid "File name:" msgstr "Fájlnév" #: mirage.py:2390 #, fuzzy msgid "File modified:" msgstr "Fájlnév" #: mirage.py:2392 #, fuzzy msgid "Dimensions:" msgstr "Méretek" #: mirage.py:2394 #, fuzzy msgid "File size:" msgstr "Fájlméret" #: mirage.py:2396 #, fuzzy msgid "File type:" msgstr "Fájltípus" #: mirage.py:2398 #, fuzzy msgid "Transparency:" msgstr "Átlátszóság" #: mirage.py:2400 #, fuzzy msgid "Animation:" msgstr "Animáció" #: mirage.py:2402 #, fuzzy msgid "Bits per sample:" msgstr "Bitszám" #: mirage.py:2404 #, fuzzy msgid "Channels:" msgstr "Csatornák" #: mirage.py:2423 mirage.py:2429 mirage.py:2586 msgid "Yes" msgstr "Igen" #: mirage.py:2425 mirage.py:2427 mirage.py:2585 msgid "No" msgstr "Nem" #: mirage.py:2464 msgid "Mirage Preferences" msgstr "Beállítások" #: mirage.py:2470 mirage.py:2690 msgid "Interface" msgstr "Felület" #: mirage.py:2473 #, fuzzy msgid "Background color:" msgstr "Háttérszín" #: mirage.py:2477 msgid "Sets the background color for the application." msgstr "Állítsd be az alkalmazás hátterének a színét." #: mirage.py:2483 #, fuzzy msgid "Simple background color:" msgstr "Háttérszín" #: mirage.py:2492 msgid "Open Mirage in fullscreen mode" msgstr "Program megnyitása teljes képernyős módban" #: mirage.py:2495 #, fuzzy msgid "Thumbnail size:" msgstr "Előnézeti kép méret" #: mirage.py:2522 msgid "Open Behavior" msgstr "Viselkedés megnyitása" #: mirage.py:2525 #, fuzzy msgid "Open new image in:" msgstr "Új kép megnyitása itt" #: mirage.py:2527 msgid "Smart Mode" msgstr "intelligens mód" #: mirage.py:2528 msgid "Zoom To Fit Mode" msgstr "Nagyítás az igazításhoz" #: mirage.py:2529 msgid "1:1 Mode" msgstr "1:1 Mód" #: mirage.py:2530 msgid "Last Active Mode" msgstr "Utolsó aktív mód" #: mirage.py:2533 msgid "Load all images in current directory" msgstr "Mindne kép betöltése az aktuális könyvtárból" #: mirage.py:2535 msgid "" "If enabled, opening an image in Mirage will automatically load all images " "found in that image's directory." msgstr "" "Ha engedélyezed, akkor a program, minden a kiválasztott könyvtárban szereplő " "képet automatikusan betölt." #: mirage.py:2536 msgid "Allow loading hidden files" msgstr "Rejtett fájlok betöltése" #: mirage.py:2538 #, fuzzy msgid "" "If checked, Mirage will open hidden files. Otherwise, hidden files will be " "ignored." msgstr "" "Ha kijelölöd, akkor a program a rejtett fájlokat is betölti, minden más " "esetben láthatatlanok lesznek." #: mirage.py:2540 msgid "Use last chosen directory" msgstr "Utolsó kiválasztott könyvtár használata" #: mirage.py:2541 msgid "The default 'Open' directory will be the last directory used." msgstr "" "Az alapértelmezett 'Megnyitott' könyvtár lesz az utolsó használt könyvtár." #: mirage.py:2542 #, fuzzy msgid "Use this fixed directory:" msgstr "Használd ezt a könyvtárt" #: mirage.py:2544 msgid "The default 'Open' directory will be this specified directory." msgstr "Az alapértelmezett megnyitott könyvtár lesz a kiválasztott könyvtár." #: mirage.py:2577 mirage.py:2689 msgid "Navigation" msgstr "Navigáció" #: mirage.py:2579 msgid "Preload images for faster navigation" msgstr "Képek újratöltése a gyorsabb navigáláshoz" #: mirage.py:2581 msgid "" "If enabled, the next and previous images in the list will be preloaded " "during idle time. Note that the speed increase comes at the expense of " "memory usage, so it is recommended to disable this option on machines with " "limited ram." msgstr "" "Ha engedélyezed, akkor a listában az első és utolsó kép újra lesz töltve az " "idle idő alatt. Ez a művelet sebességcsökkenést okozhat, mivel nagy a " "memória igénye, ezért nem ajánlott a használata kis teljesítményű gépeken." #: mirage.py:2583 #, fuzzy msgid "Wrap around imagelist:" msgstr "Képlist körbe forgatása" #: mirage.py:2587 msgid "Prompt User" msgstr "Rákérdezés" #: mirage.py:2606 mirage.py:4507 msgid "Slideshow Mode" msgstr "Diavetítés mód" #: mirage.py:2609 #, fuzzy msgid "Delay between images in seconds:" msgstr "Késleltetés képek között" #: mirage.py:2614 msgid "Randomize order of images" msgstr "Véletlenszerű képsorrend" #: mirage.py:2616 msgid "" "If enabled, a random image will be chosen during slideshow mode (without " "loading any image twice)." msgstr "" "Ha engedélyezed, akkor a képek véletlenszerűen lesznek kiválasztva a " "diavetítés alatt." #: mirage.py:2617 msgid "Disable screensaver in slideshow mode" msgstr "Képernyővédő tiltása a diavetítés alatt" #: mirage.py:2619 msgid "" "If enabled, xscreensaver will be temporarily disabled during slideshow mode." msgstr "" "Ha engedélyezed, akkor az xképernyővédő tiltva lesz a diavetítés ideje alatt." #: mirage.py:2620 msgid "Always start in fullscreen mode" msgstr "Mindig teljes képernyős módban induljon" #: mirage.py:2621 msgid "" "If enabled, starting a slideshow will put the application in fullscreen mode." msgstr "" "Ha engedélyezed, akkor a diavetítés mindig teljes képernyős módban fog " "elindulni." #: mirage.py:2639 msgid "Image Editing" msgstr "Kép szerkesztés" #: mirage.py:2641 msgid "Confirm image delete" msgstr "Kép törlés megerősítése" #: mirage.py:2645 #, fuzzy msgid "Scaling quality:" msgstr "Méretezés minősége" #: mirage.py:2647 msgid "Nearest (Fastest)" msgstr "Legközelebbi (gyorsabb)" #: mirage.py:2648 msgid "Tiles" msgstr "Elemek" #: mirage.py:2649 msgid "Bilinear" msgstr "Bilineáris" #: mirage.py:2650 msgid "Hyper (Best)" msgstr "Hyper (Legjobb)" #: mirage.py:2656 #, fuzzy msgid "Modified images:" msgstr "Módosított képek" #: mirage.py:2658 msgid "Ignore Changes" msgstr "Módosítások elvetése" #: mirage.py:2659 msgid "Auto-Save" msgstr "Automatikus mentés" #: mirage.py:2660 msgid "Prompt For Action" msgstr "Rákérdezés a műveletre" #: mirage.py:2666 #, fuzzy msgid "Quality to save in:" msgstr "Nem tudom menteni" #: mirage.py:2688 msgid "Behavior" msgstr "Viselkedés" #: mirage.py:2691 msgid "Slideshow" msgstr "Diavetítés" #: mirage.py:2692 msgid "Image" msgstr "Kép" #: mirage.py:2767 #, fuzzy msgid "_Rename" msgstr "Átnevezés" #: mirage.py:2778 #, fuzzy msgid "Enter the new name:" msgstr "Add meg az új nevet" #: mirage.py:2810 #, fuzzy, python-format msgid "Unable to rename %s" msgstr "Nem tudom átnevezni" #: mirage.py:2811 msgid "Unable to rename" msgstr "Nem tudom átnevezni" #: mirage.py:2830 #, fuzzy, python-format msgid "Are you sure you wish to permanently delete %s?" msgstr "Biztosan törölni szeretnéd?" #: mirage.py:2891 #, fuzzy, python-format msgid "Unable to delete %s" msgstr "Nem tudom törölni" #: mirage.py:2892 msgid "Unable to delete" msgstr "Nem tudom törölni" #: mirage.py:2900 msgid "Choose directory" msgstr "Könyvtár választása" #: mirage.py:2948 msgid "A fast GTK+ Image Viewer." msgstr "Egy gyors GTK+-os képnézegető" #: mirage.py:2990 msgid "Unable to launch a suitable browser." msgstr "Nem tudom megnyitni a böngészőt." #: mirage.py:3298 #, fuzzy msgid "C_rop" msgstr "Kivágás" #: mirage.py:3340 mirage.py:3553 #, fuzzy msgid "Width:" msgstr "Szélesség" #: mirage.py:3347 mirage.py:3564 #, fuzzy msgid "Height:" msgstr "Magasság" #: mirage.py:3493 msgid "Saturation" msgstr "Telítettség" #: mirage.py:3494 #, fuzzy msgid "_Saturate" msgstr "Telít" #: mirage.py:3505 msgid "Saturation level:" msgstr "Telítettség szint:" #: mirage.py:3543 #, fuzzy msgid "_Resize" msgstr "Átméretezés" #: mirage.py:3557 mirage.py:3569 msgid "pixels" msgstr "képpont" #: mirage.py:3571 msgid "Preserve aspect ratio" msgstr "Arány" #: mirage.py:3712 msgid "" "You are viewing the first image in the list. Wrap around to the last image?" msgstr "Az első képet nézed a listában. Menjünk körbe az utolsó képhez?" #: mirage.py:3714 msgid "" "You are viewing the last image in the list. Wrap around to the first image?" msgstr "Az utolsó képet nézed a listában. Menjünk körbe az első képhez?" #: mirage.py:3716 msgid "" "All images have been viewed. Would you like to cycle through the images " "again?" msgstr "Minden képet megnéztél. Szeretnéd még egyszer megtekinteni őket?" #: mirage.py:3717 msgid "Wrap?" msgstr "Körbe?" #: mirage.py:3816 mirage.py:3929 mirage.py:3946 mirage.py:4009 mirage.py:4303 #, fuzzy, python-format msgid "Loading: %s" msgstr "Betöltés" #: mirage.py:4090 mirage.py:4142 #, fuzzy, python-format msgid "Preloading: %s" msgstr "Előre betöltés" #: mirage.py:4213 mirage.py:4393 #, fuzzy, python-format msgid "Skipping: %s" msgstr "Átugrás" #: mirage.py:4270 #, python-format msgid "Found: %(item)s [%(number)i]" msgstr "" #: mirage.py:4389 #, python-format msgid "Found: %(fullpath)s [%(number)i]" msgstr "" #: mirage.py:4505 #, python-format msgid "[%(current)i of %(total)i]" msgstr "" #~ msgid "_Custom Actions" #~ msgstr "_Egyéni műveletek" #, fuzzy #~ msgid "Fullscreen" #~ msgstr "Teljes képernyő" #~ msgid "_Thumbnails Pane" #~ msgstr "_Gyorsnézeti képek" #~ msgid "Unable to launch" #~ msgstr "Nem tudom elindítani" #~ msgid "The" #~ msgstr "A(az)" #~ msgid "Custom actions" #~ msgstr "Egyéni műveletek" #~ msgid "of" #~ msgstr "-nak, -nek" #~ msgid "The shortcut " #~ msgstr "A gyorsbillentyű " #~ msgid " is already used for " #~ msgstr "már használatban van " #~ msgid "Found" #~ msgstr "Találat" #~ msgid "seconds" #~ msgstr "másodperc" #~ msgid "File date" #~ msgstr "Fájl dátum" mirage-0.9.5.1/COPYING0000644000175000017500000010451311422310710013774 0ustar fredricfredric GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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. But first, please read . mirage-0.9.5.1/stock_shuffle.png0000644000175000017500000000107711422310710016307 0ustar fredricfredricPNG  IHDRw=bKGDIDATxڕkSQP٤@K]\2!ɒ??@ ZwE 8Y2oy|pqw.%7jԒhhSnoJEfQEv5n0K5Z[H-~\3 vH\8XO|=ϋ):()f^r}9CQَK'f T@HNzHz0ӸJ$Cte, <#IM ulʂ@38΁x`.͒idr T-f3zn{&J: ?.$]RJIV^SK㞙yr!e9N[Y|ڳ\1*)\%p})9; ̩nxn4ʼnprxUgDX1tZ: xH_> F@s-oCP%Ӹk஁@A!0C=j1oɍ ױ)^ȿ a' 2r-JQv.OPϟVY~{܁k%Xʌ%lmEAmf2 z\ yb%ZrKK+)S\))+U^߈4P{X̽;VvKUeU>!1_tl² 3X-N)k7ťWUO+Cv4LzX4X3}G42oqىΫy8- N7lf2RrⱖL x5)iXvv!0 81Yy)dIENDB`mirage-0.9.5.1/xmouse.c0000644000175000017500000000236411422310710014426 0ustar fredricfredric#include #include /* Return tuple with (x,y,width,height) of window under mouse cursor */ PyObject* xmouse_geometry(PyObject* self, PyObject* args) { Display* dpy; int screennum = 0; char* display = NULL; Window rootwin, childwin; int root_x, root_y; int child_x, child_y; int win_x, win_y; unsigned int win_width, win_height, win_border, win_depth; unsigned int mask; PyObject* ret = NULL; PyArg_ParseTuple(args, "|zi", &display, &screennum); dpy = XOpenDisplay(display); //printf("display: %s\n", display); //printf("dpy: %s\n", XDisplayString(dpy)); if(!dpy) { /* TODO is this right?? */ PyErr_SetString(PyExc_Exception, "cannot open display"); return NULL; } XQueryPointer(dpy, RootWindow(dpy,0), &rootwin, &childwin, &root_x, &root_y, &child_x, &child_y, &mask); XGetGeometry(dpy, childwin, &rootwin, &win_x, &win_y, &win_width, &win_height, &win_border, &win_depth); ret = Py_BuildValue("(i,i,i,i)", win_x, win_y, win_width, win_height); XCloseDisplay(dpy); return ret; } PyMethodDef methods[] = { {"geometry", xmouse_geometry, METH_VARARGS}, }; void initxmouse(void) { Py_InitModule("xmouse", methods); } mirage-0.9.5.1/imgfuncs.c0000644000175000017500000001006211422310710014713 0ustar fredricfredric#include "Python.h" /** * copy length chars from source to dest */ void copy(char *dest, const char *source, const int length) { int i; for(i=0; i< length; i++, dest++, source++) *dest = *source; } /* Wrapper methods */ PyObject *rotate_right(PyObject *self, PyObject *args) { char *a1; char *a2; int length; int w1, w2; int h1, h2; int rws1, rws2; int psz; int i1, i2; int x1, y1; PyObject *ret; /* Get Python Arguments */ if(!PyArg_ParseTuple(args, "z#iiii", &a1, &length, &w1, &h1, &rws1, &psz)) { return NULL; } /* Do the mirroring */ w2 = h1; h2 = w1; if(w2 % 4 != 0) rws2 = ((w2/4 + 1) * 4) * psz; else rws2 = w2 * psz; length = rws2 * h2; a2 = malloc(length); for(x1=0; x1 This file is part of Mirage. Mirage 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 3 of the License, or (at your option) any later version. Mirage 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, see . """ import pygtk pygtk.require('2.0') import gtk import os, sys, getopt, ConfigParser, string, gc import random, urllib, gobject, gettext, locale import stat, time, subprocess, shutil, filecmp import tempfile, socket, threading try: import hashlib HAS_HASHLIB = True except: HAS_HASHLIB= False import md5 try: import imgfuncs HAS_IMGFUNCS = True except: HAS_IMGFUNCS = False print "imgfuncs.so module not found, rotating/flipping images will be disabled." try: import xmouse HAS_XMOUSE = True except: HAS_XMOUSE = False print "xmouse.so module not found, some screenshot capabilities will be disabled." try: import gconf except: pass if gtk.gtk_version < (2, 10, 0): sys.stderr.write("Mirage requires GTK+ 2.10.0 or newer..\n") sys.exit(1) if gtk.pygtk_version < (2, 12, 0): sys.stderr.write("Mirage requires PyGTK 2.12.0 or newer.\n") sys.exit(1) def valid_int(inputstring): try: x = int(inputstring) return True except: return False class Base: def __init__(self): gtk.gdk.threads_init() # FIX THIS! Does not work on windows and what happens if mo-files exists # in both dirs? gettext.install('mirage', '/usr/share/locale', unicode=1) gettext.install('mirage', '/usr/local/share/locale', unicode=1) # Constants self.open_mode_smart = 0 self.open_mode_fit = 1 self.open_mode_1to1 = 2 self.open_mode_last = 3 self.min_zoomratio = 0.02 # Initialize vars: width=600 height=400 bgcolor_found = False self.simple_bgcolor = False # Current image: self.curr_img_in_list = 0 self.currimg_name = "" self.currimg_width = 0 self.currimg_height = 0 self.currimg_pixbuf = None self.currimg_pixbuf_original = None self.currimg_zoomratio = 1 self.currimg_is_animation = False # This is the actual pixbuf that is loaded in Mirage. This will # usually be the same as self.curr_img_in_list except for scenarios # like when the user presses 'next image' multiple times in a row. # In this case, self.curr_img_in_list will increment while # self.loaded_img_in_list will retain the current loaded image. self.loaded_img_in_list = 0 # Next preloaded image: self.preloadimg_next_in_list = -1 self.preloadimg_next_name = "" self.preloadimg_next_width = 0 self.preloadimg_next_height = 0 self.preloadimg_next_pixbuf = None self.preloadimg_next_pixbuf_original = None self.preloadimg_next_zoomratio = 1 self.preloadimg_next_is_animation = False # Previous preloaded image: self.preloadimg_prev_in_list = -1 self.preloadimg_prev_name = "" self.preloadimg_prev_width = 0 self.preloadimg_prev_height = 0 self.preloadimg_prev_pixbuf = None self.preloadimg_prev_pixbuf_original = None self.preloadimg_prev_zoomratio = 1 self.preloadimg_prev_is_animation = False # Settings, misc: self.toolbar_show = True self.thumbpane_show = True self.statusbar_show = True self.fullscreen_mode = False self.opendialogpath = "" self.zoom_quality = gtk.gdk.INTERP_BILINEAR self.recursive = False self.verbose = False self.image_loaded = False self.open_all_images = True # open all images in the directory(ies) self.use_last_dir = True self.last_dir = os.path.expanduser("~") self.fixed_dir = os.path.expanduser("~") self.image_list = [] self.open_mode = self.open_mode_smart self.last_mode = self.open_mode_smart self.listwrap_mode = 0 # 0=no, 1=yes, 2=ask self.user_prompt_visible = False # the "wrap?" prompt self.slideshow_delay = 1 # seconds self.slideshow_mode = False self.slideshow_random = False self.slideshow_controls_visible = False # fullscreen slideshow controls self.controls_moving = False self.zoomvalue = 2 self.quality_save = 90 self.updating_adjustments = False self.disable_screensaver = False self.slideshow_in_fullscreen = False self.closing_app = False self.confirm_delete = True self.preloading_images = True self.action_names = ["Open in GIMP", "Create Thumbnail", "Create Thumbnails", "Move to Favorites"] self.action_shortcuts = ["e", "t", "t", "f"] self.action_commands = ["gimp-remote-2.4 %F", "convert %F -thumbnail 150x150 %Pt_%N.jpg", "convert %F -thumbnail 150x150 %Pt_%N.jpg", "mkdir -p ~/mirage-favs; mv %F ~/mirage-favs; [NEXT]"] self.action_batch = [False, False, True, False] self.onload_cmd = None self.searching_for_images = False self.preserve_aspect = True self.ignore_preserve_aspect_callback = False self.savemode = 2 self.image_modified = False self.image_zoomed = False self.start_in_fullscreen = False self.running_custom_actions = False self.merge_id = None self.actionGroupCustom = None self.merge_id_recent = None self.actionGroupRecent = None self.open_hidden_files = False self.thumbnail_sizes = ["128", "96", "72", "64", "48", "32"] self.thumbnail_size = 128 # Default to 128 x 128 self.thumbnail_loaded = [] self.thumbpane_updating = False self.recentfiles = ["", "", "", "", ""] self.screenshot_delay = 2 self.thumbpane_bottom_coord_loaded = 0 # Read any passed options/arguments: try: opts, args = getopt.getopt(sys.argv[1:], "hRvVsfo:", ["help", "version", "recursive", "verbose", "slideshow", "fullscreen", "onload="]) except getopt.GetoptError: # print help information and exit: self.print_usage() sys.exit(2) # If options were passed, perform action on them. if opts != []: for o, a in opts: if o in ("-v", "--version"): self.print_version() sys.exit(2) elif o in ("-h", "--help"): self.print_usage() sys.exit(2) elif o in ("-R", "--recursive"): self.recursive = True elif o in ("-V", "--verbose"): self.verbose = True elif o in ("-s", "--slideshow", "-f", "--fullscreen"): #This will be handled later None elif o in ("-o", "--onload"): self.onload_cmd = a else: self.print_usage() sys.exit(2) # Determine config dir, first try the environment variable XDG_CONFIG_HOME # according to XDG specification and as a fallback use ~/.config/mirage self.config_dir = (os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config')) + '/mirage' # Load config from disk: conf = ConfigParser.ConfigParser() if os.path.isfile(self.config_dir + '/miragerc'): conf.read(self.config_dir + '/miragerc') if conf.has_option('window', 'w'): width = conf.getint('window', 'w') if conf.has_option('window', 'h'): height = conf.getint('window', 'h') if conf.has_option('window', 'toolbar'): self.toolbar_show = conf.getboolean('window', 'toolbar') if conf.has_option('window', 'statusbar'): self.statusbar_show = conf.getboolean('window', 'statusbar') if conf.has_option('window', 'thumbpane'): self.thumbpane_show = conf.getboolean('window', 'thumbpane') if conf.has_option('prefs', 'simple-bgcolor'): self.simple_bgcolor = conf.getboolean('prefs', 'simple-bgcolor') if conf.has_option('prefs', 'bgcolor-red'): bgr = conf.getint('prefs', 'bgcolor-red') bgg = conf.getint('prefs', 'bgcolor-green') bgb = conf.getint('prefs', 'bgcolor-blue') bgcolor_found = True self.bgcolor = gtk.gdk.Color(red=bgr, green=bgg, blue=bgb) if conf.has_option('prefs', 'use_last_dir'): self.use_last_dir = conf.getboolean('prefs', 'use_last_dir') if conf.has_option('prefs', 'last_dir'): self.last_dir = conf.get('prefs', 'last_dir') if conf.has_option('prefs', 'fixed_dir'): self.fixed_dir = conf.get('prefs', 'fixed_dir') if conf.has_option('prefs', 'open_all'): self.open_all_images = conf.getboolean('prefs', 'open_all') if conf.has_option('prefs', 'hidden'): self.open_hidden_files = conf.getboolean('prefs', 'hidden') if conf.has_option('prefs', 'open_mode'): self.open_mode = conf.getint('prefs', 'open_mode') if conf.has_option('prefs', 'last_mode'): self.last_mode = conf.getint('prefs', 'last_mode') if conf.has_option('prefs', 'listwrap_mode'): self.listwrap_mode = conf.getint('prefs', 'listwrap_mode') if conf.has_option('prefs', 'slideshow_delay'): self.slideshow_delay = conf.getint('prefs', 'slideshow_delay') if conf.has_option('prefs', 'slideshow_random'): self.slideshow_random = conf.getboolean('prefs', 'slideshow_random') if conf.has_option('prefs', 'zoomquality'): self.zoomvalue = conf.getint('prefs', 'zoomquality') if int(round(self.zoomvalue, 0)) == 0: self.zoom_quality = gtk.gdk.INTERP_NEAREST elif int(round(self.zoomvalue, 0)) == 1: self.zoom_quality = gtk.gdk.INTERP_TILES elif int(round(self.zoomvalue, 0)) == 2: self.zoom_quality = gtk.gdk.INTERP_BILINEAR elif int(round(self.zoomvalue, 0)) == 3: self.zoom_quality = gtk.gdk.INTERP_HYPER if conf.has_option('prefs', 'quality_save'): self.quality_save = conf.getint('prefs', 'quality_save') if conf.has_option('prefs', 'disable_screensaver'): self.disable_screensaver = conf.getboolean('prefs', 'disable_screensaver') if conf.has_option('prefs', 'slideshow_in_fullscreen'): self.slideshow_in_fullscreen = conf.getboolean('prefs', 'slideshow_in_fullscreen') if conf.has_option('prefs', 'preloading_images'): self.preloading_images = conf.getboolean('prefs', 'preloading_images') if conf.has_option('prefs', 'thumbsize'): self.thumbnail_size = conf.getint('prefs', 'thumbsize') if conf.has_option('prefs', 'screenshot_delay'): self.screenshot_delay = conf.getint('prefs', 'screenshot_delay') if conf.has_option('actions', 'num_actions'): num_actions = conf.getint('actions', 'num_actions') self.action_names = [] self.action_commands = [] self.action_shortcuts = [] self.action_batch = [] for i in range(num_actions): if conf.has_option('actions', 'names[' + str(i) + ']') and conf.has_option('actions', 'commands[' + str(i) + ']') and conf.has_option('actions', 'shortcuts[' + str(i) + ']') and conf.has_option('actions', 'batch[' + str(i) + ']'): self.action_names.append(conf.get('actions', 'names[' + str(i) + ']')) self.action_commands.append(conf.get('actions', 'commands[' + str(i) + ']')) self.action_shortcuts.append(conf.get('actions', 'shortcuts[' + str(i) + ']')) self.action_batch.append(conf.getboolean('actions', 'batch[' + str(i) + ']')) if conf.has_option('prefs', 'savemode'): self.savemode = conf.getint('prefs', 'savemode') if conf.has_option('prefs', 'start_in_fullscreen'): self.start_in_fullscreen = conf.getboolean('prefs', 'start_in_fullscreen') if conf.has_option('prefs', 'confirm_delete'): self.confirm_delete = conf.getboolean('prefs', 'confirm_delete') self.recentfiles = [] if conf.has_option('recent', 'num_recent'): num_recent = conf.getint('recent', 'num_recent') for i in range(num_recent): self.recentfiles.append('') if conf.has_option('recent', 'urls[' + str(i) + ',0]'): self.recentfiles[i] = conf.get('recent', 'urls[' + str(i) + ',0]') # slideshow_delay is the user's preference, whereas curr_slideshow_delay is # the current delay (which can be changed without affecting the 'default') self.curr_slideshow_delay = self.slideshow_delay # Same for randomization: self.curr_slideshow_random = self.slideshow_random # Read accel_map file, if it exists if os.path.isfile(self.config_dir + '/accel_map'): gtk.accel_map_load(self.config_dir + '/accel_map') # Directory/ies in which to find application images/pixmaps self.resource_path_list = False self.blank_image = gtk.gdk.pixbuf_new_from_file(self.find_path("mirage_blank.png")) # Define the main menubar and toolbar: factory = gtk.IconFactory() iconname = 'stock_leave-fullscreen.png' iconname2 = 'stock_fullscreen.png' leave_fullscreen_icon_path = self.find_path(iconname) pixbuf = gtk.gdk.pixbuf_new_from_file(leave_fullscreen_icon_path) iconset = gtk.IconSet(pixbuf) factory.add('leave-fullscreen', iconset) factory.add_default() fullscreen_icon_path = self.find_path(iconname2) pixbuf = gtk.gdk.pixbuf_new_from_file(fullscreen_icon_path) iconset = gtk.IconSet(pixbuf) factory.add('fullscreen', iconset) factory.add_default() try: test = gtk.Button("", gtk.STOCK_LEAVE_FULLSCREEN) leave_fullscreen_icon = gtk.STOCK_LEAVE_FULLSCREEN fullscreen_icon = gtk.STOCK_FULLSCREEN except: # This will allow gtk 2.6 users to run Mirage leave_fullscreen_icon = 'leave-fullscreen' fullscreen_icon = 'fullscreen' actions = ( ('FileMenu', None, _('_File')), ('EditMenu', None, _('_Edit')), ('ViewMenu', None, _('_View')), ('GoMenu', None, _('_Go')), ('HelpMenu', None, _('_Help')), ('ActionSubMenu', None, _('Custom _Actions')), ('Open Image', gtk.STOCK_FILE, _('_Open Image...'), 'O', _('Open Image'), self.open_file), ('Open Remote Image', gtk.STOCK_NETWORK, _('Open _Remote image...'), None, _('Open Remote Image'), self.open_file_remote), ('Open Folder', gtk.STOCK_DIRECTORY, _('Open _Folder...'), 'F', _('Open Folder'), self.open_folder), ('Save', gtk.STOCK_SAVE, _('_Save Image'), 'S', _('Save Image'), self.save_image), ('Save As', gtk.STOCK_SAVE, _('Save Image _As...'), 'S', _('Save Image As'), self.save_image_as), ('Crop', None, _('_Crop...'), None, _('Crop Image'), self.crop_image), ('Resize', None, _('R_esize...'), None, _('Resize Image'), self.resize_image), ('Saturation', None, _('_Saturation...'), None, _('Modify saturation'), self.saturation), ('Quit', gtk.STOCK_QUIT, _('_Quit'), 'Q', _('Quit'), self.exit_app), ('Previous Image', gtk.STOCK_GO_BACK, _('_Previous Image'), 'Left', _('Previous Image'), self.goto_prev_image), ('Next Image', gtk.STOCK_GO_FORWARD, _('_Next Image'), 'Right', _('Next Image'), self.goto_next_image), ('Previous2', gtk.STOCK_GO_BACK, _('_Previous'), 'Left', _('Previous'), self.goto_prev_image), ('Next2', gtk.STOCK_GO_FORWARD, _('_Next'), 'Right', _('Next'), self.goto_next_image), ('Random Image', None, _('_Random Image'), 'R', _('Random Image'), self.goto_random_image), ('First Image', gtk.STOCK_GOTO_FIRST, _('_First Image'), 'Home', _('First Image'), self.goto_first_image), ('Last Image', gtk.STOCK_GOTO_LAST, _('_Last Image'), 'End', _('Last Image'), self.goto_last_image), ('In', gtk.STOCK_ZOOM_IN, _('Zoom _In'), 'Up', _('Zoom In'), self.zoom_in), ('Out', gtk.STOCK_ZOOM_OUT, _('Zoom _Out'), 'Down', _('Zoom Out'), self.zoom_out), ('Fit', gtk.STOCK_ZOOM_FIT, _('Zoom To _Fit'), '0', _('Fit'), self.zoom_to_fit_window_action), ('1:1', gtk.STOCK_ZOOM_100, _('_1:1'), '1', _('1:1'), self.zoom_1_to_1_action), ('Rotate Left', None, _('Rotate _Left'), 'Left', _('Rotate Left'), self.rotate_left), ('Rotate Right', None, _('Rotate _Right'), 'Right', _('Rotate Right'), self.rotate_right), ('Flip Vertically', None, _('Flip _Vertically'), 'V', _('Flip Vertically'), self.flip_image_vert), ('Flip Horizontally', None, _('Flip _Horizontally'), 'H', _('Flip Horizontally'), self.flip_image_horiz), ('About', gtk.STOCK_ABOUT, _('_About'), None, _('About'), self.show_about), ('Contents', gtk.STOCK_HELP, _('_Contents'), 'F1', _('Contents'), self.show_help), ('Preferences', gtk.STOCK_PREFERENCES, _('_Preferences...'), 'P', _('Preferences'), self.show_prefs), ('Full Screen', fullscreen_icon, _('_Full Screen'), 'F11', _('Full Screen'), self.enter_fullscreen), ('Exit Full Screen', leave_fullscreen_icon, _('E_xit Full Screen'), None, _('Exit Full Screen'), self.leave_fullscreen), ('Start Slideshow', gtk.STOCK_MEDIA_PLAY, _('_Start Slideshow'), 'F5', _('Start Slideshow'), self.toggle_slideshow), ('Stop Slideshow', gtk.STOCK_MEDIA_STOP, _('_Stop Slideshow'), 'F5', _('Stop Slideshow'), self.toggle_slideshow), ('Delete Image', gtk.STOCK_DELETE, _('_Delete...'), 'Delete', _('Delete Image'), self.delete_image), ('Rename Image', None, _('Re_name...'), 'F2', _('Rename Image'), self.rename_image), ('Take Screenshot', None, _('_Take Screenshot...'), None, _('Take Screenshot'), self.screenshot), ('Properties', gtk.STOCK_PROPERTIES, _('_Properties...'), None, _('Properties'), self.show_properties), ('Custom Actions', None, _('_Configure...'), None, _('Custom Actions'), self.show_custom_actions), ('MiscKeysMenuHidden', None, 'Keys'), ('Escape', None, '', 'Escape', _('Exit Full Screen'), self.leave_fullscreen), ('Minus', None, '', 'minus', _('Zoom Out'), self.zoom_out), ('Plus', None, '', 'plus', _('Zoom In'), self.zoom_in), ('Equal', None, '', 'equal', _('Zoom In'), self.zoom_in), ('Space', None, '', 'space', _('Next Image'), self.goto_next_image), ('Ctrl-KP_Insert', None, '', 'KP_Insert', _('Fit'), self.zoom_to_fit_window_action), ('Ctrl-KP_End', None, '', 'KP_End', _('1:1'), self.zoom_1_to_1_action), ('Ctrl-KP_Subtract', None, '', 'KP_Subtract', _('Zoom Out'), self.zoom_out), ('Ctrl-KP_Add', None, '', 'KP_Add', _('Zoom In'), self.zoom_in), ('Ctrl-KP_0', None, '', 'KP_0', _('Fit'), self.zoom_to_fit_window_action), ('Ctrl-KP_1', None, '', 'KP_1', _('1:1'), self.zoom_1_to_1_action), ('Full Screen Key', None, '', 'Return', None, self.enter_fullscreen), ('Prev', None, '', 'Up', _('Previous Image'), self.goto_prev_image), ('Next', None, '', 'Down', _('Next Image'), self.goto_next_image), ('PgUp', None, '', 'Page_Up', _('Previous Image'), self.goto_prev_image), ('PgDn', None, '', 'Page_Down', _('Next Image'), self.goto_next_image), ('BackSpace', None, '', 'BackSpace', _('Previous Image'), self.goto_prev_image), ('OriginalSize', None, '', '1', _('1:1'), self.zoom_1_to_1_action), ('ZoomIn', None, '', 'KP_Add', _('Zoom In'), self.zoom_in), ('ZoomOut', None, '', 'KP_Subtract', _('Zoom Out'), self.zoom_out) ) toggle_actions = ( ('Status Bar', None, _('_Status Bar'), None, _('Status Bar'), self.toggle_status_bar, self.statusbar_show), ('Toolbar', None, _('_Toolbar'), None, _('Toolbar'), self.toggle_toolbar, self.toolbar_show), ('Thumbnails Pane', None, _('Thumbnails _Pane'), None, _('Thumbnails Pane'), self.toggle_thumbpane, self.thumbpane_show) ) # Populate keys[]: self.keys=[] for i in range(len(actions)): if len(actions[i]) > 3: if actions[i][3] != None: self.keys.append([actions[i][4], actions[i][3]]) uiDescription = """ """ # Create interface self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.update_title() icon_path = self.find_path('mirage.png') try: gtk.window_set_default_icon_from_file(icon_path) except: pass vbox = gtk.VBox(False, 0) self.UIManager = gtk.UIManager() actionGroup = gtk.ActionGroup('Actions') actionGroup.add_actions(actions) actionGroup.add_toggle_actions(toggle_actions) self.UIManager.insert_action_group(actionGroup, 0) self.UIManager.add_ui_from_string(uiDescription) self.refresh_custom_actions_menu() self.refresh_recent_files_menu() self.window.add_accel_group(self.UIManager.get_accel_group()) self.menubar = self.UIManager.get_widget('/MainMenu') vbox.pack_start(self.menubar, False, False, 0) self.toolbar = self.UIManager.get_widget('/MainToolbar') vbox.pack_start(self.toolbar, False, False, 0) self.layout = gtk.Layout() self.vscroll = gtk.VScrollbar(None) self.vscroll.set_adjustment(self.layout.get_vadjustment()) self.hscroll = gtk.HScrollbar(None) self.hscroll.set_adjustment(self.layout.get_hadjustment()) self.table = gtk.Table(3, 2, False) self.thumblist = gtk.ListStore(gtk.gdk.Pixbuf) self.thumbpane = gtk.TreeView(self.thumblist) self.thumbcolumn = gtk.TreeViewColumn(None) self.thumbcell = gtk.CellRendererPixbuf() self.thumbcolumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) self.thumbpane_set_size() self.thumbpane.append_column(self.thumbcolumn) self.thumbcolumn.pack_start(self.thumbcell, True) self.thumbcolumn.set_attributes(self.thumbcell, pixbuf=0) self.thumbpane.get_selection().set_mode(gtk.SELECTION_SINGLE) self.thumbpane.set_headers_visible(False) self.thumbpane.set_property('can-focus', False) self.thumbscroll = gtk.ScrolledWindow() self.thumbscroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) self.thumbscroll.add(self.thumbpane) self.table.attach(self.thumbscroll, 0, 1, 0, 1, 0, gtk.FILL|gtk.EXPAND, 0, 0) self.table.attach(self.layout, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) self.table.attach(self.hscroll, 1, 2, 1, 2, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0) self.table.attach(self.vscroll, 2, 3, 0, 1, gtk.FILL|gtk.SHRINK, gtk.FILL|gtk.SHRINK, 0, 0) vbox.pack_start(self.table, True, True, 0) if not bgcolor_found: self.bgcolor = gtk.gdk.Color(0, 0, 0) # Default to black if self.simple_bgcolor: self.layout.modify_bg(gtk.STATE_NORMAL, None) else: self.layout.modify_bg(gtk.STATE_NORMAL, self.bgcolor) self.imageview = gtk.Image() self.layout.add(self.imageview) self.statusbar = gtk.Statusbar() self.statusbar2 = gtk.Statusbar() self.statusbar.set_has_resize_grip(False) self.statusbar2.set_has_resize_grip(True) self.statusbar2.set_size_request(200, -1) hbox_statusbar = gtk.HBox() hbox_statusbar.pack_start(self.statusbar, expand=True) hbox_statusbar.pack_start(self.statusbar2, expand=False) vbox.pack_start(hbox_statusbar, False, False, 0) self.window.add(vbox) self.window.set_property('allow-shrink', False) self.window.set_default_size(width,height) # Slideshow control: self.slideshow_window = gtk.Window(gtk.WINDOW_POPUP) self.slideshow_controls = gtk.HBox() self.ss_back = gtk.Button() self.ss_back.add(gtk.image_new_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_BUTTON)) self.ss_back.set_property('can-focus', False) self.ss_back.connect('clicked', self.goto_prev_image) self.ss_start = gtk.Button("", gtk.STOCK_MEDIA_PLAY) self.ss_start.get_child().get_child().get_children()[1].set_text('') self.ss_start.set_property('can-focus', False) self.ss_start.connect('clicked', self.toggle_slideshow) self.ss_stop = gtk.Button("", gtk.STOCK_MEDIA_STOP) self.ss_stop.get_child().get_child().get_children()[1].set_text('') self.ss_stop.set_property('can-focus', False) self.ss_stop.connect('clicked', self.toggle_slideshow) self.ss_forward = gtk.Button("", gtk.STOCK_GO_FORWARD) self.ss_forward.get_child().get_child().get_children()[1].set_text('') self.ss_forward.set_property('can-focus', False) self.ss_forward.connect('clicked', self.goto_next_image) self.slideshow_controls.pack_start(self.ss_back, False, False, 0) self.slideshow_controls.pack_start(self.ss_start, False, False, 0) self.slideshow_controls.pack_start(self.ss_stop, False, False, 0) self.slideshow_controls.pack_start(self.ss_forward, False, False, 0) self.slideshow_window.add(self.slideshow_controls) if self.simple_bgcolor: self.slideshow_window.modify_bg(gtk.STATE_NORMAL, None) else: self.slideshow_window.modify_bg(gtk.STATE_NORMAL, self.bgcolor) self.slideshow_window2 = gtk.Window(gtk.WINDOW_POPUP) self.slideshow_controls2 = gtk.HBox() try: self.ss_exit = gtk.Button("", gtk.STOCK_LEAVE_FULLSCREEN) self.ss_exit.get_child().get_child().get_children()[1].set_text('') except: self.ss_exit = gtk.Button() self.ss_exit.set_image(gtk.image_new_from_stock('leave-fullscreen', gtk.ICON_SIZE_MENU)) self.ss_exit.set_property('can-focus', False) self.ss_exit.connect('clicked', self.leave_fullscreen) self.ss_randomize = gtk.ToggleButton() icon_path = self.find_path('stock_shuffle.png') try: pixbuf = gtk.gdk.pixbuf_new_from_file(icon_path) iconset = gtk.IconSet(pixbuf) factory.add('stock-shuffle', iconset) factory.add_default() self.ss_randomize.set_image(gtk.image_new_from_stock('stock-shuffle', gtk.ICON_SIZE_MENU)) except: self.ss_randomize.set_label("Rand") self.ss_randomize.connect('toggled', self.random_changed) spin_adj = gtk.Adjustment(self.slideshow_delay, 0, 50000, 1,100, 0) self.ss_delayspin = gtk.SpinButton(spin_adj, 1.0, 0) self.ss_delayspin.set_numeric(True) self.ss_delayspin.connect('changed', self.delay_changed) self.slideshow_controls2.pack_start(self.ss_randomize, False, False, 0) self.slideshow_controls2.pack_start(self.ss_delayspin, False, False, 0) self.slideshow_controls2.pack_start(self.ss_exit, False, False, 0) self.slideshow_window2.add(self.slideshow_controls2) if self.simple_bgcolor: self.slideshow_window2.modify_bg(gtk.STATE_NORMAL, None) else: self.slideshow_window2.modify_bg(gtk.STATE_NORMAL, self.bgcolor) # Connect signals self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) self.window.connect("size-allocate", self.window_resized) self.window.connect('key-press-event', self.topwindow_keypress) self.toolbar.connect('focus', self.toolbar_focused) self.layout.drag_dest_set(gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, [("text/uri-list", 0, 80)], gtk.gdk.ACTION_DEFAULT) self.layout.connect('drag_motion', self.motion_cb) self.layout.connect('drag_data_received', self.drop_cb) self.layout.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_MOTION_MASK | gtk.gdk.SCROLL_MASK) self.layout.connect("scroll-event", self.mousewheel_scrolled) self.layout.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.KEY_PRESS_MASK) self.layout.connect("button_press_event", self.button_pressed) self.layout.add_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_RELEASE_MASK) self.layout.connect("motion-notify-event", self.mouse_moved) self.layout.connect("button-release-event", self.button_released) self.imageview.connect("expose-event", self.expose_event) self.thumb_sel_handler = self.thumbpane.get_selection().connect('changed', self.thumbpane_selection_changed) self.thumb_scroll_handler = self.thumbscroll.get_vscrollbar().connect("value-changed", self.thumbpane_scrolled) # Since GNOME does its own thing for the toolbar style... # Requires gnome-python installed to work (but optional) try: client = gconf.client_get_default() style = client.get_string('/desktop/gnome/interface/toolbar_style') if style == "both": self.toolbar.set_style(gtk.TOOLBAR_BOTH) elif style == "both-horiz": self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ) elif style == "icons": self.toolbar.set_style(gtk.TOOLBAR_ICONS) elif style == "text": self.toolbar.set_style(gtk.TOOLBAR_TEXT) client.add_dir("/desktop/gnome/interface", gconf.CLIENT_PRELOAD_NONE) client.notify_add("/desktop/gnome/interface/toolbar_style", self.gconf_key_changed) except: pass # Show GUI: if not self.toolbar_show: self.toolbar.set_property('visible', False) self.toolbar.set_no_show_all(True) if not self.statusbar_show: self.statusbar.set_property('visible', False) self.statusbar.set_no_show_all(True) self.statusbar2.set_property('visible', False) self.statusbar2.set_no_show_all(True) if not self.thumbpane_show: self.thumbscroll.set_property('visible', False) self.thumbscroll.set_no_show_all(True) self.hscroll.set_no_show_all(True) self.vscroll.set_no_show_all(True) go_into_fullscreen = False if opts != []: for o, a in opts: if (o in ("-f", "--fullscreen")) or ((o in ("-s", "--slideshow")) and self.slideshow_in_fullscreen): go_into_fullscreen = True if go_into_fullscreen or self.start_in_fullscreen: self.enter_fullscreen(None) self.statusbar.set_no_show_all(True) self.statusbar2.set_no_show_all(True) self.toolbar.set_no_show_all(True) self.menubar.set_no_show_all(True) self.thumbscroll.set_no_show_all(True) self.window.show_all() self.ss_exit.set_size_request(self.ss_start.size_request()[0], self.ss_stop.size_request()[1]) self.ss_randomize.set_size_request(self.ss_start.size_request()[0], -1) self.ss_start.set_size_request(self.ss_start.size_request()[0]*2, -1) self.ss_stop.set_size_request(self.ss_stop.size_request()[0]*2, -1) self.UIManager.get_widget('/Popup/Exit Full Screen').hide() self.layout.set_flags(gtk.CAN_FOCUS) self.window.set_focus(self.layout) #sets the visibility of some menu entries self.set_slideshow_sensitivities() self.UIManager.get_widget('/MainMenu/MiscKeysMenuHidden').set_property('visible', False) if opts != []: for o, a in opts: if o in ("-f", "--fullscreen"): self.UIManager.get_widget('/Popup/Exit Full Screen').show() # If arguments (filenames) were passed, try to open them: self.image_list = [] if args != []: for i in range(len(args)): args[i] = urllib.url2pathname(args[i]) self.expand_filelist_and_load_image(args) else: self.set_go_sensitivities(False) self.set_image_sensitivities(False) if opts != []: for o, a in opts: if o in ("-s", "--slideshow"): self.toggle_slideshow(None) def refresh_recent_files_menu(self): if self.merge_id_recent: self.UIManager.remove_ui(self.merge_id_recent) if self.actionGroupRecent: self.UIManager.remove_action_group(self.actionGroupRecent) self.actionGroupRecent = None self.actionGroupRecent = gtk.ActionGroup('RecentFiles') self.UIManager.ensure_update() for i in range(len(self.recentfiles)): if len(self.recentfiles[i]) > 0: filename = self.recentfiles[i].split("/")[-1] if len(filename) > 0: if len(filename) > 27: # Replace end of file name (excluding extension) with .. try: menu_name = filename[:25] + '..' + os.path.splitext(filename)[1] except: menu_name = filename[0] else: menu_name = filename menu_name = menu_name.replace('_','__') action = [(str(i), None, menu_name, '' + str(i+1), None, self.recent_action_click)] self.actionGroupRecent.add_actions(action) uiDescription = """ """ for i in range(len(self.recentfiles)): if len(self.recentfiles[i]) > 0: uiDescription = uiDescription + """""" uiDescription = uiDescription + """""" self.merge_id_recent = self.UIManager.add_ui_from_string(uiDescription) self.UIManager.insert_action_group(self.actionGroupRecent, 0) self.UIManager.get_widget('/MainMenu/MiscKeysMenuHidden').set_property('visible', False) def refresh_custom_actions_menu(self): if self.merge_id: self.UIManager.remove_ui(self.merge_id) if self.actionGroupCustom: self.UIManager.remove_action_group(self.actionGroupCustom) self.actionGroupCustom = None self.actionGroupCustom = gtk.ActionGroup('CustomActions') self.UIManager.ensure_update() for i in range(len(self.action_names)): action = [(self.action_names[i], None, self.action_names[i], self.action_shortcuts[i], None, self.custom_action_click)] self.actionGroupCustom.add_actions(action) uiDescription = """ """ for i in range(len(self.action_names)): uiDescription = uiDescription + """""" uiDescription = uiDescription + """""" self.merge_id = self.UIManager.add_ui_from_string(uiDescription) self.UIManager.insert_action_group(self.actionGroupCustom, 0) self.UIManager.get_widget('/MainMenu/MiscKeysMenuHidden').set_property('visible', False) def thumbpane_update_images(self, clear_first=False, force_upto_imgnum=-1): self.stop_now = False # When first populating the thumbpane, make sure we go up to at least # force_upto_imgnum so that we can show this image selected: if clear_first: self.thumbpane_clear_list() # Load all images up to the bottom ofo the visible thumbpane rect: rect = self.thumbpane.get_visible_rect() bottom_coord = rect.y + rect.height + self.thumbnail_size if bottom_coord > self.thumbpane_bottom_coord_loaded: self.thumbpane_bottom_coord_loaded = bottom_coord # update images: if not self.thumbpane_updating: thread = threading.Thread(target=self.thumbpane_update_pending_images, args=(force_upto_imgnum, None)) thread.setDaemon(True) thread.start() def thumbpane_create_dir(self): if not os.path.exists(os.path.expanduser('~/.thumbnails/')): os.mkdir(os.path.expanduser('~/.thumbnails/')) if not os.path.exists(os.path.expanduser('~/.thumbnails/normal/')): os.mkdir(os.path.expanduser('~/.thumbnails/normal/')) def thumbpane_update_pending_images(self, force_upto_imgnum, foo): self.thumbpane_updating = True self.thumbpane_create_dir() # Check to see if any images need their thumbnails generated. curr_coord = 0 imgnum = 0 while curr_coord < self.thumbpane_bottom_coord_loaded or imgnum <= force_upto_imgnum: if self.closing_app or self.stop_now or not self.thumbpane_show: break if imgnum >= len(self.image_list): break self.thumbpane_set_image(self.image_list[imgnum], imgnum) curr_coord += self.thumbpane.get_background_area((imgnum,),self.thumbcolumn).height if force_upto_imgnum == imgnum: # Verify that the user hasn't switched images while we're loading thumbnails: if force_upto_imgnum == self.curr_img_in_list: gobject.idle_add(self.thumbpane_select, force_upto_imgnum) imgnum += 1 self.thumbpane_updating = False def thumbpane_clear_list(self): self.thumbpane_bottom_coord_loaded = 0 self.thumbscroll.get_vscrollbar().handler_block(self.thumb_scroll_handler) self.thumblist.clear() self.thumbscroll.get_vscrollbar().handler_unblock(self.thumb_scroll_handler) for image in self.image_list: blank_pix = self.get_blank_pix_for_image(image) self.thumblist.append([blank_pix]) self.thumbnail_loaded = [False]*len(self.image_list) def thumbpane_set_image(self, image_name, imgnum, force_update=False): if self.thumbpane_show: if not self.thumbnail_loaded[imgnum] or force_update: filename, thumbfile = self.thumbnail_get_name(image_name) pix = self.thumbpane_get_pixbuf(thumbfile, filename, force_update) if pix: if self.thumbnail_size != 128: # 128 is the size of the saved thumbnail, so convert if different: pix, image_width, image_height = self.get_pixbuf_of_size(pix, self.thumbnail_size, gtk.gdk.INTERP_TILES) self.thumbnail_loaded[imgnum] = True self.thumbscroll.get_vscrollbar().handler_block(self.thumb_scroll_handler) pix = self.pixbuf_add_border(pix) try: self.thumblist[imgnum] = [pix] except: pass self.thumbscroll.get_vscrollbar().handler_unblock(self.thumb_scroll_handler) def thumbnail_get_name(self, image_name): filename = os.path.expanduser('file://' + image_name) uriname = os.path.expanduser('file://' + urllib.pathname2url(image_name)) if HAS_HASHLIB: m = hashlib.md5() else: m = md5.new() m.update(uriname) mhex = m.hexdigest() mhex_filename = os.path.expanduser('~/.thumbnails/normal/' + mhex + '.png') return filename, mhex_filename def thumbpane_get_pixbuf(self, thumb_url, image_url, force_generation): # Returns a valid pixbuf or None if a pixbuf cannot be generated. Tries to re-use # a thumbnail from ~/.thumbails/normal/, otherwise generates one with the # XDG filename: md5(file:///full/path/to/image).png imgfile = image_url if imgfile[:7] == 'file://': imgfile = imgfile[7:] try: if os.path.exists(thumb_url) and not force_generation: pix = gtk.gdk.pixbuf_new_from_file(thumb_url) pix_mtime = pix.get_option('tEXt::Thumb::MTime') if pix_mtime: st = os.stat(imgfile) file_mtime = str(st[stat.ST_MTIME]) # If the mtimes match, we're good. if not, regenerate the thumbnail.. if pix_mtime == file_mtime: return pix # Create the 128x128 thumbnail: uri = 'file://' + urllib.pathname2url(imgfile) pix = gtk.gdk.pixbuf_new_from_file(imgfile) pix, image_width, image_height = self.get_pixbuf_of_size(pix, 128, gtk.gdk.INTERP_TILES) st = os.stat(imgfile) file_mtime = str(st[stat.ST_MTIME]) # Save image to .thumbnails: pix.save(thumb_url, "png", {'tEXt::Thumb::URI':uri, 'tEXt::Thumb::MTime':file_mtime, 'tEXt::Software':'Mirage' + __version__}) return pix except: return None def thumbpane_load_image(self, treeview, imgnum): if imgnum != self.curr_img_in_list: gobject.idle_add(self.goto_image, str(imgnum), None) def thumbpane_selection_changed(self, treeview): cancel = self.autosave_image() if cancel: # Revert selection... gobject.idle_add(self.thumbpane_select, self.curr_img_in_list) return True try: model, paths = self.thumbpane.get_selection().get_selected_rows() imgnum = paths[0][0] if not self.thumbnail_loaded[imgnum]: self.thumbpane_set_image(self.image_list[imgnum], imgnum) gobject.idle_add(self.thumbpane_load_image, treeview, imgnum) except: pass def thumbpane_select(self, imgnum): if self.thumbpane_show: self.thumbpane.get_selection().handler_block(self.thumb_sel_handler) try: self.thumbpane.get_selection().select_path((imgnum,)) self.thumbpane.scroll_to_cell((imgnum,)) except: pass self.thumbpane.get_selection().handler_unblock(self.thumb_sel_handler) def thumbpane_set_size(self): self.thumbcolumn.set_fixed_width(self.thumbpane_get_size()) self.window_resized(None, self.window.allocation, True) def thumbpane_get_size(self): return int(self.thumbnail_size * 1.3) def thumbpane_scrolled(self, range): self.thumbpane_update_images() def get_blank_pix_for_image(self, image): # Sizes the "blank image" icon for the thumbpane. This will ensure that we don't # load a humongous icon for a small pix, for example, and will keep the thumbnails # from shifting around when they are actually loaded. try: info = gtk.gdk.pixbuf_get_file_info(image) imgwidth = float(info[1]) imgheight = float(info[2]) if imgheight > self.thumbnail_size: if imgheight > imgwidth: imgheight = self.thumbnail_size else: imgheight = imgheight/imgwidth * self.thumbnail_size imgheight = 2 + int(imgheight) # Account for border that will be added to thumbnails.. imgwidth = self.thumbnail_size except: imgheight = 2 + self.thumbnail_size imgwidth = self.thumbnail_size blank_pix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, imgwidth, imgheight) blank_pix.fill(0x00000000) imgwidth2 = int(imgheight*0.8) imgheight2 = int(imgheight*0.8) composite_pix = self.blank_image.scale_simple(imgwidth2, imgheight2, gtk.gdk.INTERP_BILINEAR) leftcoord = int((imgwidth - imgwidth2)/2) topcoord = int((imgheight - imgheight2)/2) composite_pix.copy_area(0, 0, imgwidth2, imgheight2, blank_pix, leftcoord, topcoord) return blank_pix def find_path(self, filename, exit_on_fail=True): """ Find a pixmap or icon by looking through standard dirs. If the image isn't found exit with error status 1 unless exit_on_fail is set to False, then return None """ if not self.resource_path_list: #If executed from mirage in bin this points to the basedir basedir_mirage = os.path.split(sys.path[0])[0] #If executed from mirage.py module in python lib this points to the basedir f0 = os.path.split(__file__)[0].split('/lib')[0] self.resource_path_list = list(set(filter(os.path.isdir, [ os.path.join(basedir_mirage, 'share', 'mirage'), os.path.join(basedir_mirage, 'share', 'pixmaps'), os.path.join(sys.prefix, 'share', 'mirage'), os.path.join(sys.prefix, 'share', 'pixmaps'), os.path.join(sys.prefix, 'local', 'share', 'mirage'), os.path.join(sys.prefix, 'local', 'share', 'pixmaps'), sys.path[0], #If it's run non-installed os.path.join(f0, 'share', 'mirage'), os.path.join(f0, 'share', 'pixmaps'), ]))) for path in self.resource_path_list: pix = os.path.join(path, filename) if os.path.exists(pix): return pix # If we reached here, we didn't find the pixmap if exit_on_fail: print _("Couldn't find the image %s. Please check your installation.") % filename sys.exit(1) else: return None def gconf_key_changed(self, client, cnxn_id, entry, label): if entry.value.type == gconf.VALUE_STRING: style = entry.value.to_string() if style == "both": self.toolbar.set_style(gtk.TOOLBAR_BOTH) elif style == "both-horiz": self.toolbar.set_style(gtk.TOOLBAR_BOTH_HORIZ) elif style == "icons": self.toolbar.set_style(gtk.TOOLBAR_ICONS) elif style == "text": self.toolbar.set_style(gtk.TOOLBAR_TEXT) if self.image_loaded and self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) def toolbar_focused(self, widget, direction): self.layout.grab_focus() return True def topwindow_keypress(self, widget, event): # For whatever reason, 'Left' and 'Right' cannot be used as menu # accelerators so we will manually check for them here: if event.state != gtk.gdk.SHIFT_MASK and event.state != gtk.gdk.CONTROL_MASK and event.state != gtk.gdk.MOD1_MASK and event.state != gtk.gdk.CONTROL_MASK | gtk.gdk.MOD2_MASK and event.state != gtk.gdk.LOCK_MASK | gtk.gdk.CONTROL_MASK: if event.keyval == gtk.gdk.keyval_from_name('Left') or event.keyval == gtk.gdk.keyval_from_name('Up'): self.goto_prev_image(None) return elif event.keyval == gtk.gdk.keyval_from_name('Right') or event.keyval == gtk.gdk.keyval_from_name('Down'): self.goto_next_image(None) return shortcut = gtk.accelerator_name(event.keyval, event.state) if "Escape" in shortcut: self.stop_now = True self.searching_for_images = False while gtk.events_pending(): gtk.main_iteration() self.update_title() return def parse_action_command(self, command, batchmode): self.running_custom_actions = True self.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration() self.curr_custom_action = 0 if batchmode: self.num_custom_actions = len(self.image_list) for i in range(self.num_custom_actions): self.curr_custom_action += 1 self.update_statusbar() while gtk.events_pending(): gtk.main_iteration() imagename = self.image_list[i] self.parse_action_command2(command, imagename) else: self.num_custom_actions = 1 self.curr_custom_action = 1 self.update_statusbar() while gtk.events_pending(): gtk.main_iteration() self.parse_action_command2(command, self.currimg_name) gc.collect() self.change_cursor(None) # Refresh the current image or any preloaded needed if they have changed: if not os.path.exists(self.currimg_name): self.currimg_pixbuf_original = None self.image_load_failed(False) else: animtest = gtk.gdk.PixbufAnimation(self.currimg_name) if animtest.is_static_image(): if self.images_are_different(animtest.get_static_image(), self.currimg_pixbuf_original): self.load_new_image2(False, False, True, False) else: if self.images_are_different(animtest, self.currimg_pixbuf_original): self.load_new_image2(False, False, True, False) self.running_custom_actions = False self.update_statusbar() while gtk.events_pending(): gtk.main_iteration() if not os.path.exists(self.preloadimg_prev_name): self.preloadimg_prev_in_list = -1 else: animtest = gtk.gdk.PixbufAnimation(self.preloadimg_prev_name) if animtest.is_static_image(): if self.images_are_different(animtest.get_static_image(), self.preloadimg_prev_pixbuf_original): self.preloadimg_prev_in_list = -1 self.preload_when_idle = gobject.idle_add(self.preload_prev_image, False) else: if self.images_are_different(animtest, self.preloadimg_prev_pixbuf_original): self.preloadimg_prev_in_list = -1 self.preload_when_idle = gobject.idle_add(self.preload_prev_image, False) if not os.path.exists(self.preloadimg_next_name): self.preloadimg_next_in_list = -1 else: animtest = gtk.gdk.PixbufAnimation(self.preloadimg_next_name) if animtest.is_static_image(): if self.images_are_different(animtest.get_static_image(), self.preloadimg_next_pixbuf_original): self.preloadimg_next_in_list = -1 self.preload_when_idle = gobject.idle_add(self.preload_next_image, False) else: if self.images_are_different(animtest, self.preloadimg_next_pixbuf_original): self.preloadimg_next_in_list = -1 self.preload_when_idle = gobject.idle_add(self.preload_next_image, False) self.stop_now = False if batchmode: # Update all thumbnails: gobject.idle_add(self.thumbpane_update_images, True, self.curr_img_in_list) else: # Update only the current thumbnail: gobject.idle_add(self.thumbpane_set_image, self.image_list[self.curr_img_in_list], self.curr_img_in_list, True) def images_are_different(self, pixbuf1, pixbuf2): if pixbuf1.get_pixels() == pixbuf2.get_pixels(): return False else: return True def recent_action_click(self, action): self.stop_now = True while gtk.events_pending(): gtk.main_iteration() cancel = self.autosave_image() if cancel: return index = int(action.get_name()) if os.path.isfile(self.recentfiles[index]) or os.path.exists(self.recentfiles[index]) or self.recentfiles[index].startswith('http://') or self.recentfiles[index].startswith('ftp://'): self.expand_filelist_and_load_image([self.recentfiles[index]]) else: self.image_list = [] self.curr_img_in_list = 0 self.image_list.append(self.recentfiles[index]) self.image_load_failed(False) self.recent_file_remove_and_refresh(index) def recent_file_remove_and_refresh_name(self, rmfile): index_num = 0 for imgfile in self.recentfiles: if imgfile == rmfile: self.recent_file_remove_and_refresh(index_num) break index_num += index_num def recent_file_remove_and_refresh(self, index_num): i = index_num while i < len(self.recentfiles)-1: self.recentfiles[i] = self.recentfiles[i+1] i = i + 1 # Set last item empty: self.recentfiles[len(self.recentfiles)-1] = '' self.refresh_recent_files_menu() def recent_file_add_and_refresh(self, addfile): # First check if the filename is already in the list: for i in range(len(self.recentfiles)): if len(self.recentfiles[i]) > 0: if addfile == self.recentfiles[i]: # If found in list, put to position 1 and decrement the rest: j = i while j > 0: self.recentfiles[j] = self.recentfiles[j-1] j = j - 1 self.recentfiles[0] = addfile self.refresh_recent_files_menu() return # If not found, put to position 1, decrement the rest: j = len(self.recentfiles)-1 while j > 0: self.recentfiles[j] = self.recentfiles[j-1] j = j - 1 if len(self.recentfiles) > 0: self.recentfiles[0] = addfile self.refresh_recent_files_menu() def custom_action_click(self, action): if self.UIManager.get_widget('/MainMenu/EditMenu/ActionSubMenu/' + action.get_name()).get_property('sensitive'): for i in range(len(self.action_shortcuts)): try: if action.get_name() == self.action_names[i]: self.parse_action_command(self.action_commands[i], self.action_batch[i]) except: pass def parse_action_command2(self, cmd, imagename): # Executes the given command using ``os.system``, substituting "%"-macros approprately. def sh_esc(s): import re return re.sub(r'[^/._a-zA-Z0-9-]', lambda c: '\\'+c.group(), s) cmd = cmd.strip() # [NEXT] and [PREV] are only valid alone or at the end of the command if cmd == "[NEXT]": self.goto_next_image(None) return elif cmd == "[PREV]": self.goto_prev_image(None) return # -1=go to previous, 1=go to next, 0=don't change prev_or_next=0 if cmd[-6:] == "[NEXT]": prev_or_next=1 cmd = cmd[:-6] elif cmd[-6:] == "[PREV]": prev_or_next=-1 cmd = cmd[:-6] if "%F" in cmd: cmd = cmd.replace("%F", sh_esc(imagename)) if "%N" in cmd: cmd = cmd.replace("%N", sh_esc(os.path.splitext(os.path.basename(imagename))[0])) if "%P" in cmd: cmd = cmd.replace("%P", sh_esc(os.path.dirname(imagename) + "/")) if "%E" in cmd: cmd = cmd.replace("%E", sh_esc(os.path.splitext(os.path.basename(imagename))[1])) if "%L" in cmd: cmd = cmd.replace("%L", " ".join([sh_esc(s) for s in self.image_list])) if self.verbose: print _("Action: %s") % cmd shell_rc = os.system(cmd) >> 8 if self.verbose: print _("Action return code: %s") % shell_rc if shell_rc != 0: msg = _('Unable to launch \"%s\". Please specify a valid command from Edit > Custom Actions.') % cmd error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, msg) error_dialog.set_title(_("Invalid Custom Action")) error_dialog.run() error_dialog.destroy() elif prev_or_next == 1: self.goto_next_image(None) elif prev_or_next == -1: self.goto_prev_image(None) self.running_custom_actions = False def set_go_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/GoMenu/Previous Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/Next Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/Random Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/First Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/Last Image').set_sensitive(enable) self.UIManager.get_widget('/Popup/Previous Image').set_sensitive(enable) self.UIManager.get_widget('/Popup/Next Image').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/Previous2').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/Next2').set_sensitive(enable) self.ss_forward.set_sensitive(enable) self.ss_back.set_sensitive(enable) def set_image_sensitivities(self, enable): self.set_zoom_in_sensitivities(enable) self.set_zoom_out_sensitivities(enable) self.UIManager.get_widget('/MainMenu/ViewMenu/1:1').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/ViewMenu/Fit').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Delete Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Rename Image').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Crop').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Resize').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Saturation').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/1:1').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/Fit').set_sensitive(enable) self.UIManager.get_widget('/Popup/1:1').set_sensitive(enable) self.UIManager.get_widget('/Popup/Fit').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/FileMenu/Save As').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_sensitive(False) self.UIManager.get_widget('/MainMenu/FileMenu/Properties').set_sensitive(False) # Only jpeg, png, and bmp images are currently supported for saving if len(self.image_list) > 0: try: filetype = gtk.gdk.pixbuf_get_file_info(self.currimg_name)[0]['name'] self.UIManager.get_widget('/MainMenu/FileMenu/Properties').set_sensitive(True) if self.filetype_is_writable(filetype): self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_sensitive(enable) except: self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_sensitive(False) if self.actionGroupCustom: for action in self.action_names: self.UIManager.get_widget('/MainMenu/EditMenu/ActionSubMenu/' + action).set_sensitive(enable) if not HAS_IMGFUNCS: enable = False self.UIManager.get_widget('/MainMenu/EditMenu/Rotate Left').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Rotate Right').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Flip Vertically').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/EditMenu/Flip Horizontally').set_sensitive(enable) def set_zoom_in_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/ViewMenu/In').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/In').set_sensitive(enable) self.UIManager.get_widget('/Popup/In').set_sensitive(enable) def set_zoom_out_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/ViewMenu/Out').set_sensitive(enable) self.UIManager.get_widget('/MainToolbar/Out').set_sensitive(enable) self.UIManager.get_widget('/Popup/Out').set_sensitive(enable) def set_next_image_sensitivities(self, enable): self.UIManager.get_widget('/MainToolbar/Next2').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/Next Image').set_sensitive(enable) self.UIManager.get_widget('/Popup/Next Image').set_sensitive(enable) self.ss_forward.set_sensitive(enable) def set_previous_image_sensitivities(self, enable): self.UIManager.get_widget('/MainToolbar/Previous2').set_sensitive(enable) self.UIManager.get_widget('/MainMenu/GoMenu/Previous Image').set_sensitive(enable) self.UIManager.get_widget('/Popup/Previous Image').set_sensitive(enable) self.ss_back.set_sensitive(enable) def set_first_image_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/GoMenu/First Image').set_sensitive(enable) def set_last_image_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/GoMenu/Last Image').set_sensitive(enable) def set_random_image_sensitivities(self, enable): self.UIManager.get_widget('/MainMenu/GoMenu/Random Image').set_sensitive(enable) def set_slideshow_sensitivities(self): if len(self.image_list) <=1: self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').show() self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').set_sensitive(False) self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').hide() self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').set_sensitive(False) elif self.slideshow_mode: self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').hide() self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').set_sensitive(False) self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').show() self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').set_sensitive(True) else: self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').show() self.UIManager.get_widget('/MainMenu/GoMenu/Start Slideshow').set_sensitive(True) self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').hide() self.UIManager.get_widget('/MainMenu/GoMenu/Stop Slideshow').set_sensitive(False) if self.slideshow_mode: self.UIManager.get_widget('/Popup/Start Slideshow').hide() self.UIManager.get_widget('/Popup/Stop Slideshow').show() else: self.UIManager.get_widget('/Popup/Start Slideshow').show() self.UIManager.get_widget('/Popup/Stop Slideshow').hide() if len(self.image_list) <=1: self.UIManager.get_widget('/Popup/Start Slideshow').set_sensitive(False) else: self.UIManager.get_widget('/Popup/Start Slideshow').set_sensitive(True) def set_zoom_sensitivities(self): if not self.currimg_is_animation: self.set_zoom_out_sensitivities(True) self.set_zoom_in_sensitivities(True) else: self.set_zoom_out_sensitivities(False) self.set_zoom_in_sensitivities(False) def print_version(self): print _("Version: Mirage"), __version__ print _("Website: http://mirageiv.berlios.de") def print_usage(self): self.print_version() print "" print _("Usage: mirage [OPTION]... FILES|FOLDERS...") print "" print _("Options") + ":" print " -h, --help " + _("Show this help and exit") print " -v, --version " + _("Show version information and exit") print " -V, --verbose " + _("Show more detailed information") print " -R, --recursive " + _("Recursively include all images found in") print " " + _("subdirectories of FOLDERS") print " -s, --slideshow " + _("Start in slideshow mode") print " -f, --fullscreen " + _("Start in fullscreen mode") print " -o, --onload 'cmd' " + _("Execute 'cmd' when an image is loaded") print " " + _("uses same syntax as custom actions,\n") print " " + _("i.e. mirage -o 'echo file is %F'") def delay_changed(self, action): self.curr_slideshow_delay = self.ss_delayspin.get_value() if self.slideshow_mode: gobject.source_remove(self.timer_delay) if self.curr_slideshow_random: self.timer_delay = gobject.timeout_add(int(self.curr_slideshow_delay*1000), self.goto_random_image, "ss") else: self.timer_delay = gobject.timeout_add((self.curr_slideshow_delay*1000), self.goto_next_image, "ss") self.window.set_focus(self.layout) def random_changed(self, action): self.curr_slideshow_random = self.ss_randomize.get_active() def motion_cb(self, widget, context, x, y, time): context.drag_status(gtk.gdk.ACTION_COPY, time) return True def drop_cb(self, widget, context, x, y, selection, info, time): uri = selection.data.strip() path = urllib.url2pathname(uri) paths = path.rsplit('\n') for i, path in enumerate(paths): paths[i] = path.rstrip('\r') self.expand_filelist_and_load_image(paths) def put_error_image_to_window(self): self.imageview.set_from_stock(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_LARGE_TOOLBAR) self.currimg_width = self.imageview.size_request()[0] self.currimg_height = self.imageview.size_request()[1] self.center_image() self.set_go_sensitivities(False) self.set_image_sensitivities(False) self.update_statusbar() self.loaded_img_in_list = -1 return def expose_event(self, widget, event): if self.updating_adjustments: return self.updating_adjustments = True if self.hscroll.get_property('visible'): try: zoomratio = float(self.currimg_width)/self.previmg_width newvalue = abs(self.layout.get_hadjustment().get_value() * zoomratio + (self.available_image_width()) * (zoomratio - 1) / 2) if newvalue >= self.layout.get_hadjustment().lower and newvalue <= (self.layout.get_hadjustment().upper - self.layout.get_hadjustment().page_size): self.layout.get_hadjustment().set_value(newvalue) except: pass if self.vscroll.get_property('visible'): try: newvalue = abs(self.layout.get_vadjustment().get_value() * zoomratio + (self.available_image_height()) * (zoomratio - 1) / 2) if newvalue >= self.layout.get_vadjustment().lower and newvalue <= (self.layout.get_vadjustment().upper - self.layout.get_vadjustment().page_size): self.layout.get_vadjustment().set_value(newvalue) self.previmg_width = self.currimg_width except: pass self.updating_adjustments = False def window_resized(self, widget, allocation, force_update=False): # Update the image size on window resize if the current image was last fit: if self.image_loaded: if force_update or allocation.width != self.prevwinwidth or allocation.height != self.prevwinheight: if self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) else: self.center_image() self.load_new_image_stop_now() self.show_scrollbars_if_needed() # Also, regenerate preloaded image for new window size: self.preload_when_idle = gobject.idle_add(self.preload_next_image, True) self.preload_when_idle2 = gobject.idle_add(self.preload_prev_image, True) self.prevwinwidth = allocation.width self.prevwinheight = allocation.height return def save_settings(self): conf = ConfigParser.ConfigParser() conf.add_section('window') conf.set('window', 'w', self.window.get_allocation().width) conf.set('window', 'h', self.window.get_allocation().height) conf.set('window', 'toolbar', self.toolbar_show) conf.set('window', 'statusbar', self.statusbar_show) conf.set('window', 'thumbpane', self.thumbpane_show) conf.add_section('prefs') conf.set('prefs', 'simple-bgcolor', self.simple_bgcolor) conf.set('prefs', 'bgcolor-red', self.bgcolor.red) conf.set('prefs', 'bgcolor-green', self.bgcolor.green) conf.set('prefs', 'bgcolor-blue', self.bgcolor.blue) conf.set('prefs', 'open_all', self.open_all_images) conf.set('prefs', 'hidden', self.open_hidden_files) conf.set('prefs', 'use_last_dir', self.use_last_dir) conf.set('prefs', 'last_dir', self.last_dir) conf.set('prefs', 'fixed_dir', self.fixed_dir) conf.set('prefs', 'open_mode', self.open_mode) conf.set('prefs', 'last_mode', self.last_mode) conf.set('prefs', 'listwrap_mode', self.listwrap_mode) conf.set('prefs', 'slideshow_delay', int(self.slideshow_delay)) conf.set('prefs', 'slideshow_random', self.slideshow_random) conf.set('prefs', 'zoomquality', self.zoomvalue) conf.set('prefs', 'quality_save', int(self.quality_save)) conf.set('prefs', 'disable_screensaver', self.disable_screensaver) conf.set('prefs', 'slideshow_in_fullscreen', self.slideshow_in_fullscreen) conf.set('prefs', 'confirm_delete', self.confirm_delete) conf.set('prefs', 'preloading_images', self.preloading_images) conf.set('prefs', 'savemode', self.savemode) conf.set('prefs', 'start_in_fullscreen', self.start_in_fullscreen) conf.set('prefs', 'thumbsize', self.thumbnail_size) conf.set('prefs', 'screenshot_delay', self.screenshot_delay) conf.add_section('actions') conf.set('actions', 'num_actions', len(self.action_names)) for i in range(len(self.action_names)): conf.set('actions', 'names[' + str(i) + ']', self.action_names[i]) conf.set('actions', 'commands[' + str(i) + ']', self.action_commands[i]) conf.set('actions', 'shortcuts[' + str(i) + ']', self.action_shortcuts[i]) conf.set('actions', 'batch[' + str(i) + ']', self.action_batch[i]) conf.add_section('recent') conf.set('recent', 'num_recent', len(self.recentfiles)) for i in range(len(self.recentfiles)): conf.set('recent', 'num[' + str(i) + ']', len(self.recentfiles[i])) conf.set('recent', 'urls[' + str(i) + ',0]', self.recentfiles[i]) if not os.path.exists(self.config_dir): os.makedirs(self.config_dir) conf.write(file(self.config_dir + '/miragerc', 'w')) # Also, save accel_map: gtk.accel_map_save(self.config_dir + '/accel_map') return def delete_event(self, widget, event, data=None): cancel = self.autosave_image() if cancel: return True self.stop_now = True self.closing_app = True self.save_settings() sys.exit(0) def destroy(self, event, data=None): cancel = self.autosave_image() if cancel: return True self.stop_now = True self.closing_app = True self.save_settings() def exit_app(self, action): cancel = self.autosave_image() if cancel: return True self.stop_now = True self.closing_app = True self.save_settings() sys.exit(0) def put_zoom_image_to_window(self, currimg_preloaded): self.window.window.freeze_updates() if not currimg_preloaded: # Always start with the original image to preserve quality! # Calculate image size: finalimg_width = int(self.currimg_pixbuf_original.get_width() * self.currimg_zoomratio) finalimg_height = int(self.currimg_pixbuf_original.get_height() * self.currimg_zoomratio) if not self.currimg_is_animation: # Scale image: if not self.currimg_pixbuf_original.get_has_alpha(): self.currimg_pixbuf = self.currimg_pixbuf_original.scale_simple(finalimg_width, finalimg_height, self.zoom_quality) else: colormap = self.imageview.get_colormap() light_grey = colormap.alloc_color('#666666', True, True) dark_grey = colormap.alloc_color('#999999', True, True) self.currimg_pixbuf = self.currimg_pixbuf_original.composite_color_simple(finalimg_width, finalimg_height, self.zoom_quality, 255, 8, light_grey.pixel, dark_grey.pixel) else: self.currimg_pixbuf = self.currimg_pixbuf_original self.currimg_width, self.currimg_height = finalimg_width, finalimg_height self.layout.set_size(self.currimg_width, self.currimg_height) self.center_image() self.show_scrollbars_if_needed() if not self.currimg_is_animation: self.imageview.set_from_pixbuf(self.currimg_pixbuf) self.previmage_is_animation = False else: self.imageview.set_from_animation(self.currimg_pixbuf) self.previmage_is_animation = True # Clean up (free memory) because I'm lazy gc.collect() self.window.window.thaw_updates() self.loaded_img_in_list = self.curr_img_in_list def show_scrollbars_if_needed(self): if self.currimg_width > self.available_image_width(): self.hscroll.show() else: self.hscroll.hide() if self.currimg_height > self.available_image_height(): self.vscroll.show() else: self.vscroll.hide() def center_image(self): x_shift = int((self.available_image_width() - self.currimg_width)/2) if x_shift < 0: x_shift = 0 y_shift = int((self.available_image_height() - self.currimg_height)/2) if y_shift < 0: y_shift = 0 self.layout.move(self.imageview, x_shift, y_shift) def available_image_width(self): width = self.window.get_size()[0] if not self.fullscreen_mode: if self.thumbpane_show: width -= self.thumbscroll.size_request()[0] return width def available_image_height(self): height = self.window.get_size()[1] if not self.fullscreen_mode: height -= self.menubar.size_request()[1] if self.toolbar_show: height -= self.toolbar.size_request()[1] if self.statusbar_show: height -= self.statusbar.size_request()[1] return height def save_image(self, action): if self.UIManager.get_widget('/MainMenu/FileMenu/Save').get_property('sensitive'): self.save_image_now(self.currimg_name, gtk.gdk.pixbuf_get_file_info(self.currimg_name)[0]['name']) def save_image_as(self, action): dialog = gtk.FileChooserDialog(title=_("Save As"),action=gtk.FILE_CHOOSER_ACTION_SAVE,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) filename = os.path.basename(self.currimg_name) filetype = None dialog.set_current_folder(os.path.dirname(self.currimg_name)) dialog.set_current_name(filename) dialog.set_do_overwrite_confirmation(True) response = dialog.run() if response == gtk.RESPONSE_OK: prev_name = self.currimg_name filename = dialog.get_filename() dialog.destroy() fileext = os.path.splitext(os.path.basename(filename))[1].lower() if len(fileext) > 0: fileext = fileext[1:] # Override filetype if user typed a filename with a different extension: for i in gtk.gdk.pixbuf_get_formats(): if fileext in i['extensions']: filetype = i['name'] self.save_image_now(filename, filetype) self.register_file_with_recent_docs(filename) else: dialog.destroy() def save_image_now(self, dest_name, filetype): try: self.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) while gtk.events_pending(): gtk.main_iteration() if filetype == None: filetype = gtk.gdk.pixbuf_get_file_info(self.currimg_name)[0]['name'] if self.filetype_is_writable(filetype): self.currimg_pixbuf_original.save(dest_name, filetype, {'quality': str(self.quality_save)}) self.currimg_name = dest_name self.image_list[self.curr_img_in_list] = dest_name self.update_title() self.update_statusbar() # Update thumbnail: gobject.idle_add(self.thumbpane_set_image, dest_name, self.curr_img_in_list, True) self.image_modified = False else: error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, _('The %s format is not supported for saving. Do you wish to save the file in a different format?') % filetype) error_dialog.set_title(_("Save")) response = error_dialog.run() if response == gtk.RESPONSE_YES: error_dialog.destroy() while gtk.events_pending(): gtk.main_iteration() self.save_image_as(None) else: error_dialog.destroy() except: error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('Unable to save %s') % dest_name) error_dialog.set_title(_("Save")) error_dialog.run() error_dialog.destroy() self.change_cursor(None) def autosave_image(self): # Returns True if the user has canceled out of the dialog # Never call this function from an idle or timeout loop! That will cause # the app to freeze. if self.image_modified: if self.savemode == 1: temp = self.UIManager.get_widget('/MainMenu/FileMenu/Save').get_property('sensitive') self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_property('sensitive', True) self.save_image(None) self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_property('sensitive', temp) elif self.savemode == 2: dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_NONE, _("The current image has been modified. Save changes?")) dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dialog.add_button(gtk.STOCK_NO, gtk.RESPONSE_NO) dialog.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_YES) dialog.set_title(_("Save?")) dialog.set_default_response(gtk.RESPONSE_YES) response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_YES: temp = self.UIManager.get_widget('/MainMenu/FileMenu/Save').get_property('sensitive') self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_property('sensitive', True) self.save_image(None) self.UIManager.get_widget('/MainMenu/FileMenu/Save').set_property('sensitive', temp) self.image_modified = False elif response == gtk.RESPONSE_NO: self.image_modified = False # Ensures that we don't use the current pixbuf for any preload pixbufs if we are in # the process of loading the previous or next image in the list: self.currimg_pixbuf = self.currimg_pixbuf_original self.preloadimg_next_in_list = -1 self.preloadimg_prev_in_list = -1 self.loaded_img_in_list = -1 else: return True def filetype_is_writable(self, filetype): # Determine if filetype is a writable format filetype_is_writable = True for i in gtk.gdk.pixbuf_get_formats(): if filetype in i['extensions']: if i['is_writable']: return True return False def open_file(self, action): self.stop_now = True while gtk.events_pending(): gtk.main_iteration() self.open_file_or_folder(action, True) def open_file_remote(self, action): # Prompt user for the url: dialog = gtk.Dialog(_("Open Remote"), self.window, gtk.DIALOG_MODAL, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) location = gtk.Entry() location.set_size_request(300, -1) location.set_activates_default(True) hbox = gtk.HBox() hbox.pack_start(gtk.Label(_("Image Location (URL):")), False, False, 5) hbox.pack_start(location, True, True, 5) dialog.vbox.pack_start(hbox, True, True, 10) dialog.set_default_response(gtk.RESPONSE_OK) dialog.vbox.show_all() dialog.connect('response', self.open_file_remote_response, location) response = dialog.show() def open_file_remote_response(self, dialog, response, location): if response == gtk.RESPONSE_OK: filenames = [] filenames.append(location.get_text()) dialog.destroy() while gtk.events_pending(): gtk.main_iteration() self.expand_filelist_and_load_image(filenames) else: dialog.destroy() def open_folder(self, action): self.stop_now = True while gtk.events_pending(): gtk.main_iteration() self.open_file_or_folder(action, False) def open_file_or_folder(self, action, isfile): self.thumbpane_create_dir() cancel = self.autosave_image() if cancel: return # If isfile = True, file; If isfile = False, folder dialog = gtk.FileChooserDialog(title=_("Open"),action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) if isfile: filter = gtk.FileFilter() filter.set_name(_("Images")) filter.add_pixbuf_formats() dialog.add_filter(filter) filter = gtk.FileFilter() filter.set_name(_("All files")) filter.add_pattern("*") dialog.add_filter(filter) preview = gtk.Image() dialog.set_preview_widget(preview) dialog.set_use_preview_label(False) dialog.connect("update-preview", self.update_preview, preview) recursivebutton = None else: dialog.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) recursivebutton = gtk.CheckButton(label=_("Include images in subdirectories")) dialog.set_extra_widget(recursivebutton) dialog.set_default_response(gtk.RESPONSE_OK) dialog.set_select_multiple(True) if self.use_last_dir: if self.last_dir != None: dialog.set_current_folder(self.last_dir) else: if self.fixed_dir != None: dialog.set_current_folder(self.fixed_dir) dialog.connect("response", self.open_file_or_folder_response, isfile, recursivebutton) response = dialog.show() def open_file_or_folder_response(self, dialog, response, isfile, recursivebutton): if response == gtk.RESPONSE_OK: if self.use_last_dir: self.last_dir = dialog.get_current_folder() if not isfile and recursivebutton.get_property('active'): self.recursive = True filenames = dialog.get_filenames() dialog.destroy() while gtk.events_pending(): gtk.main_iteration() self.expand_filelist_and_load_image(filenames) else: dialog.destroy() def update_preview(self, file_chooser, preview): filename = file_chooser.get_preview_filename() if not filename: return filename, thumbfile = self.thumbnail_get_name(filename) pixbuf = self.thumbpane_get_pixbuf(thumbfile, filename, False) if pixbuf: preview.set_from_pixbuf(pixbuf) else: pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 1, 8, 128, 128) pixbuf.fill(0x00000000) preview.set_from_pixbuf(pixbuf) have_preview = True file_chooser.set_preview_widget_active(have_preview) del pixbuf gc.collect() def hide_cursor(self): if self.fullscreen_mode and not self.user_prompt_visible and not self.slideshow_controls_visible: pix_data = """/* XPM */ static char * invisible_xpm[] = { "1 1 1 1", " c None", " "};""" color = gtk.gdk.Color() pix = gtk.gdk.pixmap_create_from_data(None, pix_data, 1, 1, 1, color, color) invisible = gtk.gdk.Cursor(pix, pix, color, color, 0, 0) self.change_cursor(invisible) return False def enter_fullscreen(self, action): if not self.fullscreen_mode: self.fullscreen_mode = True self.UIManager.get_widget('/Popup/Full Screen').hide() self.UIManager.get_widget('/Popup/Exit Full Screen').show() self.statusbar.hide() self.statusbar2.hide() self.toolbar.hide() self.menubar.hide() self.thumbscroll.hide() self.thumbpane.hide() self.window.fullscreen() self.timer_id = gobject.timeout_add(2000, self.hide_cursor) self.set_slideshow_sensitivities() if self.simple_bgcolor: self.layout.modify_bg(gtk.STATE_NORMAL, self.bgcolor) else: if self.simple_bgcolor: self.layout.modify_bg(gtk.STATE_NORMAL, None) self.leave_fullscreen(action) def leave_fullscreen(self, action): if self.fullscreen_mode: self.slideshow_controls_visible = False self.slideshow_window.hide_all() self.slideshow_window2.hide_all() self.fullscreen_mode = False self.UIManager.get_widget('/Popup/Full Screen').show() self.UIManager.get_widget('/Popup/Exit Full Screen').hide() if self.toolbar_show: self.toolbar.show() self.menubar.show() if self.statusbar_show: self.statusbar.show() self.statusbar2.show() if self.thumbpane_show: self.thumbscroll.show() self.thumbpane.show() self.thumbpane_update_images(False, self.curr_img_in_list) self.window.unfullscreen() self.change_cursor(None) self.set_slideshow_sensitivities() if self.simple_bgcolor: self.layout.modify_bg(gtk.STATE_NORMAL, None) def toggle_status_bar(self, action): if self.statusbar.get_property('visible'): self.statusbar.hide() self.statusbar2.hide() self.statusbar_show = False else: self.statusbar.show() self.statusbar2.show() self.statusbar_show = True if self.image_loaded and self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) def toggle_thumbpane(self, action): if self.thumbscroll.get_property('visible'): self.thumbscroll.hide() self.thumbpane.hide() self.thumbpane_show = False else: self.thumbscroll.show() self.thumbpane.show() self.thumbpane_show = True self.stop_now = False gobject.idle_add(self.thumbpane_update_images, True, self.curr_img_in_list) if self.image_loaded and self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) def toggle_toolbar(self, action): if self.toolbar.get_property('visible'): self.toolbar.hide() self.toolbar_show = False else: self.toolbar.show() self.toolbar_show = True if self.image_loaded and self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) def update_statusbar(self): # Update status bar: try: st = os.stat(self.currimg_name) filesize = st[stat.ST_SIZE]/1000 ratio = int(100 * self.currimg_zoomratio) status_text = os.path.basename(self.currimg_name)+ ": " + str(self.currimg_pixbuf_original.get_width()) + "x" + str(self.currimg_pixbuf_original.get_height()) + " " + str(filesize) + "KB " + str(ratio) + "% " except: status_text=_("Cannot load image.") self.statusbar.push(self.statusbar.get_context_id(""), status_text) status_text = "" if self.running_custom_actions: status_text = _('Custom actions: %(current)i of %(total)i') % {'current': self.curr_custom_action,'total': self.num_custom_actions} elif self.searching_for_images: status_text = _('Scanning...') self.statusbar2.push(self.statusbar2.get_context_id(""), status_text) def show_custom_actions(self, action): self.actions_dialog = gtk.Dialog(title=_("Configure Custom Actions"), parent=self.window) self.actions_dialog.set_has_separator(False) self.actions_dialog.set_resizable(False) table_actions = gtk.Table(13, 2, False) table_actions.attach(gtk.Label(), 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) actionscrollwindow = gtk.ScrolledWindow() self.actionstore = gtk.ListStore(str, str, str) self.actionwidget = gtk.TreeView() self.actionwidget.set_enable_search(False) self.actionwidget.set_rules_hint(True) self.actionwidget.connect('row-activated', self.edit_custom_action2) actionscrollwindow.add(self.actionwidget) actionscrollwindow.set_shadow_type(gtk.SHADOW_IN) actionscrollwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) actionscrollwindow.set_size_request(500, 200) self.actionwidget.set_model(self.actionstore) self.cell = gtk.CellRendererText() self.cellbool = gtk.CellRendererPixbuf() self.tvcolumn0 = gtk.TreeViewColumn(_("Batch")) self.tvcolumn1 = gtk.TreeViewColumn(_("Action"), self.cell, markup=0) self.tvcolumn2 = gtk.TreeViewColumn(_("Shortcut")) self.tvcolumn1.set_max_width(self.actionwidget.size_request()[0] - self.tvcolumn0.get_width() - self.tvcolumn2.get_width()) self.actionwidget.append_column(self.tvcolumn0) self.actionwidget.append_column(self.tvcolumn1) self.actionwidget.append_column(self.tvcolumn2) self.populate_treeview() if len(self.action_names) > 0: self.actionwidget.get_selection().select_path(0) vbox_actions = gtk.VBox() addbutton = gtk.Button("", gtk.STOCK_ADD) addbutton.get_child().get_child().get_children()[1].set_text('') addbutton.connect('clicked', self.add_custom_action, self.actionwidget) addbutton.set_tooltip_text(_("Add action")) editbutton = gtk.Button("", gtk.STOCK_EDIT) editbutton.get_child().get_child().get_children()[1].set_text('') editbutton.connect('clicked', self.edit_custom_action, self.actionwidget) editbutton.set_tooltip_text(_("Edit selected action.")) removebutton = gtk.Button("", gtk.STOCK_REMOVE) removebutton.get_child().get_child().get_children()[1].set_text('') removebutton.connect('clicked', self.remove_custom_action) removebutton.set_tooltip_text(_("Remove selected action.")) upbutton = gtk.Button("", gtk.STOCK_GO_UP) upbutton.get_child().get_child().get_children()[1].set_text('') upbutton.connect('clicked', self.custom_action_move_up, self.actionwidget) upbutton.set_tooltip_text(_("Move selected action up.")) downbutton = gtk.Button("", gtk.STOCK_GO_DOWN) downbutton.get_child().get_child().get_children()[1].set_text('') downbutton.connect('clicked', self.custom_action_move_down, self.actionwidget) downbutton.set_tooltip_text(_("Move selected action down.")) vbox_buttons = gtk.VBox() propertyinfo = gtk.Label() propertyinfo.set_markup('' + _("Parameters") + ':\n%F - ' + _("File path, name, and extension") + '\n%P - ' + _("File path") + '\n%N - ' + _("File name without file extension") + '\n%E - ' + _("File extension (i.e. \".png\")") + '\n%L - ' + _("List of files, space-separated") + '') propertyinfo.set_alignment(0, 0) actioninfo = gtk.Label() actioninfo.set_markup('' + _("Operations") + ':\n[NEXT] - ' + _("Go to next image") + '\n[PREV] - ' + _("Go to previous image") +'') actioninfo.set_alignment(0, 0) hbox_info = gtk.HBox() hbox_info.pack_start(propertyinfo, False, False, 15) hbox_info.pack_start(actioninfo, False, False, 15) vbox_buttons.pack_start(addbutton, False, False, 5) vbox_buttons.pack_start(editbutton, False, False, 5) vbox_buttons.pack_start(removebutton, False, False, 5) vbox_buttons.pack_start(upbutton, False, False, 5) vbox_buttons.pack_start(downbutton, False, False, 0) hbox_top = gtk.HBox() hbox_top.pack_start(actionscrollwindow, True, True, 5) hbox_top.pack_start(vbox_buttons, False, False, 5) vbox_actions.pack_start(hbox_top, True, True, 5) vbox_actions.pack_start(hbox_info, False, False, 5) hbox_instructions = gtk.HBox() info_image = gtk.Image() info_image.set_from_stock(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_BUTTON) hbox_instructions.pack_start(info_image, False, False, 5) instructions = gtk.Label(_("Here you can define custom actions with shortcuts. Actions use the built-in parameters and operations listed below and can have multiple statements separated by a semicolon. Batch actions apply to all images in the list.")) instructions.set_line_wrap(True) instructions.set_alignment(0, 0.5) hbox_instructions.pack_start(instructions, False, False, 5) table_actions.attach(hbox_instructions, 1, 3, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 5, 0) table_actions.attach(gtk.Label(), 1, 3, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_actions.attach(vbox_actions, 1, 3, 4, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_actions.attach(gtk.Label(), 1, 3, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) self.actions_dialog.vbox.pack_start(table_actions, False, False, 0) # Show dialog: self.actions_dialog.vbox.show_all() instructions.set_size_request(self.actions_dialog.size_request()[0]-50, -1) close_button = self.actions_dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) close_button.grab_focus() self.actions_dialog.run() self.refresh_custom_actions_menu() while gtk.events_pending(): gtk.main_iteration() if len(self.image_list) == 0: self.set_image_sensitivities(False) self.actions_dialog.destroy() def add_custom_action(self, button, treeview): self.open_custom_action_dialog(True, '', '', 'None', False, treeview) def edit_custom_action2(self, treeview, path, view_column): self.edit_custom_action(None, treeview) def edit_custom_action(self, button, treeview): (model, iter) = self.actionwidget.get_selection().get_selected() if iter != None: (row, ) = self.actionstore.get_path(iter) self.open_custom_action_dialog(False, self.action_names[row], self.action_commands[row], self.action_shortcuts[row], self.action_batch[row], treeview) def open_custom_action_dialog(self, add_call, name, command, shortcut, batch, treeview): if add_call: self.dialog_name = gtk.Dialog(_("Add Custom Action"), self.actions_dialog, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) else: self.dialog_name = gtk.Dialog(_("Edit Custom Action"), self.actions_dialog, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) self.dialog_name.set_modal(True) table = gtk.Table(2, 4, False) action_name_label = gtk.Label(_("Action Name:")) action_name_label.set_alignment(0, 0.5) action_command_label = gtk.Label(_("Command:")) action_command_label.set_alignment(0, 0.5) shortcut_label = gtk.Label(_("Shortcut:")) shortcut_label.set_alignment(0, 0.5) table.attach(action_name_label, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(action_command_label, 0, 1, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(shortcut_label, 0, 1, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) action_name = gtk.Entry() action_name.set_text(name) action_command = gtk.Entry() action_command.set_text(command) table.attach(action_name, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(action_command, 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) self.shortcut = gtk.Button(shortcut) self.shortcut.connect('clicked', self.shortcut_clicked) table.attach(self.shortcut, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) batchmode = gtk.CheckButton(_("Perform action on all images (Batch)")) batchmode.set_active(batch) table.attach(batchmode, 0, 2, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) self.dialog_name.vbox.pack_start(table, False, False, 5) self.dialog_name.vbox.show_all() self.dialog_name.connect('response', self.dialog_name_response, add_call, action_name, action_command, self.shortcut, batchmode, treeview) self.dialog_name.run() def dialog_name_response(self, dialog, response, add_call, action_name, action_command, shortcut, batchmode, treeview): if response == gtk.RESPONSE_ACCEPT: if not (action_command.get_text() == "" or action_name.get_text() == "" or self.shortcut.get_label() == "None"): name = action_name.get_text() command = action_command.get_text() if ((("[NEXT]" in command.strip()) and command.strip()[-6:] != "[NEXT]") or (("[PREV]" in command.strip()) and command.strip()[-6:] != "[PREV]") ): error_dialog = gtk.MessageDialog(self.actions_dialog, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('[PREV] and [NEXT] are only valid alone or at the end of the command')) error_dialog.set_title(_("Invalid Custom Action")) error_dialog.run() error_dialog.destroy() return shortcut = shortcut.get_label() batch = batchmode.get_active() dialog.destroy() if add_call: self.action_names.append(name) self.action_commands.append(command) self.action_shortcuts.append(shortcut) self.action_batch.append(batch) else: (model, iter) = self.actionwidget.get_selection().get_selected() (rownum, ) = self.actionstore.get_path(iter) self.action_names[rownum] = name self.action_commands[rownum] = command self.action_shortcuts[rownum] = shortcut self.action_batch[rownum] = batch self.populate_treeview() if add_call: rownum = len(self.action_names)-1 treeview.get_selection().select_path(rownum) while gtk.events_pending(): gtk.main_iteration() # Keep item in visible rect: visible_rect = treeview.get_visible_rect() row_rect = treeview.get_background_area(rownum, self.tvcolumn1) if row_rect.y + row_rect.height > visible_rect.height: top_coord = (row_rect.y + row_rect.height - visible_rect.height) + visible_rect.y treeview.scroll_to_point(-1, top_coord) elif row_rect.y < 0: treeview.scroll_to_cell(rownum) else: error_dialog = gtk.MessageDialog(self.actions_dialog, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('Incomplete custom action specified.')) error_dialog.set_title(_("Invalid Custom Action")) error_dialog.run() error_dialog.destroy() else: dialog.destroy() def custom_action_move_down(self, button, treeview): iter = None selection = treeview.get_selection() model, iter = selection.get_selected() if iter: rownum = int(model.get_string_from_iter(iter)) if rownum < len(self.action_names)-1: # Move item down: temp_name = self.action_names[rownum] temp_shortcut = self.action_shortcuts[rownum] temp_command = self.action_commands[rownum] temp_batch = self.action_batch[rownum] self.action_names[rownum] = self.action_names[rownum+1] self.action_shortcuts[rownum] = self.action_shortcuts[rownum+1] self.action_commands[rownum] = self.action_commands[rownum+1] self.action_batch[rownum] = self.action_batch[rownum+1] self.action_names[rownum+1] = temp_name self.action_shortcuts[rownum+1] = temp_shortcut self.action_commands[rownum+1] = temp_command self.action_batch[rownum+1] = temp_batch # Repopulate treeview and keep item selected: self.populate_treeview() selection.select_path((rownum+1,)) while gtk.events_pending(): gtk.main_iteration() # Keep item in visible rect: rownum = rownum + 1 visible_rect = treeview.get_visible_rect() row_rect = treeview.get_background_area(rownum, self.tvcolumn1) if row_rect.y + row_rect.height > visible_rect.height: top_coord = (row_rect.y + row_rect.height - visible_rect.height) + visible_rect.y treeview.scroll_to_point(-1, top_coord) elif row_rect.y < 0: treeview.scroll_to_cell(rownum) def custom_action_move_up(self, button, treeview): iter = None selection = treeview.get_selection() model, iter = selection.get_selected() if iter: rownum = int(model.get_string_from_iter(iter)) if rownum > 0: # Move item down: temp_name = self.action_names[rownum] temp_shortcut = self.action_shortcuts[rownum] temp_command = self.action_commands[rownum] temp_batch = self.action_batch[rownum] self.action_names[rownum] = self.action_names[rownum-1] self.action_shortcuts[rownum] = self.action_shortcuts[rownum-1] self.action_commands[rownum] = self.action_commands[rownum-1] self.action_batch[rownum] = self.action_batch[rownum-1] self.action_names[rownum-1] = temp_name self.action_shortcuts[rownum-1] = temp_shortcut self.action_commands[rownum-1] = temp_command self.action_batch[rownum-1] = temp_batch # Repopulate treeview and keep item selected: self.populate_treeview() selection.select_path((rownum-1,)) while gtk.events_pending(): gtk.main_iteration() # Keep item in visible rect: rownum = rownum - 1 visible_rect = treeview.get_visible_rect() row_rect = treeview.get_background_area(rownum, self.tvcolumn1) if row_rect.y + row_rect.height > visible_rect.height: top_coord = (row_rect.y + row_rect.height - visible_rect.height) + visible_rect.y treeview.scroll_to_point(-1, top_coord) elif row_rect.y < 0: treeview.scroll_to_cell(rownum) def shortcut_clicked(self, widget): self.dialog_shortcut = gtk.Dialog(_("Action Shortcut"), self.dialog_name, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) self.shortcut_label = gtk.Label(_("Press the desired shortcut for the action.")) hbox = gtk.HBox() hbox.pack_start(self.shortcut_label, False, False, 15) self.dialog_shortcut.vbox.pack_start(hbox, False, False, 5) self.dialog_shortcut.vbox.show_all() self.dialog_shortcut.connect('key-press-event', self.shortcut_keypress) self.dialog_shortcut.run() self.dialog_shortcut.destroy() def shortcut_keypress(self, widget, event): shortcut = gtk.accelerator_name(event.keyval, event.state) if "" in shortcut: shortcut = shortcut.replace("", "") if shortcut[(len(shortcut)-2):len(shortcut)] != "_L" and shortcut[(len(shortcut)-2):len(shortcut)] != "_R": # Validate to make sure the shortcut hasn't already been used: for i in range(len(self.keys)): if shortcut == self.keys[i][1]: error_dialog = gtk.MessageDialog(self.dialog_shortcut, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('The shortcut \'%(shortcut)s\' is already used for \'%(key)s\'.') % {'shortcut': shortcut, 'key': self.keys[i][0]}) error_dialog.set_title(_("Invalid Shortcut")) error_dialog.run() error_dialog.destroy() return for i in range(len(self.action_shortcuts)): if shortcut == self.action_shortcuts[i]: error_dialog = gtk.MessageDialog(self.dialog_shortcut, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('The shortcut \'%(shortcut)s\' is already used for \'%(key)s\'.') % {'shortcut': shortcut, 'key': self.action_names[i]}) error_dialog.set_title(_("Invalid Shortcut")) error_dialog.run() error_dialog.destroy() return self.shortcut.set_label(shortcut) widget.destroy() def remove_custom_action(self, button): (model, iter) = self.actionwidget.get_selection().get_selected() if iter != None: (row, ) = self.actionstore.get_path(iter) self.action_names.pop(row) self.action_shortcuts.pop(row) self.action_commands.pop(row) self.action_batch.pop(row) self.populate_treeview() self.actionwidget.grab_focus() def populate_treeview(self): self.actionstore.clear() for i in range(len(self.action_names)): if self.action_batch[i]: pb = gtk.STOCK_APPLY else: pb = None self.actionstore.append([pb, '' + self.action_names[i].replace('&','&') + '\n' + self.action_commands[i].replace('&','&') + '', self.action_shortcuts[i]]) self.tvcolumn0.clear() self.tvcolumn1.clear() self.tvcolumn2.clear() self.tvcolumn0.pack_start(self.cellbool) self.tvcolumn1.pack_start(self.cell) self.tvcolumn2.pack_start(self.cell) self.tvcolumn0.add_attribute(self.cellbool, "stock-id", 0) self.tvcolumn1.set_attributes(self.cell, markup=1) self.tvcolumn2.set_attributes(self.cell, text=2) self.tvcolumn1.set_expand(True) def screenshot(self, action): cancel = self.autosave_image() if cancel: return # Dialog: dialog = gtk.Dialog(_("Screenshot"), self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) snapbutton = dialog.add_button(_("_Snap"), gtk.RESPONSE_ACCEPT) snapimage = gtk.Image() snapimage.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON) snapbutton.set_image(snapimage) loc = gtk.Label() loc.set_markup('' + _('Location') + '') loc.set_alignment(0, 0) area = gtk.RadioButton() area1 = gtk.RadioButton(group=area, label=_("Entire screen")) area2 = gtk.RadioButton(group=area, label=_("Window under pointer")) if not HAS_XMOUSE: area2.set_sensitive(False) area1.set_active(True) de = gtk.Label() de.set_markup('' + _("Delay") + '') de.set_alignment(0, 0) delaybox = gtk.HBox() adj = gtk.Adjustment(self.screenshot_delay, 0, 30, 1, 10, 0) delay = gtk.SpinButton(adj, 0, 0) delay.set_numeric(True) delay.set_update_policy(gtk.UPDATE_IF_VALID) delay.set_wrap(False) delaylabel = gtk.Label(_(" seconds")) delaybox.pack_start(delay, False) delaybox.pack_start(delaylabel, False) table = gtk.Table() table.attach(gtk.Label(), 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table.attach(loc, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(gtk.Label(), 1, 2, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table.attach(area1, 1, 2, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table.attach(area2, 1, 2, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table.attach(gtk.Label(), 1, 2, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table.attach(de, 1, 2, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(gtk.Label(), 1, 2, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table.attach(delaybox, 1, 2, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table.attach(gtk.Label(), 1, 2, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) dialog.vbox.pack_start(table) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.vbox.show_all() response = dialog.run() if response == gtk.RESPONSE_ACCEPT: dialog.destroy() while gtk.events_pending(): gtk.main_iteration() self.screenshot_delay = int(delay.get_text()) gobject.timeout_add(int(self.screenshot_delay*1000), self._screenshot_grab, area1.get_active()) else: dialog.destroy() def _screenshot_grab(self, entire_screen): root_win = gtk.gdk.get_default_root_window() if entire_screen: x = 0 y = 0 width = gtk.gdk.screen_width() height = gtk.gdk.screen_height() else: (x, y, width, height) = xmouse.geometry() pix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, width, height) pix = pix.get_from_drawable(root_win, gtk.gdk.colormap_get_system(), x, y, 0, 0, width, height) # Save as /tmp/mirage-/filename.ext tmpdir = tempfile.mkdtemp(prefix="mirage-") + "/" tmpfile = tmpdir + "screenshot.png" pix.save(tmpfile, 'png') # Load file: self.image_list = [tmpfile] self.curr_img_in_list = 0 gobject.idle_add(self.load_new_image2, False, False, False, False, True) self.update_statusbar() self.set_go_navigation_sensitivities(False) self.set_slideshow_sensitivities() self.thumbpane_update_images(True, self.curr_img_in_list) del pix self.window.present() def show_properties(self, action): show_props = gtk.Dialog(_("Properties"), self.window) show_props.set_has_separator(False) show_props.set_resizable(False) table = gtk.Table(3, 3, False) image = gtk.Image() animtest = gtk.gdk.PixbufAnimation(self.currimg_name) image_is_anim = False if animtest.is_static_image(): pixbuf, image_width, image_height = self.get_pixbuf_of_size(self.currimg_pixbuf_original, 180, self.zoom_quality) else: pixbuf, image_width, image_height = self.get_pixbuf_of_size(animtest.get_static_image(), 180, self.zoom_quality) image_is_anim = True image.set_from_pixbuf(self.pixbuf_add_border(pixbuf)) vbox_left = gtk.VBox() filename = gtk.Label(_("File name:")) filename.set_alignment(1, 1) filedate = gtk.Label(_("File modified:")) filedate.set_alignment(1, 1) imagesize = gtk.Label(_("Dimensions:")) imagesize.set_alignment(1, 1) filesize = gtk.Label(_("File size:")) filesize.set_alignment(1, 1) filetype = gtk.Label(_("File type:")) filetype.set_alignment(1, 1) transparency = gtk.Label(_("Transparency:")) transparency.set_alignment(1, 1) animation = gtk.Label(_("Animation:")) animation.set_alignment(1, 1) bits = gtk.Label(_("Bits per sample:")) bits.set_alignment(1, 1) channels = gtk.Label(_("Channels:")) channels.set_alignment(1, 1) vbox_left.pack_start(filename, False, False, 2) vbox_left.pack_start(filedate, False, False, 2) vbox_left.pack_start(imagesize, False, False, 2) vbox_left.pack_start(filesize, False, False, 2) vbox_left.pack_start(filetype, False, False, 2) vbox_left.pack_start(transparency, False, False, 2) vbox_left.pack_start(animation, False, False, 2) vbox_left.pack_start(bits, False, False, 2) vbox_left.pack_start(channels, False, False, 2) vbox_right = gtk.VBox() filestat = os.stat(self.currimg_name) filename2 = gtk.Label(os.path.basename(self.currimg_name)) filedate2 = gtk.Label(time.strftime('%c', time.localtime(filestat[stat.ST_MTIME]))) imagesize2 = gtk.Label(str(self.currimg_pixbuf_original.get_width()) + "x" + str(self.currimg_pixbuf_original.get_height())) filetype2 = gtk.Label(gtk.gdk.pixbuf_get_file_info(self.currimg_name)[0]['mime_types'][0]) filesize2 = gtk.Label(str(filestat[stat.ST_SIZE]/1000) + "KB") if not image_is_anim and pixbuf.get_has_alpha(): transparency2 = gtk.Label(_("Yes")) else: transparency2 = gtk.Label(_("No")) if animtest.is_static_image(): animation2 = gtk.Label(_("No")) else: animation2 = gtk.Label(_("Yes")) bits2 = gtk.Label(str(pixbuf.get_bits_per_sample())) channels2 = gtk.Label(str(pixbuf.get_n_channels())) filename2.set_alignment(0, 1) filedate2.set_alignment(0, 1) imagesize2.set_alignment(0, 1) filesize2.set_alignment(0, 1) filetype2.set_alignment(0, 1) transparency2.set_alignment(0, 1) animation2.set_alignment(0, 1) bits2.set_alignment(0, 1) channels2.set_alignment(0, 1) vbox_right.pack_start(filename2, False, False, 2) vbox_right.pack_start(filedate2, False, False, 2) vbox_right.pack_start(imagesize2, False, False, 2) vbox_right.pack_start(filesize2, False, False, 2) vbox_right.pack_start(filetype2, False, False, 2) vbox_right.pack_start(transparency2, False, False, 2) vbox_right.pack_start(animation2, False, False, 2) vbox_right.pack_start(bits2, False, False, 2) vbox_right.pack_start(channels2, False, False, 2) hbox = gtk.HBox() hbox.pack_start(vbox_left, False, False, 3) hbox.pack_start(vbox_right, False, False, 3) table.attach(image, 1, 2, 1, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table.attach(hbox, 2, 3, 1, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) show_props.vbox.pack_start(table, False, False, 15) show_props.vbox.show_all() close_button = show_props.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) close_button.grab_focus() show_props.run() show_props.destroy() def show_prefs(self, action): prev_thumbnail_size = self.thumbnail_size self.prefs_dialog = gtk.Dialog(_("Mirage Preferences"), self.window) self.prefs_dialog.set_has_separator(False) self.prefs_dialog.set_resizable(False) # "Interface" prefs: table_settings = gtk.Table(14, 3, False) bglabel = gtk.Label() bglabel.set_markup('' + _('Interface') + '') bglabel.set_alignment(0, 1) color_hbox = gtk.HBox(False, 0) colortext = gtk.Label(_('Background color:')) self.colorbutton = gtk.ColorButton(self.bgcolor) self.colorbutton.connect('color-set', self.bgcolor_selected) self.colorbutton.set_size_request(150, -1) self.colorbutton.set_tooltip_text(_("Sets the background color for the application.")) color_hbox.pack_start(colortext, False, False, 0) color_hbox.pack_start(self.colorbutton, False, False, 0) color_hbox.pack_start(gtk.Label(), True, True, 0) simplecolor_hbox = gtk.HBox(False, 0) simplecolortext = gtk.Label(_('Simple background color:')) simplecolorbutton = gtk.CheckButton() simplecolorbutton.connect('toggled', self.simple_bgcolor_selected) simplecolor_hbox.pack_start(simplecolortext, False, False, 0) simplecolor_hbox.pack_start(simplecolorbutton, False, False, 0) simplecolor_hbox.pack_start(gtk.Label(), True, True, 0) if self.simple_bgcolor: simplecolorbutton.set_active(True) fullscreen = gtk.CheckButton(_("Open Mirage in fullscreen mode")) fullscreen.set_active(self.start_in_fullscreen) thumbbox = gtk.HBox() thumblabel = gtk.Label(_("Thumbnail size:")) thumbbox.pack_start(thumblabel, False, False, 0) thumbsize = gtk.combo_box_new_text() option = 0 for size in self.thumbnail_sizes: thumbsize.append_text(size + " x " + size) if self.thumbnail_size == int(size): thumbsize.set_active(option) option += 1 thumbbox.pack_start(thumbsize, False, False, 5) table_settings.attach(gtk.Label(), 1, 3, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_settings.attach(bglabel, 1, 3, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_settings.attach(gtk.Label(), 1, 3, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_settings.attach(simplecolor_hbox, 1, 2, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(color_hbox, 1, 2, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_settings.attach(thumbbox, 1, 3, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(fullscreen, 1, 3, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 11, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 13, 14, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_settings.attach(gtk.Label(), 1, 3, 14, 15, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) # "Behavior" tab: table_behavior = gtk.Table(14, 2, False) openlabel = gtk.Label() openlabel.set_markup('' + _('Open Behavior') + '') openlabel.set_alignment(0, 1) hbox_openmode = gtk.HBox() hbox_openmode.pack_start(gtk.Label(_('Open new image in:')), False, False, 0) combobox = gtk.combo_box_new_text() combobox.append_text(_("Smart Mode")) combobox.append_text(_("Zoom To Fit Mode")) combobox.append_text(_("1:1 Mode")) combobox.append_text(_("Last Active Mode")) combobox.set_active(self.open_mode) hbox_openmode.pack_start(combobox, False, False, 5) openallimages = gtk.CheckButton(_("Load all images in current directory")) openallimages.set_active(self.open_all_images) openallimages.set_tooltip_text(_("If enabled, opening an image in Mirage will automatically load all images found in that image's directory.")) hiddenimages = gtk.CheckButton(_("Allow loading hidden files")) hiddenimages.set_active(self.open_hidden_files) hiddenimages.set_tooltip_text(_("If checked, Mirage will open hidden files. Otherwise, hidden files will be ignored.")) openpref = gtk.RadioButton() openpref1 = gtk.RadioButton(group=openpref, label=_("Use last chosen directory")) openpref1.set_tooltip_text(_("The default 'Open' directory will be the last directory used.")) openpref2 = gtk.RadioButton(group=openpref, label=_("Use this fixed directory:")) openpref2.connect('toggled', self.prefs_use_fixed_dir_clicked) openpref2.set_tooltip_text(_("The default 'Open' directory will be this specified directory.")) hbox_defaultdir = gtk.HBox() self.defaultdir = gtk.Button() hbox_defaultdir.pack_start(gtk.Label(), True, True, 0) hbox_defaultdir.pack_start(self.defaultdir, False, False, 0) hbox_defaultdir.pack_start(gtk.Label(), True, True, 0) if len(self.fixed_dir) > 25: self.defaultdir.set_label('...' + self.fixed_dir[-22:]) else: self.defaultdir.set_label(self.fixed_dir) self.defaultdir.connect('clicked', self.defaultdir_clicked) self.defaultdir.set_size_request(250, -1) if self.use_last_dir: openpref1.set_active(True) self.defaultdir.set_sensitive(False) else: openpref2.set_active(True) self.defaultdir.set_sensitive(True) table_behavior.attach(gtk.Label(), 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_behavior.attach(openlabel, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_behavior.attach(gtk.Label(), 1, 2, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_behavior.attach(hbox_openmode, 1, 2, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_behavior.attach(gtk.Label(), 1, 2, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_behavior.attach(openallimages, 1, 2, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_behavior.attach(hiddenimages, 1, 2, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_behavior.attach(gtk.Label(), 1, 2, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_behavior.attach(openpref1, 1, 2, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_behavior.attach(openpref2, 1, 2, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_behavior.attach(hbox_defaultdir, 1, 2, 11, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 45, 0) table_behavior.attach(gtk.Label(), 1, 2, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 45, 0) # "Navigation" tab: table_navigation = gtk.Table(14, 2, False) navlabel = gtk.Label() navlabel.set_markup('' + _('Navigation') + '') navlabel.set_alignment(0, 1) preloadnav = gtk.CheckButton(label=_("Preload images for faster navigation")) preloadnav.set_active(self.preloading_images) preloadnav.set_tooltip_text(_("If enabled, the next and previous images in the list will be preloaded during idle time. Note that the speed increase comes at the expense of memory usage, so it is recommended to disable this option on machines with limited ram.")) hbox_listwrap = gtk.HBox() hbox_listwrap.pack_start(gtk.Label(_("Wrap around imagelist:")), False, False, 0) combobox2 = gtk.combo_box_new_text() combobox2.append_text(_("No")) combobox2.append_text(_("Yes")) combobox2.append_text(_("Prompt User")) combobox2.set_active(self.listwrap_mode) hbox_listwrap.pack_start(combobox2, False, False, 5) table_navigation.attach(gtk.Label(), 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(navlabel, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_navigation.attach(gtk.Label(), 1, 2, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(hbox_listwrap, 1, 2, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_navigation.attach(gtk.Label(), 1, 2, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(preloadnav, 1, 2, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_navigation.attach(gtk.Label(), 1, 2, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_navigation.attach(gtk.Label(), 1, 2, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(gtk.Label(), 1, 2, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_navigation.attach(gtk.Label(), 1, 2, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_navigation.attach(gtk.Label(), 1, 2, 11, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(gtk.Label(), 1, 2, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_navigation.attach(gtk.Label(), 1, 2, 13, 14, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) # "Slideshow" tab: table_slideshow = gtk.Table(14, 2, False) slideshowlabel = gtk.Label() slideshowlabel.set_markup('' + _('Slideshow Mode') + '') slideshowlabel.set_alignment(0, 1) hbox_delay = gtk.HBox() hbox_delay.pack_start(gtk.Label(_("Delay between images in seconds:")), False, False, 0) spin_adj = gtk.Adjustment(self.slideshow_delay, 0, 50000, 1, 10, 0) delayspin = gtk.SpinButton(spin_adj, 1.0, 0) delayspin.set_numeric(True) hbox_delay.pack_start(delayspin, False, False, 5) randomize = gtk.CheckButton(_("Randomize order of images")) randomize.set_active(self.slideshow_random) randomize.set_tooltip_text(_("If enabled, a random image will be chosen during slideshow mode (without loading any image twice).")) disable_screensaver = gtk.CheckButton(_("Disable screensaver in slideshow mode")) disable_screensaver.set_active(self.disable_screensaver) disable_screensaver.set_tooltip_text(_("If enabled, xscreensaver will be temporarily disabled during slideshow mode.")) ss_in_fs = gtk.CheckButton(_("Always start in fullscreen mode")) ss_in_fs.set_tooltip_text(_("If enabled, starting a slideshow will put the application in fullscreen mode.")) ss_in_fs.set_active(self.slideshow_in_fullscreen) table_slideshow.attach(gtk.Label(), 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(slideshowlabel, 1, 2, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_slideshow.attach(gtk.Label(), 1, 2, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(hbox_delay, 1, 2, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_slideshow.attach(gtk.Label(), 1, 2, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(disable_screensaver, 1, 2, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_slideshow.attach(ss_in_fs, 1, 2, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_slideshow.attach(randomize, 1, 2, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_slideshow.attach(gtk.Label(), 1, 2, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(gtk.Label(), 1, 2, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(gtk.Label(), 1, 2, 11, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(gtk.Label(), 1, 2, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) table_slideshow.attach(gtk.Label(), 1, 2, 13, 14, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 0, 0) # "Image" tab: table_image = gtk.Table(14, 2, False) imagelabel = gtk.Label() imagelabel.set_markup('' + _('Image Editing') + '') imagelabel.set_alignment(0, 1) deletebutton = gtk.CheckButton(_("Confirm image delete")) deletebutton.set_active(self.confirm_delete) zoom_hbox = gtk.HBox() zoom_hbox.pack_start(gtk.Label(_('Scaling quality:')), False, False, 0) zoomcombo = gtk.combo_box_new_text() zoomcombo.append_text(_("Nearest (Fastest)")) zoomcombo.append_text(_("Tiles")) zoomcombo.append_text(_("Bilinear")) zoomcombo.append_text(_("Hyper (Best)")) zoomcombo.set_active(self.zoomvalue) zoom_hbox.pack_start(zoomcombo, False, False, 0) zoom_hbox.pack_start(gtk.Label(), True, True, 0) hbox_save = gtk.HBox() savelabel = gtk.Label(_("Modified images:")) savecombo = gtk.combo_box_new_text() savecombo.append_text(_("Ignore Changes")) savecombo.append_text(_("Auto-Save")) savecombo.append_text(_("Prompt For Action")) savecombo.set_active(self.savemode) hbox_save.pack_start(savelabel, False, False, 0) hbox_save.pack_start(savecombo, False, False, 5) hbox_quality = gtk.HBox() qualitylabel = gtk.Label(_("Quality to save in:")) qspin_adj = gtk.Adjustment(self.quality_save, 0, 100, 1, 100, 0) qualityspin = gtk.SpinButton(qspin_adj, 1.0, 0) qualityspin.set_numeric(True) hbox_quality.pack_start(qualitylabel, False, False, 0) hbox_quality.pack_start(qualityspin, False, False, 5) table_image.attach(gtk.Label(), 1, 3, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(imagelabel, 1, 3, 2, 3, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 15, 0) table_image.attach(gtk.Label(), 1, 3, 3, 4, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(zoom_hbox, 1, 3, 4, 5, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 5, 6, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(hbox_save, 1, 3, 6, 7, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 7, 8, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(hbox_quality, 1, 3, 8, 9, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 9, 10, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(deletebutton, 1, 3, 10, 11, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 11, 12, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 12, 13, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 13, 14, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) table_image.attach(gtk.Label(), 1, 3, 14, 15, gtk.FILL|gtk.EXPAND, gtk.FILL|gtk.EXPAND, 30, 0) # Add tabs: notebook = gtk.Notebook() notebook.append_page(table_behavior, gtk.Label(_("Behavior"))) notebook.append_page(table_navigation, gtk.Label(_("Navigation"))) notebook.append_page(table_settings, gtk.Label(_("Interface"))) notebook.append_page(table_slideshow, gtk.Label(_("Slideshow"))) notebook.append_page(table_image, gtk.Label(_("Image"))) notebook.set_current_page(0) hbox = gtk.HBox() self.prefs_dialog.vbox.pack_start(hbox, False, False, 7) hbox.pack_start(notebook, False, False, 7) notebook.connect('switch-page', self.prefs_tab_switched) # Show prefs: self.prefs_dialog.vbox.show_all() self.close_button = self.prefs_dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) self.close_button.grab_focus() response = self.prefs_dialog.run() if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT: self.zoomvalue = zoomcombo.get_active() if int(round(self.zoomvalue, 0)) == 0: self.zoom_quality = gtk.gdk.INTERP_NEAREST elif int(round(self.zoomvalue, 0)) == 1: self.zoom_quality = gtk.gdk.INTERP_TILES elif int(round(self.zoomvalue, 0)) == 2: self.zoom_quality = gtk.gdk.INTERP_BILINEAR elif int(round(self.zoomvalue, 0)) == 3: self.zoom_quality = gtk.gdk.INTERP_HYPER self.open_all_images = openallimages.get_active() self.open_hidden_files = hiddenimages.get_active() if openpref1.get_active(): self.use_last_dir = True else: self.use_last_dir = False open_mode_prev = self.open_mode self.open_mode = combobox.get_active() preloading_images_prev = self.preloading_images self.preloading_images = preloadnav.get_active() self.listwrap_mode = combobox2.get_active() self.slideshow_delay = delayspin.get_value() self.curr_slideshow_delay = self.slideshow_delay self.slideshow_random = randomize.get_active() self.curr_slideshow_random = self.slideshow_random self.disable_screensaver = disable_screensaver.get_active() self.slideshow_in_fullscreen = ss_in_fs.get_active() self.savemode = savecombo.get_active() self.start_in_fullscreen = fullscreen.get_active() self.confirm_delete = deletebutton.get_active() self.quality_save = qualityspin.get_value() self.thumbnail_size = int(self.thumbnail_sizes[thumbsize.get_active()]) if self.thumbnail_size != prev_thumbnail_size: gobject.idle_add(self.thumbpane_set_size) gobject.idle_add(self.thumbpane_update_images, True, self.curr_img_in_list) self.prefs_dialog.destroy() self.set_go_navigation_sensitivities(False) if (self.preloading_images and not preloading_images_prev) or (open_mode_prev != self.open_mode): # The user just turned on preloading, so do it: self.preloadimg_next_in_list = -1 self.preloadimg_prev_in_list = -1 self.preload_when_idle = gobject.idle_add(self.preload_next_image, False) self.preload_when_idle2 = gobject.idle_add(self.preload_prev_image, False) elif not self.preloading_images: self.preloadimg_next_in_list = -1 self.preloadimg_prev_in_list = -1 def prefs_use_fixed_dir_clicked(self, button): if button.get_active(): self.defaultdir.set_sensitive(True) else: self.defaultdir.set_sensitive(False) def rename_image(self, action): if len(self.image_list) > 0: temp_slideshow_mode = self.slideshow_mode if self.slideshow_mode: self.toggle_slideshow(None) rename_dialog = gtk.Dialog(_('Rename Image'), self.window, gtk.DIALOG_MODAL) self.rename_txt = gtk.Entry() filename = os.path.basename(self.currimg_name) self.rename_txt.set_text(filename) self.rename_txt.set_activates_default(True) cancelbutton = rename_dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) renamebutton = rename_dialog.add_button(_("_Rename"), gtk.RESPONSE_ACCEPT) renameimage = gtk.Image() renameimage.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON) renamebutton.set_image(renameimage) animtest = gtk.gdk.PixbufAnimation(self.currimg_name) if animtest.is_static_image(): pixbuf, image_width, image_height = self.get_pixbuf_of_size(self.currimg_pixbuf_original, 60, self.zoom_quality) else: pixbuf, image_width, image_height = self.get_pixbuf_of_size(animtest.get_static_image(), 60, self.zoom_quality) image = gtk.Image() image.set_from_pixbuf(pixbuf) instructions = gtk.Label(_("Enter the new name:")) instructions.set_alignment(0, 1) hbox = gtk.HBox() hbox.pack_start(image, False, False, 10) vbox_stuff = gtk.VBox() vbox_stuff.pack_start(gtk.Label(), False, False, 0) vbox_stuff.pack_start(instructions, False, False, 0) vbox_stuff.pack_start(gtk.Label(), False, False, 0) vbox_stuff.pack_start(self.rename_txt, True, True, 0) vbox_stuff.pack_start(gtk.Label(), False, False, 0) hbox.pack_start(vbox_stuff, True, True, 10) rename_dialog.vbox.pack_start(hbox, False, False, 0) rename_dialog.set_has_separator(True) rename_dialog.set_default_response(gtk.RESPONSE_ACCEPT) rename_dialog.set_size_request(300, -1) rename_dialog.vbox.show_all() rename_dialog.connect('show', self.select_rename_text) response = rename_dialog.run() if response == gtk.RESPONSE_ACCEPT: try: new_filename = os.path.dirname(self.currimg_name) + "/" + self.rename_txt.get_text() shutil.move(self.currimg_name, new_filename) # Update thumbnail filename: try: shutil.move(self_get_name(self.currimg_name)[1], self.thumbnail_get_name(new_filename)[1]) except: pass self.recent_file_remove_and_refresh_name(self.currimg_name) self.currimg_name = new_filename self.register_file_with_recent_docs(self.currimg_name) self.update_title() except: error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _('Unable to rename %s') % self.currimg_name) error_dialog.set_title(_("Unable to rename")) error_dialog.run() error_dialog.destroy() rename_dialog.destroy() if temp_slideshow_mode: self.toggle_slideshow(None) def select_rename_text(self, widget): filename = os.path.basename(self.currimg_name) fileext = os.path.splitext(os.path.basename(self.currimg_name))[1] self.rename_txt.select_region(0, len(filename) - len(fileext)) def delete_image(self, action): if len(self.image_list) > 0: temp_slideshow_mode = self.slideshow_mode if self.slideshow_mode: self.toggle_slideshow(None) delete_dialog = gtk.Dialog(_('Delete Image'), self.window, gtk.DIALOG_MODAL) if self.confirm_delete: permlabel = gtk.Label(_('Are you sure you wish to permanently delete %s?') % os.path.split(self.currimg_name)[1]) permlabel.set_line_wrap(True) permlabel.set_alignment(0, 0.1) warningicon = gtk.Image() warningicon.set_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) hbox = gtk.HBox() hbox.pack_start(warningicon, False, False, 10) hbox.pack_start(permlabel, False, False, 10) delete_dialog.vbox.pack_start(gtk.Label(), False, False, 0) delete_dialog.vbox.pack_start(hbox, False, False, 0) cancelbutton = delete_dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) deletebutton = delete_dialog.add_button(gtk.STOCK_DELETE, gtk.RESPONSE_YES) delete_dialog.set_has_separator(False) deletebutton.set_property('has-focus', True) delete_dialog.set_default_response(gtk.RESPONSE_YES) delete_dialog.vbox.show_all() response = delete_dialog.run() else: response = gtk.RESPONSE_YES if response == gtk.RESPONSE_YES: try: os.remove(self.currimg_name) self.image_modified = False try: os.remove(self.thumbnail_get_name(self.currimg_name)[1]) except: pass self.recent_file_remove_and_refresh_name(self.currimg_name) iter = self.thumblist.get_iter((self.curr_img_in_list,)) try: self.thumbnail_loaded.pop(self.curr_img_in_list) self.thumbpane_update_images() except: pass self.thumblist.remove(iter) templist = self.image_list self.image_list = [] for item in templist: if item != self.currimg_name: self.image_list.append(item) if len(self.image_list) >= 1: if len(self.image_list) == 1: self.curr_img_in_list = 0 elif self.curr_img_in_list == len(self.image_list): self.curr_img_in_list -= 1 self.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.preloadimg_prev_in_list = -1 self.preloadimg_next_in_list = -1 self.load_when_idle = gobject.idle_add(self.load_new_image, False, False, True, True, True, True) self.set_go_navigation_sensitivities(False) else: self.imageview.clear() self.update_title() self.statusbar.push(self.statusbar.get_context_id(""), "") self.image_loaded = False self.set_slideshow_sensitivities() self.set_image_sensitivities(False) self.set_go_navigation_sensitivities(False) # Select new item: self.thumbpane_select(self.curr_img_in_list) except: error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _('Unable to delete %s') % self.currimg_name) error_dialog.set_title(_("Unable to delete")) error_dialog.run() error_dialog.destroy() delete_dialog.destroy() if temp_slideshow_mode: self.toggle_slideshow(None) def defaultdir_clicked(self, button): getdir = gtk.FileChooserDialog(title=_("Choose directory"),action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) getdir.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) getdir.set_filename(self.fixed_dir) getdir.set_default_response(gtk.RESPONSE_OK) response = getdir.run() if response == gtk.RESPONSE_OK: self.fixed_dir = getdir.get_filenames()[0] if len(self.fixed_dir) > 25: button.set_label('...' + self.fixed_dir[-22:]) else: button.set_label(self.fixed_dir) getdir.destroy() else: getdir.destroy() def prefs_tab_switched(self, notebook, page, page_num): do_when_idle = gobject.idle_add(self.grab_close_button) def grab_close_button(self): self.close_button.grab_focus() def bgcolor_selected(self, widget): # When the user selects a color, store this color in self.bgcolor (which will # later be saved to .miragerc) and set this background color: self.bgcolor = widget.get_property('color') if not self.simple_bgcolor: self.layout.modify_bg(gtk.STATE_NORMAL, self.bgcolor) self.slideshow_window.modify_bg(gtk.STATE_NORMAL, self.bgcolor) self.slideshow_window2.modify_bg(gtk.STATE_NORMAL, self.bgcolor) def simple_bgcolor_selected(self, widget): if widget.get_active(): self.simple_bgcolor = True self.layout.modify_bg(gtk.STATE_NORMAL, None) else: self.simple_bgcolor = False self.bgcolor_selected(self.colorbutton) def show_about(self, action): # Help > About self.about_dialog = gtk.AboutDialog() try: self.about_dialog.set_transient_for(self.window) self.about_dialog.set_modal(True) except: pass self.about_dialog.set_name('Mirage') self.about_dialog.set_version(__version__) self.about_dialog.set_comments(_('A fast GTK+ Image Viewer.')) self.about_dialog.set_license(__license__) self.about_dialog.set_authors(['Scott Horowitz ', 'Fredric Johansson ']) self.about_dialog.set_artists(['William Rea ']) self.about_dialog.set_translator_credits('cs - Petr Pisar \nde - Bjoern Martensen \nes - Isidro Arribas \nfr - Mike Massonnet \nhu - Sandor Lisovszki \nnl - Pascal De Vuyst \npl - Tomasz Dominikowski \npt_BR - Danilo Martins \nru - mavka \nit - Daniele Maggio \nzh_CN - Jayden Suen ') gtk.about_dialog_set_url_hook(self.show_website, "http://mirageiv.berlios.de") self.about_dialog.set_website_label("http://mirageiv.berlios.de") icon_path = self.find_path('mirage.png') try: icon_pixbuf = gtk.gdk.pixbuf_new_from_file(icon_path) self.about_dialog.set_logo(icon_pixbuf) except: pass self.about_dialog.connect('response', self.close_about) self.about_dialog.connect('delete_event', self.close_about) self.about_dialog.show_all() def show_website(self, dialog, blah, link): self.browser_load(link) def show_help(self, action): self.browser_load("http://mirageiv.berlios.de/docs.html") def browser_load(self, docslink): try: pid = subprocess.Popen(["gnome-open", docslink]).pid except: try: pid = subprocess.Popen(["exo-open", docslink]).pid except: try: pid = subprocess.Popen(["kfmclient", "openURL", docslink]).pid except: try: pid = subprocess.Popen(["firefox", docslink]).pid except: try: pid = subprocess.Popen(["mozilla", docslink]).pid except: try: pid = subprocess.Popen(["opera", docslink]).pid except: error_dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, _('Unable to launch a suitable browser.')) error_dialog.run() error_dialog.destroy() def close_about(self, event, data=None): self.about_dialog.hide() return True def mousewheel_scrolled(self, widget, event): if event.type == gtk.gdk.SCROLL: # Zooming of the image by Ctrl-mousewheel if event.state & gtk.gdk.CONTROL_MASK: if event.direction == gtk.gdk.SCROLL_UP: self.zoom_in(None) elif event.direction == gtk.gdk.SCROLL_DOWN: self.zoom_out(None) return True # Navigation of images with mousewheel: else: if event.direction == gtk.gdk.SCROLL_UP: self.goto_prev_image(None) elif event.direction == gtk.gdk.SCROLL_DOWN: self.goto_next_image(None) return True def mouse_moved(self, widget, event): # This handles the panning of the image if event.is_hint: x, y, state = event.window.get_pointer() else: state = event.state x, y = event.x_root, event.y_root if (state & gtk.gdk.BUTTON2_MASK) or (state & gtk.gdk.BUTTON1_MASK): # Prevent self.expose_event() from potentially further changing the # adjustments upon the adjustment value changes self.updating_adjustments = True xadjust = self.layout.get_hadjustment() newx = xadjust.value + (self.prevmousex - x) if newx >= xadjust.lower and newx <= xadjust.upper - xadjust.page_size: xadjust.set_value(newx) self.layout.set_hadjustment(xadjust) yadjust = self.layout.get_vadjustment() newy = yadjust.value + (self.prevmousey - y) if newy >= yadjust.lower and newy <= yadjust.upper - yadjust.page_size: yadjust.set_value(newy) self.layout.set_vadjustment(yadjust) self.updating_adjustments = False self.prevmousex = x self.prevmousey = y if self.fullscreen_mode: # Show cursor on movement, then hide after 2 seconds of no movement self.change_cursor(None) if not self.slideshow_controls_visible: gobject.source_remove(self.timer_id) if not self.closing_app: while gtk.events_pending(): gtk.main_iteration() self.timer_id = gobject.timeout_add(2000, self.hide_cursor) if y > 0.9*self.available_image_height(): self.slideshow_controls_show() else: self.slideshow_controls_hide() return True def button_pressed(self, widget, event): if self.image_loaded: # Changes the cursor to the 'resize' cursor, like GIMP, on a middle click: if (event.button == 2 or event.button == 1) and (self.hscroll.get_property('visible')==True or self.vscroll.get_property('visible')==True): self.change_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR)) self.prevmousex = event.x_root self.prevmousey = event.y_root # Right-click popup: elif self.image_loaded and event.button == 3: self.UIManager.get_widget('/Popup').popup(None, None, None, event.button, event.time) return True def button_released(self, widget, event): # Resets the cursor when middle mouse button is released if event.button == 2 or event.button == 1: self.change_cursor(None) return True def zoom_in(self, action): if self.currimg_name != "" and self.UIManager.get_widget('/MainMenu/ViewMenu/In').get_property('sensitive'): self.image_zoomed = True self.currimg_zoomratio = self.currimg_zoomratio * 1.25 self.set_zoom_sensitivities() self.last_image_action_was_fit = False self.put_zoom_image_to_window(False) self.update_statusbar() def zoom_out(self, action): if self.currimg_name != "" and self.UIManager.get_widget('/MainMenu/ViewMenu/Out').get_property('sensitive'): if self.currimg_zoomratio == self.min_zoomratio: # No point in proceeding.. return self.image_zoomed = True self.currimg_zoomratio = self.currimg_zoomratio * 1/1.25 if self.currimg_zoomratio < self.min_zoomratio: self.currimg_zoomratio = self.min_zoomratio self.set_zoom_sensitivities() self.last_image_action_was_fit = False self.put_zoom_image_to_window(False) self.update_statusbar() def zoom_to_fit_window_action(self, action): self.zoom_to_fit_window(action, False, False) def zoom_to_fit_window(self, action, is_preloadimg_next, is_preloadimg_prev): if is_preloadimg_next: if self.preloading_images and self.preloadimg_next_in_list != -1: win_width = self.available_image_width() win_height = self.available_image_height() preimg_width = self.preloadimg_next_pixbuf_original.get_width() preimg_height = self.preloadimg_next_pixbuf_original.get_height() prewidth_ratio = float(preimg_width)/win_width preheight_ratio = float(preimg_height)/win_height if prewidth_ratio < preheight_ratio: premax_ratio = preheight_ratio else: premax_ratio = prewidth_ratio self.preloadimg_next_zoomratio = 1/float(max_ratio) elif is_preloadimg_prev: if self.preloading_images and self.preloadimg_prev_in_list != -1: win_width = self.available_image_width() win_height = self.available_image_height() preimg_width = self.preloadimg_prev_pixbuf_original.get_width() preimg_height = self.preloadimg_prev_pixbuf_original.get_height() prewidth_ratio = float(preimg_width)/win_width preheight_ratio = float(preimg_height)/win_height if prewidth_ratio < preheight_ratio: premax_ratio = preheight_ratio else: premax_ratio = prewidth_ratio self.preloadimg_prev_zoomratio = 1/float(max_ratio) else: if self.currimg_name != "" and (self.slideshow_mode or self.UIManager.get_widget('/MainMenu/ViewMenu/Fit').get_property('sensitive')): self.image_zoomed = True self.last_mode = self.open_mode_fit self.last_image_action_was_fit = True self.last_image_action_was_smart_fit = False # Calculate zoomratio needed to fit to window: win_width = self.available_image_width() win_height = self.available_image_height() img_width = self.currimg_pixbuf_original.get_width() img_height = self.currimg_pixbuf_original.get_height() width_ratio = float(img_width)/win_width height_ratio = float(img_height)/win_height if width_ratio < height_ratio: max_ratio = height_ratio else: max_ratio = width_ratio self.currimg_zoomratio = 1/float(max_ratio) self.set_zoom_sensitivities() self.put_zoom_image_to_window(False) self.update_statusbar() def zoom_to_fit_or_1_to_1(self, action, is_preloadimg_next, is_preloadimg_prev): if is_preloadimg_next: if self.preloading_images and self.preloadimg_next_in_list != -1: win_width = self.available_image_width() win_height = self.available_image_height() preimg_width = self.preloadimg_next_pixbuf_original.get_width() preimg_height = self.preloadimg_next_pixbuf_original.get_height() prewidth_ratio = float(preimg_width)/win_width preheight_ratio = float(preimg_height)/win_height if prewidth_ratio < preheight_ratio: premax_ratio = preheight_ratio else: premax_ratio = prewidth_ratio self.preloadimg_next_zoomratio = 1/float(premax_ratio) if self.preloadimg_next_zoomratio > 1: self.preloadimg_next_zoomratio = 1 elif is_preloadimg_prev: if self.preloading_images and self.preloadimg_prev_in_list != -1: win_width = self.available_image_width() win_height = self.available_image_height() preimg_width = self.preloadimg_prev_pixbuf_original.get_width() preimg_height = self.preloadimg_prev_pixbuf_original.get_height() prewidth_ratio = float(preimg_width)/win_width preheight_ratio = float(preimg_height)/win_height if prewidth_ratio < preheight_ratio: premax_ratio = preheight_ratio else: premax_ratio = prewidth_ratio self.preloadimg_prev_zoomratio = 1/float(premax_ratio) if self.preloadimg_prev_zoomratio > 1: self.preloadimg_prev_zoomratio = 1 else: if self.currimg_name != "": self.image_zoomed = True # Calculate zoomratio needed to fit to window: win_width = self.available_image_width() win_height = self.available_image_height() img_width = self.currimg_pixbuf_original.get_width() img_height = self.currimg_pixbuf_original.get_height() width_ratio = float(img_width)/win_width height_ratio = float(img_height)/win_height if width_ratio < height_ratio: max_ratio = height_ratio else: max_ratio = width_ratio self.currimg_zoomratio = 1/float(max_ratio) self.set_zoom_sensitivities() if self.currimg_zoomratio > 1: # Revert to 1:1 zoom self.zoom_1_to_1(action, False, False) else: self.put_zoom_image_to_window(False) self.update_statusbar() self.last_image_action_was_fit = True self.last_image_action_was_smart_fit = True def zoom_1_to_1_action(self, action): self.zoom_1_to_1(action, False, False) def zoom_1_to_1(self, action, is_preloadimg_next, is_preloadimg_prev): if is_preloadimg_next: if self.preloading_images: self.preloadimg_next_zoomratio = 1 elif is_preloadimg_prev: if self.preloading_images: self.preloadimg_prev_zoomratio = 1 else: if self.currimg_name != "" and (self.slideshow_mode or self.currimg_is_animation or (not self.currimg_is_animation and self.UIManager.get_widget('/MainMenu/ViewMenu/1:1').get_property('sensitive'))): self.image_zoomed = True self.last_mode = self.open_mode_1to1 self.last_image_action_was_fit = False self.currimg_zoomratio = 1 self.put_zoom_image_to_window(False) self.update_statusbar() def rotate_left(self, action): self.rotate_left_or_right(self.UIManager.get_widget('/MainMenu/EditMenu/Rotate Left'), 90) def rotate_right(self, action): self.rotate_left_or_right(self.UIManager.get_widget('/MainMenu/EditMenu/Rotate Right'), 270) def rotate_left_or_right(self, widget, angle): if self.currimg_name != "" and widget.get_property('sensitive'): self.currimg_pixbuf_original = self.image_rotate(self.currimg_pixbuf_original, angle) if self.last_image_action_was_fit: if self.last_image_action_was_smart_fit: self.zoom_to_fit_or_1_to_1(None, False, False) else: self.zoom_to_fit_window(None, False, False) else: self.currimg_width, self.currimg_height = self.currimg_height, self.currimg_width self.layout.set_size(self.currimg_width, self.currimg_height) self.currimg_pixbuf = self.image_rotate(self.currimg_pixbuf, angle) self.imageview.set_from_pixbuf(self.currimg_pixbuf) self.show_scrollbars_if_needed() self.center_image() self.update_statusbar() self.image_modified = True def flip_image_vert(self, action): self.flip_image_vert_or_horiz(self.UIManager.get_widget('/MainMenu/EditMenu/Flip Vertically'), True) def flip_image_horiz(self, action): self.flip_image_vert_or_horiz(self.UIManager.get_widget('/MainMenu/EditMenu/Flip Horizontally'), False) def flip_image_vert_or_horiz(self, widget, vertical): if self.currimg_name != "" and widget.get_property('sensitive'): self.currimg_pixbuf = self.image_flip(self.currimg_pixbuf, vertical) self.currimg_pixbuf_original = self.image_flip(self.currimg_pixbuf_original, vertical) self.imageview.set_from_pixbuf(self.currimg_pixbuf) self.image_modified = True def get_pixbuf_of_size(self, pixbuf, size, zoom_quality): # Creates a pixbuf that fits in the specified square of sizexsize # while preserving the aspect ratio # Returns tuple: (scaled_pixbuf, actual_width, actual_height) image_width = pixbuf.get_width() image_height = pixbuf.get_height() if image_width-size > image_height-size: if image_width > size: image_height = int(size/float(image_width)*image_height) image_width = size else: if image_height > size: image_width = int(size/float(image_height)*image_width) image_height = size if not pixbuf.get_has_alpha(): crop_pixbuf = pixbuf.scale_simple(image_width, image_height, zoom_quality) else: colormap = self.imageview.get_colormap() light_grey = colormap.alloc_color('#666666', True, True) dark_grey = colormap.alloc_color('#999999', True, True) crop_pixbuf = pixbuf.composite_color_simple(image_width, image_height, zoom_quality, 255, 8, light_grey.pixel, dark_grey.pixel) return (crop_pixbuf, image_width, image_height) def pixbuf_add_border(self, pix): # Add a gray outline to pix. This will increase the pixbuf size by # 2 pixels lengthwise and heightwise, 1 on each side. Returns pixbuf. try: width = pix.get_width() height = pix.get_height() newpix = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, width+2, height+2) newpix.fill(0x858585ff) pix.copy_area(0, 0, width, height, newpix, 1, 1) return newpix except: return pix def crop_image(self, action): dialog = gtk.Dialog(_("Crop Image"), self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) cropbutton = dialog.add_button(_("C_rop"), gtk.RESPONSE_ACCEPT) cropimage = gtk.Image() cropimage.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON) cropbutton.set_image(cropimage) image = gtk.DrawingArea() crop_pixbuf, image_width, image_height = self.get_pixbuf_of_size(self.currimg_pixbuf_original, 400, self.zoom_quality) image.set_size_request(image_width, image_height) hbox = gtk.HBox() hbox.pack_start(gtk.Label(), expand=True) hbox.pack_start(image, expand=False) hbox.pack_start(gtk.Label(), expand=True) vbox_left = gtk.VBox() x_adj = gtk.Adjustment(0, 0, self.currimg_pixbuf_original.get_width(), 1, 10, 0) x = gtk.SpinButton(x_adj, 0, 0) x.set_numeric(True) x.set_update_policy(gtk.UPDATE_IF_VALID) x.set_wrap(False) x_label = gtk.Label("X:") x_label.set_alignment(0, 0.7) y_adj = gtk.Adjustment(0, 0, self.currimg_pixbuf_original.get_height(), 1, 10, 0) y = gtk.SpinButton(y_adj, 0, 0) y.set_numeric(True) y.set_update_policy(gtk.UPDATE_IF_VALID) y.set_wrap(False) y_label = gtk.Label("Y:") x_label.set_size_request(y_label.size_request()[0], -1) hbox_x = gtk.HBox() hbox_y = gtk.HBox() hbox_x.pack_start(x_label, False, False, 10) hbox_x.pack_start(x, False, False, 0) hbox_x.pack_start(gtk.Label(), False, False, 3) hbox_y.pack_start(y_label, False, False, 10) hbox_y.pack_start(y, False, False, 0) hbox_y.pack_start(gtk.Label(), False, False, 3) vbox_left.pack_start(hbox_x, False, False, 0) vbox_left.pack_start(hbox_y, False, False, 0) vbox_right = gtk.VBox() width_adj = gtk.Adjustment(self.currimg_pixbuf_original.get_width(), 1, self.currimg_pixbuf_original.get_width(), 1, 10, 0) width = gtk.SpinButton(width_adj, 0, 0) width.set_numeric(True) width.set_update_policy(gtk.UPDATE_IF_VALID) width.set_wrap(False) width_label = gtk.Label(_("Width:")) width_label.set_alignment(0, 0.7) height_adj = gtk.Adjustment(self.currimg_pixbuf_original.get_height(), 1, self.currimg_pixbuf_original.get_height(), 1, 10, 0) height = gtk.SpinButton(height_adj, 0, 0) height.set_numeric(True) height.set_update_policy(gtk.UPDATE_IF_VALID) height.set_wrap(False) height_label = gtk.Label(_("Height:")) width_label.set_size_request(height_label.size_request()[0], -1) height_label.set_alignment(0, 0.7) hbox_width = gtk.HBox() hbox_height = gtk.HBox() hbox_width.pack_start(width_label, False, False, 10) hbox_width.pack_start(width, False, False, 0) hbox_height.pack_start(height_label, False, False, 10) hbox_height.pack_start(height, False, False, 0) vbox_right.pack_start(hbox_width, False, False, 0) vbox_right.pack_start(hbox_height, False, False, 0) hbox2 = gtk.HBox() hbox2.pack_start(gtk.Label(), expand=True) hbox2.pack_start(vbox_left, False, False, 0) hbox2.pack_start(vbox_right, False, False, 0) hbox2.pack_start(gtk.Label(), expand=True) dialog.vbox.pack_start(hbox, False, False, 0) dialog.vbox.pack_start(hbox2, False, False, 15) dialog.set_resizable(False) dialog.vbox.show_all() image.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK) image.connect("expose-event", self.crop_image_expose_cb, crop_pixbuf, image_width, image_height) image.connect("motion_notify_event", self.crop_image_mouse_moved, image, 0, 0, x, y, width, height, image_width, image_height, width_adj, height_adj) image.connect("button_press_event", self.crop_image_button_press, image) image.connect("button_release_event", self.crop_image_button_release) self.x_changed = x.connect('value-changed', self.crop_value_changed, x, y, width, height, width_adj, height_adj, image_width, image_height, image, 0) self.y_changed = y.connect('value-changed', self.crop_value_changed, x, y, width, height, width_adj, height_adj, image_width, image_height, image, 1) self.width_changed = width.connect('value-changed', self.crop_value_changed, x, y, width, height, width_adj, height_adj, image_width, image_height, image, 2) self.height_changed = height.connect('value-changed', self.crop_value_changed, x, y, width, height, width_adj, height_adj, image_width, image_height, image, 3) image.realize() self.crop_rectangle = [0, 0] self.drawing_crop_rectangle = False self.update_rectangle = False self.rect = None response = dialog.run() if response == gtk.RESPONSE_ACCEPT: dialog.destroy() if self.rect != None: temp_pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, self.currimg_pixbuf_original.get_has_alpha(), 8, self.coords[2], self.coords[3]) self.currimg_pixbuf_original.copy_area(self.coords[0], self.coords[1], self.coords[2], self.coords[3], temp_pixbuf, 0, 0) self.currimg_pixbuf_original = temp_pixbuf del temp_pixbuf gc.collect() self.load_new_image2(False, True, False, False) self.image_modified = True else: dialog.destroy() def crop_value_changed(self, currspinbox, x, y, width, height, width_adj, height_adj, image_width, image_height, image, type): if type == 0: # X if x.get_value() + width.get_value() > self.currimg_pixbuf_original.get_width(): width.handler_block(self.width_changed) width.set_value(self.currimg_pixbuf_original.get_width() - x.get_value()) width.handler_unblock(self.width_changed) elif type == 1: # Y if y.get_value() + height.get_value() > self.currimg_pixbuf_original.get_height(): height.handler_block(self.height_changed) height.set_value(self.currimg_pixbuf_original.get_height() - y.get_value()) height.handler_unblock(self.height_changed) self.coords = [int(x.get_value()), int(y.get_value()), int(width.get_value()), int(height.get_value())] self.crop_rectangle[0] = int(round(float(self.coords[0])/self.currimg_pixbuf_original.get_width()*image_width, 0)) self.crop_rectangle[1] = int(round(float(self.coords[1])/self.currimg_pixbuf_original.get_height()*image_height, 0)) x2 = int(round(float(self.coords[2])/self.currimg_pixbuf_original.get_width()*image_width, 0)) + self.crop_rectangle[0] y2 = int(round(float(self.coords[3])/self.currimg_pixbuf_original.get_height()*image_height, 0)) + self.crop_rectangle[1] self.drawing_crop_rectangle = True self.update_rectangle = True self.crop_image_mouse_moved(None, None, image, x2, y2, x, y, width, height, image_width, image_height, width_adj, height_adj) self.update_rectangle = False self.drawing_crop_rectangle = False def crop_image_expose_cb(self, image, event, pixbuf, width, height): image.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0, width, height) def crop_image_mouse_moved(self, widget, event, image, x2, y2, x, y, width, height, image_width, image_height, width_adj, height_adj): if event != None: x2, y2, state = event.window.get_pointer() if self.drawing_crop_rectangle: if self.crop_rectangle != None or self.update_rectangle: gc = image.window.new_gc(function=gtk.gdk.INVERT) if self.rect != None: # Get rid of the previous drawn rectangle: image.window.draw_rectangle(gc, False, self.rect[0], self.rect[1], self.rect[2], self.rect[3]) self.rect = [0, 0, 0, 0] if self.crop_rectangle[0] > x2: self.rect[0] = x2 self.rect[2] = self.crop_rectangle[0]-x2 else: self.rect[0] = self.crop_rectangle[0] self.rect[2] = x2-self.crop_rectangle[0] if self.crop_rectangle[1] > y2: self.rect[1] = y2 self.rect[3] = self.crop_rectangle[1]-y2 else: self.rect[1] = self.crop_rectangle[1] self.rect[3] = y2-self.crop_rectangle[1] image.window.draw_rectangle(gc, False, self.rect[0], self.rect[1], self.rect[2], self.rect[3]) # Convert the rectangle coordinates of the current image # to coordinates of pixbuf_original if self.rect[0] < 0: self.rect[2] = self.rect[2] + self.rect[0] self.rect[0] = 0 if self.rect[1] < 0: self.rect[3] = self.rect[3] + self.rect[1] self.rect[1] = 0 if event != None: self.coords = [0,0,0,0] self.coords[0] = int(round(float(self.rect[0])/image_width*self.currimg_pixbuf_original.get_width(), 0)) self.coords[1] = int(round(float(self.rect[1])/image_height*self.currimg_pixbuf_original.get_height(), 0)) self.coords[2] = int(round(float(self.rect[2])/image_width*self.currimg_pixbuf_original.get_width(), 0)) self.coords[3] = int(round(float(self.rect[3])/image_height*self.currimg_pixbuf_original.get_height(), 0)) if self.coords[0] + self.coords[2] > self.currimg_pixbuf_original.get_width(): self.coords[2] = self.currimg_pixbuf_original.get_width() - self.coords[0] if self.coords[1] + self.coords[3] > self.currimg_pixbuf_original.get_height(): self.coords[3] = self.currimg_pixbuf_original.get_height() - self.coords[1] x.handler_block(self.x_changed) y.handler_block(self.y_changed) width.handler_block(self.width_changed) height.handler_block(self.height_changed) x.set_value(self.coords[0]) y.set_value(self.coords[1]) width.set_value(self.coords[2]) height.set_value(self.coords[3]) x.handler_unblock(self.x_changed) y.handler_unblock(self.y_changed) width_adj.set_property('upper', self.currimg_pixbuf_original.get_width() - self.coords[0]) height_adj.set_property('upper', self.currimg_pixbuf_original.get_height() - self.coords[1]) width.handler_unblock(self.width_changed) height.handler_unblock(self.height_changed) def crop_image_button_press(self, widget, event, image): x, y, state = event.window.get_pointer() if (state & gtk.gdk.BUTTON1_MASK): self.drawing_crop_rectangle = True self.crop_rectangle = [x, y] gc = image.window.new_gc(function=gtk.gdk.INVERT) if self.rect != None: # Get rid of the previous drawn rectangle: image.window.draw_rectangle(gc, False, self.rect[0], self.rect[1], self.rect[2], self.rect[3]) self.rect = None def crop_image_button_release(self, widget, event): x, y, state = event.window.get_pointer() if not (state & gtk.gdk.BUTTON1_MASK): self.drawing_crop_rectangle = False def saturation(self, action): dialog = gtk.Dialog(_("Saturation"), self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) resizebutton = dialog.add_button(_("_Saturate"), gtk.RESPONSE_ACCEPT) resizeimage = gtk.Image() resizeimage.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON) resizebutton.set_image(resizeimage) scale = gtk.HScale() scale.set_draw_value(False) scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) scale.set_range(0, 2) scale.set_increments(0.1, 0.5) scale.set_value(1) scale.connect('value-changed', self.saturation_preview) label = gtk.Label(_("Saturation level:")) label.set_alignment(0, 0.5) hbox1 = gtk.HBox() hbox1.pack_start(label, True, True, 10) hbox2 = gtk.HBox() hbox2.pack_start(scale, True, True, 20) dialog.vbox.pack_start(gtk.Label(" ")) dialog.vbox.pack_start(hbox1, False) dialog.vbox.pack_start(hbox2, True, True, 10) dialog.vbox.pack_start(gtk.Label(" ")) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.vbox.show_all() response = dialog.run() if response == gtk.RESPONSE_ACCEPT: self.currimg_pixbuf_original.saturate_and_pixelate(self.currimg_pixbuf_original, scale.get_value(), False) self.currimg_pixbuf.saturate_and_pixelate(self.currimg_pixbuf, scale.get_value(), False) self.imageview.set_from_pixbuf(self.currimg_pixbuf) self.image_modified = True dialog.destroy() else: self.imageview.set_from_pixbuf(self.currimg_pixbuf) dialog.destroy() def saturation_preview(self, range): while gtk.events_pending(): gtk.main_iteration() try: bak = self.currimg_pixbuf.copy() self.currimg_pixbuf.saturate_and_pixelate(self.currimg_pixbuf, range.get_value(), False) self.imageview.set_from_pixbuf(self.currimg_pixbuf) self.currimg_pixbuf = bak.copy() del bak except: pass gc.collect() def resize_image(self, action): dialog = gtk.Dialog(_("Resize Image"), self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) resizebutton = dialog.add_button(_("_Resize"), gtk.RESPONSE_ACCEPT) resizeimage = gtk.Image() resizeimage.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON) resizebutton.set_image(resizeimage) hbox_width = gtk.HBox() width_adj = gtk.Adjustment(self.currimg_pixbuf_original.get_width(), 1, 100000000000, 1, 10, 0) width = gtk.SpinButton(width_adj, 0, 0) width.set_numeric(True) width.set_update_policy(gtk.UPDATE_IF_VALID) width.set_wrap(False) width_label = gtk.Label(_("Width:")) width_label.set_alignment(0, 0.7) hbox_width.pack_start(width_label, False, False, 10) hbox_width.pack_start(width, False, False, 0) hbox_width.pack_start(gtk.Label(_("pixels")), False, False, 10) hbox_height = gtk.HBox() height_adj = gtk.Adjustment(self.currimg_pixbuf_original.get_height(), 1, 100000000000, 1, 10, 0) height = gtk.SpinButton(height_adj, 0, 0) height.set_numeric(True) height.set_update_policy(gtk.UPDATE_IF_VALID) height.set_wrap(False) height_label = gtk.Label(_("Height:")) width_label.set_size_request(height_label.size_request()[0], -1) height_label.set_alignment(0, 0.7) hbox_height.pack_start(height_label, False, False, 10) hbox_height.pack_start(height, False, False, 0) hbox_height.pack_start(gtk.Label(_("pixels")), False, False, 10) hbox_aspect = gtk.HBox() aspect_checkbox = gtk.CheckButton(_("Preserve aspect ratio")) aspect_checkbox.set_active(self.preserve_aspect) hbox_aspect.pack_start(aspect_checkbox, False, False, 10) vbox = gtk.VBox() vbox.pack_start(gtk.Label(), False, False, 0) vbox.pack_start(hbox_width, False, False, 0) vbox.pack_start(hbox_height, False, False, 0) vbox.pack_start(gtk.Label(), False, False, 0) vbox.pack_start(hbox_aspect, False, False, 0) vbox.pack_start(gtk.Label(), False, False, 0) hbox_total = gtk.HBox() animtest = gtk.gdk.PixbufAnimation(self.currimg_name) if animtest.is_static_image(): pixbuf, image_width, image_height = self.get_pixbuf_of_size(self.currimg_pixbuf_original, 96, self.zoom_quality) else: pixbuf, image_width, image_height = self.get_pixbuf_of_size(animtest.get_static_image(), 96, self.zoom_quality) image = gtk.Image() image.set_from_pixbuf(self.pixbuf_add_border(pixbuf)) hbox_total.pack_start(image, False, False, 10) hbox_total.pack_start(vbox, False, False, 10) dialog.vbox.pack_start(hbox_total, False, False, 0) width.connect('value-changed', self.preserve_image_aspect, "width", height) height.connect('value-changed', self.preserve_image_aspect, "height", width) aspect_checkbox.connect('toggled', self.aspect_ratio_toggled, width, height) dialog.set_default_response(gtk.RESPONSE_ACCEPT) dialog.vbox.show_all() response = dialog.run() if response == gtk.RESPONSE_ACCEPT: pixelheight = height.get_value_as_int() pixelwidth = width.get_value_as_int() dialog.destroy() self.currimg_pixbuf_original = self.currimg_pixbuf_original.scale_simple(pixelwidth, pixelheight, self.zoom_quality) self.load_new_image2(False, True, False, False) self.image_modified = True else: dialog.destroy() def aspect_ratio_toggled(self, togglebutton, width, height): self.preserve_aspect = togglebutton.get_active() if self.preserve_aspect: # Set height based on width and aspect ratio target_value = float(width.get_value_as_int())/self.currimg_pixbuf_original.get_width() target_value = int(target_value * self.currimg_pixbuf_original.get_height()) self.ignore_preserve_aspect_callback = True height.set_value(target_value) self.ignore_preserve_aspect_callback = False def preserve_image_aspect(self, currspinbox, type, otherspinbox): if not self.preserve_aspect: return if self.ignore_preserve_aspect_callback: return if type == "width": target_value = float(currspinbox.get_value_as_int())/self.currimg_pixbuf_original.get_width() target_value = int(target_value * self.currimg_pixbuf_original.get_height()) else: target_value = float(currspinbox.get_value_as_int())/self.currimg_pixbuf_original.get_height() target_value = int(target_value * self.currimg_pixbuf_original.get_width()) self.ignore_preserve_aspect_callback = True otherspinbox.set_value(target_value) self.ignore_preserve_aspect_callback = False def goto_prev_image(self, action): self.goto_image("PREV", action) def goto_next_image(self, action): self.goto_image("NEXT", action) def goto_random_image(self, action): self.goto_image("RANDOM", action) def goto_first_image(self, action): self.goto_image("FIRST", action) def goto_last_image(self, action): self.goto_image("LAST", action) def goto_image(self, location, action): # location can be "LAST", "FIRST", "NEXT", "PREV", "RANDOM", or a number if self.slideshow_mode and action != "ss": gobject.source_remove(self.timer_delay) if ((location=="PREV" or location=="NEXT" or location=="RANDOM") and len(self.image_list) > 1) or (location=="FIRST" and (len(self.image_list) > 1 and self.curr_img_in_list != 0)) or (location=="LAST" and (len(self.image_list) > 1 and self.curr_img_in_list != len(self.image_list)-1)) or valid_int(location): self.load_new_image_stop_now() cancel = self.autosave_image() if cancel: return check_wrap = False if location != "RANDOM": self.randomlist = [] if location == "FIRST": self.curr_img_in_list = 0 elif location == "RANDOM": if self.randomlist == []: self.reinitialize_randomlist() else: # check if we have seen every image; if so, reinitialize array and repeat: all_items_are_true = True for item in self.randomlist: if not item: all_items_are_true = False if all_items_are_true: if not self.slideshow_mode or (self.slideshow_mode and self.listwrap_mode == 1): self.reinitialize_randomlist() else: check_wrap = True elif location == "LAST": self.curr_img_in_list = len(self.image_list)-1 elif location == "PREV": if self.curr_img_in_list > 0: self.curr_img_in_list -= 1 else: check_wrap = True elif location == "NEXT": if self.curr_img_in_list < len(self.image_list) - 1: self.curr_img_in_list += 1 else: check_wrap = True if check_wrap: if self.listwrap_mode == 0: if location == "NEXT": if self.slideshow_mode: self.toggle_slideshow(None) return elif (location == "PREV" or location == "NEXT") and self.listwrap_mode == 1: if location == "PREV": self.curr_img_in_list = len(self.image_list) - 1 elif location == "NEXT": self.curr_img_in_list = 0 else: if self.curr_img_in_list != self.loaded_img_in_list: # Ensure that the user is looking at the correct "last" image before # they are asked the wrap question: if location == "PREV": self.load_new_image(True, False, True, True, True, True) else: self.load_new_image(False, False, True, True, True, True) self.set_go_navigation_sensitivities(False) self.thumbpane_select(self.curr_img_in_list) if self.fullscreen_mode: self.change_cursor(None) if location == "PREV": dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("You are viewing the first image in the list. Wrap around to the last image?")) elif location == "NEXT": dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("You are viewing the last image in the list. Wrap around to the first image?")) elif location == "RANDOM": dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("All images have been viewed. Would you like to cycle through the images again?")) dialog.set_title(_("Wrap?")) dialog.label.set_property('can-focus', False) dialog.set_default_response(gtk.RESPONSE_YES) self.user_prompt_visible = True response = dialog.run() if response == gtk.RESPONSE_YES: if location == "PREV": self.curr_img_in_list = len(self.image_list)-1 elif location == "NEXT": self.curr_img_in_list = 0 elif location == "RANDOM": self.reinitialize_randomlist() dialog.destroy() self.user_prompt_visible = False if self.fullscreen_mode: self.hide_cursor else: dialog.destroy() self.user_prompt_visible = False if self.fullscreen_mode: self.hide_cursor else: self.change_cursor(None) if self.slideshow_mode: self.toggle_slideshow(None) return if location == "RANDOM": # Find random image that hasn't already been chosen: j = random.randint(0, len(self.image_list)-1) while self.randomlist[j]: j = random.randint(0, len(self.image_list)-1) self.curr_img_in_list = j self.randomlist[j] = True self.currimg_name = str(self.image_list[self.curr_img_in_list]) if valid_int(location): prev_img = self.curr_img_in_list self.curr_img_in_list = int(location) if not self.fullscreen_mode and (not self.slideshow_mode or (self.slideshow_mode and action != "ss")): self.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) if location == "PREV" or (valid_int(location) and int(location) == prev_img-1): self.load_when_idle = gobject.idle_add(self.load_new_image, True, False, True, True, True, True) else: self.load_when_idle = gobject.idle_add(self.load_new_image, False, False, True, True, True, True) self.set_go_navigation_sensitivities(False) if self.slideshow_mode: if self.curr_slideshow_random: self.timer_delay = gobject.timeout_add(int(self.curr_slideshow_delay*1000), self.goto_random_image, "ss") else: self.timer_delay = gobject.timeout_add(int(self.curr_slideshow_delay*1000), self.goto_next_image, "ss") gobject.idle_add(self.thumbpane_select, self.curr_img_in_list) def set_go_navigation_sensitivities(self, skip_initial_check): # setting skip_image_list_check to True is useful when calling from # expand_filelist_and_load_image() for example, as self.image_list has not # yet fully populated if (not self.image_loaded or len(self.image_list) == 1) and not skip_initial_check: self.set_previous_image_sensitivities(False) self.set_first_image_sensitivities(False) self.set_next_image_sensitivities(False) self.set_last_image_sensitivities(False) self.set_random_image_sensitivities(False) elif self.curr_img_in_list == 0: if self.listwrap_mode == 0: self.set_previous_image_sensitivities(False) else: self.set_previous_image_sensitivities(True) self.set_first_image_sensitivities(False) self.set_next_image_sensitivities(True) self.set_last_image_sensitivities(True) self.set_random_image_sensitivities(True) elif self.curr_img_in_list == len(self.image_list)-1: self.set_previous_image_sensitivities(True) self.set_first_image_sensitivities(True) if self.listwrap_mode == 0: self.set_next_image_sensitivities(False) else: self.set_next_image_sensitivities(True) self.set_last_image_sensitivities(False) self.set_random_image_sensitivities(True) else: self.set_previous_image_sensitivities(True) self.set_first_image_sensitivities(True) self.set_next_image_sensitivities(True) self.set_last_image_sensitivities(True) self.set_random_image_sensitivities(True) def reinitialize_randomlist(self): self.randomlist = [] for i in range(len(self.image_list)): self.randomlist.append(False) self.randomlist[self.curr_img_in_list] = True def image_load_failed(self, reset_cursor, filename=""): # If a filename is provided, use it for display: if len(filename) == 0: self.currimg_name = str(self.image_list[self.curr_img_in_list]) else: self.currmg_name = filename if self.verbose and self.currimg_name != "": print _("Loading: %s") % self.currimg_name self.update_title() self.put_error_image_to_window() self.image_loaded = False self.currimg_pixbuf_original = None if reset_cursor: if not self.fullscreen_mode: self.change_cursor(None) def load_new_image_stop_now(self): try: gobject.source_remove(self.load_when_idle) except: pass try: gobject.source_remove(self.preload_when_idle) except: pass try: gobject.source_remove(self.preload_when_idle2) except: pass def load_new_image(self, check_prev_last, use_current_pixbuf_original, reset_cursor, perform_onload_action, preload_next_image_after, preload_prev_image_after): try: self.load_new_image2(check_prev_last, use_current_pixbuf_original, reset_cursor, perform_onload_action) except: self.image_load_failed(True) if preload_next_image_after: self.preload_when_idle = gobject.idle_add(self.preload_next_image, False) if preload_prev_image_after: self.preload_when_idle2 = gobject.idle_add(self.preload_prev_image, False) def check_preloadimg_prev_for_existing(self, prev_index, reset_preloadimg_prev_in_list): # Determines if preloadimg_prev needs to be updated; if so, # checks if the image is already stored in self.currimg # or self.preloadimg_next and can be reused. reset_preloadimg_prev_in_list = False if prev_index != self.preloadimg_prev_in_list and prev_index != -1: # Need to update preloadimg_prev: if prev_index == self.loaded_img_in_list and not self.image_modified and not self.image_zoomed: self.preloadimg_prev_in_list = self.loaded_img_in_list self.preloadimg_prev_name = self.currimg_name self.preloadimg_prev_width = self.currimg_width self.preloadimg_prev_height = self.currimg_height self.preloadimg_prev_pixbuf = self.currimg_pixbuf self.preloadimg_prev_pixbuf_original = self.currimg_pixbuf_original self.preloadimg_prev_zoomratio = self.currimg_zoomratio self.preloadimg_prev_is_animation = self.currimg_is_animation elif prev_index == self.preloadimg_next_in_list: self.preloadimg_prev_in_list = self.preloadimg_next_in_list self.preloadimg_prev_name = self.preloadimg_next_name self.preloadimg_prev_width = self.preloadimg_next_width self.preloadimg_prev_height = self.preloadimg_next_height self.preloadimg_prev_pixbuf = self.preloadimg_next_pixbuf self.preloadimg_prev_pixbuf_original = self.preloadimg_next_pixbuf_original self.preloadimg_prev_zoomratio = self.preloadimg_next_zoomratio self.preloadimg_prev_is_animation = self.preloadimg_next_is_animation else: reset_preloadimg_prev_in_list = True elif prev_index == -1: reset_preloadimg_prev_in_list = True def check_preloadimg_next_for_existing(self, next_index, reset_preloadimg_next_in_list): # Determines if preloadimg_next needs to be updated; if so, # checks if the image is already stored in self.currimg # or self.preloadimg_prev and can be reused. reset_preloadimg_next_in_list = False if next_index != self.preloadimg_next_in_list and next_index != -1: # Need to update preloadimg_next: if next_index == self.loaded_img_in_list and not self.image_modified and not self.image_zoomed: self.preloadimg_next_in_list = self.loaded_img_in_list self.preloadimg_next_name = self.currimg_name self.preloadimg_next_width = self.currimg_width self.preloadimg_next_height = self.currimg_height self.preloadimg_next_pixbuf = self.currimg_pixbuf self.preloadimg_next_pixbuf_original = self.currimg_pixbuf_original self.preloadimg_next_zoomratio = self.currimg_zoomratio self.preloadimg_next_is_animation = self.currimg_is_animation elif next_index == self.preloadimg_prev_in_list: self.preloadimg_next_in_list = self.preloadimg_prev_in_list self.preloadimg_next_name = self.preloadimg_prev_name self.preloadimg_next_width = self.preloadimg_prev_width self.preloadimg_next_height = self.preloadimg_prev_height self.preloadimg_next_pixbuf = self.preloadimg_prev_pixbuf self.preloadimg_next_pixbuf_original = self.preloadimg_prev_pixbuf_original self.preloadimg_next_zoomratio = self.preloadimg_prev_zoomratio self.preloadimg_next_is_animation = self.preloadimg_prev_is_animation else: reset_preloadimg_next_in_list = True elif next_index == -1: reset_preloadimg_next_in_list = True def check_currimg_for_existing(self): # Determines if currimg needs to be updated; if so, # checks if the image is already stored in self.preloadimg_next # or self.preloadimg_prev and can be reused (the whole point of # preloading!) used_prev = False used_next = False if self.curr_img_in_list != self.loaded_img_in_list: # Need to update currimg: if self.curr_img_in_list == self.preloadimg_prev_in_list: # Set preload_prev_image as current image self.currimg_name = self.preloadimg_prev_name self.currimg_width = self.preloadimg_prev_width self.currimg_height = self.preloadimg_prev_height self.currimg_pixbuf = self.preloadimg_prev_pixbuf self.currimg_pixbuf_original = self.preloadimg_prev_pixbuf_original self.currimg_zoomratio = self.preloadimg_prev_zoomratio self.currimg_is_animation = self.preloadimg_prev_is_animation used_prev = True if self.verbose and self.currimg_name != "": print _("Loading: %s") % self.currimg_name self.put_zoom_image_to_window(True) if not self.currimg_is_animation: self.set_image_sensitivities(True) else: self.set_image_sensitivities(False) elif self.curr_img_in_list == self.preloadimg_next_in_list: # Use preload_next_image as current image self.currimg_name = self.preloadimg_next_name self.currimg_width = self.preloadimg_next_width self.currimg_height = self.preloadimg_next_height self.currimg_pixbuf = self.preloadimg_next_pixbuf self.currimg_pixbuf_original = self.preloadimg_next_pixbuf_original self.currimg_zoomratio = self.preloadimg_next_zoomratio self.currimg_is_animation = self.preloadimg_next_is_animation used_next = True if self.verbose and self.currimg_name != "": print _("Loading: %s") % self.currimg_name self.put_zoom_image_to_window(True) if not self.currimg_is_animation: self.set_image_sensitivities(True) else: self.set_image_sensitivities(False) return used_prev, used_next def load_new_image2(self, check_prev_last, use_current_pixbuf_original, reset_cursor, perform_onload_action, skip_recentfiles=False): # check_prev_last is used to determine if we should check whether # preloadimg_prev can be reused last. This should really only # be done if the user just clicked the previous image button in # order to reduce the number of image loads. # If use_current_pixbuf_original == True, do not reload the # self.currimg_pixbuf_original from the file; instead, use the existing # one. This is only currently useful for resizing images. # Determine the indices in the self.image_list array for the # previous and next preload images. next_index = self.curr_img_in_list + 1 if next_index > len(self.image_list)-1: if self.listwrap_mode == 0: next_index = -1 else: next_index = 0 prev_index = self.curr_img_in_list - 1 if prev_index < 0: if self.listwrap_mode == 0: prev_index = -1 else: prev_index = len(self.image_list)-1 if self.preloading_images: reset_preloadimg_next_in_list = False reset_preloadimg_prev_in_list = False if check_prev_last: self.check_preloadimg_next_for_existing(next_index, reset_preloadimg_next_in_list) else: self.check_preloadimg_prev_for_existing(prev_index, reset_preloadimg_prev_in_list) used_prev, used_next = self.check_currimg_for_existing() if self.preloading_images: if check_prev_last: self.check_preloadimg_prev_for_existing(prev_index, reset_preloadimg_prev_in_list) else: self.check_preloadimg_next_for_existing(next_index, reset_preloadimg_next_in_list) if reset_preloadimg_prev_in_list: self.preloadimg_prev_in_list = -1 if reset_preloadimg_next_in_list: self.preloadimg_next_in_list = -1 if used_prev or used_next: # If we used a preload image, set the correct boolean variables if self.open_mode == self.open_mode_smart or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_smart): self.last_image_action_was_fit = True self.last_image_action_was_smart_fit = True elif self.open_mode == self.open_mode_fit or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_fit): self.last_image_action_was_fit = True self.last_image_action_was_smart_fit = False elif self.open_mode == self.open_mode_1to1 or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_1to1): self.last_image_action_was_fit = False else: # Need to load the current image self.currimg_pixbuf = None self.currimg_zoomratio = 1 self.currimg_name = str(self.image_list[self.curr_img_in_list]) if self.verbose and self.currimg_name != "": print _("Loading: %s") % self.currimg_name animtest = gtk.gdk.PixbufAnimation(self.currimg_name) if animtest.is_static_image() or (use_current_pixbuf_original and not self.currimg_is_animation): self.currimg_is_animation = False if not use_current_pixbuf_original: self.currimg_pixbuf_original = animtest.get_static_image() self.set_image_sensitivities(True) if self.open_mode == self.open_mode_smart or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_smart): self.zoom_to_fit_or_1_to_1(None, False, False) elif self.open_mode == self.open_mode_fit or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_fit): self.zoom_to_fit_window(None, False, False) elif self.open_mode == self.open_mode_1to1 or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_1to1): self.zoom_1_to_1(None, False, False) else: self.currimg_is_animation = True if not use_current_pixbuf_original: self.currimg_pixbuf_original = animtest self.zoom_1_to_1(None, False, False) self.set_image_sensitivities(False) if self.onload_cmd != None and perform_onload_action: self.parse_action_command(self.onload_cmd, False) self.update_statusbar() self.update_title() self.image_loaded = True self.image_modified = False self.image_zoomed = False self.set_slideshow_sensitivities() if not skip_recentfiles: self.register_file_with_recent_docs(self.currimg_name) if reset_cursor: if not self.fullscreen_mode: self.change_cursor(None) def preload_next_image(self, use_existing_image): try: if self.preloading_images and len(self.image_list) > 1: if not use_existing_image: next_index = self.curr_img_in_list + 1 if next_index > len(self.image_list)-1: if self.listwrap_mode == 0: self.preloadimg_next_in_list == -1 return else: next_index = 0 if next_index == self.preloadimg_next_in_list: return self.preloadimg_next_in_list = next_index self.preloadimg_next_name = str(self.image_list[next_index]) pre_animtest = gtk.gdk.PixbufAnimation(self.preloadimg_next_name) if pre_animtest.is_static_image(): self.preloadimg_next_is_animation = False self.preloadimg_next_pixbuf_original = pre_animtest.get_static_image() else: self.preloadimg_next_is_animation = True self.preloadimg_next_pixbuf_original = pre_animtest if self.preloadimg_next_in_list == -1: return # Determine self.preloadimg_next_zoomratio if self.open_mode == self.open_mode_smart or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_smart): self.zoom_to_fit_or_1_to_1(None, True, False) elif self.open_mode == self.open_mode_fit or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_fit): self.zoom_to_fit_window(None, True, False) elif self.open_mode == self.open_mode_1to1 or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_1to1): self.zoom_1_to_1(None, True, False) # Always start with the original image to preserve quality! # Calculate image size: self.preloadimg_next_width = int(self.preloadimg_next_pixbuf_original.get_width() * self.preloadimg_next_zoomratio) self.preloadimg_next_height = int(self.preloadimg_next_pixbuf_original.get_height() * self.preloadimg_next_zoomratio) if not self.preloadimg_next_is_animation: # Scale image: if not self.preloadimg_next_pixbuf_original.get_has_alpha(): self.preloadimg_next_pixbuf = self.preloadimg_next_pixbuf_original.scale_simple(self.preloadimg_next_width, self.preloadimg_next_height, self.zoom_quality) else: colormap = self.imageview.get_colormap() light_grey = colormap.alloc_color('#666666', True, True) dark_grey = colormap.alloc_color('#999999', True, True) self.preloadimg_next_pixbuf = self.preloadimg_next_pixbuf_original.composite_color_simple(self.preloadimg_next_width, self.preloadimg_next_height, self.zoom_quality, 255, 8, light_grey.pixel, dark_grey.pixel) else: self.preloadimg_next_pixbuf = self.preloadimg_next_pixbuf_original gc.collect() if self.verbose: print _("Preloading: %s") % self.preloadimg_next_name except: self.preloadimg_next_in_list = -1 def preload_prev_image(self, use_existing_image): try: if self.preloading_images and len(self.image_list) > 1: if not use_existing_image: prev_index = self.curr_img_in_list - 1 if prev_index < 0: if self.listwrap_mode == 0: self.preloadimg_prev_in_list == -1 return else: prev_index = len(self.image_list)-1 if prev_index == self.preloadimg_prev_in_list: return self.preloadimg_prev_in_list = prev_index self.preloadimg_prev_name = str(self.image_list[prev_index]) pre_animtest = gtk.gdk.PixbufAnimation(self.preloadimg_prev_name) if pre_animtest.is_static_image(): self.preloadimg_prev_is_animation = False self.preloadimg_prev_pixbuf_original = pre_animtest.get_static_image() else: self.preloadimg_prev_is_animation = True self.preloadimg_prev_pixbuf_original = pre_animtest if self.preloadimg_prev_in_list == -1: return # Determine self.preloadimg_prev_zoomratio if self.open_mode == self.open_mode_smart or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_smart): self.zoom_to_fit_or_1_to_1(None, False, True) elif self.open_mode == self.open_mode_fit or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_fit): self.zoom_to_fit_window(None, False, True) elif self.open_mode == self.open_mode_1to1 or (self.open_mode == self.open_mode_last and self.last_mode == self.open_mode_1to1): self.zoom_1_to_1(None, False, True) # Always start with the original image to preserve quality! # Calculate image size: self.preloadimg_prev_width = int(self.preloadimg_prev_pixbuf_original.get_width() * self.preloadimg_prev_zoomratio) self.preloadimg_prev_height = int(self.preloadimg_prev_pixbuf_original.get_height() * self.preloadimg_prev_zoomratio) if not self.preloadimg_prev_is_animation: # Scale image: if not self.preloadimg_prev_pixbuf_original.get_has_alpha(): self.preloadimg_prev_pixbuf = self.preloadimg_prev_pixbuf_original.scale_simple(self.preloadimg_prev_width, self.preloadimg_prev_height, self.zoom_quality) else: colormap = self.imageview.get_colormap() light_grey = colormap.alloc_color('#666666', True, True) dark_grey = colormap.alloc_color('#999999', True, True) self.preloadimg_prev_pixbuf = self.preloadimg_prev_pixbuf_original.composite_color_simple(self.preloadimg_prev_width, self.preloadimg_prev_height, self.zoom_quality, 255, 8, light_grey.pixel, dark_grey.pixel) else: self.preloadimg_prev_pixbuf = self.preloadimg_prev_pixbuf_original gc.collect() if self.verbose: print _("Preloading: %s") % self.preloadimg_prev_name except: self.preloadimg_prev_in_list = -1 def change_cursor(self, type): for i in gtk.gdk.window_get_toplevels(): if i.get_window_type() != gtk.gdk.WINDOW_TEMP and i.get_window_type() != gtk.gdk.WINDOW_CHILD: i.set_cursor(type) self.layout.window.set_cursor(type) def expand_filelist_and_load_image(self, inputlist): # Takes the current list (i.e. ["pic.jpg", "pic2.gif", "../images"]) and # expands it into a list of all pictures found self.thumblist.clear() first_image_loaded_successfully = False self.images_found = 0 self.stop_now = True # Make sure that any previous search process is stopped self.change_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) # Reset preload images: self.preloadimg_next_in_list = -1 self.preloadimg_prev_in_list = -1 # If any directories were passed, display "Searching..." in statusbar: self.searching_for_images = False for item in inputlist: if os.path.isdir(item): self.searching_for_images = True self.update_statusbar() if not self.closing_app: while gtk.events_pending(): gtk.main_iteration() first_image = "" first_image_found = False first_image_loaded = False second_image = "" second_image_found = False second_image_preloaded = False self.randomlist = [] folderlist = [] self.image_list = [] self.curr_img_in_list = 0 go_buttons_enabled = False self.set_go_sensitivities(False) # Clean up list (remove preceding "file://" or "file:" and trailing "/") for itemnum in range(len(inputlist)): # Strip off preceding file.. if inputlist[itemnum].startswith('file://'): inputlist[itemnum] = inputlist[itemnum][7:] elif inputlist[itemnum].startswith('file:'): inputlist[itemnum] = inputlist[itemnum][5:] # Strip off trailing "/" if it exists: if inputlist[itemnum][len(inputlist[itemnum])-1] == "/": inputlist[itemnum] = inputlist[itemnum][:(len(inputlist[itemnum])-1)] if not (inputlist[itemnum].startswith('http://') or inputlist[itemnum].startswith('ftp://')): inputlist[itemnum] = os.path.abspath(inputlist[itemnum]) else: try: # Remote file. Save as /tmp/mirage-/filename.ext tmpdir = tempfile.mkdtemp(prefix="mirage-") + "/" tmpfile = tmpdir + os.path.basename(inputlist[itemnum]) socket.setdefaulttimeout(5) urllib.urlretrieve(inputlist[itemnum], tmpfile) inputlist[itemnum] = tmpfile except: pass # Remove hidden files from list: if not self.open_hidden_files: tmplist = [] for item in inputlist: if os.path.basename(item)[0] != '.': tmplist.append(item) elif self.verbose: print _("Skipping: %s") % item inputlist = tmplist if len(inputlist) == 0: # All files/dirs were hidden, exit.. self.currimg_name = "" self.searching_for_images = False self.set_go_navigation_sensitivities(False) self.set_slideshow_sensitivities() if not self.closing_app: self.change_cursor(None) self.recursive = False self.put_error_image_to_window() self.update_title() return init_image = os.path.abspath(inputlist[0]) self.stop_now = False # If open all images in dir... if self.open_all_images: temp = inputlist inputlist = [] for item in temp: if os.path.isfile(item): itempath = os.path.dirname(os.path.abspath(item)) temp = self.recursive self.recursive = False self.stop_now = False self.expand_directory(itempath, False, go_buttons_enabled, False, False) self.recursive = temp else: inputlist.append(item) for item in self.image_list: inputlist.append(item) if first_image_found and not second_image_found: second_image_found = True second_image = item second_image_came_from_dir = False if item == init_image: first_image_found = True first_image = item first_image_came_from_dir = False self.curr_img_in_list = len(inputlist)-1 self.image_list = [] for item in inputlist: if not self.closing_app: if os.path.isfile(item): if self.valid_image(item): if not second_image_found and first_image_found: second_image_found = True second_image = item second_image_came_from_dir = False if not first_image_found: first_image_found = True first_image = item first_image_came_from_dir = False self.image_list.append(item) if self.verbose: self.images_found += 1 print _("Found: %(item)s [%(number)i]") % {'item': item, 'number': self.images_found} else: # If it's a directory that was explicitly selected or passed to # the program, get all the files in the dir. # Retrieve only images in the top directory specified by the user # unless explicitly told to recurse (via -R or in Settings>Preferences) folderlist.append(item) if not second_image_found: # See if we can find an image in this directory: self.stop_now = False self.expand_directory(item, True, go_buttons_enabled, False, False) itemnum = 0 while itemnum < len(self.image_list) and not second_image_found: if os.path.isfile(self.image_list[itemnum]): if not second_image_found and first_image_found: second_image_found = True second_image_came_from_dir = True second_image = self.image_list[itemnum] self.set_go_navigation_sensitivities(True) go_buttons_enabled = True while gtk.events_pending(): gtk.main_iteration(True) if not first_image_found: first_image_found = True first_image = self.image_list[itemnum] first_image_came_from_dir = True itemnum += 1 # Load first image and display: if first_image_found and not first_image_loaded and self.curr_img_in_list <= len(self.image_list)-1: first_image_loaded = True if self.slideshow_mode: self.toggle_slideshow(None) if self.verbose and self.currimg_name != "": print _("Loading: %s") % self.currimg_name try: self.load_new_image2(False, False, True, True) # Calling load_new_image2 will reset the following two vars # to 0, so ensure they are -1 again (no images preloaded) self.preloadimg_prev_in_list = -1 self.preloadimg_next_in_list = -1 if not self.currimg_is_animation: self.previmg_width = self.currimg_pixbuf.get_width() else: self.previmg_width = self.currimg_pixbuf.get_static_image().get_width() self.image_loaded = True first_image_loaded_successfully = True if not self.closing_app: while gtk.events_pending(): gtk.main_iteration(True) except: pass if first_image_came_from_dir: self.image_list = [] # Pre-load second image: if second_image_found and not second_image_preloaded and ((not second_image_came_from_dir and self.curr_img_in_list+1 <= len(self.image_list)-1) or second_image_came_from_dir): second_image_preloaded = True temp = self.image_list self.image_list = [] while len(self.image_list) < self.curr_img_in_list+1: self.image_list.append(first_image) self.image_list.append(second_image) self.preload_next_image(False) self.image_list = temp if first_image_found: # Sort the filelist and folderlist alphabetically, and recurse into folderlist: if first_image_came_from_dir: self.add_folderlist_images(folderlist, go_buttons_enabled) self.do_image_list_stuff(first_image, second_image) else: self.do_image_list_stuff(first_image, second_image) self.add_folderlist_images(folderlist, go_buttons_enabled) self.update_title() if not self.closing_app: while gtk.events_pending(): gtk.main_iteration(True) if not first_image_loaded_successfully: self.image_load_failed(False, init_image) self.searching_for_images = False self.update_statusbar() self.set_go_navigation_sensitivities(False) self.set_slideshow_sensitivities() self.thumbpane_update_images(True, self.curr_img_in_list) if not self.closing_app: self.change_cursor(None) self.recursive = False def add_folderlist_images(self, folderlist, go_buttons_enabled): if len(folderlist) > 0: folderlist.sort(locale.strcoll) folderlist = list(set(folderlist)) for item in folderlist: if not self.closing_app: if (not self.open_hidden_files and os.path.basename(item)[0] != '.') or self.open_hidden_files: self.stop_now = False self.expand_directory(item, False, go_buttons_enabled, True, True) def do_image_list_stuff(self, first_image, second_image): if len(self.image_list) > 0: self.set_go_navigation_sensitivities(True) self.image_list = list(set(self.image_list)) self.image_list.sort(locale.strcoll) def expand_directory(self, item, stop_when_second_image_found, go_buttons_enabled, update_window_title, print_found_msg): if not self.stop_now and not self.closing_app: folderlist = [] filelist = [] if not os.access(item, os.R_OK): return False for item2 in os.listdir(item): if not self.closing_app and not self.stop_now: while gtk.events_pending(): gtk.main_iteration(True) item2 = item + os.sep + item2 item_fullpath2 = os.path.abspath(item2) if (not self.open_hidden_files and os.path.basename(item_fullpath2)[0] != '.') or self.open_hidden_files: if os.path.isfile(item_fullpath2) and self.valid_image(item_fullpath2): filelist.append(item2) if self.verbose and print_found_msg: self.images_found += 1 print _("Found: %(fullpath)s [%(number)i]") % {'fullpath': item_fullpath2, 'number': self.images_found} elif os.path.isdir(item_fullpath2) and self.recursive: folderlist.append(item_fullpath2) elif self.verbose: print _("Skipping: %s") % item_fullpath2 if len(self.image_list)>0 and update_window_title: self.update_title() # Sort the filelist and folderlist alphabetically: if len(filelist) > 0: filelist.sort(locale.strcoll) for item2 in filelist: if not item2 in self.image_list: self.image_list.append(item2) if stop_when_second_image_found and len(self.image_list)==2: return if not go_buttons_enabled and len(self.image_list) > 1: self.set_go_navigation_sensitivities(True) go_buttons_enabled = True # Recurse into the folderlist: if len(folderlist) > 0: folderlist.sort(locale.strcoll) for item2 in folderlist: if not self.stop_now: self.expand_directory(item2, stop_when_second_image_found, go_buttons_enabled, update_window_title, print_found_msg) def register_file_with_recent_docs(self, imgfile): self.recent_file_add_and_refresh(imgfile) if os.path.isfile(imgfile) and gtk.check_version(2, 10, 0) == None: try: gtk_recent_manager = gtk.recent_manager_get_default() uri = '' if imgfile[:7] != 'file://': uri = 'file://' uri = uri + urllib.pathname2url(os.path.abspath(imgfile)) gtk_recent_manager.add_item(uri) except: #Isnt currently functional on win32 if sys.platform == "win32": pass else: raise def valid_image(self, file): test = gtk.gdk.pixbuf_get_file_info(file) if test == None: return False elif test[0]['name'] == "wbmp": # some regular files are thought to be wbmp for whatever reason, # so let's check further.. :( try: test2 = gtk.gdk.pixbuf_new_from_file(file) return True except: return False else: return True def image_flip(self, old_pix, vertical): width = old_pix.get_width() height = old_pix.get_height() d = None if vertical: d, w, h, rws = imgfuncs.vert(old_pix.get_pixels(), width, height, old_pix.get_rowstride(), old_pix.get_n_channels()) else: d, w, h, rws = imgfuncs.horiz(old_pix.get_pixels(), width, height, old_pix.get_rowstride(), old_pix.get_n_channels()) if d: new_pix = gtk.gdk.pixbuf_new_from_data(d, old_pix.get_colorspace(), old_pix.get_has_alpha(), old_pix.get_bits_per_sample(), w, h, rws) return new_pix return old_pix def image_rotate(self, old_pix, full_angle): width = old_pix.get_width() height = old_pix.get_height() angle = full_angle - (int(full_angle) / 360) * 360 if angle: d = None if angle % 270 == 0: d, w, h, rws = imgfuncs.right(old_pix.get_pixels(), width, height, old_pix.get_rowstride(), old_pix.get_n_channels()) elif angle % 180 == 0: d, w, h, rws = imgfuncs.mirror(old_pix.get_pixels(), width, height, old_pix.get_rowstride(), old_pix.get_n_channels()) elif angle % 90 == 0: d, w, h, rws = imgfuncs.left(old_pix.get_pixels(), width, height, old_pix.get_rowstride(), old_pix.get_n_channels()) if d: new_pix = gtk.gdk.pixbuf_new_from_data(d, old_pix.get_colorspace(), old_pix.get_has_alpha(), old_pix.get_bits_per_sample(), w, h, rws) return new_pix return old_pix def toggle_slideshow(self, action): if len(self.image_list) > 1: if not self.slideshow_mode: if self.slideshow_in_fullscreen and not self.fullscreen_mode: self.enter_fullscreen(None) self.slideshow_mode = True self.update_title() self.set_slideshow_sensitivities() if not self.curr_slideshow_random: self.timer_delay = gobject.timeout_add(int(self.curr_slideshow_delay*1000), self.goto_next_image, "ss") else: self.reinitialize_randomlist() self.timer_delay = gobject.timeout_add(int(self.curr_slideshow_delay*1000), self.goto_random_image, "ss") self.ss_start.hide() self.ss_stop.show() timer_screensaver = gobject.timeout_add(1000, self.disable_screensaver_in_slideshow_mode) else: self.slideshow_mode = False gobject.source_remove(self.timer_delay) self.update_title() self.set_slideshow_sensitivities() self.set_zoom_sensitivities() self.ss_stop.hide() self.ss_start.show() def update_title(self): if len(self.image_list) == 0: title = "Mirage" else: title = "Mirage - " +_("[%(current)i of %(total)i]") % {'current': self.curr_img_in_list+1, 'total': len(self.image_list)} + ' ' + os.path.basename(self.currimg_name) if self.slideshow_mode: title = title + ' - ' + _('Slideshow Mode') self.window.set_title(title) def slideshow_controls_show(self): if not self.slideshow_controls_visible and not self.controls_moving: self.slideshow_controls_visible = True self.ss_delayspin.set_value(self.curr_slideshow_delay) self.ss_randomize.set_active(self.curr_slideshow_random) if self.slideshow_mode: self.ss_start.set_no_show_all(True) self.ss_stop.set_no_show_all(False) else: self.ss_start.set_no_show_all(False) self.ss_stop.set_no_show_all(True) (xpos, ypos) = self.window.get_position() screen = self.window.get_screen() self.slideshow_window.set_screen(screen) self.slideshow_window2.set_screen(screen) self.slideshow_window.show_all() self.slideshow_window2.show_all() if not self.closing_app: while gtk.events_pending(): gtk.main_iteration() ss_winheight = self.slideshow_window.allocation.height ss_win2width = self.slideshow_window2.allocation.width winheight = self.window.allocation.height winwidth = self.window.allocation.width y = -3.0 self.controls_moving = True while y < ss_winheight: self.slideshow_window.move(2+xpos, int(winheight-y-2)) self.slideshow_window2.move(winwidth-ss_win2width-2+xpos, int(winheight-y-2)) y += 0.05 if not self.closing_app: while gtk.events_pending(): gtk.main_iteration() self.controls_moving = False def slideshow_controls_hide(self): if self.slideshow_controls_visible and not self.controls_moving: self.slideshow_controls_visible = False (xpos, ypos) = self.window.get_position() ss_winheight = self.slideshow_window.allocation.height ss_win2width = self.slideshow_window2.allocation.width winheight = self.window.allocation.height winwidth = self.window.allocation.width y = float(self.slideshow_window.allocation.height*1.0) self.controls_moving = True while y > -3: self.slideshow_window.move(2+xpos, int(winheight-y-2)) self.slideshow_window2.move(winwidth-ss_win2width-2+xpos, int(winheight-y-2)) y -= 0.05 if not self.closing_app: while gtk.events_pending(): gtk.main_iteration() self.controls_moving = False def disable_screensaver_in_slideshow_mode(self): if self.slideshow_mode and self.disable_screensaver: test = os.spawnlp(os.P_WAIT, "/usr/bin/xscreensaver-command", "xscreensaver-command", "-deactivate") if test <> 127: timer_screensaver = gobject.timeout_add(1000, self.disable_screensaver_in_slideshow_mode) def main(self): gtk.main() if __name__ == "__main__": base = Base() gtk.gdk.threads_enter() base.main() gtk.gdk.threads_leave() mirage-0.9.5.1/mirage.png0000644000175000017500000001273511422310710014717 0ustar fredricfredricPNG  IHDR>asBIT|d pHYs$$P$tEXtSoftwarewww.inkscape.org<ZIDATxyp$W}?4V]`@uUbJ„PC?BWW#p+t1]ZI#i?^Lh$ͭYMkg5~ m+a{ tWW@v€ ,ECW; D p(g$i࿁{ ]{o;.IDbp %PG׃.mGӸd+["4P&Bh@h %HKb[ޗJKk{Q̶GzN~}2B 0CתVA2|oZ<|gCӱJ$@$*nފ:C58$ k5|s %g$M!+)d7=> |e{5=CHT F BaA( kmBڊ$fa|3]`Cqa 7|ZNX~g :aC?~mCs#cJI&aY1tnk[c?O-4v/^/-ɬd6f~oEm.U #o \B>cN*axw]#@$*| x, _/WY*5·7uP8cF >UH)I-Y*G 3("Qq*aem' 9y 3W!{|1Db* wZ}k[AJIz&dAYWpM%D#QCŻoe~' v=.Vߊr5Vu?a@sE_ЉHTܫ. o>Z~Q,5ijb#h8}wTRB. C.O{}RDը`t  k'J(gH^\$*4ggpԷE:`}*^m<T&nx'^2 ߯zmHT< Wzx8j5\K8@`d~BeMWt'.vPX08V $l5I.Yr6҆0 7߬p2z=Piہ9E\&htdTDXڬ|=QlږO,+pdG3k|z](boQ'|he%F'XW @/<ѺR`|,MMH3[~KU9qT<|Zt@!|ZE7xFeF-పoۊD=jmr钚Y\3 ]~KjYZ$;6*!"Q|J Y:c%Y$lئtO;e2g6(|~HIfOD3kL|-+dmOyBQg2i#mawT7t7tyE9i7 WulF s{>@IWw.ʵ OdlV͆c`@sGh;q+PSBZsru<*)QU>l VnV֙(t@.)C14(-X 9Ԓ9[$,Բڅ {t5wPgKgL.@b@vs#Wp ]~xcʬY@!g^ $\bIH.~lt yco]3I6guo)%vY4DC>;6SjI!Ԕz dju:3jMaÔ̧$j%T%m7LCEUȱbN$*DaQt.)%k^f[^\J9YX/KZV &\8'SRP*āZV,*U P'134~J}C(dee5*|p݆`:Q)E SDP# -OphRr|Z^@hjLZGoJ-&s 3[Xȥl |ZFo0|Χ$+B 0t]Ȯ[]<$ p] #V:Kp 9YIxcuh^(`a`aQ2άmLW OI-~paWmH\7Upiֻ˔$Ε'Mܘʧ<)/%5u'n:omW!*%=V|SM'ƭ?\.JV5hN&C;(L/7_1 o ]~  YpF@M:a)uZ'[ ] E|u*]fN& T'| 8\m6<PS\aPCE1hH9۱B +lAd, $gnZhmn\{YMu. v8x3*ҪF/]V=]@sTڒ9˝SkԸP4ͼd<3 .H-6VA):B1xTX£YR`Mr6KgMw*pg:P ]QĦ)SE>oUrZ1 \fpMd鬉mFuȬ,69g~^ 4g-Tw7 ̏6\2V/Ty;FCQqS2Vf"r(Y~UKދBr)JyTS $5*p}禨ve=Ũ'Ci ]3tyU.a֍7eJV+~.\F E V=O+q7%Q 7 m鎛+kFQ{՜@Yje:ח ]~5 6Ѹ*G 5̪nWkxyNW2>VP5pyGSpPZy6S(gX+kL2* ]~w4Ε)tfE|WHfm3:ACռCD>X<] t`?k n+Zjk~7?XSKm983`vfv~xEm,TSe泆.-=ICPGW^d ]ZNcZ+>.P޽+쵖_ .Aѳ0tyw=x<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9<9zz}z C-$1 COy!k 8 Mtp. @<&B(^\[|9.0yZ9Ӯgtm+9cb 4j㽸3CΫd<&.OȮ,_/FY7ŭ >`p`p`HhMa$p[qOIJssi |˪d&g;/1qE")+n t7}66mقG 9B6ĭ\2N;?Pe 9U;6p^:e<&~ 'U-qcb~ޭ7*  "Px Mk6`p(smNJ-N-J%R"y X7Pd{zFf;YQ3(ِAw3/ ߼E_4# LfDt*A2i>܍ZWv oDWVc.6jXS"<<;~ѱԢҩYYrthKP/wMȇVv$7;^}nhh]SOT@nGvs#dҫ$$gIK>xyO41/FGlUO X(CL|.C"1Ņ:%xL|ez w"@<&^1nM=fnQ\Xdsך۸8m04Ƀ&D F`O!kbKȷյ?Cm_dl|I%g!(}l<&^1=#꽧wxL< W`?~kbwF8yN=x4k/kf#Ycn$Kgwx􌼻{lIgwq6P+}Hy  O*lϕ\~4_υerC\\x}a3榑 11 7W^TwMڎ,Ac@dzF*_-#9xi:_v Y~sk4F&qᣞ/!>|p-8^WcKQcK|>?Oc oB6?/we3e*=8O06{Ncee6S3rx x-_ `ll?Q2.ww`+;;y!J}t4a]S뢹.QA#kuUsgN $Ȋt&YG)I*LI.IͶ(.WYuU{WmTVRU|>x T⛴aǢ&#=Gjl#.+ l:CIENDB`mirage-0.9.5.1/CHANGELOG0000644000175000017500000002202111422311772014155 0ustar fredricfredricv0.9.5.1 - July 23, 2010 + Added: dutch translation + Bug: Mirage showed verbose output by default + Bug: Misplaced parenthesis in Open Remote Image dialog code + Changes: Fixed translations again... v0.9.5 - July 20, 2010 + Added a windows icon + Added new shortcuts PgUP/PgDN for previous/next image + Added option to disable the backgroundcolor in windowed mode + Bug: & in custom actions caused an error when mirage tried to open custom action dialog (bug #17329) + Bug: Save image didn't work. (bug #17330) + Bug: Fixed gettext files not found if installed into /usr/local (bug #17359) + Changes: now uses $XDG_CONFIG_HOME/mirage as config directory if possible (patch taken from debian) + Changes: Switched zooming directions for Ctrl+Mousewheel up/down. + Changes: Small interface changes + Changes: Updated mnemonics (bug #17350 and patch #3020) + Changes: Improvements to localized strings v0.9.4 - June 26, 2010 + Mirage now requires PyGTK 2.12.0 + Added the ability to set the quality for saving images + Added windows support + Fixed DeprecationWarnings for old tooltip API in pygtk + Fixed DeprecationWarnings for md5 + Prevent toolbar from getting focus on keypresses + Bug: Fix returning from fullscreen mode with no images displayed + Bug: delete_image() could cause some thumbnails to not get loaded + Bug: If a image modified image was deleted mirage would ask to save the image + Bug: Hopefully fixed image preloading + Bug: Fixed wrong tooltip for hidden images + Bug: Some menu entries was visible while they shouldnt have been + Bug: Fixed parsing of custom commands + Changes: Properties now show "file modified" instead of "file date" + Changes: Slideshow delay is choosen with a spinner + Changes: Fixed DeprecationWarnings for old tooltip API in pygtk + Changes: Fixed DeprecationWarnings for md5 + Feature request: Show filename in statusbar + Translation: Added Portuguese translation (Danilo) + Translation: Added Chinese translation (Jayden) + Translation: Updated the po-files v0.9.3 - March 26, 2008 + Added shortcuts for consistency with gqview/eog (Benjamin) + Added Hungarian translation (Sandor) + Added Czech translation (Petr) v0.9.2 - January 28, 2008 + Bug: Fix typo preventing thumbnails from being reused (Lane) v0.9.1 - January 9, 2008 + Screenshot support + Use png attributes to be more fully thumbnail spec compliant + Allow running without compiled C modules (certain features disabled) + Reuse generated thumbnails for open dialog preview if they exist + Bug: Fix freeze involving modified image and navigation + Bug: Prevent possible crash on invalid image files + Bug: Fix occasional wrong height of thumbnails (and gobject assertion) + Bug: Wrong image displayed if discarding modified app and using preload + Bug: Ctrl+mousewheel doesn't zoom when caps/num lock is on + Bug: Fix horizontal centering of image + Bug: Fix .desktop file category + Bug: Create thumbnails dir if it doesn't exist v0.9 - October 18, 2007 + Thumbnails pane (freedesktop spec compliant using ~/.thumbnails) + Ability to open remote images (http and ftp) + Register viewed images with gtk's recent documents (ongardie) + Preference for opening hidden files + Add up/down keybindings to go to previous/next image + Bug: Filenames in custom actions aren't correctly escaped (Andrew) + Bug: Can't open properties on animated images + Bug: Editing a custom action creates a new action + Bug: Fast image traversal overruns image list and becomes stuck v0.8.3 - January 17, 2007 + Use F11 for fullscreen like most applications + Use 'kfmclient' to launch browser in kde + Added Italian translation (Daniele Maggio) + Bug: Save As doesn't work v0.8.2 - December 7, 2006 + Ability to modify image saturation + Recent file/list menu + Save/load accel_map in case user edits any gtk accelerators + Bug: Fullscreen controls can be on wrong screen with Xinerama + Bug: Scrollbars don't appear correctly on window resizes + Bug: Panning images doesn't always work properly + Bug: Alpha channel is lost when resizing image with transparency + Bug: Allow saving files when file extension isn't lowercase + Bug: Specified image scaling method isn't properly used v0.8.1 - October 19, 2006 + Add list of image names to custom actions (%L) + Improved preloading/navigation handling + Menu improvements; added Custom Actions to EditMenu + Try gnome-open/exo-open first for opening help, then fallback + Bug: Next/brevious buttons block with mouse over it + Bug: Ctrl-0/1 shortcuts don't work from numpad with numlock on + Bug: Custom actions don't execute when using --verbose + Bug: Cannot install when X server isn't running + Updated icon (William Rea) v0.8 - September 4, 2006 + Editing capabilities: resize, crop, save, delete, rename + Pref to preload images for faster navigation (enabled by default) + Implemented 'custom actions' framework, including batch actions + --onload or -o argument for performing actions on image loading + Added File > Properties to display image properties + Show "Scanning..." in statusbar when scanning for images; Escape to abort + Reduce GTK+ requirement to 2.6.0 + Bug: Opening with 'load all images in dir' gives expected result + Bug: Cannot open folder while search process is active + Added French translation (Mike Massonnet) + Added Polish translation (Tomasz Dominikowski) + Added Russian translation (mavka) v0.7.3 - August 2, 2006 + Fix crash when loading images in certain circumstances v0.7.2 - August 1, 2006 + Preference to automatically start the slideshow in fullscreen mode + Background image search process to load image faster + Added cli argument: -s or --slideshow to start in slideshow mode + Added cli argument: -f or --fullscreen to start in fullscreen mode + Additional shortcuts: +/- for zooming in/out + Fixed .desktop mimetypes + Added German translation (Bjoern Martensen) + Added Spanish translation (Isidro Arribas) v0.7.1 - July 9, 2006 + Toolbar style follows gnome preference (optional gnome-python dependency) + Skip hidden files/dirs when loading images + Bug: Caps-lock breaks some shortcuts + Bug fixes v0.7 - June 20, 2006 + Slideshow mode (delay time, randomize order, disable screensaver preferences) + Display animated images + Edit > Open in Editor + Image wrapping options: yes/no/prompt + Cleaned up menubar, preferences + Set go navigation items' sensitivities based on context + Bug: 1:1 images are sometimes incorrectly set to fit + Many bugfixes, interface tweaks v0.6 - May 29, 2006 + In fullscreen mode, hide mouse cursor after 2 seconds of no movement + Option to wrap around imagelist + When in zoom-to-fit mode, fit the image when it's rotated + Show broken icon if image not found (i.e. deleted) + Bug: Ensure that scrollbars don't show up unless needed + Bug: Don't resize an image if it's at 100% zoom + Other small bugfixes v0.5 - May 1, 2006 + Make open image mode configurable: smart, fit, 1:1, last + Option to navigate imagelist via mousewheel (default: on) + Add maximum/minimum zoom levels + Reduce border around image for fit mode + Have Go>Random not show images twice until all images have been shown once + Allow numpad keys as shortcuts + Allow panning image additionally with left-click/drag + Revert retaining state of images in list introduced in v0.4 + Add hourglass feedback for loading images + Bug: Small images don't zoom-to-fit + Bug: Some non-image files are thought to be images + Bug: Files/folders with spaces don't open from file manager + Bug: Some shortcuts don't work with numslock enabled v0.4 - April 25, 2006 + Removed from navigational shortcuts + Default to alphabetically populating the image list + Ability to go to first (Home) and last (End) image in list + Retain zoom/flip/rotate state of images in list + Additional preferences: - Open all images in current directory - Default directory for 'Open' dialog + Fullscreen hides menu/tool/status bars v0.3.1 - April 4, 2006 + Fixed inability to open a file from a file manager. v0.3 - April 4, 2006 + Speed improvements for zooming and rotating images + Allow drag-and-drop of images/folders from file managers + Flip images vertically/horizontally + Go > Random Image + Ability to recursively load images found in all subdirectories (mirage -R or checkbox in Open Folder dialog) + Right-click menu on image + "mirage --help" information. + Fixed .desktop bug that caused multiple images to open in separate windows when launched via a file manager. v0.2 - March 29, 2006 + Allow multiple files/folders to be passed as arguments or opened directly + MiddleMouseButton-Drag to pan the image (like GIMP) + Add Tools > Options for scaling quality, background color + Retain center of user-view when zooming + Display a broken image in the window instead of an error popup message + Improve handling of which images Mirage can successfully display v0.1 - March 22, 2006 (Initial release) + Fast scaling/rotating of images + Displays 'checkerboard' for transparency + Ctrl-MouseScrollDown to zoom out, Ctrl-MouseScrollUp to zoom in (like GIMP)