diff -Nru mcomix-1.2.1mcomix3+git20200206/ChangeLog mcomix-2.1.0/ChangeLog --- mcomix-1.2.1mcomix3+git20200206/ChangeLog 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/ChangeLog 2022-12-17 13:04:54.000000000 +0000 @@ -1,3 +1,104 @@ +MComix 2.1.0 +Release date: 2022-12-17 + + BUG FIXES + + - Fixed byte/unicode error in library search text field. + + - Fixed DPI detection for PDFs which cannot be decoded using UTF-8. + + - Fixed magnifying lens errors when image was rotated. + + - Fixed another byte/unicode error in file chooser dialog. + + - 7z archives with encrypted header could not be extracted on Windows, + as MComix did not properly parse that the archive needed password input. + + FEATURES + + - Added option to customize space between pages in double-page mode. + + - Added options to open first file/archive when going backwards to + previous archive/directory. + + - The "Fit to same size" option now results in more aggressively distorted + images to make them fit, if necessary. The old, more conservative + behaviour is available via the "Prefer same size" option. + +MComix 2.0.2 +Release date: 2022-05-20 + + BUG FIXES + + - Fixed bytes/unicode error in library 'Add collection' dialog. + + - Fixed missing localization and image resources after calling + "setup.py install" + + - Fixed bytes/unicode error in unrar executable extraction handler. + + - Fixed one more instance of incorrect color conversion from preferences. + +MComix 2.0.1 +Release date: 2022-03-09 + + BUG FIXES + + - Fixed conversion of unexpected color values from stored preferences. + + - Fixed error trying to display page file size within archives where + members have not been extracted yet. + + - Fixed bytes/unicode error in the library 'Add Book' dialog. + + - Fixed endless password popup when library fails to genrate thumbnail + for password-protected archive. + + - Handle error when thumbnail metadata Thumb::MTime is a floating point + number. + + - Fixed alphanumeric sort for names with mismatched text/number patterns. + + - Fixed unicode/bytes error in "Save as" dialog, as well as errors + when saving double-page images. + + - Reduced declared minimum PyGObject version to 3.36.0 as well as + PyCairo to 1.16.0. + + - Fixed minimum Pillow requirement in code not matching setup.py. + +MComix 2.0.0 +Release date: 2022-01-29 + + BREAKING CHANGES + + - MComix now requires Python 3.7 or newer, as well as GTK+ 3, PyGObject, and + PyCairo. Minimum Pillow version has been increased to 6.0.0. + + - MComix no longer depends on the setuptools module. Optional dependencies + on czipfile and subprocess32 have been removed, since they are no longer + supported or necessary for Python 3. + + KNOWN ISSUES + + - The MComix window will not remember its last position on Windows. Code + that works on Linux causes the window to fly off the screen for some + reason. + + FEATURES + + - Animated image formats are now supported. Previously, MComix would only + display the first frame. + + - Supported image formats are now a combination of formats supported by + GDK/Pixbuf and Pillow formats. + + TRANSLATION + + - Added Lithuanian translation + + - Updated Swedish and Korean translation + MComix 1.2.1 Release date: 2016-02-12 @@ -343,7 +444,7 @@ comicthumb is unmaintained and not installed by MComix' setup routine by default. - - MComix will no longer complain that the PIL library is missing when + - MComix will no longer complain that the PIL library is missing when a user has Pillow (a PIL fork) installed. - Updated traditional Chinese translation (by Wayne Su). @@ -728,7 +829,7 @@ (suggested by Anonymous on the Comix tracker, adapted by Alan Horkan) -W[all|warn|error] Set log level (default is 'warn') - - The following preference items have been removed: + - The following preference items have been removed: "Automated crash recovery": No longer necessary. "Show page numbers": Enabled by default. "Avoid unintentional page flips": Enabled by default. @@ -751,7 +852,7 @@ - Fixed "Remove from the library" deleting the actual book instead of its library thumbnail. - - The "Go to page" dialog now shows thumbnails when they are available, + - The "Go to page" dialog now shows thumbnails when they are available, not only after all thumbnails have been loaded. Additionally, some usability improvements have been done to the dialog, such as instantly updating the thumbnail when editing the page box, and setting @@ -820,12 +921,12 @@ MComix 0.90.3 Release date: 13.03.2011 - - MComix now uses a slightly different directory structure than before. + - MComix now uses a slightly different directory structure than before. The 'src' folder is now 'mcomix' to provide a correct package name. 'mcomix.py' is now 'mcomixstarter.py' to avoid confusing Python by having a module with the same name as the package around. Translations and images required by the GUI are now sub-packages of - 'mcomix'. + 'mcomix'. A setuptools-based setup.py replaces install.py. This should help for uniform installs across different operating systems. @@ -869,7 +970,7 @@ - When pressing CTRL while being in double page mode, stepping forwards and backwards will now always only advance/go back one image instead of - possibly two. + possibly two. - Graceful shutdown on SIGTERM. (by Marco Nicolini) @@ -912,13 +1013,13 @@ - Added save and quit functionality. - Added crash recovery. - + - Added bookmark sorting. - Added changed focus page protection option. - + - Added refresh button and capability. - + - Added color preference and selection for thumbnail bar background color. - Fixed lens not magnifying the enhanced image. @@ -931,7 +1032,7 @@ - Split each file to only contain one class per file (except labels.py). - Fixed file name ampersand encoding error. - + - Added page selector with page preview. - Added preference regarding the number of keys pressed needed to flip the page. @@ -943,106 +1044,106 @@ - Added thumbnail cacheing and threading. - Added threaded page cacheing and cacheing preferences. - + - Added the preference to turn on/off page number display. - + Comix is forked and becomes MComix Comix 4.0.5 - + - Added a Ukrainian translation by Олександр Заяц. - + - Added a Galician translation by Roxerio Roxo Carrillo. - + - The German translation updated for Comix 4 by Chris Leick. - + - Added support for BMP images in archives. Thanks to Nathaniel Moseley. - + - The status bar now displays the filename of the viewed image files also in archives. - + - Fixed a bug that caused the wrong background colour to be used with the dynamic background colour preference on some systems. Thanks to Nathaniel Moseley. - + - Fixed a bug that could cause the thumbnail maintenance dialog to crash. - + - Fixed a bug that caused the zoom scale in manual zoom mode to be wrong when using double page mode. Comix 4.0.4 - + - Applied a workaround for a bug that caused the "Open" dialog to crash when trying to open a file when the file type filter had been reset to blank. This bug seems to only appear on some systems, probably depending on the installed GTK+ version. - + - Fixed a bug that caused the error message for unfulfilled dependencies to not be printed properly. - + - The rar/unrar program is now invoked in such a way as to keep broken or incomplete files extracted from RAR archives, since Comix might be able to display parts of these files anyway. Comix 4.0.3 - + - Hungarian translation updated by Ernő Drabik. - + - French translation updated by Benoît H. - + - Added a feature to automatically rotate images according to their EXIF tags. - + - Fixed a bug that caused drag-n-drop actions from KDE applications to not work properly. - + - Fixed some bugs that caused problems with non-UTF-8 filename encodings. - + - Fixed a bug that caused the manual zoom mode to not work as expected when set as the default mode. - + - Comix now accepts directories as command-line arguments. - + - Added command-line arguments to start Comix in fullscreen mode and to display the library on startup. - + - Comix preferences and data now reside in the $XDG_CONFIG_HOME and $XDG_DATA_HOME directories instead of in ~/.comix/. - + - Some minor interface enhancements. Comix 4.0.2 - Brazilian Portuguese translation updated by Marcelo Góes. - + - Traditional Chinese translation updated by Wayne Su. - + - Catalan translation updated by Carles Escrig Royo. - + - Internal filenames in archives created by the archive editing dialog no longer contain temporary filename cruft. Comix 4.0.1 - Croatian translation updated by Adrian C. - + - Polish translation updated by Darek Jakoniuk. - + - Russian translation updated by Артем Смирнов. - + - Simplified Chinese translation updated by Xie Yanbo. - + - Re-added the "flip pages when scrolling off the page" preference from previous Comix versions. Thanks to Mamoru Tasaka. - - - Added a portability module for handling home directories in a more - portable way. Thanks to Oddegamra. + + - Added a portability module for handling home directories in a more + portable way. Thanks to Oddegamra. Comix 4.0.0 - + - Comix has been completely rewritten from scratch. On the surface things - look quite a bit like they used to, but the internal workings are + look quite a bit like they used to, but the internal workings are entirely new. There are too many changes for them all to be mentioned here, but a couple of highlights are a much more functional library and a new archive editing dialog. The work on this new version of Comix has @@ -1053,47 +1154,47 @@ have contributed fixes, patches, suggestions or encouraging words. Thanks! Comix 3.6.5 - + - Applied security fix patches to handle unsecure tempfile creation and character escaping in filenames. Thanks to Mamoru Tasaka and others for the patches. - + - Added a Korean translation by 김민기. - + - Added a Persian translation by Maryam Sanaat. - + - Added a Indonesian translation by Andhika Padmawan. - + - Added a Czech translation by Jan Nekvasil. Comix 3.6.4 - + - Added a Russian translation by Artyom Smirnov. - + - Added a Croatian translation by Adrian C. - + - Fixed a bug in the thumbnailer, comicthumb, failing to create thumbnails for Zip and tar archives. - + - Some minor changes. Comix 3.6.3 - + - Added a Hungarian translation by Ernő Drabik. - + - Added a patch by Abdullah Hamed that fixes so that the arrow keys can be used to flip pages also when not in fit-to-screen mode when the corresponding preference is set. Just like was possible only with the scroll wheel before. - + - Fixed a bug with opening certain Zip files. Thanks to Steve Juranich for the fix. - + - Fixed a bug concerning %'s in filenames. Comix 3.6.2 - + - Added Japanese translation by Mamoru Tasaka. Comix 3.6.1 @@ -1104,39 +1205,39 @@ - Added an "Adjust colour" dialog that lets you specify values for brightness, contrast, saturation and sharpness. - + - Improved the behaviour of the "Save window position and size" and "Default fullscreen" preferences. - + - Changed the "Save window position and size" preference to on by default. - + - Changed the menus a bit. - + - Improved autocontrast (slightly heavier contrast change). - + - Changed the UI of the properties dialog a bit to better suit low resolution screens. - - - Improved handling of Zip files containing files with filenames of an + + - Improved handling of Zip files containing files with filenames of an unknown character encoding. - + - Added extra error message to install.py that is displayed when trying to install into a non-existing directory. - - - Added a --no-balloon option to install.py that tells the Nautilus + + - Added a --no-balloon option to install.py that tells the Nautilus thumbnailer to not imprint balloon images on thumbnails by default. - - - Fixed a bug that could cause Comix to scale images to the wrong + + - Fixed a bug that could cause Comix to scale images to the wrong dimensions on a dual-screen setup. Thanks to Vegard Eriksen for this fix. - + - Fixed a bug that caused icons to not be loaded when starting Comix through a symbolic link not located in the same directory as the `comix` executable. - + - Fixed a bug that could cause an error message when going back to a previous archive by flipping backwards in double page mode and directly switching to single page mode afterwards. - + - Fixed a bug that caused Comix to treat empty files as tar archives. Thanks to Christoph Wolk for this fix. @@ -1147,7 +1248,7 @@ - Fixed a bug that caused the mode of all images to be reported as "unknown" instead of RGB/CMYK etc. - + - Fixed a bug that could cause an error when trying to quit Comix under certain circumstances (i.e. when there is no ~/.comix/menu_thumbnails/ directory present). @@ -1155,162 +1256,162 @@ Comix 3.5 - Added a bunch of new icons, including a new "logo". - + - The magnifying lens code has been polished a bit. It is now substantially faster so the lens should appear less choppy. - + - Added horizontal and vertical lossless JPEG flip commands. - + - Added a JPEG desaturation command. - + - Added support for SVG, PCX, PNM, PBM, PGM, PPM, Targa and Sun raster image files. - + - Rearranged the toolbar a bit and added tooltips to it. - + - When a directory is given as a command line parameter, Comix now recursively searches for cbr, cbz and cbt files as well as image files. - + - Changed install.py so that it aborts installation if the required dependencies are not found. - + - Fixed a bug that caused the space key to not scroll down when in double page mode and manga mode and the window is wider than the pages. - + - Applied a workaround for a bug(?) in WindowMaker that caused problems when using the "fullscreen as default" preference. - + - Fixed a memory leak in the magnifying lens code. - + - Some internal and some minor changes. Comix 3.4 - Added more image data to the properties dialog. - + - Added a "delete image" command that can remove single images from Comix. It is currently not possible to remove image files within archives. - + - Added lossless JPEG rotation commands. It is currently not possible to - rotate image files within archives. The `jpegtran` program (part of the + rotate image files within archives. The `jpegtran` program (part of the jpeg library) must be present for this to work. Comix can still run as normal without `jpegtran`, but then without the new JPEG rotation capabilities. - + - Changed the buttons in the toolbar. - + - Improved the space key smart scrolling mode so that it automatically performs all the sideways scrolling as well. - + - Added a preference to set the magnitude of the space key scroll in percentages of either the window size or the page size. - + - Added a Traditional Chinese translation by Hsin-Lin Cheng. - + - Comments are now displayed using a monospaced font. - + - Comments can now be dragged around with the mouse just like an image. - + - Directories can now be given as command line parameters as well as files. If a directory is given it will be recursed into and the first image file found will be loaded. - + - Improved cover guessing of comicthumb and the library a bit. - + - Handling of files that have filenames encoded with the wrong character encoding is now more sturdy. - + - Fixed a bug that could cause outdated thumbnails to be left in the ~/.comix/menu_thumbnails/ directory when running multiple instances of Comix at the same time. - + - Applied a workaround for a bug(?) in WindowMaker that caused the "Open dialog" to be invisible while in fullscreen mode when using WindowMaker. The same problem applies to the library window, but there is no workaround for that in place currently. - + - Fixed a bug that could cause no images to be displayed when turning double page mode off, then on again and flipping to the next couple of pages in that order. - + - Some minor changes. Comix 3.3 - Added a slideshow feature. - + - Added RGB colour histogram to the properties dialog. More data will be added in future versions. - - - Added a Catalan translation by Carles Escrig. - + + - Added a Catalan translation by Carles Escrig. + - Rewrote install.py from scratch. - + - Fixed a bug that caused compressed tar archives to be presented as plain tar archives. - + - Fixed a bug that could cause invalid page numbers in bookmarks when re-adding an already present bookmark. - + - Some minor changes. Comix 3.2.1 - - Added support for the `rar` program in addition to `unrar` to handle + - Added support for the `rar` program in addition to `unrar` to handle RAR (.cbr) files. - + - Updated Polish translation by Kamil Leduchowski. - + - Some minor changes. Comix 3.2 - Changed PyGTK requirement to version 2.8 or higher. - + - Added a "Fit width mode" and a "Fit height mode" that automatically scales images to fit the width or height of the window. - - - Default filenames for extracted images are changed to + + - Default filenames for extracted images are changed to _. from .. - + - Moved the manga mode setting from the preferences dialog to the menus. - + - Redesigned the library interface a bit. The background colour is now fixed and does not change with the background colour of the main window. Default thumbnail size is now 128x128 px, and thumbnails have a border to - make them more clearly separated. - + make them more clearly separated. + - Added Greek translation by Paul Chatzidimitriou. - + - Xie Yanbo updated the Simplified Chinese translation. - - - Changed the menu icons for "Open library..." and "Add to library". The + + - Changed the menu icons for "Open library..." and "Add to library". The icons are taken from the Silk Icons set at www.famfamfam.com. - + - Broken images are now correctly handled by the thumbnail sidebar. - + - The workaround against a problem with unrar applied in version 3.1.3 has been removed again. It created some new problems with archives that have multiple files with the same filename in different subdirectories. - + - Fixed a bug so that translations and extra icons are always available - when running Comix from the source directory, no matter what directory is + when running Comix from the source directory, no matter what directory is the current working directory. - + - Fixed a bug in the "Go to page dialog" that caused the page to not be changed when manually typing in a new page number and pressing Enter. - + - Some minor changes. Comix 3.1.3 - Added Polish translation by Kamil Leduchowski. - + - Updated French translation by Achraf Cherti. Comix 3.1.2 - - Fixed a bug which caused ALL files to be added to the library when + - Fixed a bug which caused ALL files to be added to the library when adding in recursive mode instead of just archives. Also, only files with cbz, cbr or cbt as filename extension will now be added in recursive mode to avoid adding cruft files with the same magic numbers as the archives. @@ -1318,19 +1419,19 @@ Comix 3.1.1 - Added automatic dependency checking to install.py. - + - Added error messages and graceful exit from Comix in the case of missing dependencies. - + - Applied a workaround for a bug(?) in unrar that caused problems with some RAR archives containing directories with invalid filename encodings. Thanks to François Ingelrest. - + - Updated French translation by Achraf Cherti. - + - Changed the "Use stored thumbnails for images in archives" preference to off by default. - + - Changed the "Go to the next archive in directory after last page" preference to on by default. @@ -1338,21 +1439,21 @@ - Created a new convert dialog that is built from the standard GTK+ save dialog. It now supports saving in different directories etc. - + - Added an "Extract image" menu item that lets you extract individual images from the archive. - + - Added support for recursive adding of archives to the library. - + - Added a Frech translation by Achraf Cherti. - + - Fixed a bug which rendered the magnifying lens and the ability to drag images around with the mouse useless in some situations, and with some certain versions (7.0?) of X.org. - + - Pressing enter in the "Go to page" dialog entry now has the same effect as pressing OK. - + - Applied a workaround for a bug(?) in certain builds of PIL that made Comix crash when it tried to draw page numbers on thumbnails. Now Comix simply ignores the page numbers if this problem occurs and imforms the @@ -1365,44 +1466,44 @@ Comix 3.0 - Major cleanup of the entire code base. - + - Completely redesigned the properties dialog. - + - Comix now stores a list of the 10 last viewed files. It also updates the ~/.recently-used file as is proposed by the freedesktop.org standard. Thanks to Jose M. daLuz. - + - Added an "Add to library" menu item. - + - Redesigned the library window slightly. - + - Added an Italian translation by Raimondo Giammanco. - + - The Nautilus thumbnailer, comicthumb, has been updated by Christoph Wolk to support subarchives among other things. - - - Added a preference to set the size of the magnifying lens. Thanks to + + - Added a preference to set the size of the magnifying lens. Thanks to Jose M. daLuz. - + - Added a scalable svg icon. - - - Improved handling of files without read permission. - + + - Improved handling of files without read permission. + - Fixed a bug which caused the recommended name for a converted directory of images to be the same as one of the image files plus filename extension - instead of the name of the directory plus filename extension. Thanks to + instead of the name of the directory plus filename extension. Thanks to Manuel Quiñones. - + - Fixed a bug with the magnifying lens which could appear when using it in double page mode and manga mode, possibly showing the images as if not in manga mode. - + - Fixed a bug which caused unnecessary reloading of files from disk when resizing images that is already in memory in double page mode. - - - Fixed a bug which could cause the wrong image to be displayed when + + - Fixed a bug which could cause the wrong image to be displayed when continuously flipping forward really fast in cache mode. - + - Some minor fixes. Comix 2.9 @@ -1411,113 +1512,113 @@ added to the library through a dialog or by drag and drop. The comic books appear as covers in the library window where they can be browsed or opened. They can be easily filtered by typing in regular expressions. - + - When dropping multiple files on the Comix main window, the first file gets opened now instead of none. - - - The convert dialog now saves the last used archive type. - + + - The convert dialog now saves the last used archive type. + - Fixed a memory leak when creating new thumbnails from files. - + - Some minor fixes. Comix 2.8 - MIME types for cbz, cbr and cbt archives are now registered by default. Use the --no-mime flag for install.py to skip it. - + - Added a thumbnailer (by Christoph Wolk) that lets file managers create thumbnails for cbz, cbr and cbt archives. Currently it is only supported by Nautilus and does not affect other file managers. It is installed if the --no-mime flag is not given to install.py. Nautilus has to be restarted before the thumbnailer is activated. - - - Added a "Hide all" menu item which hides menubar, toolbar, statusbar, + + - Added a "Hide all" menu item which hides menubar, toolbar, statusbar, scrollbars and thumbnails at once. - + - Added an option to only display a single image in double page mode if that image consists of two pages. An image is assumed to consist of two pages if it's width is greater than it's height. - + - Filename is now displayed as well as directory name when viewing images in a directory in single page mode. - + - Changed max zoom to 1000% to prevent X server resource drains. - + - F11 can now be used to toggle fullscreen mode. - + - Fixed a bug which caused the cursor to be invisible when dragging around an image in fullscreen mode. - + - Fixed a bug which removed the drag and drop functionality. - + - Fixed a bug which could cause the scroll wheel to stop working when displaying the magnifying lens by pressing the middle mouse button, holding down the right mouse button and letting go the middle mouse button again. - + - Fixed a bug which could cause the chess board pattern background for small transparent images to be zoomed in or out when changing size. - + - Fixed a bug which could cause changes of saturation in small images to not be updated when changing it and changing it back again. - + - Fixed a bug which could cause the images to be scaled incorrectly when the "Use smart scaling in double page mode" preference was set. - + - Fixed a bug which caused the thumb selection not to be updated when moving from page two to page one in double page mode. - + - Some minor fixes. Comix 2.7 - Improved image quality through dithering in 16 bits per pixel. Thanks to John Ellis, the author of GQview, for helping me with this. - + - Added previews of files in the "Open" dialog. Stored thumbnails are used when they exist, otherwise previews are created directly from the files. Previews of archives are also available, but only when thumbnails have already been stored for that archive. - + - The cursor is now only being hidden when it has been idle for two seconds instead of always. - + - Changed "Hide cursor in fullscreen mode" to on by default. - + - Added chess board pattern as background for transparent images. - + - Added file filters to the "Open" dialog. - + - Saturation adjustment now affects the magnifying lens also. - + - Added Brazilian Portuguese translation by Marcelo Góes. - + - Added German translation by Christoph Wolk. - + - Added a "comix.xml" file which can be installed to register cbz, cbr and cbt mime types. Because of inconsistency on some systems, mime types are not registered by default. Follow the instructions in the mime README file to install. Thanks to Cristoph Wolk for this contribution. - + - Changed permissions of temporary folders to octal 700 to preserve the users privacy. - + - Added page number information to thumbnails generated for archives. This information will displayed for previews of archives if available. - + - Fixed a bug which caused the image width and height information embedded in thumbnails to be put in the wrong namespace of the PNG tEXt chunks. - + - Fixed possible wrong permissions of thumbnail folders on some systems. Permissions should now always be 700. - + - Fixed a bug which caused the magnifying lens to display the wrong page in manga mode (thanks Christoph Wolk). - + - Fixed a bug which could cause Comix to crash when trying to view a very small image scaled down so that it contained no pixels at all. - + - Some minor fixes. Comix 2.6 @@ -1528,12 +1629,12 @@ to the same standard. Thumbnails for images in archives can also be stored, but due to limitations in the standard they are stored in ~/.comix for private use by Comix only. - + - Improved handling of corrupt and missing files. Comix now simply displays a "file missing" image instead of terminating. - + - Added a menu entry for the lens toggle action. - + - Some minor fixes. Comix 2.5 @@ -1541,33 +1642,33 @@ - Added a mouse controlled "magnification lens" that can be used to zoom in on parts of the images. It will appear while holding the middle mouse button. Pressing 'z' can also toggle it on or off. - + - Added the ability to set the size of the thumbnails. - + - Improved the look of the bookmark handling features. Small thumbnails will now be displayed for the bookmarks. - + - Fixed a bug which caused one of the two images in double page mode to remain displayed even after using the "Close" command. - + - Fixed a bug which caused the "Use smart scaling in double page mode" preference to misbehave with rotated images. - + - Fixed a bug which caused the convert dialog to not automatically fill in a new filename for files with non-UTF8 filenames. - + - Some minor fixes. Comix 2.4.1 - Improved cache handling slightly. - + - FIxed a bug which could cause Comix to crash when starting with the "Save window position and size for future sessions" option turned on. - - - Fixed a bug which caused only one thumbnail to remain selected when + + - Fixed a bug which caused only one thumbnail to remain selected when clicking on the first of the two selected thumbnails in double page mode. - + - Fixed a bug which caused Comix to always go to the first page when reloading thumbnails in double page mode due to switching the "Show page numbers on thumbnails" on or off. @@ -1576,75 +1677,75 @@ - Added full support for internationalization (i18n). Apart from English, Comix is now translated to Swedish, Simplified Chinese and Spanish. - + - Added an option to let Comix automatically adjust the contrast of the images so that the darkest pixel is completely black and the lightest pixel is completely white. - + - Added an option to space key "smart scrolling" feature as if in double page mode even when in single page mode. - - - Added thin borders around the thumbnails so that they should be more + + - Added thin borders around the thumbnails so that they should be more easily distinguished. - + - Added accelerators for more menu items. - + - Fixed a bug which caused the wrong image to be displayed when viewing the third last and the second last pages in double page mode, exiting double page mode and flipping forward one page. - + - Fixed a bug which caused Comix to display no warning when trying to create a file in a directory where it does not have permission to do so. Comix 2.3 - - Comix now depends on the Python Imaging Library - (http://www.pythonware.com/products/pil/) to handle some image + - Comix now depends on the Python Imaging Library + (http://www.pythonware.com/products/pil/) to handle some image manipulations. - + - Added the ability to rotate and mirror images. - + - Added an option to set the contrast of the images. - + - Added an option to show the page numbers in the upper left corner of each thumbnail. - + - Cleaned up the preferences dialog a bit. - + - The arrow keys now flips pages in fit-to-screen mode. - + - Added an option to go to the same directory as last time when opening the "Open" dialog, instead of always going to a preset directory. - + - Fixed a bug which caused comments to not be displayed until after all thumbnails had been loaded when using the "Always view comments when opening a new file" option. - - - Fixed a bug which caused comment files in a directory, had their + + - Fixed a bug which caused comment files in a directory, had their extensions been added to the comment extensions list while the directory was loaded, to not be opened correctly until the directory had been reloaded. - - - Fixed a bug which caused the scrollbars to not align themselves + + - Fixed a bug which caused the scrollbars to not align themselves automatically when switching between viewing comments and viewing images. - + - Fixed a bug which caused the "Fit width", "Fit height" and "Best fit" commands to scale incorrectly when viewing thumbnails. - + - Fixed a bug which could cause the wrong image to be displayed if switching from one page to another and back again really quickly. - + - Some minor fixes. Comix 2.2.1 - - Fixed a bug which caused underscores in bookmark names to be shown + - Fixed a bug which caused underscores in bookmark names to be shown as underlines for the next character. - - - Fixed a bug which caused Comix to crash when trying to close the - program while loading thumbnails for an archive/directory that was + + - Fixed a bug which caused Comix to crash when trying to close the + program while loading thumbnails for an archive/directory that was opened while loading thumbnails for the same archive/directory. - + - Fixed a bug which caused some events (e.g. switching fullscreen on/off), invoked while loading thumbnails, to be delayed until all the thumbnails had been loaded if they were invoked more than once during this loading. @@ -1652,196 +1753,196 @@ loading of thumbnails (e.g. open new file) being delayed if invoked multiple times during the loading. This should, however, not be a problem in most cases. - + - Fixed a bug which caused some thumbnails to not be displayed in whole when using certain GTK themes. - + - Fixed a bug which caused the selected thumbnails to not be updated properly when switching between single page and double page mode. - + - Fixed a bug which caused the thumbnail scrollbar to not update it's length when resizing the main window. - + - Made the automatic scrolling of the thumbnail pane more consequent in double page mode. Comix 2.2 - Added a thumbnail browser. - - - Added a "smart scrolling" option for the space key. - - - The number pad on the keyboard can now be used to align the image(s). + + - Added a "smart scrolling" option for the space key. + + - The number pad on the keyboard can now be used to align the image(s). '1' takes you to the lower left corner, '2' takes you to the middle of the bottom, '3' takes you to the lower right corner and so on for all nine digits. - + - Added an option to automatically open the last viewed page when Comix is started. - + - The zoom in and zoom out commands now zoom straight on, preserving the alignment of the viewed image(s). - + - Fixed a bug which caused images to be scaled slighty wrong during specific window size/image size combinations. - + - Fixed a bug which caused the wrong image to be displayed when jumping two pages forward with the cache option turned on in single page mode. Comix 2.1 - Made the dialogs more GNOME HIG compliant. - - - Added an option to let the scroll wheel scroll horizontally when at the + + - Added an option to let the scroll wheel scroll horizontally when at the top or bottom of the page. - - - Added an option to let the scroll wheel flip pages when scrolling "off + + - Added an option to let the scroll wheel flip pages when scrolling "off the page". - + - Added an option to use smart scaling when in double page mode and fit-to-screen mode. The smart scaling feature makes the images scale - independently so that no space is wasted. The largest of the images is + independently so that no space is wasted. The largest of the images is scaled as before, but the smallest in now scaled up to fill any extra space. - + - Added an option to set the toolbar to show either icons, text or both. - + - The image can now be dragged around with the middle mouse button as well. - - - If adding a bookmark for an archive/directory that is already + + - If adding a bookmark for an archive/directory that is already bookmarked, Comix now updates the page number of that bookmark instead of adding a new one. - + - Added tooltips for the preferences dialog. - + - Removed the zoom entry in the preferences dialog. - + - Made the cleanup of files in /tmp a bit more sturdy. - - - Fixed a bug which caused the scrollbars to not align themselves + + - Fixed a bug which caused the scrollbars to not align themselves automatically when opening a new archive/folder. - - - Fixed a bug which caused changes to fullscreen, fit-to-screen mode etc. - that were made while the preferences dialog was open to be reverted when + + - Fixed a bug which caused changes to fullscreen, fit-to-screen mode etc. + that were made while the preferences dialog was open to be reverted when the dialog was closed. - - - Fixed a bug which caused some images to appear twice if they were + + - Fixed a bug which caused some images to appear twice if they were packed in an archive containing multiple subfolders. - + - Fixed a bug which caused some strange behaviour when (un)hiding the menubar after a bookmark had been added/removed. - + - Some minor fixes. Comix 2.0 - The text in the comments is now selectable. - + - Some minor (mainly cosmetic) changes. Comix 2.0b - Comix 2.0b has a major speed advantage over previous versions. - I rewrote some of the code, mainly the parts concerning the caching of - images. Page flipping with the cache option turned off is now about - twice as fast as before (not counting the time it takes to scale the - image(s) since this is highly dependant on the image scaling quality being + I rewrote some of the code, mainly the parts concerning the caching of + images. Page flipping with the cache option turned off is now about + twice as fast as before (not counting the time it takes to scale the + image(s) since this is highly dependant on the image scaling quality being used). Forward page flipping with the cache option turned on now seems - almost instantaneous (again not counting the possible delay to scale - the image(s)). Backwards flipping with the cache option turned on is no + almost instantaneous (again not counting the possible delay to scale + the image(s)). Backwards flipping with the cache option turned on is no longer suffering any speed penalty, it is just as fast as normal flipping without any cache would be. The only occasion when things will be slower - with the cache option turned on is when doing irregular flipping, as from - page 1 to page 7 to page 3 etc., and even then things will seem to be - as fast as normal though some extra work is done "under the hood". + with the cache option turned on is when doing irregular flipping, as from + page 1 to page 7 to page 3 etc., and even then things will seem to be + as fast as normal though some extra work is done "under the hood". Using cache is strongly recommended from now on. - - - Added a bookmarks manager that lets you add or remove single bookmarks. - - - Added support for image/x-icon, image/x-xpixmap and image/x-xbitmap + + - Added a bookmarks manager that lets you add or remove single bookmarks. + + - Added support for image/x-icon, image/x-xpixmap and image/x-xbitmap image formats. - + - Changed the text entry field for the default path to a button which brings up a nice standard folder selection dialog. - - - The "Flip position of pages in double page mode" option, now called + + - The "Flip position of pages in double page mode" option, now called "Manga mode", automatically aligns the scrollbars to the upper-right corner of the window when flipping to a new page. - - - The "Hide menubar etc. in fullscreen" option now also affects the + + - The "Hide menubar etc. in fullscreen" option now also affects the scrollbars. - + - Fixed a bug which caused temporary files to be overwritten when viewing two archives in two different Comix sessions at the same time. - - - Fixed a bug which caused the separators in the menus to disappear after + + - Fixed a bug which caused the separators in the menus to disappear after a while. - - - Fixed a bug that caused the wrong page to be displayed when flipping - backwards one step in double page mode, switching to one page mode, - switching back to double page mode again and then flipping forward one + + - Fixed a bug that caused the wrong page to be displayed when flipping + backwards one step in double page mode, switching to one page mode, + switching back to double page mode again and then flipping forward one step, all with the cache option set. - + - Lots of minor fixes. Comix 1.6 - The next page can now be flipped to by pressing the left mouse button - on the main window. Images can still be moved around by clicking and + on the main window. Images can still be moved around by clicking and dragging before you release the button again. - + - The "Hide cursor" option now only affect fullscreen. - + - Comix now sorts files by the standard set up by the LC_COLLATE environmental variable. - + - Added a new dialog to display an error message if the convert utility - is used in some way to alter a file which the user does not have + is used in some way to alter a file which the user does not have appropriate permissions to. - - - Fixed a bug with the wrong filename sometimes being shown in the + + - Fixed a bug with the wrong filename sometimes being shown in the properties dialog when viewing plain image files. - + - Fixed a bug with strange things happening when opening the preferences window in windowed mode and closing it in fullscreen mode and vice versa. - + - Fixed a bug with the "Hide menubar etc. in fullscreen" option not always working as expected. - + - Some minor fixes. Comix 1.5 - Added support for forward/back buttons on mice that have them. Thanks to Stephen Jones for this feature. - - - New option to set which filename extensions should be treated as + + - New option to set which filename extensions should be treated as comment files. - - - New option to automatically hide menubar etc. when entering + + - New option to automatically hide menubar etc. when entering fullscreen mode. - + - Improved the look of the properties dialog. - + - Fixed problems with parsing certain comment files. - + - Some minor fixes. Comix 1.4 - - Added support for embedded archive comments in the form of .txt or + - Added support for embedded archive comments in the form of .txt or .nfo files. - + - The convert utility now creates exact copies of the directory structure in the source archive/directory, including correct filenames. - + - The zoom in and zoom out commands now zoom 15% relative to the current size instead of 20% relative to the original size. - + - Changed default image scaling quality to "Tiles" from "Hyper". - + - Some minor fixes. Comix 1.3.1 @@ -1853,24 +1954,24 @@ - The viewed page(s) can now be dragged around by pressing the mouse button and moving the cursor. - + - New option to cache the next page for faster forward page flipping. Continuous backwards flipping will be slower with this option. Slightly more RAM will be used as well. - - - Comix now handles manipulation of already loaded images (resizing, + + - Comix now handles manipulation of already loaded images (resizing, changing scaling technique, etc.) more efficiently due to less disk IO. - - - Fixed a bug that caused saved options to not be loaded when the + + - Fixed a bug that caused saved options to not be loaded when the program is restarted. Comix 1.2 - + - Drag and drop support. - + - Changed the install.py script slightly. - - - Added new error messages for the statusbar when trying to open + + - Added new error messages for the statusbar when trying to open non-valid files etc. Comix 1.1.2 @@ -1883,30 +1984,30 @@ - The "file" dependancy is no longer needed. All mime type checks are now done internally. - - - Fixed an error in the .desktop file. - - - The install.py script now uses "update-desktop-database" to update the + + - Fixed an error in the .desktop file. + + - The install.py script now uses "update-desktop-database" to update the menus properly. - + - Some minor fixes. Comix 1.1 - Support for nestled archives, i.e. archives in archives. - + - The install.py script now includes a "--installdir" option to let the user choose the install directory, e.g. /usr instead of /usr/local. - + - Comix now includes a manpage. - + - Some minor fixes. Comix 1.0.2 - - Added support for filenames encoded with various international + - Added support for filenames encoded with various international character encodings. - + - Some minor fixes. Comix 1.0.1 @@ -1918,81 +2019,81 @@ - Added an archive convert feature. Archives and directories can be converted to Zip, tar, tar.gz or tar.bz2. - + - More changes toward a hopefully more user-friendly GUI. Comix 0.9 - - A number of efforts has been made to make Comix more GNOME HIG + - A number of efforts has been made to make Comix more GNOME HIG compliant. - + - Added optional menubar, toolbar and statusbar. - + - Added an option to hide the mouse cursor. - + - The space key now works in fit to screen mode as well. - + - Fixed a bug with certain hotkeys not working before the right-click menu had been shown the first time. - + - Fixed a bug with archive names sometimes being displayed incorrectly in the bookmarks menu. - + - Some minor fixes. Comix 0.8 - - Comix now handles zip, tar, tar.gz and tar.bz2 archives + - Comix now handles zip, tar, tar.gz and tar.bz2 archives internally. The unzip and tar programs are no longer needed. - - - New option to let you go to the next archive when flipping past the + + - New option to let you go to the next archive when flipping past the last page in the current archive, and vice versa for the first page. - + - Fixed a bug with small images sometimes being stretched to fit the screen although the corresponding option was not set. - + - Fixed a bug with exiting fullscreen mode with the escape key. - + - Supported image formats are now "only" JPEG, PNG, TIFF, GIF and BMP. There were problems with other files being reported as image files though they were not. - + - Some minor fixes. Comix 0.7 - Added a new "bookmark" feature. - + - Now reads any image format supported by gtk.gdk.Pixbuf (that means most formats). - + - Fixed a bug with capital letters not working as hotkeys. - + - Some minor fixes. Comix 0.6 - Added a new option to hide the scrollbars even when not in fit to screen mode. - - - Pressing space now scrolls the page to show the next part of it, if + + - Pressing space now scrolls the page to show the next part of it, if pressed at the bottom of the page it flips to the next page. - + - Dialogs should now look better and use buttons with stock icons. - + - Scrolling could be a bit faulty due to different dimensions of the scrollbars in different themes. That problem is now fixed. - - - `Fit width', `Fit height' and `Fit to screen' commands should now be + + - `Fit width', `Fit height' and `Fit to screen' commands should now be exact. Comix 0.5.2 - The makefile in 0.5.1 could in some cases change the permissions - of the folders Comix were installed in to 0755. To solve this - vulnerability Comix 0.5.2 uses a python script `install.py' to install + of the folders Comix were installed in to 0755. To solve this + vulnerability Comix 0.5.2 uses a python script `install.py' to install the program instead. - + Usage of the 0.5.1 makefile is not recommended! Comix 0.5.1 @@ -2003,47 +2104,47 @@ Comix 0.5 - Fixed a bug with the background colour option not working. - + - Added a colour picking dialog instead of the old entry box for the background colour. - + - Added a new more user-friendly file chooser dialog. - + - Added `Fit width', `Fit height' and `Fit to screen' commands to the right-click menu. - + - Added new option to save zooming values to future sessions. - + - The right-click menu and the preferences window now looks better and should hopefully be more user friendly. - + - Changed some hotkeys and their effect. - + - PyGTK requirement is now 2.6+. Comix 0.4 - Comix now supports image zooming and window scrolling as well as the old fit-to-screen-mode. - - - Comix now includes a makefile, a .desktop file and an icon for an + + - Comix now includes a makefile, a .desktop file and an icon for an easy installation and desktop integration. Comix 0.3 - New option to save window position and size to future sessions. - + - New option to set a default path to open when selecting a new file with the `Open file' command. - + - Comix now supports page scrolling with the mouse wheel. - + - Fixed a bug with trying to view `File info' when viewing the last page in double page mode. - + - Fixed a bug with the number of pages always reported as zero in the go-to-page-window. - + - Some minor fixes. Comix 0.2.1 @@ -2054,24 +2155,24 @@ - Now uses the shutil module to move and delete files instead of calling the `rm' and `mv' programs. - + - Now uses gtk.gdk.pixbuf_get_file_info() to check image file types and the `file' program to check filetypes for ZIP/RAR archives. Filename extensions should no longer matter for Comix. - + - Now supports tar, tar.gz and tar.bz2 archives. - + - New menu option `File info' brings up a window and displays various information about the file being viewed. - + - New option to flip the pages viewed in double page mode. - + - New option to reverse the reading order (start with the last page). - + - New option to set the saturation of the images displayed. - + - Some minor fixes. - - - New dependencies are `file' and `tar' (should be installed on most + + - New dependencies are `file' and `tar' (should be installed on most systems as default). diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/changelog mcomix-2.1.0/debian/changelog --- mcomix-1.2.1mcomix3+git20200206/debian/changelog 2020-02-08 07:00:41.000000000 +0000 +++ mcomix-2.1.0/debian/changelog 2023-01-29 09:19:06.000000000 +0000 @@ -1,3 +1,18 @@ +mcomix (2.1.0-2) unstable; urgency=medium + + * Add missing build dependency: python3-setuptools. + + -- Emfox Zhou Sun, 29 Jan 2023 17:19:06 +0800 + +mcomix (2.1.0-1) unstable; urgency=medium + + * New upstream release, switch to official release. (Closes: #1006794) + - comicthumb obsolete and no longer provided. (Closes: #982150) + * Add Suggest for unzip and lhasa, remove comix related things, + remove MComix3 descriptions. (Closes: #1016794) + + -- Emfox Zhou Sun, 29 Jan 2023 16:14:54 +0800 + mcomix (1.2.1mcomix3+git20200206-1) unstable; urgency=medium * New upstream release diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/control mcomix-2.1.0/debian/control --- mcomix-1.2.1mcomix3+git20200206/debian/control 2020-01-22 05:02:54.000000000 +0000 +++ mcomix-2.1.0/debian/control 2023-01-29 09:18:55.000000000 +0000 @@ -4,7 +4,7 @@ Maintainer: Krzysztof Klimonda Uploaders: Emfox Zhou Build-Depends: debhelper (>= 12.0.0~) -Build-Depends-Indep: python3, dh-python +Build-Depends-Indep: python3, python3-setuptools, dh-python Standards-Version: 4.5.0 Homepage: http://mcomix.sourceforge.net/ @@ -13,9 +13,7 @@ Depends: ${misc:Depends}, ${python3:Depends}, gir1.2-gtk-3.0, python3-pil, python3-gi, python3-cairo, python3-gi-cairo Recommends: python3-chardet -Suggests: unrar | libunrar5, p7zip, mupdf-tools -Conflicts: comix -Provides: comix +Suggests: unrar | libunrar5, p7zip, mupdf-tools, unzip, lhasa Description: GTK+ image viewer for comic books MComix is an user-friendly, customizable image viewer. It is specifically designed to handle comic books, but also serves as a generic viewer. @@ -26,6 +24,3 @@ MComix is a fork of the Comix project, and aims to add bug fixes and stability improvements after Comix development came to a halt in late 2009. - . - MComix3 is a fork of the MComix project (of gtk3 branch), which port MComix - to python3. diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/mcomix.docs mcomix-2.1.0/debian/mcomix.docs --- mcomix-1.2.1mcomix3+git20200206/debian/mcomix.docs 2019-11-12 07:30:21.000000000 +0000 +++ mcomix-2.1.0/debian/mcomix.docs 2023-01-29 06:45:23.000000000 +0000 @@ -1,2 +1 @@ README -README.rst diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/mcomix.install mcomix-2.1.0/debian/mcomix.install --- mcomix-1.2.1mcomix3+git20200206/debian/mcomix.install 2019-11-13 14:09:47.000000000 +0000 +++ mcomix-2.1.0/debian/mcomix.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -/usr/share/mcomix -mime/mcomix.desktop usr/share/applications -mime/mcomix.appdata.xml usr/share/metainfo -mime/icons/16x16/* /usr/share/icons/hicolor/16x16/mimetypes -mime/icons/22x22/* /usr/share/icons/hicolor/22x22/mimetypes -mime/icons/24x24/* /usr/share/icons/hicolor/24x24/mimetypes -mime/icons/32x32/* /usr/share/icons/hicolor/32x32/mimetypes -mime/icons/48x48/* /usr/share/icons/hicolor/48x48/mimetypes -mime/comicthumb.thumbnailer /usr/share/thumbnailers diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/mcomix.links mcomix-2.1.0/debian/mcomix.links --- mcomix-1.2.1mcomix3+git20200206/debian/mcomix.links 2019-11-13 07:07:25.000000000 +0000 +++ mcomix-2.1.0/debian/mcomix.links 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -usr/share/mcomix/mcomixstarter.py usr/bin/mcomix -usr/share/mcomix/comicthumb.py usr/bin/comicthumb -usr/share/mcomix/mcomix/images/16x16/mcomix.png usr/share/icons/hicolor/16x16/apps/mcomix.png -usr/share/mcomix/mcomix/images/22x22/mcomix.png usr/share/icons/hicolor/22x22/apps/mcomix.png -usr/share/mcomix/mcomix/images/24x24/mcomix.png usr/share/icons/hicolor/24x24/apps/mcomix.png -usr/share/mcomix/mcomix/images/32x32/mcomix.png usr/share/icons/hicolor/32x32/apps/mcomix.png -usr/share/mcomix/mcomix/images/48x48/mcomix.png usr/share/icons/hicolor/48x48/apps/mcomix.png diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/mcomix.manpages mcomix-2.1.0/debian/mcomix.manpages --- mcomix-1.2.1mcomix3+git20200206/debian/mcomix.manpages 2019-11-13 05:38:54.000000000 +0000 +++ mcomix-2.1.0/debian/mcomix.manpages 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -man/mcomix.1 -man/comicthumb.1 diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/patches/01_temp_fix_for_pybuild.patch mcomix-2.1.0/debian/patches/01_temp_fix_for_pybuild.patch --- mcomix-1.2.1mcomix3+git20200206/debian/patches/01_temp_fix_for_pybuild.patch 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/debian/patches/01_temp_fix_for_pybuild.patch 2023-01-29 07:32:06.000000000 +0000 @@ -0,0 +1,26 @@ +Description: temp fix for pybuild +--- mcomix-2.1.0.orig/mcomix.egg-info/PKG-INFO ++++ mcomix-2.1.0/mcomix.egg-info/PKG-INFO +@@ -3,14 +3,13 @@ Name: mcomix + Version: 2.1.0 + Summary: GTK comic book viewer + Home-page: http://mcomix.sourceforge.net ++Download-URL: http://sourceforge.net/projects/mcomix/files + Maintainer: The MComix Team + Maintainer-email: https://sourceforge.net/projects/mcomix/ + License: License :: OSI Approved :: GNU General Public License (GPL) +-Download-URL: http://sourceforge.net/projects/mcomix/files + Platform: Operating System :: POSIX :: Linux + Platform: Operating System :: Microsoft :: Windows + Platform: Operating System :: POSIX :: BSD + License-File: COPYING + + MComix is a user-friendly, customizable image viewer. It is specifically designed to handle comic books (both Western comics and manga) and supports a variety of container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). MComix is a fork of Comix. +- +--- mcomix-2.1.0.orig/mcomix.egg-info/entry_points.txt ++++ mcomix-2.1.0/mcomix.egg-info/entry_points.txt +@@ -3,4 +3,3 @@ mcomix = mcomix.run:run + + [setuptools.installation] + eggsecutable = mcomix.run:run +- diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/patches/02_fix_legacy_appstream.patch mcomix-2.1.0/debian/patches/02_fix_legacy_appstream.patch --- mcomix-1.2.1mcomix3+git20200206/debian/patches/02_fix_legacy_appstream.patch 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/debian/patches/02_fix_legacy_appstream.patch 2023-01-29 08:10:13.000000000 +0000 @@ -0,0 +1,27 @@ +--- a/setup.py ++++ b/setup.py +@@ -37,7 +37,7 @@ + data_files = [ + ('share/man/man1', ['mcomix.1.gz']), + ('share/applications', ['mime/mcomix.desktop']), +- ('share/appdata', ['mime/mcomix.appdata.xml']), ++ ('share/metainfo', ['mime/mcomix.appdata.xml']), + ('share/mime/packages', ['mime/mcomix.xml']), + ('share/icons/hicolor/16x16/apps', ['mcomix/images/16x16/mcomix.png']), + ('share/icons/hicolor/22x22/apps', ['mcomix/images/22x22/mcomix.png']), +--- a/mime/mcomix.appdata.xml ++++ b/mime/mcomix.appdata.xml +@@ -1,6 +1,6 @@ + + +- ++ + mcomix.desktop + CC0-1.0 + GPL-2.0+ +@@ -23,4 +23,4 @@ + + http://mcomix.sourceforge.net/ + +- ++ diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/patches/series mcomix-2.1.0/debian/patches/series --- mcomix-1.2.1mcomix3+git20200206/debian/patches/series 2019-12-03 04:47:53.000000000 +0000 +++ mcomix-2.1.0/debian/patches/series 2023-01-29 07:56:33.000000000 +0000 @@ -0,0 +1,2 @@ +02_fix_legacy_appstream.patch +01_temp_fix_for_pybuild.patch diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/rules mcomix-2.1.0/debian/rules --- mcomix-1.2.1mcomix3+git20200206/debian/rules 2019-11-13 05:18:07.000000000 +0000 +++ mcomix-2.1.0/debian/rules 2023-01-29 08:04:14.000000000 +0000 @@ -1,10 +1,40 @@ #!/usr/bin/make -f export PYBUILD_NAME=mcomix -export PYBUILD_SYSTEM=custom +#export PYBUILD_SYSTEM=custom export PYBUILD_DISABLE=test %: dh $@ --with python3 --buildsystem=pybuild -override_dh_auto_install: - python3 installer.py --srcdir=mcomix --target=debian/tmp/usr/share +#override_dh_auto_install: +# python3 setup.py install --single-version-externally-managed --root debian/tmp --prefix /usr/ + +override_dh_fixperms: + dh_fixperms + chmod -x debian/mcomix/usr/share/metainfo/mcomix.appdata.xml + chmod -x debian/mcomix/usr/share/mime/packages/mcomix.xml + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix-2.1.0.egg-info/* + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/ca/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/cs/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/de/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/el/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/es/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/fa/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/fr/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/gl/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/he/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/hr/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/hu/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/id/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/it/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/ja/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/ko/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/lt/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/nl/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/pl/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/ru/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/sv/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/uk/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.mo + chmod -x debian/mcomix/usr/lib/python3/dist-packages/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.mo diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/source/include-binaries mcomix-2.1.0/debian/source/include-binaries --- mcomix-1.2.1mcomix3+git20200206/debian/source/include-binaries 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/debian/source/include-binaries 2023-01-29 07:11:45.000000000 +0000 @@ -0,0 +1,55 @@ +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/16x16/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/22x22/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/24x24/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/32x32/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/48x48/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/comments.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/double-page.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/fitbest.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/fitheight.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/fitmanual.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/fitsize.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/fitwidth.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-flip-horizontal.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-flip-vertical.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-rotate-180.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-rotate-270.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-rotate-90.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-thumbnails.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/gimp-transform.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/lens.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/library.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/manga.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/mcomix.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/tango-add-bookmark.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/tango-archive.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/tango-enhance-image.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/tango-image.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/images/zoom.png +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/ca/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/cs/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/de/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/el/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/es/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/fa/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/fr/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/gl/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/he/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/hr/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/hu/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/id/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/it/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/ja/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/ko/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/lt/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/nl/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/pl/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/ru/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/sv/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/uk/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.mo +.pybuild/cpython3_3.11_mcomix/build/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.mo +mcomix/__pycache__/__init__.cpython-311.pyc +mcomix/__pycache__/constants.cpython-311.pyc +mcomix/__pycache__/tools.cpython-311.pyc diff -Nru mcomix-1.2.1mcomix3+git20200206/debian/watch mcomix-2.1.0/debian/watch --- mcomix-1.2.1mcomix3+git20200206/debian/watch 2012-09-06 02:30:39.000000000 +0000 +++ mcomix-2.1.0/debian/watch 2023-01-29 07:41:59.000000000 +0000 @@ -1,2 +1,2 @@ version=3 -http://sf.net/mcomix/mcomix-(.*)\.tar\.bz2 debian uupdate +http://sf.net/mcomix/mcomix-(.*)\.tar\.gz debian uupdate diff -Nru mcomix-1.2.1mcomix3+git20200206/.gitignore mcomix-2.1.0/.gitignore --- mcomix-1.2.1mcomix3+git20200206/.gitignore 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -__pycache__/ -*.mo -mcomix/portable.txt -mcomix/profile/ diff -Nru mcomix-1.2.1mcomix3+git20200206/installer.py mcomix-2.1.0/installer.py --- mcomix-1.2.1mcomix3+git20200206/installer.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/installer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: utf-8 -*- - -from argparse import ArgumentParser,ArgumentDefaultsHelpFormatter -from multiprocessing.dummy import Pool -from os import chmod,environ,makedirs,stat,utime,walk -from os.path import dirname,isdir,join,splitext -import shlex -from subprocess import run,DEVNULL - -msgfmt_cmd=shlex.split(environ.get('MSGFMT',default='msgfmt')) - -def fixdirtime(args): - srcdir,filename,target=args - while True: - sstat,d=stat(srcdir),join(target,srcdir) - if not isdir(d):return - times_ns=(sstat.st_atime_ns,sstat.st_mtime_ns) - utime(d,ns=times_ns,times=None) - chmod(d,sstat.st_mode) - srcdir=dirname(srcdir) - if not srcdir:return - -def copy(srcdir,filename,target,pool): - dstdir=join(target,srcdir) - finame,foname=join(srcdir,filename),join(dstdir,filename) - fistat=stat(finame) - times_ns=(fistat.st_atime_ns,fistat.st_mtime_ns) - makedirs(dstdir,exist_ok=True) - with open(finame,mode='rb') as fi,open(foname,mode='wb') as fo: - fo.write(fi.read()) - utime(foname,ns=times_ns,times=None) - chmod(foname,fistat.st_mode) - print('install:',finame,foname) - fixdirtime((srcdir,filename,target)) - -def check_msgfmt(): - try: - run(msgfmt_cmd+['-V'],check=True,stdout=DEVNULL,stderr=DEVNULL) - except: - # msgfmt not found or usable - msgfmt_cmd.clear() - print('msgfmt not found') - return - -def msgfmt(srcdir,filename,target,pool): - if not msgfmt_cmd:return - if pool: - pool.apply_async(msgfmt,(srcdir,filename,target,None),callback=fixdirtime) - return - dstdir=join(target,srcdir) - b,e=splitext(filename) - finame,foname=join(srcdir,filename),join(dstdir,'{}.mo'.format(b)) - makedirs(dstdir,exist_ok=True) - run(msgfmt_cmd+['-o',foname,finame]) - print('msgfmt:',foname,finame) - return srcdir,filename,target - -install_methods={'.1':copy, - '.py':copy, - '.png':copy, - '.po':msgfmt} - -def install(srcdir,filename,target,pool): - b,e=splitext(filename) - if e not in install_methods:return - install_methods[e](srcdir,filename,target,pool) - -def scandir(root,dest,pool=None): - for r,dl,fl in walk(root): - for f in fl: - yield r,f,dest,pool - -def main(): - argp=ArgumentParser(prog='installer',add_help=False,formatter_class=ArgumentDefaultsHelpFormatter) - - argp.add_argument('--srcdir',dest='srcdir',default='mcomix', - help='source directory.',metavar='DIR') - argp.add_argument('--target',dest='target',default='target', - help='target directory.',metavar='DIR') - argp.add_argument('-h','--help',action='help', - help='show help options.') - - ns=argp.parse_args() - - check_msgfmt() - with Pool() as p: - for args in scandir(ns.srcdir,ns.target,pool=p): - install(*args) - p.close() - p.join() - -if __name__=='__main__': - exit(main()) diff -Nru mcomix-1.2.1mcomix3+git20200206/man/comicthumb.1 mcomix-2.1.0/man/comicthumb.1 --- mcomix-1.2.1mcomix3+git20200206/man/comicthumb.1 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/man/comicthumb.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -.TH comicthumb 1 - -.SH NAME -\fBcomicthumb\fP - Thumbnailer for cbz, cbr and cbt archives. - -.SH SYNOPSIS -.nf -\fBcomicthumb\fP \fIFILE\fP \fITHUMBNAIL\fP [\fISIZE\fP] -.fi - -.SH DESCRIPTION -\fBcomicthumb\fP creates thumbnails for x-cbz, x-cbr and x-cbt files. -It is usually registered in gconf (if available) and is then used automatically -by some file managers (e.g. Nautilus or Thunar). - -.SH ARGUMENTS -.TP -.I FILE -An archive file (ZIP, RAR, tar, tar.gz or tar.bz2) that contain -at least one image file. -.TP -.I THUMBNAIL -The thumbnail to be created. It is saved as a PNG image. -.TP -.I SIZE -The maximum size of the thumbnail in pixels. It defaults to 128. - -.SH AUTHOR -Christoph Wolk -.TP -Pontus Ekberg - diff -Nru mcomix-1.2.1mcomix3+git20200206/man/mcomix.1 mcomix-2.1.0/man/mcomix.1 --- mcomix-1.2.1mcomix3+git20200206/man/mcomix.1 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/man/mcomix.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -.TH MComix 1 "January 2016" - -.SH NAME -.B MComix -\- GTK Comic Book Viewer - -.SH SYNOPSIS -.B mcomix -.RI [ OPTION... "] [" PATH... ] - -.SH DESCRIPTION -.B MComix -is a user-friendly, customizable image viewer. It is specifically designed to -handle comic books (both Western comics and manga) and supports a variety of -container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). - -.SH OPTIONS -.TP -.BR \-h , " \-\-help" -Display the help text and exit. -.TP -.BR \-s , " \-\-slideshow" -Start the application in slideshow mode. -.TP -.BR \-l , " \-\-library" -Show the library on startup. -.TP -.BR \-v , " \-\-version" -Show the version number and exit. -.PP -.B Viewing modes -.TP -.BR \-f , " \-\-fullscreen" -Start the application in fullscreen mode. -.TP -.BR \-m , " \-\-manga" -Start the application in manga mode. -.TP -.BR \-d , " \-\-double\-page" -Start the application in double page mode. -.PP -.B Zoom modes -.TP -.BR \-b , " \-\-zoom\-best" -Start the application with zoom set to best fit mode. -.TP -.BR \-w , " \-\-zoom\-width" -Start the application with zoom set to fit width. -.TP -.BR \-h , " \-\-zoom\-height" -Start the application with zoom set to fit height. -.PP -The zoom modes are mutually exclusive, and if more than one is specified, -the first will be used. - -.SH ARGUMENTS -.TP -.I PATH -The path to one or more files or directories to be opened. - -.SH DEPENDENCIES -.SS Required: -.B Python -3.3 or later -.PP -.B PyGObject -3.24 or later, with -.B GTK+ 3 -3.22 or later. -.PP -.B PIL -(Python Imaging Library) 1.1.5 or later. Alternatively, -.B Pillow -(a fork of PIL) can be used. -.PP -.BR Distribute " or " Setuptools . -Distribute supersedes Setuptools on most distributions. -.SS Recommended: -.BR unrar ", " rar " or " libunrar -to extract RAR archives. -.PP -.B p7zip -to extract 7Z archives. Note that p7zip might be able to extract RAR archives -as well, but this might require additional software (for example, -.B p7zip-rar -on Debian-like systems), and it might fail to open certain RAR archives, -especially newer ones. -.PP -.B lha -to extract LHA archives. -.PP -.B mupdf -for PDF support. - -.SH BUGS -.PD 0 -Please report any bugs to the MComix bug tracker at -.PP -.I http://sourceforge.net/projects/mcomix - -.SH CONTACT -.PD 0 -The MComix home page is -.PP -.I http://mcomix.sourceforge.net diff -Nru mcomix-1.2.1mcomix3+git20200206/MANIFEST.in mcomix-2.1.0/MANIFEST.in --- mcomix-1.2.1mcomix3+git20200206/MANIFEST.in 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/MANIFEST.in 2022-12-17 12:42:37.000000000 +0000 @@ -1,7 +1,5 @@ recursive-include mcomix/images *.png -recursive-include mcomix/messages *.po *.mo *.pot +recursive-include mcomix/messages *.mo recursive-include mime *.* -include mcomix/images/__init__.py mcomix/messages/__init__.py include mime/comicthumb mime/comicthumb.thumbnailer include mcomix.1.gz ChangeLog COPYING mcomixstarter.py -exclude mcomix/images/mcomix-large.png diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/about_dialog.py mcomix-2.1.0/mcomix/about_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/about_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/about_dialog.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +"""about_dialog.py - About dialog.""" + +from gi.repository import Gtk +import pkgutil +import webbrowser + +from mcomix import constants +from mcomix import strings +from mcomix import image_tools + +class _AboutDialog(Gtk.AboutDialog): + + def __init__(self, window): + super(_AboutDialog, self).__init__(parent=window) + + self.set_name(constants.APPNAME) + self.set_program_name(constants.APPNAME) + self.set_version(constants.VERSION) + self.set_website('https://sourceforge.net/p/mcomix/wiki/') + self.set_copyright('Copyright © 2005-2022') + + icon_data = pkgutil.get_data('mcomix', 'images/mcomix.png') + pixbuf = image_tools.load_pixbuf_data(icon_data) + self.set_logo(pixbuf) + + comment = \ + _('%s is an image viewer specifically designed to handle comic books.') % \ + constants.APPNAME + ' ' + \ + _('It reads ZIP, RAR and tar archives, as well as plain image files.') + self.set_comments(comment) + + license = \ + _('%s is licensed under the terms of the GNU General Public License.') % constants.APPNAME + \ + ' ' + \ + _('A copy of this license can be obtained from %s') % \ + 'http://www.gnu.org/licenses/gpl-2.0.html' + self.set_wrap_license(True) + self.set_license(license) + + authors = [ '%s: %s' % (name, description) for name, description in strings.AUTHORS ] + self.set_authors(authors) + + translators = [ '%s: %s' % (name, description) for name, description in strings.TRANSLATORS ] + self.set_translator_credits("\n".join(translators)) + + artists = [ '%s: %s' % (name, description) for name, description in strings.ARTISTS ] + self.set_artists(artists) + + self.connect('activate-link', self._on_activate_link) + + self.show_all() + + def _on_activate_link(self, about_dialog, uri): + webbrowser.open(uri) + return True + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/archive_base.py mcomix-2.1.0/mcomix/archive/archive_base.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/archive_base.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/archive_base.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- + +""" Base class for unified handling of various archive formats. Used for simplifying +extraction and adding new archive formats. """ + +import os +import errno +import threading + +from mcomix import portability +from mcomix import i18n +from mcomix import process +from mcomix import callback +from mcomix import archive + +class BaseArchive(object): + """ Base archive interface. All filenames passed from and into archives + are expected to be Unicode objects. Archive files are converted to + Unicode with some guess-work. """ + + """ True if concurrent calls to extract is supported. """ + support_concurrent_extractions = False + + def __init__(self, archive): + assert isinstance(archive, str), "File should be an Unicode string." + + self.archive = archive + self._password = None + self._event = threading.Event() + if self.support_concurrent_extractions: + # When multiple concurrent extractions are supported, + # we need a lock to handle concurent calls to _get_password. + self._lock = threading.Lock() + self._waiting_for_password = False + + def iter_contents(self): + """ Generator for listing the archive contents. + """ + return + yield + + def list_contents(self): + """ Returns a list of unicode filenames relative to the archive root. + These names do not necessarily exist in the actual archive since they + need to saveable on the local filesystems, so some characters might + need to be replaced. """ + + return [f for f in self.iter_contents()] + + def extract(self, filename, destination_dir): + """ Extracts the file specified by . This filename must + be obtained by calling list_contents(). The file is saved to + . """ + + assert isinstance(filename, str) and \ + isinstance(destination_dir, str) + + def iter_extract(self, entries, destination_dir): + """ Generator to extract from archive to . """ + wanted = set(entries) + for filename in self.iter_contents(): + if not filename in wanted: + continue + self.extract(filename, destination_dir) + yield filename + wanted.remove(filename) + if 0 == len(wanted): + break + + def close(self): + """ Closes the archive and releases held resources. """ + + pass + + def is_solid(self): + """ Returns True if the archive is solid and extraction should be done + in one pass. """ + return False + + def _replace_invalid_filesystem_chars(self, filename): + """ Replaces characters in that cannot be saved to the disk + with underscore and returns the cleaned-up name. """ + + unsafe_chars = portability.invalid_filesystem_chars() + translation_table = {} + replacement_char = '_' + for char in unsafe_chars: + translation_table[ord(char)] = replacement_char + + new_name = filename.translate(translation_table) + + # Make sure the filename does not contain portions that might + # traverse directories, i.e. do not allow absolute paths + # and paths containing ../ + normalized = os.path.normpath(new_name) + return normalized.lstrip('..' + os.sep).lstrip(os.sep) + + def _create_directory(self, directory): + """ Recursively create a directory if it doesn't exist yet. """ + if os.path.exists(directory): + return + try: + os.makedirs(directory) + except OSError as e: + # Can happen with concurrent calls. + if e.errno != errno.EEXIST: + raise e + + def _create_file(self, dst_path): + """ Open for writing, making sure base directory exists. """ + dst_dir = os.path.dirname(dst_path) + # Create directory if it doesn't exist + self._create_directory(dst_dir) + return open(dst_path, 'wb') + + @callback.Callback + def _password_required(self): + """ Asks the user for a password and sets . + If is None, no password has been requested yet. + If an empty string is set, assume that the user did not provide + a password. """ + + password = archive.ask_for_password(self.archive) + if password is None: + password = "" + + self._password = password + self._event.set() + + def _get_password(self): + ask_for_password = self._password is None + # Don't trigger concurrent password dialogs. + if ask_for_password and self.support_concurrent_extractions: + with self._lock: + if self._waiting_for_password: + ask_for_password = False + else: + self._waiting_for_password = True + if ask_for_password: + self._password_required() + self._event.wait() + +class NonUnicodeArchive(BaseArchive): + """ Base class for archives that manage a conversion of byte member names -> + Unicode member names internally. Required for formats that do not provide + wide character member names. """ + + def __init__(self, archive): + super(NonUnicodeArchive, self).__init__(archive) + # Maps Unicode names to regular names as expected by the original archive format + self.unicode_mapping = {} + + def _unicode_filename(self, filename, conversion_func=i18n.to_unicode): + """ Instead of returning archive members directly, map each filename through + this function first to convert them to Unicode. """ + + unicode_name = conversion_func(filename) + safe_name = self._replace_invalid_filesystem_chars(unicode_name) + self.unicode_mapping[safe_name] = filename + return safe_name + + def _original_filename(self, filename): + """ Map Unicode filename back to original archive name. """ + if filename in self.unicode_mapping: + return self.unicode_mapping[filename] + else: + return i18n.to_utf8(filename) + +class ExternalExecutableArchive(NonUnicodeArchive): + """ For archives that are extracted by spawning an external + application. """ + + # Since we're using an external program for extraction, + # concurrent calls are supported. + support_concurrent_extractions = True + + def __init__(self, archive): + super(ExternalExecutableArchive, self).__init__(archive) + # Flag to determine if list_contents() has been called + # This builds the Unicode mapping and is likely required + # for extracting filenames that have been internally mapped. + self.filenames_initialized = False + + def _get_executable(self): + """ Returns the executable's name or path. Return None if no executable + was found on the system. """ + raise NotImplementedError("Subclasses must override _get_executable.") + + def _get_list_arguments(self): + """ Returns an array of arguments required for the executable + to produce a list of archive members. """ + raise NotImplementedError("Subclasses must override _get_list_arguments.") + + def _get_extract_arguments(self): + """ Returns an array of arguments required for the executable + to extract a file to STDOUT. """ + raise NotImplementedError("Subclasses must override _get_extract_arguments.") + + def _parse_list_output_line(self, line): + """ Parses the output of the external executable's list command + and return either a file path relative to the archive's root, + or None if the current line doesn't contain any file references. """ + + return line + + def iter_contents(self): + if not self._get_executable(): + return + + proc = process.popen([self._get_executable()] + + self._get_list_arguments() + + [self.archive]) + try: + for line in proc.stdout: + filename = self._parse_list_output_line(line.rstrip(os.linesep)) + if filename is not None: + yield self._unicode_filename(filename) + finally: + proc.stdout.close() + proc.wait() + + self.filenames_initialized = True + + def extract(self, filename, destination_dir): + """ Extract from the archive to . """ + assert isinstance(filename, str) and \ + isinstance(destination_dir, str) + + if not self._get_executable(): + return + + if not self.filenames_initialized: + self.list_contents() + + output = self._create_file(os.path.join(destination_dir, filename)) + try: + process.call([self._get_executable()] + + self._get_extract_arguments() + + [self.archive, self._original_filename(filename)], + stdout=output) + finally: + output.close() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/archive_recursive.py mcomix-2.1.0/mcomix/archive/archive_recursive.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/archive_recursive.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/archive_recursive.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- + +""" Class for transparently handling an archive containing sub-archives. """ + +from mcomix.archive import archive_base +from mcomix import archive_tools +from mcomix import log + +import os + +class RecursiveArchive(archive_base.BaseArchive): + + def __init__(self, archive, destination_dir): + super(RecursiveArchive, self).__init__(archive.archive) + self._main_archive = archive + self._destination_dir = destination_dir + self._archive_list = [] + # Map entry name to its archive+name. + self._entry_mapping = {} + # Map archive to its root. + self._archive_root = {} + self._contents_listed = False + self._contents = [] + # Assume concurrent extractions are not supported. + self.support_concurrent_extractions = False + + def _iter_contents(self, archive, root=None): + self._archive_list.append(archive) + self._archive_root[archive] = root + sub_archive_list = [] + for f in archive.iter_contents(): + if archive_tools.is_archive_file(f): + # We found a sub-archive, don't try to extract it now, as we + # must finish listing the containing archive contents before + # any extraction can be done. + sub_archive_list.append(f) + continue + name = f + if root is not None: + name = os.path.join(root, name) + self._entry_mapping[name] = (archive, f) + yield name + for f in sub_archive_list: + # Extract sub-archive. + destination_dir = self._destination_dir + if root is not None: + destination_dir = os.path.join(destination_dir, root) + archive.extract(f, destination_dir) + sub_archive_ext = os.path.splitext(f)[1].lower()[1:] + sub_archive_path = os.path.join( + self._destination_dir, 'sub-archives', + '%04u.%s' % (len(self._archive_list), sub_archive_ext + )) + self._create_directory(os.path.dirname(sub_archive_path)) + os.rename(os.path.join(destination_dir, f), sub_archive_path) + # And open it and list its contents. + sub_archive = archive_tools.get_archive_handler(sub_archive_path) + if sub_archive is None: + log.warning('Non-supported archive format: %s', + os.path.basename(sub_archive_path)) + continue + sub_root = f + if root is not None: + sub_root = os.path.join(root, sub_root) + for name in self._iter_contents(sub_archive, sub_root): + yield name + + def _check_concurrent_extraction_support(self): + supported = True + # We need all archives to support concurrent extractions. + for archive in self._archive_list: + if not archive.support_concurrent_extractions: + supported = False + break + self.support_concurrent_extractions = supported + + def iter_contents(self): + if self._contents_listed: + for f in self._contents: + yield f + return + self._contents = [] + for f in self._iter_contents(self._main_archive): + self._contents.append(f) + yield f + self._contents_listed = True + # We can now check if concurrent extractions are really supported. + self._check_concurrent_extraction_support() + + def list_contents(self): + if self._contents_listed: + return self._contents + return [f for f in self.iter_contents()] + + def extract(self, filename, destination_dir): + if not self._contents_listed: + self.list_contents() + archive, name = self._entry_mapping[filename] + root = self._archive_root[archive] + if root is not None: + destination_dir = os.path.join(destination_dir, root) + log.debug('extracting from %s to %s: %s', + archive.archive, destination_dir, filename) + archive.extract(name, destination_dir) + + def iter_extract(self, entries, destination_dir): + if not self._contents_listed: + self.list_contents() + # Unfortunately we can't just rely on BaseArchive default + # implementation if solid archives are to be correctly supported: + # we need to call iter_extract (not extract) for each archive ourselves. + wanted = set(entries) + for archive in self._archive_list: + archive_wanted = {} + for name in wanted: + name_archive, name_archive_name = self._entry_mapping[name] + if name_archive == archive: + archive_wanted[name_archive_name] = name + if 0 == len(archive_wanted): + continue + root = self._archive_root[archive] + archive_destination_dir = destination_dir + if root is not None: + archive_destination_dir = os.path.join(destination_dir, root) + log.debug('extracting from %s to %s: %s', + archive.archive, archive_destination_dir, + ' '.join(list(archive_wanted.keys()))) + for f in archive.iter_extract(list(archive_wanted.keys()), archive_destination_dir): + yield archive_wanted[f] + wanted -= set(archive_wanted.values()) + if 0 == len(wanted): + break + + def is_solid(self): + if not self._contents_listed: + self.list_contents() + # We're solid if at least one archive is solid. + for archive in self._archive_list: + if archive.is_solid(): + return True + return False + + def close(self): + for archive in self._archive_list: + archive.close() + diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/__init__.py mcomix-2.1.0/mcomix/archive/__init__.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/__init__.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/__init__.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from gi.repository import Gtk + +from mcomix import message_dialog + +def ask_for_password(archive): + """ Openes an input dialog to ask for a password. Returns either + an Unicode string (the password), or None.""" + dialog = message_dialog.MessageDialog(None, Gtk.DialogFlags.MODAL, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL) + dialog.set_text( + _("The archive is password-protected:"), + archive + '\n\n' + + ("Please enter the password to continue:")) + dialog.set_default_response(Gtk.ResponseType.OK) + dialog.set_auto_destroy(False) + + password_box = Gtk.Entry() + password_box.set_visibility(False) + password_box.set_activates_default(True) + dialog.get_content_area().pack_end(password_box, True, True, 0) + dialog.set_focus(password_box) + + result = dialog.run() + password = password_box.get_text() + dialog.destroy() + + if result == Gtk.ResponseType.OK and password: + return password + else: + return None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/lha_external.py mcomix-2.1.0/mcomix/archive/lha_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/lha_external.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/lha_external.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +""" LHA archive extractor. """ + +import re + +from mcomix import process +from mcomix.archive import archive_base + +# Filled on-demand by LhaArchive +_lha_executable = -1 + +class LhaArchive(archive_base.ExternalExecutableArchive): + """ LHA file extractor using the lha executable. """ + + def _get_executable(self): + return LhaArchive._find_lha_executable() + + def _get_list_arguments(self): + return ['l', '-g', '-q2'] + + def _get_extract_arguments(self): + return ['p', '-q2'] + + def _parse_list_output_line(self, line): + match = re.search(r'\[generic\]\s+\d+\s+\S+?\s+\w+\s+\d+\s+\d+\s+(.+)$', line) + if match: + return match.group(1) + else: + return None + + @staticmethod + def _find_lha_executable(): + """ Tries to start lha, and returns either 'lha' if + it was started successfully or None otherwise. """ + global _lha_executable + if _lha_executable == -1: + _lha_executable = process.find_executable(('lha',)) + return _lha_executable + + @staticmethod + def is_available(): + return bool(LhaArchive._find_lha_executable()) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/pdf_external.py mcomix-2.1.0/mcomix/archive/pdf_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/pdf_external.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/pdf_external.py 2022-12-17 12:43:24.000000000 +0000 @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- + +""" PDF handler. """ + +from mcomix import log +from mcomix import process +from mcomix.archive import archive_base + +# FIXME: LooseVersion is deprecated +from distutils.version import LooseVersion +import math +import os +import re +import subprocess + +# Default DPI for rendering. +PDF_RENDER_DPI_DEF = 72 * 4 +# Maximum DPI for rendering. +PDF_RENDER_DPI_MAX = 72 * 10 + +_pdf_possible = None +_mutool_exec = None +_mudraw_exec = None +_mudraw_trace_args = None + +class PdfArchive(archive_base.BaseArchive): + + """ Concurrent calls to extract welcome! """ + support_concurrent_extractions = True + + _fill_image_regex = re.compile(r'^\s*[^"]+)".*\bwidth="(?P\d+)".*\bheight="(?P\d+)".*/>\s*$') + + def __init__(self, archive): + super(PdfArchive, self).__init__(archive) + + def iter_contents(self): + proc = subprocess.run(_mutool_exec + ['show', '--', self.archive, 'pages'], stdout=subprocess.PIPE, encoding='utf-8') + for line in proc.stdout.splitlines(): + if line.startswith('page '): + yield line.split()[1] + '.png' + + def extract(self, filename, destination_dir): + self._create_directory(destination_dir) + destination_path = os.path.join(destination_dir, filename) + page_num = int(filename[0:-4]) + # Try to find optimal DPI. + cmd = _mudraw_exec + _mudraw_trace_args + ['--', self.archive, str(page_num)] + log.debug('finding optimal DPI for %s: %s', filename, ' '.join(cmd)) + proc = subprocess.run(cmd, stdout=subprocess.PIPE, encoding='utf-8', errors='replace') + max_size = 0 + max_dpi = PDF_RENDER_DPI_DEF + for line in proc.stdout.splitlines(): + match = self._fill_image_regex.match(line) + if not match: + continue + matrix = [float(f) for f in match.group('matrix').split()] + for size, coeff1, coeff2 in ( + (int(match.group('width')), matrix[0], matrix[1]), + (int(match.group('height')), matrix[2], matrix[3]), + ): + if size < max_size: + continue + render_size = math.sqrt(coeff1 * coeff1 + coeff2 * coeff2) + dpi = int(size * 72 / render_size) + if dpi > PDF_RENDER_DPI_MAX: + dpi = PDF_RENDER_DPI_MAX + max_size = size + max_dpi = dpi + # Render... + cmd = _mudraw_exec + ['-r', str(max_dpi), '-o', destination_path, '--', self.archive, str(page_num)] + log.debug('rendering %s: %s', filename, ' '.join(cmd)) + process.call(cmd) + + @staticmethod + def is_available(): + global _pdf_possible + if _pdf_possible is not None: + return _pdf_possible + global _mutool_exec, _mudraw_exec, _mudraw_trace_args + mutool = process.find_executable(('mutool',)) + _pdf_possible = False + version = None + if mutool is None: + log.debug('mutool executable not found') + else: + _mutool_exec = [mutool] + # Find MuPDF version; assume 1.6 version since + # the '-v' switch is only supported from 1.7 onward... + version = '1.6' + proc = process.popen([mutool, '-v'], + stdout=process.NULL, + stderr=process.PIPE) + try: + output = proc.stderr.read() + if output.startswith(b'mutool version '): + version = output[15:].rstrip().decode() + finally: + proc.stderr.close() + proc.wait() + version = LooseVersion(version) + if version >= LooseVersion('1.8'): + # Mutool executable with draw support. + _mudraw_exec = [mutool, 'draw'] + _mudraw_trace_args = ['-F', 'trace'] + _pdf_possible = True + else: + # Separate mudraw executable. + mudraw = process.find_executable(('mudraw',)) + if mudraw is None: + log.debug('mudraw executable not found') + else: + _mudraw_exec = [mudraw] + if version >= LooseVersion('1.7'): + _mudraw_trace_args = ['-F', 'trace'] + else: + _mudraw_trace_args = ['-x'] + _pdf_possible = True + if _pdf_possible: + log.info('Using MuPDF version: %s', version) + log.debug('mutool: %s', ' '.join(_mutool_exec)) + log.debug('mudraw: %s', ' '.join(_mudraw_exec)) + log.debug('mudraw trace arguments: %s', ' '.join(_mudraw_trace_args)) + else: + log.info('MuPDF not available.') + return _pdf_possible + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/rar_external.py mcomix-2.1.0/mcomix/archive/rar_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/rar_external.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/rar_external.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- + +""" RAR archive extractor. """ + +import os +import sys +import subprocess + +from mcomix import log +from mcomix import process +from mcomix.archive import archive_base + +# Filled on-demand by RarArchive +_rar_executable = -1 + +class RarArchive(archive_base.ExternalExecutableArchive): + """ RAR file extractor using the unrar/rar executable. """ + + STATE_HEADER, STATE_LISTING = 1, 2 + + class EncryptedHeader(Exception): + pass + + def __init__(self, archive): + super(RarArchive, self).__init__(archive) + self._is_solid = False + self._is_encrypted = False + self._contents = [] + + def _get_executable(self): + return self._find_unrar_executable() + + def _get_password_argument(self): + if not self._is_encrypted: + # Add a dummy password anyway, to prevent deadlock on reading for + # input if we did not correctly detect the archive is encrypted. + return '-p-' + self._get_password() + # Check for invalid empty password, see comment above. + if not self._password: + return '-p-' + return '-p' + self._password + + def _get_list_arguments(self): + args = [self._get_executable(), 'vt'] + args.append(self._get_password_argument()) + args.extend(('--', self.archive)) + return args + + def _get_extract_arguments(self): + args = [self._get_executable(), 'p', '-inul', '-@'] + args.append(self._get_password_argument()) + args.extend(('--', self.archive)) + return args + + def _parse_list_output_line(self, line): + if self._state == self.STATE_HEADER: + if line.startswith('Details: '): + flags = line[9:].split(', ') + if 'solid' in flags: + self._is_solid = True + if 'encrypted headers' in flags: + if not self._is_encrypted: + # Trigger a restart of the enclosing + # iter_contents loop with a password. + self._is_encrypted = True + raise self.EncryptedHeader() + self._state = self.STATE_LISTING + return None + if self._state == self.STATE_LISTING: + line = line.lstrip() + if line.startswith('Name: '): + self._path = line[6:] + return self._path + if line.startswith('Size: '): + filesize = int(line[6:]) + if filesize > 0: + self._contents.append((self._path, filesize)) + if line.startswith('Flags: '): + flags = line[7:].split() + if 'solid' in flags: + self._is_solid = True + if 'encrypted' in flags: + self._is_encrypted = True + return None + + def is_solid(self): + return self._is_solid + + def iter_contents(self): + if not self._get_executable(): + return + + # We'll try at most 2 times: + # - the first time without a password + # - a second time with a password if the header is encrypted + for retry_count in range(2): + #: Indicates which part of the file listing has been read. + self._state = self.STATE_HEADER + #: Current path while listing contents. + self._path = None + proc = subprocess.run( + self._get_list_arguments(), stdout=process.PIPE, stderr=process.STDOUT, + encoding="utf-8", + creationflags=process._get_creationflags()) + try: + for line in proc.stdout.splitlines(): + filename = self._parse_list_output_line(line.rstrip(os.linesep)) + if filename is not None: + yield self._unicode_filename(filename) + except self.EncryptedHeader: + # The header is encrypted, try again + # if it was our first attempt. + if 0 == retry_count: + continue + # Last and/or successful attempt. + break + + self.filenames_initialized = True + + def extract(self, filename, destination_dir): + """ Extract from the archive to . """ + assert isinstance(filename, str) and \ + isinstance(destination_dir, str) + + if not self._get_executable(): + return + + if not self.filenames_initialized: + self.list_contents() + + desired_filename = self._original_filename(filename) + cmd = self._get_extract_arguments() + [desired_filename] + output = self._create_file(os.path.join(destination_dir, filename)) + try: + process.call(cmd, stdout=output) + finally: + output.close() + + def iter_extract(self, entries, destination_dir): + + if not self._get_executable(): + return + + if not self.filenames_initialized: + self.list_contents() + + proc = process.popen(self._get_extract_arguments()) + try: + wanted = dict([(self._original_filename(unicode_name), unicode_name) + for unicode_name in entries]) + + for filename, filesize in self._contents: + data = proc.stdout.read(filesize) + if filename not in wanted: + continue + unicode_name = wanted.get(filename, None) + if unicode_name is None: + continue + new = self._create_file(os.path.join(destination_dir, unicode_name)) + new.write(data) + new.close() + yield unicode_name + del wanted[filename] + if 0 == len(wanted): + break + + finally: + proc.stdout.close() + proc.wait() + + @staticmethod + def _find_unrar_executable(): + """ Tries to start rar/unrar, and returns either 'rar' or 'unrar' if + one of them was started successfully. + Returns None if neither could be started. """ + global _rar_executable + if _rar_executable == -1: + if 'win32' == sys.platform: + def is_not_unrar_free(exe): + return True + else: + def is_not_unrar_free(exe): + real_exe = exe + while os.path.islink(real_exe): + real_exe = os.readlink(real_exe) + if real_exe.endswith(os.path.sep + 'unrar-free'): + log.warning('RAR executable %s is unrar-free, ignoring', exe) + return False + return True + _rar_executable = process.find_executable(('unrar-nonfree', 'unrar', 'rar'), + is_valid_candidate=is_not_unrar_free) + return _rar_executable + + @staticmethod + def is_available(): + return bool(RarArchive._find_unrar_executable()) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/rar.py mcomix-2.1.0/mcomix/archive/rar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/rar.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/rar.py 2022-01-25 16:24:16.000000000 +0000 @@ -0,0 +1,350 @@ +# -*- coding: utf-8 -*- + +""" Glue around libunrar.so/unrar.dll to extract RAR files without having to +resort to calling rar/unrar manually. """ + +import sys, os +import ctypes, ctypes.util + +from mcomix import constants +from mcomix.archive import archive_base +from mcomix import log + +if sys.platform == 'win32': + UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_longlong, ctypes.c_uint, + ctypes.c_longlong, ctypes.c_longlong, ctypes.c_longlong) +else: + UNRARCALLBACK = ctypes.CFUNCTYPE(ctypes.c_longlong, ctypes.c_uint, + ctypes.c_longlong, ctypes.c_longlong, ctypes.c_longlong) + +class RarArchive(archive_base.BaseArchive): + """ Wrapper class for libunrar. All string values passed to this class must be unicode objects. + In turn, all values returned are also unicode. """ + + # Nope! Not a good idea... + support_concurrent_extractions = False + + class _OpenMode(object): + """ Rar open mode """ + RAR_OM_LIST = 0 + RAR_OM_EXTRACT = 1 + + class _ProcessingMode(object): + """ Rar file processing mode """ + RAR_SKIP = 0 + RAR_EXTRACT = 2 + + class _ErrorCode(object): + """ Rar error codes """ + ERAR_END_ARCHIVE = 10 + ERAR_NO_MEMORY = 11 + ERAR_BAD_DATA = 12 + ERAR_BAD_ARCHIVE = 13 + ERAR_UNKNOWN_FORMAT = 14 + ERAR_EOPEN = 15 + ERAR_ECREATE = 16 + ERAR_ECLOSE = 17 + ERAR_EREAD = 18 + ERAR_EWRITE = 19 + ERAR_SMALL_BUF = 20 + ERAR_UNKNOWN = 21 + ERAR_MISSING_PASSWORD = 22 + + class _RAROpenArchiveDataEx(ctypes.Structure): + """ Archive header structure. Used by DLL calls. """ + _pack_ = 1 + _fields_ = [("ArcName", ctypes.c_char_p), + ("ArcNameW", ctypes.c_wchar_p), + ("OpenMode", ctypes.c_uint), + ("OpenResult", ctypes.c_uint), + ("CmtBuf", ctypes.c_char_p), + ("CmtBufSize", ctypes.c_uint), + ("CmtSize", ctypes.c_uint), + ("CmtState", ctypes.c_uint), + ("Flags", ctypes.c_uint), + ("Callback", UNRARCALLBACK), + ("UserData", ctypes.c_long), + ("Reserved", ctypes.c_uint * 28)] + + class _RARHeaderDataEx(ctypes.Structure): + """ Archive file structure. Used by DLL calls. """ + _pack_ = 1 + _fields_ = [("ArcName", ctypes.c_char * 1024), + ("ArcNameW", ctypes.c_wchar * 1024), + ("FileName", ctypes.c_char * 1024), + ("FileNameW", ctypes.c_wchar * 1024), + ("Flags", ctypes.c_uint), + ("PackSize", ctypes.c_uint), + ("PackSizeHigh", ctypes.c_uint), + ("UnpSize", ctypes.c_uint), + ("UnpSizeHigh", ctypes.c_uint), + ("HostOS", ctypes.c_uint), + ("FileCRC", ctypes.c_uint), + ("FileTime", ctypes.c_uint), + ("UnpVer", ctypes.c_uint), + ("Method", ctypes.c_uint), + ("FileAttr", ctypes.c_uint), + ("CmtBuf", ctypes.c_char_p), + ("CmtBufSize", ctypes.c_uint), + ("CmtSize", ctypes.c_uint), + ("CmtState", ctypes.c_uint), + ("Reserved", ctypes.c_uint * 1024)] + + + @staticmethod + def is_available(): + """ Returns True if unrar.dll can be found, False otherwise. """ + return bool(_get_unrar_dll()) + + def __init__(self, archive): + """ Initialize Unrar.dll. """ + super(RarArchive, self).__init__(archive) + self._unrar = _get_unrar_dll() + self._handle = None + self._callback_function = None + self._is_solid = False + # Information about the current file will be stored in this structure + self._headerdata = RarArchive._RARHeaderDataEx() + self._current_filename = None + + # Set up function prototypes. + # Mandatory since pointers get truncated on x64 otherwise! + self._unrar.RAROpenArchiveEx.restype = ctypes.c_void_p + self._unrar.RAROpenArchiveEx.argtypes = \ + [ctypes.POINTER(RarArchive._RAROpenArchiveDataEx)] + self._unrar.RARCloseArchive.restype = ctypes.c_int + self._unrar.RARCloseArchive.argtypes = \ + [ctypes.c_void_p] + self._unrar.RARReadHeaderEx.restype = ctypes.c_int + self._unrar.RARReadHeaderEx.argtypes = \ + [ctypes.c_void_p, ctypes.POINTER(RarArchive._RARHeaderDataEx)] + self._unrar.RARProcessFileW.restype = ctypes.c_int + self._unrar.RARProcessFileW.argtypes = \ + [ctypes.c_void_p, ctypes.c_int, ctypes.c_wchar_p, ctypes.c_wchar_p] + self._unrar.RARSetCallback.argtypes = \ + [ctypes.c_void_p, UNRARCALLBACK, ctypes.c_long] + + def is_solid(self): + return self._is_solid + + def iter_contents(self): + """ List archive contents. """ + self._close() + self._open() + try: + while True: + self._read_header() + if 0 != (0x10 & self._headerdata.Flags): + self._is_solid = True + filename = self._current_filename + yield filename + # Skip to the next entry if we're still on the same name + # (extract may have been called by iter_extract). + if filename == self._current_filename: + self._process() + except UnrarException as exc: + log.error('Error while listing contents: %s', str(exc)) + except EOFError: + # End of archive reached. + pass + finally: + self._close() + + def extract(self, filename, destination_dir): + """ Extract from the archive to . """ + if not self._handle: + self._open() + looped = False + while True: + # Check if the current entry matches the requested file. + if self._current_filename is not None: + if (self._current_filename == filename): + # It's the entry we're looking for, extract it. + dest = ctypes.c_wchar_p(os.path.join(destination_dir, filename)) + self._process(dest) + break + # Not the right entry, skip it. + self._process() + try: + self._read_header() + except EOFError: + # Archive end was reached, this might be due to out-of-order + # extraction while the handle was still open. Close the + # archive and jump back to archive start and try to extract + # file again. Do this only once; if the file isn't found after + # a second full pass, it probably doesn't even exist in the + # archive. + if looped: + break + self._open() + # After the method returns, the RAR handler is still open and pointing + # to the next archive file. This will improve extraction speed for sequential file reads. + # After all files have been extracted, close() should be called to free the handler resources. + + def close(self): + """ Close the archive handle """ + self._close() + + def _open(self): + """ Open rar handle for extraction. """ + self._callback_function = UNRARCALLBACK(self._password_callback) + archivedata = RarArchive._RAROpenArchiveDataEx(ArcNameW=self.archive, + OpenMode=RarArchive._OpenMode.RAR_OM_EXTRACT, + Callback=self._callback_function, + UserData=0) + + handle = self._unrar.RAROpenArchiveEx(ctypes.byref(archivedata)) + if not handle: + errormessage = UnrarException.get_error_message(archivedata.OpenResult) + raise UnrarException("Couldn't open archive: %s" % errormessage) + self._unrar.RARSetCallback(handle, self._callback_function, 0) + self._handle = handle + + def _check_errorcode(self, errorcode): + if 0 == errorcode: + # No error. + return + self._close() + if RarArchive._ErrorCode.ERAR_END_ARCHIVE == errorcode: + # End of archive reached. + exc = EOFError() + else: + errormessage = UnrarException.get_error_message(errorcode) + exc = UnrarException(errormessage) + raise exc + + def _read_header(self): + self._current_filename = None + errorcode = self._unrar.RARReadHeaderEx(self._handle, ctypes.byref(self._headerdata)) + self._check_errorcode(errorcode) + self._current_filename = self._headerdata.FileNameW + + def _process(self, dest=None): + """ Process current entry: extract or skip it. """ + if dest is None: + mode = RarArchive._ProcessingMode.RAR_SKIP + else: + mode = RarArchive._ProcessingMode.RAR_EXTRACT + errorcode = self._unrar.RARProcessFileW(self._handle, mode, None, dest) + self._current_filename = None + self._check_errorcode(errorcode) + + def _close(self): + """ Close the rar handle previously obtained by open. """ + if self._handle is None: + return + errorcode = self._unrar.RARCloseArchive(self._handle) + if errorcode != 0: + errormessage = UnrarException.get_error_message(errorcode) + raise UnrarException("Couldn't close archive: %s" % errormessage) + self._handle = None + + def _password_callback(self, msg, userdata, buffer_address, buffer_size): + """ Called by the unrar library in case of missing password. """ + if msg == 2: # UCM_NEEDPASSWORD + self._get_password() + if not self._password or len(self._password) == 0: + # Abort extraction + return -1 + password = ctypes.create_string_buffer(self._password.encode('utf-8')) + copy_size = min(buffer_size, len(password)) + ctypes.memmove(buffer_address, password, copy_size) + return 1 + elif msg == 4: # UCM_NEEDPASSWORDW + self._get_password() + if not self._password or len(self._password) == 0: + # Abort extraction + return -1 + password = ctypes.create_string_buffer(self._password.encode('utf-16le')) + copy_size = min(buffer_size, len(password)) + ctypes.memmove(buffer_address, password, copy_size) + return 1 + else: + # Continue operation + return 0 + +class UnrarException(Exception): + """ Exception class for RarArchive. """ + + _exceptions = { + RarArchive._ErrorCode.ERAR_END_ARCHIVE: "End of archive", + RarArchive._ErrorCode.ERAR_NO_MEMORY:" Not enough memory to initialize data structures", + RarArchive._ErrorCode.ERAR_BAD_DATA: "Bad data, CRC mismatch", + RarArchive._ErrorCode.ERAR_BAD_ARCHIVE: "Volume is not valid RAR archive", + RarArchive._ErrorCode.ERAR_UNKNOWN_FORMAT: "Unknown archive format", + RarArchive._ErrorCode.ERAR_EOPEN: "Volume open error", + RarArchive._ErrorCode.ERAR_ECREATE: "File create error", + RarArchive._ErrorCode.ERAR_ECLOSE: "File close error", + RarArchive._ErrorCode.ERAR_EREAD: "Read error", + RarArchive._ErrorCode.ERAR_EWRITE: "Write error", + RarArchive._ErrorCode.ERAR_SMALL_BUF: "Buffer too small", + RarArchive._ErrorCode.ERAR_UNKNOWN: "Unknown error", + RarArchive._ErrorCode.ERAR_MISSING_PASSWORD: "Password missing" + } + + @staticmethod + def get_error_message(errorcode): + if errorcode in UnrarException._exceptions: + return UnrarException._exceptions[errorcode] + else: + return "Unkown error" + +# Filled on-demand by _get_unrar_dll +_unrar_dll = -1 + +def _get_unrar_dll(): + """ Tries to load libunrar and will return a handle of it. + Returns None if an error occured or the library couldn't be found. """ + global _unrar_dll + if _unrar_dll != -1: + return _unrar_dll + + # Load unrar64.dll on win32 + if sys.platform == 'win32': + + # First, search for unrar.dll in PATH + unrar_path = ctypes.util.find_library("UnRar64.dll") + if unrar_path: + try: + return ctypes.windll.LoadLibrary(unrar_path) + except WindowsError: + pass + + # The file wasn't found in PATH, try MComix' root directory + try: + return ctypes.windll.LoadLibrary(os.path.join(constants.BASE_PATH, "UnRar64.dll")) + except WindowsError: + pass + + # Last attempt, just use the current directory + try: + _unrar_dll = ctypes.windll.LoadLibrary("UnRar64.dll") + except WindowsError: + _unrar_dll = None + + return _unrar_dll + + # Load libunrar.so on UNIX + else: + # find_library on UNIX uses various mechanisms to determine the path + # of a library, so one could assume the library is not installed + # when find_library fails + unrar_path = ctypes.util.find_library("unrar") or \ + '/usr/lib64/libunrar.so' + + if unrar_path: + try: + _unrar_dll = ctypes.cdll.LoadLibrary(unrar_path) + return _unrar_dll + except OSError: + pass + + # Last attempt, try the current directory + try: + _unrar_dll = ctypes.cdll.LoadLibrary(os.path.join(os.getcwd(), "libunrar.so")) + except OSError: + _unrar_dll = None + + return _unrar_dll + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/sevenzip_external.py mcomix-2.1.0/mcomix/archive/sevenzip_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/sevenzip_external.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/sevenzip_external.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- + +""" 7z archive extractor. """ + +import re +import os +import subprocess +import tempfile + +from mcomix import process +from mcomix import log +from mcomix.archive import archive_base + +# Filled on-demand by SevenZipArchive +_7z_executable = -1 + + +class SevenZipArchive(archive_base.ExternalExecutableArchive): + """ 7z file extractor using the 7z executable. """ + + STATE_HEADER, STATE_LISTING, STATE_FOOTER = 1, 2, 3 + + class EncryptedHeader(Exception): + pass + + def __init__(self, archive): + super(SevenZipArchive, self).__init__(archive) + self._is_solid = False + self._is_encrypted = False + self._contents = [] + + def _get_executable(self): + return SevenZipArchive._find_7z_executable() + + def _get_password_argument(self): + if self._is_encrypted: + self._get_password() + return '-p' + self._password + else: + # Add an empty password anyway, to prevent deadlock on reading for + # input if we did not correctly detect the archive is encrypted. + return '-p' + + def _get_list_arguments(self): + args = [self._get_executable(), 'l', '-slt', '-sccUTF-8'] + args.append(self._get_password_argument()) + args.extend(('--', self.archive)) + return args + + def _get_extract_arguments(self, list_file=None): + args = [self._get_executable(), 'x', '-so', '-sccUTF-8'] + if list_file is not None: + args.append('-i@' + list_file) + args.append(self._get_password_argument()) + args.extend(('--', self.archive)) + return args + + def _parse_list_output_line(self, line): + """ Start parsing after the first delimiter (bunch of - characters), + and end when delimiters appear again. Format: + Date Time Attr Size Compressed Name""" + + if line.startswith('----------'): + if self._state == self.STATE_HEADER: + # First delimiter reached, start reading from next line. + self._state = self.STATE_LISTING + elif self._state == self.STATE_LISTING: + # Last delimiter read, stop reading from now on. + self._state = self.STATE_FOOTER + + return None + + if self._state == self.STATE_HEADER: + if re.match(r'^error:.+?can\s?not open encrypted archive\. wrong password\?$', line, + re.IGNORECASE): + self._is_encrypted = True + raise self.EncryptedHeader() + if 'Solid = +' == line: + self._is_solid = True + + if self._state == self.STATE_LISTING: + if line.startswith('Path = '): + self._path = line[7:] + return self._path + if line.startswith('Size = '): + filesize = int(line[7:]) + if filesize > 0: + self._contents.append((self._path, filesize)) + elif 'Encrypted = +' == line: + self._is_encrypted = True + + return None + + def is_solid(self): + return self._is_solid + + def iter_contents(self): + if not self._get_executable(): + return + + # We'll try at most 2 times: + # - the first time without a password + # - a second time with a password if the header is encrypted + for retry_count in range(2): + #: Indicates which part of the file listing has been read. + self._state = self.STATE_HEADER + #: Current path while listing contents. + self._path = None + proc = subprocess.run(self._get_list_arguments(), + stdout=subprocess.PIPE, stderr=process.STDOUT, encoding='utf-8') + try: + for line in proc.stdout.splitlines(): + filename = self._parse_list_output_line(line.rstrip(os.linesep)) + if filename is not None: + yield filename + except self.EncryptedHeader: + # The header is encrypted, try again + # if it was our first attempt. + if 0 == retry_count: + continue + # Last and/or successful attempt. + break + + self.filenames_initialized = True + + def extract(self, filename, destination_dir): + """ Extract from the archive to . """ + assert isinstance(filename, str) and \ + isinstance(destination_dir, str) + + if not self._get_executable(): + return + + if not self.filenames_initialized: + self.list_contents() + + tmplistfile = tempfile.NamedTemporaryFile(prefix='mcomix.7z.', delete=False) + try: + desired_filename = self._original_filename(filename) + if isinstance(desired_filename, str): + desired_filename = desired_filename.encode('utf-8') + + tmplistfile.write(desired_filename + os.linesep.encode('utf-8')) + tmplistfile.close() + + output = self._create_file(os.path.join(destination_dir, filename)) + try: + proc = subprocess.run( + self._get_extract_arguments(list_file=tmplistfile.name), + stdout=output, stderr=subprocess.PIPE, + creationflags=process._get_creationflags()) + + if len(proc.stderr) > 0: + log.error(_("Extraction of %(archivefile)s might have failed: %(error)s"), + {'archivefile': filename, 'error': proc.stderr.decode('utf-8')}) + finally: + output.close() + finally: + os.unlink(tmplistfile.name) + + def iter_extract(self, entries, destination_dir): + + if not self._get_executable(): + return + + if not self.filenames_initialized: + self.list_contents() + + proc = process.popen(self._get_extract_arguments()) + try: + wanted = set(entries) + for filename, filesize in self._contents: + data = proc.stdout.read(filesize) + if filename not in wanted: + continue + new = self._create_file(os.path.join(destination_dir, filename)) + new.write(data) + new.close() + yield filename + wanted.remove(filename) + if 0 == len(wanted): + break + + finally: + proc.stdout.close() + proc.wait() + + @staticmethod + def _find_7z_executable(): + """ Tries to start 7z, and returns either '7z' if + it was started successfully or None otherwise. """ + global _7z_executable + if _7z_executable == -1: + _7z_executable = process.find_executable(('7z',)) + return _7z_executable + + @staticmethod + def is_available(): + return bool(SevenZipArchive._find_7z_executable()) + + +class TarArchive(SevenZipArchive): + + '''Special class for handling tar archives. + + Needed because for XZ archives, the technical listing + does not contain the archive member name... + ''' + + def __init__(self, archive): + super(TarArchive, self).__init__(archive) + self._is_solid = True + self._is_encrypted = False + + def _get_extract_arguments(self, list_file=None): + # Note: we ignore the list_file argument, which + # contains our made up archive member name. + return super(TarArchive, self)._get_extract_arguments() + + def iter_contents(self): + if not self._get_executable(): + return + self._state = self.STATE_HEADER + # We make up a name that's guaranteed to be + # recognized as an archive by MComix. + self._path = 'archive.tar' + proc = process.popen(self._get_list_arguments(), stderr=process.STDOUT) + try: + for line in proc.stdout: + self._parse_list_output_line(line.rstrip(os.linesep)) + finally: + proc.stdout.close() + proc.wait() + if self._contents: + # The archive should not contain more than 1 member. + assert 1 == len(self._contents) + yield self._unicode_filename(self._path) + self.filenames_initialized = True + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/tar.py mcomix-2.1.0/mcomix/archive/tar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/tar.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/tar.py 2022-01-28 05:29:19.000000000 +0000 @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +""" Unicode-aware wrapper for tarfile.TarFile. """ + +import os +import tarfile +from . import archive_base + +class TarArchive(archive_base.NonUnicodeArchive): + def __init__(self, archive): + super(TarArchive, self).__init__(archive) + # Track if archive contents have been listed at least one time: this + # must be done before attempting to extract contents. + self._contents_listed = False + self._contents = [] + self.tar = None + + def is_solid(self): + return True + + def iter_contents(self): + if self._contents_listed: + for name in self._contents: + yield name + return + # Make sure we start back at the beginning of the tar. + self.tar = tarfile.open(self.archive, 'r') + self._contents = [] + while True: + info = self.tar.next() + if info is None: + break + name = self._unicode_filename(info.name) + self._contents.append(name) + yield name + self._contents_listed = True + + def list_contents(self): + return [f for f in self.iter_contents()] + + def extract(self, filename, destination_dir): + if not self._contents_listed: + self.list_contents() + new = self._create_file(os.path.join(destination_dir, filename)) + file_object = self.tar.extractfile(self._original_filename(filename)) + new.write(file_object.read()) + file_object.close() + new.close() + + def iter_extract(self, entries, destination_dir): + if not self._contents_listed: + self.list_contents() + for f in super(TarArchive, self).iter_extract(entries, destination_dir): + yield f + + def close(self): + if self.tar is not None: + self.tar.close() + self.tar = None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/zip_external.py mcomix-2.1.0/mcomix/archive/zip_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/zip_external.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/zip_external.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +""" ZIP archive extractor via executable.""" + +from mcomix import i18n +from mcomix import process +from mcomix.archive import archive_base + +# Filled on-demand by ZipArchive +_zip_executable = -1 + +class ZipArchive(archive_base.ExternalExecutableArchive): + """ ZIP file extractor using unzip executable. """ + + def _get_executable(self): + return ZipArchive._find_unzip_executable() + + def _get_list_arguments(self): + return ['-Z1'] + + def _get_extract_arguments(self): + return ['-p', '-P', ''] + + @staticmethod + def _find_unzip_executable(): + """ Tries to run unzip, and returns 'unzip' on success. + Returns None on failure. """ + global _zip_executable + if -1 == _zip_executable: + _zip_executable = process.find_executable(('unzip',)) + return _zip_executable + + @staticmethod + def is_available(): + return bool(ZipArchive._find_unzip_executable()) + + def _unicode_filename(self, filename, conversion_func=i18n.to_unicode): + unicode_name = conversion_func(filename) + safe_name = self._replace_invalid_filesystem_chars(unicode_name) + # As it turns out, unzip will try to interpret filenames as glob... + for c in '[*?': + filename = filename.replace(c, '[' + c + ']') + # Won't work on Windows... + filename = filename.replace('\\', '\\\\') + self.unicode_mapping[safe_name] = filename + return safe_name + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive/zip.py mcomix-2.1.0/mcomix/archive/zip.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive/zip.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive/zip.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +""" Unicode-aware wrapper for zipfile.ZipFile. """ + +import os +import zipfile +from contextlib import closing + +from mcomix import log +from mcomix import i18n +from mcomix.archive import archive_base + + +def is_py_supported_zipfile(path): + """Check if a given zipfile has all internal files stored with Python supported compression + """ + # Use contextlib's closing for 2.5 compatibility + with closing(zipfile.ZipFile(path, 'r')) as zip_file: + for file_info in zip_file.infolist(): + if file_info.compress_type not in (zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED): + return False + return True + +class ZipArchive(archive_base.NonUnicodeArchive): + def __init__(self, archive): + super(ZipArchive, self).__init__(archive) + self.zip = zipfile.ZipFile(archive, 'r') + + # Encryption is supported starting with Python 2.6 + self._encryption_supported = hasattr(self.zip, "setpassword") + self._password = None + + def iter_contents(self): + if self._encryption_supported and self._has_encryption(): + self._get_password() + self.zip.setpassword(i18n.to_utf8(self._password)) + + for filename in self.zip.namelist(): + yield self._unicode_filename(filename) + + def extract(self, filename, destination_dir): + new = self._create_file(os.path.join(destination_dir, filename)) + content = self.zip.read(self._original_filename(filename)) + new.write(content) + new.close() + + zipinfo = self.zip.getinfo(self._original_filename(filename)) + if len(content) != zipinfo.file_size: + log.warning(_('%(filename)s\'s extracted size is %(actual_size)d bytes,' + ' but should be %(expected_size)d bytes.' + ' The archive might be corrupt or in an unsupported format.'), + { 'filename' : filename, 'actual_size' : len(content), + 'expected_size' : zipinfo.file_size }) + + + + def close(self): + self.zip.close() + + def _has_encryption(self): + """ Checks all files in the archive for encryption. + Returns True if at least one encrypted file was found. """ + for zipinfo in self.zip.infolist(): + if zipinfo.flag_bits & 0x1: # File is encrypted + return True + + return False + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive_extractor.py mcomix-2.1.0/mcomix/archive_extractor.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive_extractor.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive_extractor.py 2022-01-25 11:23:29.000000000 +0000 @@ -0,0 +1,228 @@ +"""archive_extractor.py - Archive extraction class.""" + + +import os +import threading +import traceback + +from mcomix import archive_tools +from mcomix import callback +from mcomix import log +from mcomix.preferences import prefs +from mcomix.worker_thread import WorkerThread + +class Extractor(object): + + """Extractor is a threaded class for extracting different archive formats. + + The Extractor can be loaded with paths to archives and a path to a + destination directory. Once an archive has been set and its contents + listed, it is possible to filter out the files to be extracted and set the + order in which they should be extracted. The extraction can then be + started in a new thread in which files are extracted one by one, and a + signal is sent on a condition after each extraction, so that it is possible + for other threads to wait on specific files to be ready. + + Note: Support for gzip/bzip2 compressed tar archives is limited, see + set_files() for more info. + """ + + def __init__(self): + self._setupped = False + + def setup(self, src, dst, type=None): + """Setup the extractor with archive and destination dir . + Return a threading.Condition related to the is_ready() method, or + None if the format of isn't supported. + """ + self._src = src + self._dst = dst + self._files = [] + self._extracted = set() + self._archive = archive_tools.get_recursive_archive_handler(src, dst, type=type) + if self._archive is None: + msg = _('Non-supported archive format: %s') % os.path.basename(src) + log.warning(msg) + raise ArchiveException(msg) + + self._contents_listed = False + self._extract_started = False + self._condition = threading.Condition() + self._list_thread = WorkerThread(self._list_contents, name='list') + self._list_thread.append_order(self._archive) + self._setupped = True + + return self._condition + + def get_files(self): + """Return a list of names of all the files the extractor is currently + set for extracting. After a call to setup() this is by default all + files found in the archive. The paths in the list are relative to + the archive root and are not absolute for the files once extracted. + """ + with self._condition: + if not self._contents_listed: + return + return self._files[:] + + def get_directory(self): + """Returns the root extraction directory of this extractor.""" + return self._dst + + def set_files(self, files): + """Set the files that the extractor should extract from the archive in + the order of extraction. Normally one would get the list of all files + in the archive using get_files(), then filter and/or permute this + list before sending it back using set_files(). + + Note: Random access on gzip or bzip2 compressed tar archives is + no good idea. These formats are supported *only* for backwards + compability. They are fine formats for some purposes, but should + not be used for scanned comic books. So, we cheat and ignore the + ordering applied with this method on such archives. + """ + with self._condition: + if not self._contents_listed: + return + self._files = [f for f in files if f not in self._extracted] + if not self._files: + # Nothing to do! + return + if self._extract_started: + self.extract() + + def is_ready(self, name): + """Return True if the file in the extractor's file list + (as set by set_files()) is fully extracted. + """ + with self._condition: + return name in self._extracted + + def stop(self): + """Signal the extractor to stop extracting and kill the extracting + thread. Blocks until the extracting thread has terminated. + """ + if self._setupped: + self._list_thread.stop() + if self._extract_started: + self._extract_thread.stop() + self._extract_started = False + self.setupped = False + + def extract(self): + """Start extracting the files in the file list one by one using a + new thread. Every time a new file is extracted a notify() will be + signalled on the Condition that was returned by setup(). + """ + with self._condition: + if not self._contents_listed: + return + if not self._extract_started: + if self._archive.support_concurrent_extractions \ + and not self._archive.is_solid(): + max_threads = prefs['max extract threads'] + else: + max_threads = 1 + if self._archive.is_solid(): + fn = self._extract_all_files + else: + fn = self._extract_file + self._extract_thread = WorkerThread(fn, + name='extract', + max_threads=max_threads, + unique_orders=True) + self._extract_started = True + else: + self._extract_thread.clear_orders() + if self._archive.is_solid(): + # Sort files so we don't queue the same batch multiple times. + self._extract_thread.append_order(sorted(self._files)) + else: + self._extract_thread.extend_orders(self._files) + + @callback.Callback + def contents_listed(self, extractor, files): + """ Called after the contents of the archive has been listed. """ + pass + + @callback.Callback + def file_extracted(self, extractor, filename): + """ Called whenever a new file is extracted and ready. """ + pass + + def close(self): + """Close any open file objects, need only be called manually if the + extract() method isn't called. + """ + self.stop() + if self._archive: + self._archive.close() + + def _extraction_finished(self, name): + with self._condition: + self._files.remove(name) + self._extracted.add(name) + self._condition.notifyAll() + self.file_extracted(self, name) + + def _extract_all_files(self, files): + + # With multiple extractions for each pass, some of the files might have + # already been extracted. + with self._condition: + files = list(set(files) - self._extracted) + files.sort() + + try: + log.debug('Extracting from "%s" to "%s": "%s"', self._src, self._dst, '", "'.join(files)) + for f in self._archive.iter_extract(files, self._dst): + if self._extract_thread.must_stop(): + return + self._extraction_finished(f) + + except Exception as ex: + # Better to ignore any failed extractions (e.g. from a corrupt + # archive) than to crash here and leave the main thread in a + # possible infinite block. Damaged or missing files *should* be + # handled gracefully by the main program anyway. + log.error(_('! Extraction error: %s'), ex) + log.debug('Traceback:\n%s', traceback.format_exc()) + + def _extract_file(self, name): + """Extract the file named to the destination directory, + mark the file as "ready", then signal a notify() on the Condition + returned by setup(). + """ + + try: + log.debug('Extracting from "%s" to "%s": "%s"', self._src, self._dst, name) + self._archive.extract(name, self._dst) + + except Exception as ex: + # Better to ignore any failed extractions (e.g. from a corrupt + # archive) than to crash here and leave the main thread in a + # possible infinite block. Damaged or missing files *should* be + # handled gracefully by the main program anyway. + log.error(_('! Extraction error: %s'), ex) + log.debug('Traceback:\n%s', traceback.format_exc()) + + if self._extract_thread.must_stop(): + return + self._extraction_finished(name) + + def _list_contents(self, archive): + files = [] + for f in archive.iter_contents(): + if self._list_thread.must_stop(): + return + files.append(f) + with self._condition: + self._files = files + self._contents_listed = True + self.contents_listed(self, files) + +class ArchiveException(Exception): + """ Indicate error during extraction operations. """ + pass + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive_packer.py mcomix-2.1.0/mcomix/archive_packer.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive_packer.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive_packer.py 2022-01-23 07:07:18.000000000 +0000 @@ -0,0 +1,116 @@ +"""archive_packer.py - Archive creation class.""" + +import os +import zipfile +import threading + +from mcomix import log + +class Packer(object): + + """Packer is a threaded class for packing files into ZIP archives. + + It would be straight-forward to add support for more archive types, + but basically all other types are less well fitted for this particular + task than ZIP archives are (yes, really). + """ + + def __init__(self, image_files, other_files, archive_path, base_name): + """Setup a Packer object to create a ZIP archive at . + All files pointed to by paths in the sequences and + will be included in the archive when packed. + + The files in will be renamed on the form + "NN - .ext", so that the lexical ordering of their + filenames match that of their order in the list. + + The files in will be included as they are, + assuming their filenames does not clash with other filenames in + the archive. All files are placed in the archive root. + """ + self._image_files = image_files + self._other_files = other_files + self._archive_path = archive_path + self._base_name = base_name + self._pack_thread = None + self._packing_successful = False + + def pack(self): + """Pack all the files in the file lists into the archive.""" + self._pack_thread = threading.Thread(target=self._thread_pack) + self._pack_thread.name += '-pack' + self._pack_thread.setDaemon(False) + self._pack_thread.start() + + def wait(self): + """Block until the packer thread has finished. Return True if the + packer finished its work successfully. + """ + if self._pack_thread != None: + self._pack_thread.join() + + return self._packing_successful + + def _thread_pack(self): + try: + zfile = zipfile.ZipFile(self._archive_path, 'w') + except Exception: + log.error(_('! Could not create archive at path "%s"'), + self._archive_path) + return + + used_names = [] + pattern = '%%0%dd - %s%%s' % (len(str(len(self._image_files))), + self._base_name) + + for i, path in enumerate(self._image_files): + filename = pattern % (i + 1, os.path.splitext(path)[1]) + + try: + zfile.write(path, filename, zipfile.ZIP_STORED) + except Exception: + log.error(_('! Could not add file %(sourcefile)s ' + 'to archive %(archivefile)s, aborting...'), + { "sourcefile" : path, + "archivefile" : self._archive_path}) + + zfile.close() + + try: + os.remove(self._archive_path) + except: + pass + + return + + used_names.append(filename) + + for path in self._other_files: + filename = os.path.basename(path) + + while filename in used_names: + filename = '_%s' % filename + + try: + zfile.write(path, filename, zipfile.ZIP_DEFLATED) + except Exception: + log.error(_('! Could not add file %(sourcefile)s ' + 'to archive %(archivefile)s, aborting...'), + { "sourcefile" : path, + "archivefile" : self._archive_path}) + + zfile.close() + + try: + os.remove(self._archive_path) + except: + pass + + return + + used_names.append(filename) + + zfile.close() + self._packing_successful = True + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/archive_tools.py mcomix-2.1.0/mcomix/archive_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/archive_tools.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/archive_tools.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,226 @@ +"""archive_tools.py - Archive tool functions.""" + +import os +import shutil +import zipfile +import tarfile +import tempfile + +from mcomix import image_tools +from mcomix import constants +from mcomix import log +from mcomix.archive import ( + lha_external, + pdf_external, + rar, + rar_external, + sevenzip_external, + tar, + zip, + zip_external, +) +from mcomix import tools + +# Handlers for each archive type. +_HANDLERS = { + constants.ZIP: ( + zip.ZipArchive, + ), + # Prefer 7z over zip executable for encryption and Unicode support. + constants.ZIP_EXTERNAL: ( + sevenzip_external.SevenZipArchive, + zip_external.ZipArchive + ), + constants.TAR: ( + tar.TarArchive, + ), + constants.GZIP: ( + tar.TarArchive, + ), + constants.BZIP2: ( + tar.TarArchive, + ), + constants.XZ: ( + # No LZMA support in Python 2 tarfile module. + sevenzip_external.TarArchive, + ), + constants.RAR: ( + rar.RarArchive, + rar_external.RarArchive, + # Last resort: some versions of 7z support RAR. + sevenzip_external.SevenZipArchive, + ), + # Prefer 7z over lha executable for Unicode support. + constants.LHA: ( + sevenzip_external.SevenZipArchive, + lha_external.LhaArchive, + ), + constants.SEVENZIP: ( + sevenzip_external.SevenZipArchive, + ), + constants.PDF: ( + pdf_external.PdfArchive, + ), +} + +def _get_handler(archive_type): + """ Return best archive class for format """ + + for handler in _HANDLERS[archive_type]: + if not hasattr(handler, 'is_available'): + return handler + if handler.is_available(): + return handler + +def _is_available(archive_type): + """ Return True if a handler supporting the format is available """ + return _get_handler(archive_type) is not None + +def szip_available(): + return _is_available(constants.SEVENZIP) + +def rar_available(): + return _is_available(constants.RAR) + +def lha_available(): + return _is_available(constants.LHA) + +def pdf_available(): + return _is_available(constants.PDF) + +def get_supported_formats(): + global _SUPPORTED_ARCHIVE_FORMATS + if _SUPPORTED_ARCHIVE_FORMATS is None: + supported_formats = {} + for name, formats, is_available in ( + ('ZIP', constants.ZIP_FORMATS , True ), + ('Tar', constants.TAR_FORMATS , True ), + ('RAR', constants.RAR_FORMATS , rar_available() ), + ('7z' , constants.SZIP_FORMATS, szip_available()), + ('LHA', constants.LHA_FORMATS , lha_available() ), + ('PDF', constants.PDF_FORMATS , pdf_available() ), + ): + if is_available: + supported_formats[name] = (set(formats[0]), set(formats[1])) + _SUPPORTED_ARCHIVE_FORMATS = supported_formats + return _SUPPORTED_ARCHIVE_FORMATS + +_SUPPORTED_ARCHIVE_FORMATS = None +# Set supported archive extensions regexp from list of supported formats. +# Only used internally. +_SUPPORTED_ARCHIVE_REGEX = tools.formats_to_regex(get_supported_formats()) +log.debug("_SUPPORTED_ARCHIVE_REGEX='%s'", _SUPPORTED_ARCHIVE_REGEX.pattern) + +def is_archive_file(path): + """Return True if the file at is a supported archive file. + """ + return _SUPPORTED_ARCHIVE_REGEX.search(path) is not None + +def archive_mime_type(path): + """Return the archive type of or None for non-archives.""" + try: + + if os.path.isfile(path): + + if not os.access(path, os.R_OK): + return None + + if zipfile.is_zipfile(path): + if zip.is_py_supported_zipfile(path): + return constants.ZIP + else: + return constants.ZIP_EXTERNAL + + fd = open(path, 'rb') + magic = fd.read(5) + fd.close() + + try: + istarfile = tarfile.is_tarfile(path) + except IOError: + # Tarfile raises an error when accessing certain network shares + istarfile = False + + if istarfile and os.path.getsize(path) > 0: + if magic.startswith(b'BZh'): + return constants.BZIP2 + elif magic.startswith(b'\037\213'): + return constants.GZIP + else: + return constants.TAR + + if magic[0:4] == b'Rar!': + return constants.RAR + + if magic[0:4] == b'7z\xBC\xAF': + return constants.SEVENZIP + + # Headers for TAR-XZ and TAR-LZMA that aren't supported by tarfile + if magic[0:5] == b'\xFD7zXZ' or magic[0:5] == b']\x00\x00\x80\x00': + return constants.XZ + + if magic[2:4] == b'-l': + return constants.LHA + + if magic[0:4] == b'%PDF': + return constants.PDF + + except Exception: + log.warning(_('! Could not read %s'), path) + + return None + +def get_archive_info(path): + """Return a tuple (mime, num_pages, size) with info about the archive + at , or None if doesn't point to a supported + """ + cleanup = [] + try: + tmpdir = tempfile.mkdtemp(prefix='mcomix_archive_info.') + cleanup.append(lambda: shutil.rmtree(tmpdir, True)) + + mime = archive_mime_type(path) + archive = get_recursive_archive_handler(path, tmpdir, type=mime) + if archive is None: + return None + cleanup.append(archive.close) + + files = archive.list_contents() + num_pages = len(list(filter(image_tools.is_image_file, files))) + size = os.stat(path).st_size + + return (mime, num_pages, size) + finally: + for fn in reversed(cleanup): + fn() + +def get_archive_handler(path, mimetype=None): + """ Returns a fitting extractor handler for the archive passed + in (with optional mime type . Returns None if no matching + extractor was found. + """ + if mimetype is None: + mimetype = archive_mime_type(path) + if mimetype is None: + return None + + handler = _get_handler(mimetype) + if handler is None: + return None + + log.debug('Archive handler %(handler)s for archive "%(archivename)s" was selected.', + {'handler': handler.__name__, 'archivename': os.path.split(path)[1]}) + return handler(path) + +def get_recursive_archive_handler(path, destination_dir, type=None): + """ Same as but the handler will transparently handle + archives within archives. + """ + archive = get_archive_handler(path, mimetype=type) + if archive is None: + return None + # XXX: Deferred import to avoid circular dependency + from mcomix.archive import archive_recursive + return archive_recursive.RecursiveArchive(archive, destination_dir) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_backend.py mcomix-2.1.0/mcomix/bookmark_backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_backend.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/bookmark_backend.py 2022-01-25 19:16:28.000000000 +0000 @@ -0,0 +1,225 @@ +"""bookmark_backend.py - Bookmarks handler.""" + +import os +import pickle +from gi.repository import Gtk +import operator +import datetime +import time + +from mcomix import constants +from mcomix import log +from mcomix import bookmark_menu_item +from mcomix import callback +from mcomix import i18n +from mcomix import message_dialog + +class __BookmarksStore(object): + + """The _BookmarksStore is a backend for both the bookmarks menu and dialog. + Changes in the _BookmarksStore are mirrored in both. + """ + + def __init__(self): + self._initialized = False + self._window = None + self._file_handler = None + self._image_handler = None + + bookmarks, mtime = self.load_bookmarks() + + #: List of bookmarks + self._bookmarks = bookmarks + #: Modification date of bookmarks file + self._bookmarks_mtime = mtime + + def initialize(self, window): + """ Initializes references to the main window and file/image handlers. """ + if not self._initialized: + self._window = window + self._file_handler = window.filehandler + self._image_handler = window.imagehandler + self._initialized = True + + # Update already loaded bookmarks with window and file handler information + for bookmark in self._bookmarks: + bookmark._window = window + bookmark._file_handler = window.filehandler + + def add_bookmark_by_values(self, name, path, page, numpages, archive_type, date_added): + """Create a bookmark and add it to the list.""" + bookmark = bookmark_menu_item._Bookmark(self._window, self._file_handler, + name, path, page, numpages, archive_type, date_added) + + self.add_bookmark(bookmark) + + @callback.Callback + def add_bookmark(self, bookmark): + """Add the to the list.""" + self._bookmarks.append(bookmark) + self.write_bookmarks_file() + + @callback.Callback + def remove_bookmark(self, bookmark): + """Remove the from the list.""" + self._bookmarks.remove(bookmark) + self.write_bookmarks_file() + + def add_current_to_bookmarks(self): + """Add the currently viewed page to the list.""" + name = self._image_handler.get_pretty_current_filename() + path = self._image_handler.get_real_path() + page = self._image_handler.get_current_page() + numpages = self._image_handler.get_number_of_pages() + archive_type = self._file_handler.archive_type + date_added = datetime.datetime.now() + + same_file_bookmarks = [] + + for bookmark in self._bookmarks: + if bookmark.same_path(path): + if bookmark.same_page(page): + # Do not create identical bookmarks + return + else: + same_file_bookmarks.append(bookmark) + + # If the same file was already bookmarked, ask to replace + # the existing bookmarks before deleting them. + if len(same_file_bookmarks) > 0: + response = self.show_replace_bookmark_dialog(same_file_bookmarks, page) + + # Delete old bookmarks + if response == Gtk.ResponseType.YES: + for bookmark in same_file_bookmarks: + self.remove_bookmark(bookmark) + # Perform no action + elif response not in (Gtk.ResponseType.YES, Gtk.ResponseType.NO): + return + + self.add_bookmark_by_values(name, path, page, numpages, + archive_type, date_added) + + def clear_bookmarks(self): + """Remove all bookmarks from the list.""" + + while not self.is_empty(): + self.remove_bookmark(self._bookmarks[-1]) + + def get_bookmarks(self): + """Return all the bookmarks in the list.""" + if not self.file_was_modified(): + return self._bookmarks + else: + self._bookmarks, self._bookmarks_mtime = self.load_bookmarks() + return self._bookmarks + + def is_empty(self): + """Return True if the bookmark list is empty.""" + return len(self._bookmarks) == 0 + + def load_bookmarks(self): + """ Loads persisted bookmarks from a local file. + @return: Tuple of (bookmarks, file mtime) + """ + + path = constants.BOOKMARK_PICKLE_PATH + bookmarks = [] + mtime = 0 + + if os.path.isfile(path): + fd = None + try: + mtime = int(os.stat(path).st_mtime) + fd = open(path, 'rb') + version = pickle.load(fd) + packs = pickle.load(fd) + + for pack in packs: + # Handle old bookmarks without date_added attribute + if len(pack) == 5: + pack = pack + (datetime.datetime.now(),) + + bookmark = bookmark_menu_item._Bookmark(self._window, + self._file_handler, *pack) + bookmarks.append(bookmark) + + except Exception: + log.error(_('! Could not parse bookmarks file %s'), path) + finally: + try: + if fd: + fd.close() + except IOError: + pass + + return bookmarks, mtime + + def file_was_modified(self): + """ Checks the bookmark store's mtime to see if it has been modified + since it was last read. """ + path = constants.BOOKMARK_PICKLE_PATH + if os.path.isfile(path): + try: + mtime = int(os.stat(path).st_mtime) + except IOError: + mtime = 0 + + if mtime > self._bookmarks_mtime: + return True + else: + return False + else: + return True + + def write_bookmarks_file(self): + """Store relevant bookmark info in the mcomix directory.""" + + # Merge changes in case file was modified from within other instances + if self.file_was_modified(): + new_bookmarks, _ = self.load_bookmarks() + self._bookmarks = list(set(self._bookmarks + new_bookmarks)) + + fd = open(constants.BOOKMARK_PICKLE_PATH, 'wb') + pickle.dump(constants.VERSION, fd, pickle.HIGHEST_PROTOCOL) + + packs = [bookmark.pack() for bookmark in self._bookmarks] + pickle.dump(packs, fd, pickle.HIGHEST_PROTOCOL) + fd.close() + + self._bookmarks_mtime = int(time.time()) + + + def show_replace_bookmark_dialog(self, old_bookmarks, new_page): + """ Present a confirmation dialog to replace old bookmarks. + @return RESPONSE_YES to create replace bookmarks, + RESPONSE_NO to create a new bookmark, RESPONSE_CANCEL to abort creating + a new bookmark. """ + dialog = message_dialog.MessageDialog(self._window, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO) + dialog.add_buttons(Gtk.STOCK_YES, Gtk.ResponseType.YES, + Gtk.STOCK_NO, Gtk.ResponseType.NO, + Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) + dialog.set_default_response(Gtk.ResponseType.YES) + dialog.set_should_remember_choice('replace-existing-bookmark', + (Gtk.ResponseType.YES, Gtk.ResponseType.NO)) + + pages = list(map(str, sorted(map(operator.attrgetter('_page'), old_bookmarks)))) + dialog.set_text( + i18n.get_translation().ngettext( + 'Replace existing bookmark on page %s?', + 'Replace existing bookmarks on pages %s?', + len(pages) + ) % ", ".join(pages), + + _('The current book already contains marked pages. ' + 'Do you want to replace them with a new bookmark on page %d?') % new_page + + '\n\n' + + _('Selecting "No" will create a new bookmark without affecting the other bookmarks.')) + + return dialog.run() + + +# Singleton instance of the bookmarks store. +BookmarksStore = __BookmarksStore() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_dialog.py mcomix-2.1.0/mcomix/bookmark_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/bookmark_dialog.py 2022-12-17 11:34:07.000000000 +0000 @@ -0,0 +1,190 @@ +"""bookmark_dialog.py - Bookmarks dialog handler.""" + +from gi.repository import Gdk, GdkPixbuf, Gtk, GObject + +from mcomix import constants +from mcomix import bookmark_menu_item +from mcomix import tools + +class _BookmarksDialog(Gtk.Dialog): + + """_BookmarksDialog lets the user remove or rearrange bookmarks.""" + + _SORT_TYPE, _SORT_NAME, _SORT_PAGE, _SORT_ADDED = 100, 101, 102, 103 + + def __init__(self, window, bookmarks_store): + super(_BookmarksDialog, self).__init__(_('Edit Bookmarks'), window, Gtk.DialogFlags.DESTROY_WITH_PARENT, + (Gtk.STOCK_REMOVE, constants.RESPONSE_REMOVE, + Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) + + self._bookmarks_store = bookmarks_store + + self.set_resizable(True) + self.set_default_response(Gtk.ResponseType.CLOSE) + # scroll area fill to the edge (TODO window should not really be a dialog) + self.set_border_width(0) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_border_width(0) + scrolled.set_shadow_type(Gtk.ShadowType.IN) + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self.vbox.pack_start(scrolled, True, True, 0) + + self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, GObject.TYPE_STRING, + GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, bookmark_menu_item._Bookmark) + + self._treeview = Gtk.TreeView(self._liststore) + self._treeview.set_rules_hint(True) + self._treeview.set_reorderable(True) + # search by typing first few letters of name + self._treeview.set_search_column(1) + self._treeview.set_enable_search(True) + self._treeview.set_headers_clickable(True) + self._selection = self._treeview.get_selection() + + scrolled.add(self._treeview) + + cellrenderer_text = Gtk.CellRendererText() + cellrenderer_pbuf = Gtk.CellRendererPixbuf() + + self._icon_col = Gtk.TreeViewColumn(_('Type'), cellrenderer_pbuf) + self._name_col = Gtk.TreeViewColumn(_('Name'), cellrenderer_text) + self._page_col = Gtk.TreeViewColumn(_('Page'), cellrenderer_text) + self._path_col = Gtk.TreeViewColumn(_('Location'), cellrenderer_text) + # TRANSLATORS: "Added" as in "Date Added" + self._date_add_col = Gtk.TreeViewColumn(_('Added'), cellrenderer_text) + + self._treeview.append_column(self._icon_col) + self._treeview.append_column(self._name_col) + self._treeview.append_column(self._page_col) + self._treeview.append_column(self._path_col) + self._treeview.append_column(self._date_add_col) + + self._icon_col.set_attributes(cellrenderer_pbuf, pixbuf=0) + self._name_col.set_attributes(cellrenderer_text, text=1) + self._page_col.set_attributes(cellrenderer_text, text=2) + self._path_col.set_attributes(cellrenderer_text, text=3) + self._date_add_col.set_attributes(cellrenderer_text, text=4) + self._name_col.set_expand(True) + + self._liststore.set_sort_func(_BookmarksDialog._SORT_TYPE, + self._sort_model, ('_archive_type', '_name', '_page')) + self._liststore.set_sort_func(_BookmarksDialog._SORT_NAME, + self._sort_model, ('_name', '_page', '_path')) + self._liststore.set_sort_func(_BookmarksDialog._SORT_PAGE, + self._sort_model, ('_page', '_numpages', '_name')) + self._liststore.set_sort_func(_BookmarksDialog._SORT_ADDED, + self._sort_model, ('_date_added',)) + + self._icon_col.set_sort_column_id(_BookmarksDialog._SORT_TYPE) + self._name_col.set_sort_column_id(_BookmarksDialog._SORT_NAME) + self._page_col.set_sort_column_id(_BookmarksDialog._SORT_PAGE) + self._path_col.set_sort_column_id(3) + self._date_add_col.set_sort_column_id(_BookmarksDialog._SORT_ADDED) + + self._icon_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + self._name_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + self._page_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + self._path_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + self._date_add_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + + # FIXME Hide extra columns. Needs UI controls to enable these. + self._path_col.set_visible(False) + + self.resize(600, 450) + + self.connect('response', self._response) + self.connect('delete_event', self._close) + + self._treeview.connect('key_press_event', self._key_press_event) + self._treeview.connect('row_activated', self._bookmark_activated) + + for bookmark in self._bookmarks_store.get_bookmarks(): + self._add_bookmark(bookmark) + + self.show_all() + + def _add_bookmark(self, bookmark): + """Add the to the dialog.""" + self._liststore.prepend(bookmark.to_row()) + + def _remove_selected(self): + """Remove the currently selected bookmark from the dialog and from + the store.""" + + treeiter = self._selection.get_selected()[1] + + if treeiter is not None: + + bookmark = self._liststore.get_value(treeiter, 5) + self._liststore.remove(treeiter) + self._bookmarks_store.remove_bookmark(bookmark) + + def _bookmark_activated(self, treeview, path, view_column, *args): + """ Open the activated bookmark. """ + + iter = treeview.get_model().get_iter(path) + bookmark = treeview.get_model().get_value(iter, 5) + + self._close() + bookmark._load() + + def _sort_model(self, treemodel, iter1, iter2, user_data): + """ Custom sort function to sort to model entries based on the + BookmarkMenuItem's fields specified in @C{user_data}. This is a list + of field names. """ + if iter1 == iter2: + return 0 + if iter1 is None: + return 1 + elif iter2 is None: + return -1 + + bookmark1 = treemodel.get_value(iter1, 5) + bookmark2 = treemodel.get_value(iter2, 5) + + for field in user_data: + result = tools.cmp(getattr(bookmark1, field), + getattr(bookmark2, field)) + if result != 0: + return result + + # If the loop didn't return, both entries are equal. + return 0 + + def _response(self, dialog, response): + + if response == Gtk.ResponseType.CLOSE: + self._close() + + elif response == constants.RESPONSE_REMOVE: + self._remove_selected() + + else: + self.destroy() + + def _key_press_event(self, dialog, event, *args): + + if event.keyval == Gdk.KEY_Delete: + self._remove_selected() + + def _close(self, *args): + """Close the dialog and update the _BookmarksStore with the new + ordering.""" + + ordering = [] + treeiter = self._liststore.get_iter_first() + + while treeiter is not None: + bookmark = self._liststore.get_value(treeiter, 5) + ordering.insert(0, bookmark) + treeiter = self._liststore.iter_next(treeiter) + + for bookmark in ordering: + self._bookmarks_store.remove_bookmark(bookmark) + self._bookmarks_store.add_bookmark(bookmark) + + self.destroy() + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_menu_item.py mcomix-2.1.0/mcomix/bookmark_menu_item.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_menu_item.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/bookmark_menu_item.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,98 @@ +"""bookmark_menu_item.py - A signle bookmark item.""" + +from gi.repository import Gtk + +class _Bookmark(Gtk.ImageMenuItem): + + """_Bookmark represents one bookmark. It extends the Gtk.ImageMenuItem + and is thus put directly in the bookmarks menu. + """ + + def __init__(self, window, file_handler, name, path, page, numpages, archive_type, date_added): + + self._name = name + self._path = path + self._page = page + self._numpages = numpages + self._window = window + self._archive_type = archive_type + self._file_handler = file_handler + self._date_added = date_added + + super(_Bookmark, self).__init__(str(self), False) + + if self._archive_type is not None: + im = Gtk.Image.new_from_stock('mcomix-archive', Gtk.IconSize.MENU) + + else: + im = Gtk.Image.new_from_stock('mcomix-image', Gtk.IconSize.MENU) + + self.set_image(im) + self.connect('activate', self._load) + + def __str__(self): + return '%s, (%d / %d)' % (self._name, self._page, self._numpages) + + def _load(self, *args): + """Open the file and page the bookmark represents.""" + + if self._file_handler._base_path != self._path: + self._file_handler.open_file(self._path, self._page) + else: + self._window.set_page(self._page) + + self._window.toolbar.hide() + self._window.toolbar.show() + + def same_path(self, path): + """Return True if the bookmark is for the file .""" + return path == self._path + + def same_page(self, page): + """Return True if the bookmark is for the same page.""" + return page == self._page + + def to_row(self): + """Return a tuple corresponding to one row in the _BookmarkDialog's + ListStore. + """ + stock = self.get_image().get_stock() + pixbuf = self.render_icon(*stock) + page = '%d / %d' % (self._page, self._numpages) + date = self._date_added.strftime("%x %X") + + return (pixbuf, self._name, page, self._path, date, self) + + def pack(self): + """Return a tuple suitable for pickling. The bookmark can be fully + re-created using the values in the tuple. + """ + return (self._name, self._path, self._page, self._numpages, + self._archive_type, self._date_added) + + def clone(self): + """ Creates a copy of the provided Bookmark menu item. This is necessary + since one bookmark item cannot be anchored in more than one menu. There are, + however, at least two: The main menu and the popup menu. """ + return _Bookmark( + self._window, + self._file_handler, + self._name, + self._path, + self._page, + self._numpages, + self._archive_type, + self._date_added) + + def __eq__(self, other): + """ Equality comparison for Bookmark items. """ + if isinstance(other, _Bookmark): + return self._path == other._path and self._page == other._page + else: + return False + + def __hash__(self): + """ Hash for this object. """ + return hash(self._path) | hash(self._page) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_menu.py mcomix-2.1.0/mcomix/bookmark_menu.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/bookmark_menu.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/bookmark_menu.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,85 @@ +"""bookmark_menu.py - Bookmarks menu.""" + +from gi.repository import Gtk + +from mcomix import bookmark_backend +from mcomix import bookmark_dialog + +class BookmarksMenu(Gtk.Menu): + + """BookmarksMenu extends Gtk.Menu with convenience methods relating to + bookmarks. It contains fixed items for adding bookmarks etc. as well + as dynamic items corresponding to the current bookmarks. + """ + + def __init__(self, ui, window): + super(BookmarksMenu, self).__init__() + + self._window = window + self._bookmarks_store = bookmark_backend.BookmarksStore + self._bookmarks_store.initialize(window) + + self._actiongroup = Gtk.ActionGroup('mcomix-bookmarks') + self._actiongroup.add_actions([ + ('add_bookmark', 'mcomix-add-bookmark', _('Add _Bookmark'), + 'D', None, self._add_current_to_bookmarks), + ('edit_bookmarks', None, _('_Edit Bookmarks...'), + 'B', None, self._edit_bookmarks)]) + + action = self._actiongroup.get_action('add_bookmark') + action.set_accel_group(ui.get_accel_group()) + self.add_button = action.create_menu_item() + self.append(self.add_button) + + action = self._actiongroup.get_action('edit_bookmarks') + action.set_accel_group(ui.get_accel_group()) + self.edit_button = action.create_menu_item() + self.append(self.edit_button) + + # Re-create the bookmarks menu if one was added/removed + self._create_bookmark_menuitems() + self._bookmarks_store.add_bookmark += lambda bookmark: self._create_bookmark_menuitems() + self._bookmarks_store.remove_bookmark += lambda bookmark: self._create_bookmark_menuitems() + + self.show_all() + + def _create_bookmark_menuitems(self): + # Delete all old menu entries + for item in self.get_children(): + if item not in (self.add_button, self.edit_button): + self.remove(item) + + bookmarks = self._bookmarks_store.get_bookmarks() + + # Add separator + if bookmarks: + separator = Gtk.SeparatorMenuItem() + separator.show() + self.append(separator) + + # Add new bookmarks + for bookmark in bookmarks: + self.add_bookmark(bookmark) + + def add_bookmark(self, bookmark): + """Add to the menu.""" + bookmark = bookmark.clone() + bookmark.show() + self.insert(bookmark, 3) + + def _add_current_to_bookmarks(self, *args): + """Add the current page to the bookmarks list.""" + self._bookmarks_store.add_current_to_bookmarks() + + def _edit_bookmarks(self, *args): + """Open the bookmarks dialog.""" + bookmark_dialog._BookmarksDialog(self._window, self._bookmarks_store) + + def set_sensitive(self, loaded): + """Set the sensitivities of menu items as appropriate if + represents whether a file is currently loaded in the main program + or not. + """ + self._actiongroup.get_action('add_bookmark').set_sensitive(loaded) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/box.py mcomix-2.1.0/mcomix/box.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/box.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/box.py 2022-01-23 12:13:58.000000000 +0000 @@ -0,0 +1,355 @@ +""" Hyperrectangles. """ + +from mcomix import tools + + +class Box(object): + + def __init__(self, size, position=None): + """ A Box is immutable and always axis-aligned. + Each component of size should be positive (i.e. non-zero). + Both position and size must have equal number of dimensions. + If there is only one argument, it must be the size. In this case, the + position is set to origin (i.e. all coordinates are 0) by definition. + @param size: The size of this Box. + @param position: The position of this Box.""" + if position is None: + self.position = (0,) * len(size) + else: + self.position = tuple(position) + self.size = tuple(size) + if len(self.position) != len(self.size): + raise ValueError("different number of dimensions: " + + str(len(self.position)) + " != " + str(len(self.size))) + + + def __str__(self): + """ Returns a string representation of this Box. """ + return "{" + str(self.get_position()) + ":" + str(self.get_size()) + "}" + + + def __eq__(self, other): + """ Two Boxes are said to be equal if and only if the number of + dimensions, the positions and the sizes of the two Boxes are equal, + respectively. """ + return (self.get_position() == other.get_position()) and \ + (self.get_size() == other.get_size()) + + + def __len__(self): + """ Returns the number of dimensions of this Box. """ + return len(self.position) + + + def get_size(self): + """ Returns the size of this Box. + @return: The size of this Box. """ + return self.size + + + def get_position(self): + """ Returns the position of this Box. + @return: The position of this Box. """ + return self.position + + + def set_position(self, position): + """ Returns a new Box that has the same size as this Box and the + specified position. + @return: A new Box as specified above. """ + return Box(self.get_size(), position) + + + def set_size(self, size): + """ Returns a new Box that has the same position as this Box and the + specified size. + @return: A new Box as specified above. """ + return Box(size, self.get_position()) + + + def distance_point_squared(self, point): + """ Returns the square of the Euclidean distance between this Box and a + point. If the point lies within the Box, this Box is said to have a + distance of zero. Otherwise, the square of the Euclidean distance + between point and the closest point of the Box is returned. + @param point: The point of interest. + @return The distance between the point and the Box as specified above. + """ + result = 0 + for i in range(len(point)): + p = point[i] + bs = self.position[i] + be = self.size[i] + bs + if p < bs: + r = bs - p + elif p >= be: + r = p - be + 1 + else: + continue + result += r * r + return result + + + def translate(self, delta): + """ Returns a new Box that has the same size as this Box and a + translated position as specified by delta. + @param delta: The distance to the position of this Box. + @return: A new Box as specified above. """ + return Box(self.get_size(), + tools.vector_add(self.get_position(), delta)) + + + def translate_opposite(self, delta): + """ Returns a new Box that has the same size as this Box and a + oppositely translated position as specified by delta. + @param delta: The distance to the position of this Box, with opposite + direction. + @return: A new Box as specified above. """ + return Box(self.get_size(), + tools.vector_sub(self.get_position(), delta)) + + + @staticmethod + def closest_boxes(point, boxes, orientation=None): + """ Returns the indices of the Boxes that are closest to the specified + point. First, the Euclidean distance between point and the closest point + of the respective Box is used to determine which of these Boxes are the + closest ones. If two Boxes have the same distance, the Box that is + closer to the origin as defined by orientation is said to have a shorter + distance. + @param point: The point of interest. + @param boxes: A list of Boxes. + @param orientation: The orientation which shows where "forward" points + to. Either 1 (towards larger values in this dimension when reading) or + -1 (towards smaller values in this dimension when reading). If + orientation is set to None, it will be ignored. + @return The indices of the closest Boxes as specified above. """ + result = [] + mindist = -1 + for i in range(len(boxes)): + # 0 --> keep + # 1 --> append + # 2 --> replace + keep_append_replace = 0 + b = boxes[i] + dist = b.distance_point_squared(point) + if (result == []) or (dist < mindist): + keep_append_replace = 2 + elif dist == mindist: + if orientation is not None: + # Take orientation into account. + # If result is small, a simple iteration shouldn't be a + # performance issue. + for ri in range(len(result)): + c = Box._compare_distance_to_origin(b, + boxes[result[ri]], orientation) + if c < 0: + keep_append_replace = 2 + break + if c == 0: + keep_append_replace = 1 + else: + keep_append_replace = 1 + + if keep_append_replace == 1: + result.append(i) + if keep_append_replace == 2: + mindist = dist + result = [i] + return result + + + @staticmethod + def _compare_distance_to_origin(box1, box2, orientation): + """ Returns an integer that is less than, equal to or greater than zero + if the distance between box1 and the origin is less than, equal to or + greater than the distance between box2 and the origin, respectively. + The origin is implied by orientation. + @param box1: The first Box. + @param box2: The second Box. + @param orientation: The orientation which shows where "forward" points + to. Either 1 (towards larger values in this dimension when reading) or + -1 (towards smaller values in this dimension when reading). + @return An integer as specified above. """ + for i in range(len(orientation)): + o = orientation[i] + if o == 0: + continue + box1edge = box1.get_position()[i] + box2edge = box2.get_position()[i] + if o < 0: + box1edge = box1.get_size()[i] - box1edge + box2edge = box2.get_size()[i] - box2edge + d = box1edge - box2edge + if d != 0: + return d + return 0 + + + def get_center(self, orientation): + """ Returns the center of this Box. If the exact value is not equal to + an integer, the integer that is closer to the origin (as implied by + orientation) is chosen. + @orientation: The orientation which shows where "forward" points + to. Either 1 (towards larger values in this dimension when reading) or + -1 (towards smaller values in this dimension when reading). + @return The center of this Box as specified above. """ + result = [0] * len(orientation) + bp = self.get_position() + bs = self.get_size() + for i in range(len(orientation)): + result[i] = Box._box_to_center_offset_1d(bs[i] - 1, + orientation[i]) + bp[i] + return result + + + @staticmethod + def _box_to_center_offset_1d(box_size_delta, orientation): + if orientation == -1: + box_size_delta += 1 + return box_size_delta >> 1 + + + def current_box_index(self, orientation, boxes): + """ Calculates the index of the Box that is closest to the center of + this Box. + @param orientation: The orientation to use. + @param boxes: The Boxes to examine. + @return: The index as specified above. """ + return Box.closest_boxes(self.get_center(orientation), boxes, + orientation)[0] + + + @staticmethod + def align_center(boxes, axis, fix, orientation): + """ Aligns Boxes so that the center of each Box appears on the same + line. + @param axis: the axis to center. + @param fix: the index of the Box that should not move. + @param orientation: The orientation to use. + @return: A list of new Boxes with accordingly translated positions. """ + if len(boxes) == 0: + return [] + center_box = boxes[fix] + cs = center_box.get_size()[axis] + if cs % 2 != 0: + cs +=1 + cp = center_box.get_position()[axis] + result = [] + for b in boxes: + s = b.get_size() + p = list(b.get_position()) + p[axis] = cp + Box._box_to_center_offset_1d(cs - s[axis], + orientation) + result.append(Box(s, p)) + return result + + + @staticmethod + def distribute(boxes, axis, fix, spacing=0): + """ Ensures that the Boxes do not overlap. For this purpose, the Boxes + are distributed according to the index of the respective Box. + @param axis: the axis along which the Boxes are distributed. + @param fix: the index of the Box that should not move. + @param spacing: the number of additional pixels between Boxes. + @return: A new list with new Boxes that are accordingly translated. """ + if len(boxes) == 0: + return [] + result = [None] * len(boxes) + initialSum = boxes[fix].get_position()[axis] + partial_sum = initialSum + for bi in range(fix, len(boxes)): + b = boxes[bi] + s = b.get_size() + p = list(b.get_position()) + p[axis] = partial_sum + result[bi] = Box(s, p) + partial_sum += s[axis] + spacing + partial_sum = initialSum + for bi in range(fix - 1, -1, -1): + b = boxes[bi] + s = b.get_size() + p = list(b.get_position()) + partial_sum -= s[axis] + spacing + p[axis] = partial_sum + result[bi] = Box(s, p) + return result + + + def wrapper_box(self, viewport_size, orientation): + """ Returns a Box that covers the same area that is covered by a + scrollable viewport showing this Box. + @param viewport_size: The size of the viewport. + @param orientation: The orientation to use. + @return: A Box as specified above. """ + size = self.get_size() + position = self.get_position() + result_size = [0] * len(size) + result_position = [0] * len(size) + for i in range(len(size)): + c = size[i] + v = viewport_size[i] + result_size[i] = max(c, v) + result_position[i] = Box._box_to_center_offset_1d(c - result_size[i], + orientation[i]) + position[i] + return Box(result_size, result_position) + + + @staticmethod + def bounding_box(boxes): + """ Returns the union of all specified Boxes (that is, the smallest Box + that contains all specified Boxes). + @param boxes: The Boxes to calculate the union from. + @return: A Box as specified above. """ + if len(boxes) == 0: + return Box((), ()) + mins = [None] * len(boxes[0].get_size()) + maxes = [None] * len(mins) + for b in boxes: + s = b.get_size() + p = b.get_position() + for i in range(len(mins)): + if (mins[i] is None) or (p[i] < mins[i]): + mins[i] = p[i] + ps = p[i] + s[i] + if (maxes[i] is None) or (ps > maxes[i]): + maxes[i] = ps + return Box(tools.vector_sub(maxes, mins), mins) + + + @staticmethod + def intersect(boxA, boxB): + """ Returns the intersection of the two specified Boxes (that is, the + largest Box that is contained by the two specified Boxes). + @param boxA: The first Box to calculate the intersection from. + @param boxB: The second Box to calculate the intersection from. + @return: A Box as specified above. """ + # TODO Add tests. + # TODO What if there is no intersection? + # TODO What if the intersection is a single point? + # TODO Make interfaces of intersect and bounding_box consistent with + # each other, and then rename bounding_box to union. + aPos = boxA.get_position() + bPos = boxB.get_position() + aSize = boxA.get_size() + bSize = boxB.get_size() + resPos = [0] * len(aPos) + resSize = [0] * len(aSize) + for i in range(len(aPos)): + ax1 = aPos[i] + bx1 = bPos[i] + ax2 = ax1 + ax2 += aSize[i] + bx2 = bx1 + bx2 += bSize[i] + if ax1 < bx1: + ax1 = bx1 + if ax2 > bx2: + ax2 = bx2 + ax2 -= ax1 + resPos[i] = ax1 + resSize[i] = ax2 + return Box(resSize, resPos) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/callback.py mcomix-2.1.0/mcomix/callback.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/callback.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/callback.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +import traceback +import weakref +import threading +from gi.repository import GObject + +from mcomix import log + +class CallbackList(object): + """ Helper class for implementing callbacks within the main thread. + Add listeners to method calls with method += callback_function. """ + + def __init__(self, obj, function): + self.__callbacks = [] + self.__object = obj + self.__function = function + + def __call__(self, *args, **kwargs): + """ Runs the wrapped function. After the funtion has finished, + callbacks are run. Code within the function and the callback is + always executed in the main thread. """ + + if threading.currentThread().name == 'MainThread': + if self.__object: + # Assume that the Callback object is bound to a class method. + result = self.__function(self.__object, *args, **kwargs) + else: + # Otherwise, the callback should be bound to a normal function. + result = self.__function(*args, **kwargs) + + self.__run_callbacks(*args, **kwargs) + return result + else: + # Call this method again in the main thread. + GObject.idle_add(self.__mainthread_call, (args, kwargs)) + + def __iadd__(self, function): + """ Support for 'method += callback_function' syntax. """ + obj, func = self.__get_function(function) + + if (obj, func) not in self.__callbacks: + self.__callbacks.append((obj, func)) + + return self + + def __isub__(self, function): + """ Support for 'method -= callback_function' syntax. """ + obj, func = self.__get_function(function) + + if (obj, func) in self.__callbacks: + self.__callbacks.remove((obj, func)) + + return self + + def __mainthread_call(self, params): + """ Helper function to execute code in the main thread. + This will be called by GObject.idle_add, with being a tuple + of (args, kwargs). """ + + result = self(*params[0], **params[1]) + + # Remove this function from the idle queue + return 0 + + def __run_callbacks(self, *args, **kwargs): + """ Executes callback functions. """ + for obj_ref, func in self.__callbacks: + + if obj_ref is None: + # Callback is a normal function + callback = func + elif obj_ref() is not None: + # Callback is a bound method. + # Recreate it by binding the function to the object. + callback = func.__get__(obj_ref()) + else: + # Callback is a bound method, object + # no longer exists. + callback = None + + if callback: + try: + callback(*args, **kwargs) + except Exception as e: + log.error(_('! Callback %(function)r failed: %(error)s'), + { 'function' : callback, 'error' : e }) + log.debug('Traceback:\n%s', traceback.format_exc()) + + def __callback_deleted(self, obj_ref): + """ Called whenever one of the callback objects is collected by gc. + This removes all callback functions registered by the object. """ + self.__callbacks = [callback for callback in self.__callbacks if callback[0] != obj_ref] + + def __get_function(self, func): + """ If is a normal function, return (None, func). + If is a bound method, return (weakref(obj), func), with + being the object is bound to. This is required since + weak references do not work on bound methods. """ + + if hasattr(func, "im_self") and getattr(func, "im_self") is not None: + return (weakref.ref(func.__self__, self.__callback_deleted), func.__func__) + else: + return (None, func) + +class Callback(object): + """ Decorator class for using the CallbackList helper. """ + + def __init__(self, function): + # This is the function the Callback is decorating. + self.__function = function + + def __get__(self, obj, cls): + """ This method makes Callback implement the descriptor interface. + Enables calling bound methods with the correct reference. + Do not ask me why or how this actually works, I simply do not know. """ + + return CallbackList(obj, self.__function) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/clipboard.py mcomix-2.1.0/mcomix/clipboard.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/clipboard.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/clipboard.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,41 @@ +"""clipboard.py - Clipboard handler""" + +from gi.repository import Gdk, Gtk + +from mcomix import image_tools + + +class Clipboard(object): + + """The Clipboard takes care of all necessary copy-paste functionality + """ + + def __init__(self, window): + self._clipboard = Gtk.Clipboard.get(Gdk.Atom.intern("CLIPBOARD", False)) + self._window = window + + def copy(self, text, pixbuf): + """ Copies C{text} and C{pixbuf} to clipboard. """ + self._clipboard.set_text(text, len(text)) + self._clipboard.set_image(pixbuf) + + def copy_page(self, *args): + """ Copies the currently opened page and pixbuf to clipboard. """ + + if self._window.filehandler.file_loaded: + # Get pixbuf for current page + current_page_pixbufs = self._window.imagehandler.get_pixbufs( + 2 if self._window.displayed_double() else 1) # XXX limited to at most 2 pages + + if len(current_page_pixbufs) == 1: + pixbuf = current_page_pixbufs[ 0 ] + else: + pixbuf = image_tools.combine_pixbufs( + current_page_pixbufs[ 0 ], + current_page_pixbufs[ 1 ], + self._window.is_manga_mode ) + + path = self._window.imagehandler.get_path_to_page() + self.copy(path, pixbuf) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/comicthumb.py mcomix-2.1.0/mcomix/comicthumb.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/comicthumb.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/comicthumb.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 - -'''comicthumb - Thumbnailer for comic book archives, bundled with MComix. - -comicthumb use same dependency with MComix. - -comicthumb was originally written by Christoph Wolk, this version was -re-written from scratch for Comix 4 by Pontus Ekberg. -''' - -import argparse -from os import getcwd -from os.path import exists,join,normpath -from urllib.parse import unquote - -from gi import require_version - -require_version('GdkPixbuf', '2.0') -require_version('Gdk', '3.0') -require_version('Gtk', '3.0') - -CURDIR=getcwd() - -from mcomix import thumbnail_tools -from mcomix import portability - -THUMB_SIZE=128 -URL_PREFIX='file://' - -def abspath(path): - return normpath(join(CURDIR,path)) - -def main(): - parser=argparse.ArgumentParser( - prog='comicthumb', - description='Thumbnailer for comic book archives', - epilog='Supported formats: ZIP, RAR and tar (.cbz, .cbr, .cbt)', - ) - parser.add_argument('infile',default=None,metavar='INFILE', - help='input archive') - parser.add_argument('outfile',default=None,metavar='OUTFILE', - help='output thumbnail') - parser.add_argument('size',nargs='?',default=THUMB_SIZE,metavar='SIZE', - help='size of thumbnail (default: {})'.format(THUMB_SIZE)) - ns=parser.parse_args() - in_path=abspath(ns.infile) - out_path=abspath(ns.outfile) - if in_path.startswith(URL_PREFIX): - in_path=unquote(in_path[len(URL_PREFIX):]) - if not exists(in_path): - print('not exists:',ns.infile) - parser.print_usage() - return 1 - try: - size=int(ns.size) - except ValueError: - print('invalid SIZE:',ns.size) - parser.print_usage() - return 1 - - thumbnailer = thumbnail_tools.Thumbnailer(force_recreation=True, - archive_support=True, - store_on_disk=False, - size=(size, size)) - thumb = thumbnailer.thumbnail(in_path) - thumb.savev(out_path, 'png', [], []) - -if __name__ == '__main__': - exit(main()) - diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/comment_dialog.py mcomix-2.1.0/mcomix/comment_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/comment_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/comment_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,106 @@ +"""comment.py - Comments dialog.""" + +import os +from gi.repository import Gtk + +from mcomix import i18n + +class _CommentsDialog(Gtk.Dialog): + + def __init__(self, window): + super(_CommentsDialog, self).__init__(_('Comments'), window, 0, + (Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) + + self.set_resizable(True) + self.set_default_response(Gtk.ResponseType.CLOSE) + self.set_default_size(600, 550) + self.set_border_width(4) + + tag = Gtk.TextTag() + tag.set_property('editable', False) + tag.set_property('editable-set', True) + tag.set_property('family', 'Monospace') + tag.set_property('family-set', True) + tag.set_property('scale', 0.9) + tag.set_property('scale-set', True) + tag_table = Gtk.TextTagTable() + tag_table.add(tag) + + self._tag = tag + self._tag_table = tag_table + self._notebook = None + self._window = window + self._comments = [] + + self._window.filehandler.file_available += self._on_file_available + self._window.filehandler.file_opened += self._update_comments + self._window.filehandler.file_closed += self._update_comments + self._update_comments() + self.show_all() + + def _on_file_available(self, path_list): + for path in path_list: + if path in self._comments: + self._add_comment(path, self._comments[path]) + self._notebook.show_all() + + def _update_comments(self): + + if self._notebook is not None: + self._notebook.destroy() + self._notebook = None + + notebook = Gtk.Notebook() + notebook.set_scrollable(True) + notebook.set_border_width(6) + self.vbox.pack_start(notebook, True, True, 0) + self._notebook = notebook + self._comments = {} + + for num in range(1, self._window.filehandler.get_number_of_comments() + 1): + path = self._window.filehandler.get_comment_name(num) + if self._window.filehandler.file_is_available(path): + self._add_comment(path, num) + else: + # In case it's not ready yet, bump it's + # extraction in front of the queue. + self._window.filehandler._ask_for_files([path]) + self._comments[path] = num + + self._notebook.show_all() + + def _add_comment(self, path, num): + + name = os.path.basename(path) + + page = Gtk.VBox(False) + page.set_border_width(8) + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + page.pack_start(scrolled, True, True, 0) + + outbox = Gtk.EventBox() + scrolled.add_with_viewport(outbox) + + inbox = Gtk.EventBox() + inbox.set_border_width(6) + outbox.add(inbox) + + text = self._window.filehandler.get_comment_text(num) + if text is None: + text = _('Could not read %s') % name + + text_buffer = Gtk.TextBuffer(tag_table=self._tag_table) + text_buffer.set_text(i18n.to_unicode(text)) + text_buffer.apply_tag(self._tag, *text_buffer.get_bounds()) + text_view = Gtk.TextView(buffer=text_buffer) + inbox.add(text_view) + + bg_color = text_view.get_default_attributes().pg_bg_color + outbox.modify_bg(Gtk.StateType.NORMAL, bg_color) + tab_label = Gtk.Label(label=i18n.to_unicode(name)) + self._notebook.insert_page(page, tab_label, -1) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/constants.py mcomix-2.1.0/mcomix/constants.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/constants.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/constants.py 2022-12-17 13:04:17.000000000 +0000 @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +"""constants.py - Miscellaneous constants.""" + +import os + +from mcomix import tools + +APPNAME = 'MComix' +VERSION = '2.1.0' + +HOME_DIR = tools.get_home_directory() +CONFIG_DIR = tools.get_config_directory() +DATA_DIR = tools.get_data_directory() + +BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +THUMBNAIL_PATH = os.path.join(HOME_DIR, '.thumbnails/normal') +LIBRARY_DATABASE_PATH = os.path.join(DATA_DIR, 'library.db') +LASTPAGE_DATABASE_PATH = os.path.join(DATA_DIR, 'lastreadpage.db') +LIBRARY_COVERS_PATH = os.path.join(DATA_DIR, 'library_covers') +PREFERENCE_PATH = os.path.join(CONFIG_DIR, 'preferences.conf') +KEYBINDINGS_CONF_PATH = os.path.join(CONFIG_DIR, 'keybindings.conf') + +BOOKMARK_PICKLE_PATH = os.path.join(DATA_DIR, 'bookmarks.pickle') +FILEINFO_PICKLE_PATH = os.path.join(DATA_DIR, 'file.pickle') +# Transitional - used if json preferences are (were) absent. +PREFERENCE_PICKLE_PATH = os.path.join(CONFIG_DIR, 'preferences.pickle') + +ZOOM_MODE_BEST, ZOOM_MODE_WIDTH, ZOOM_MODE_HEIGHT, ZOOM_MODE_MANUAL, ZOOM_MODE_SIZE = list(range(5)) +DOUBLE_PAGE_AUTORESIZE_SCALE, DOUBLE_PAGE_AUTORESIZE_SIZE, DOUBLE_PAGE_AUTORESIZE_FIT_SIZE = list(range(3)) + +WIDTH_AXIS, HEIGHT_AXIS = list(range(2)) +DISTRIBUTION_AXIS, ALIGNMENT_AXIS = WIDTH_AXIS, HEIGHT_AXIS +NORMAL_AXES = (0, 1) +SWAPPED_AXES = (1, 0) +WESTERN_ORIENTATION = (1, 1) +MANGA_ORIENTATION = (-1, 1) +SCROLL_TO_CENTER = -2 +SCROLL_TO_START = -3 +SCROLL_TO_END = -4 +FIRST_INDEX = 0 +LAST_INDEX = -1 +UNION_INDEX = -2 + +ANIMATION_DISABLED, ANIMATION_NORMAL = list(range(2)) + +ZIP, RAR, TAR, GZIP, BZIP2, XZ, PDF, SEVENZIP, LHA, ZIP_EXTERNAL = list(range(10)) +NORMAL_CURSOR, GRAB_CURSOR, WAIT_CURSOR, NO_CURSOR = list(range(4)) +LIBRARY_DRAG_EXTERNAL_ID, LIBRARY_DRAG_BOOK_ID, LIBRARY_DRAG_COLLECTION_ID = list(range(3)) +AUTOROTATE_NEVER, AUTOROTATE_WIDTH_90, AUTOROTATE_WIDTH_270, \ + AUTOROTATE_HEIGHT_90, AUTOROTATE_HEIGHT_270 = list(range(5)) + +RESPONSE_REVERT_TO_DEFAULT = 3 +RESPONSE_REMOVE = 4 +RESPONSE_IMPORT = 5 +RESPONSE_SAVE_AS = 6 +RESPONSE_REPLACE = 7 +RESPONSE_NEW = 8 + +# These are bit field values, so only use powers of two. +STATUS_PAGE, STATUS_RESOLUTION, STATUS_PATH, STATUS_FILENAME, STATUS_FILENUMBER, STATUS_FILESIZE = \ + 1, 2, 4, 8, 16, 32 +SHOW_DOUBLE_AS_ONE_TITLE, SHOW_DOUBLE_AS_ONE_WIDE = 1, 2 + +MAX_LIBRARY_COVER_SIZE = 500 +SORT_NAME, SORT_PATH, SORT_SIZE, SORT_LAST_MODIFIED, SORT_NAME_LITERAL = 1, 2, 3, 4, 5 +SORT_DESCENDING, SORT_ASCENDING = 1, 2 +SIZE_HUGE, SIZE_LARGE, SIZE_NORMAL, SIZE_SMALL, SIZE_TINY = MAX_LIBRARY_COVER_SIZE, 300, 250, 125, 80 + +ACCEPTED_COMMENT_EXTENSIONS = ['txt', 'nfo', 'xml'] + +ZIP_FORMATS = ( + ('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/x-cbz'), + ('zip', 'cbz')) +RAR_FORMATS = ( + ('application/x-rar', 'application/x-cbr'), + ('rar', 'cbr')) +TAR_FORMATS = ( + ('application/x-tar', 'application/x-gzip', 'application/x-bzip2', 'application/x-cbt'), + ('tar', 'gz', 'bz2', 'bzip2', 'cbt')) +SZIP_FORMATS = ( + ('application/x-7z-compressed', 'application/x-cb7'), + ('7z', 'cb7', 'xz', 'lzma')) +LHA_FORMATS = ( + ('application/x-lzh', 'application/x-lha', 'application/x-lzh-compressed'), + ('lha', 'lzh')) +PDF_FORMATS = ( + ('application/pdf',), + ('pdf',)) + +IMAGEIO_GDKPIXBUF, IMAGEIO_PIL = list(range(2)) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/cursor_handler.py mcomix-2.1.0/mcomix/cursor_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/cursor_handler.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/cursor_handler.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,85 @@ +"""cursor_handler.py - Cursor handler.""" + +from gi.repository import Gdk, GObject + +from mcomix import constants + +class CursorHandler(object): + + def __init__(self, window): + self._window = window + self._timer_id = None + self._auto_hide = False + self._current_cursor = constants.NORMAL_CURSOR + + def set_cursor_type(self, cursor): + """Set the cursor to type . Supported cursor types are + available as constants in this module. If is not one of the + cursor constants above, it must be a Gdk.Cursor. + """ + if cursor == constants.NORMAL_CURSOR: + mode = None + elif cursor == constants.GRAB_CURSOR: + mode = Gdk.Cursor.new(Gdk.CursorType.FLEUR) + elif cursor == constants.WAIT_CURSOR: + mode = Gdk.Cursor.new(Gdk.CursorType.WATCH) + elif cursor == constants.NO_CURSOR: + mode = self._get_hidden_cursor() + else: + mode = cursor + + self._window.set_cursor(mode) + + self._current_cursor = cursor + + if self._auto_hide: + + if cursor == constants.NORMAL_CURSOR: + self._set_hide_timer() + else: + self._kill_timer() + + def auto_hide_on(self): + """Signal that the cursor should auto-hide from now on (e.g. that + we are entering fullscreen). + """ + self._auto_hide = True + + if self._current_cursor == constants.NORMAL_CURSOR: + self._set_hide_timer() + + def auto_hide_off(self): + """Signal that the cursor should *not* auto-hide from now on.""" + self._auto_hide = False + self._kill_timer() + + if self._current_cursor == constants.NORMAL_CURSOR: + self.set_cursor_type(constants.NORMAL_CURSOR) + + def refresh(self): + """Refresh the current cursor (i.e. display it and set a new timer in + fullscreen). Used when we move the cursor. + """ + if self._auto_hide: + self.set_cursor_type(self._current_cursor) + + def _on_timeout(self): + mode = self._get_hidden_cursor() + self._window.set_cursor(mode) + self._timer_id = None + return False + + def _set_hide_timer(self): + self._kill_timer() + self._timer_id = GObject.timeout_add(2000, self._on_timeout) + + def _kill_timer(self): + if self._timer_id is not None: + GObject.source_remove(self._timer_id) + self._timer_id = None + + def _get_hidden_cursor(self): + return Gdk.Cursor.new(Gdk.CursorType.BLANK_CURSOR) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/dialog_handler.py mcomix-2.1.0/mcomix/dialog_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/dialog_handler.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/dialog_handler.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,41 @@ +"""dialog_handler.py - Takes care of opening and closing and destroying of simple dialog windows. + Dialog windows should only be taken care of here if they are windows that need to display + information and then exit with no added functionality inbetween. +""" + +from mcomix import about_dialog +from mcomix import comment_dialog +from mcomix import properties_dialog + +dialog_windows = {} +dialog_windows[ 'about-dialog' ] = [None, about_dialog._AboutDialog] +dialog_windows[ 'comments-dialog' ] = [None, comment_dialog._CommentsDialog] +dialog_windows[ 'properties-dialog' ] = [None, properties_dialog._PropertiesDialog] + +def open_dialog(action, data): + """Create and display the given dialog.""" + + window, name_of_dialog = data + + _dialog = dialog_windows[ name_of_dialog ] + + # if the dialog window is not created then create the window + # and connect the _close_dialog action to the dialog window + if _dialog[0] is None: + dialog_windows[ name_of_dialog ][0] = _dialog[1](window) + dialog_windows[ name_of_dialog ][0].connect('response', _close_dialog, name_of_dialog) + else: + # if the dialog window already exists bring it to the forefront of the screen + _dialog[0].present() + +def _close_dialog(action, exit_response, name_of_dialog): + + _dialog = dialog_windows[ name_of_dialog ] + + # if the dialog window exists then destroy it + if _dialog[0] is not None: + _dialog[0].destroy() + _dialog[0] = None + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/edit_comment_area.py mcomix-2.1.0/mcomix/edit_comment_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/edit_comment_area.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/edit_comment_area.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,106 @@ +"""edit_comment_area.py - The area in the editing window that displays comments.""" + +import os +from gi.repository import Gdk, Gtk +from mcomix import tools + +class _CommentArea(Gtk.VBox): + + """The area used for displaying and handling non-image files.""" + + def __init__(self, edit_dialog): + super(_CommentArea, self).__init__() + self._edit_dialog = edit_dialog + + scrolled = Gtk.ScrolledWindow() + scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self.pack_start(scrolled, True, True, 0) + + info = Gtk.Label(label=_('Please note that the only files that are automatically added to this list are those files in archives that MComix recognizes as comments.')) + info.set_alignment(0.5, 0.5) + info.set_line_wrap(True) + self.pack_start(info, False, False, 10) + + # The ListStore layout is (basename, size, full path). + self._liststore = Gtk.ListStore(str, str, str) + self._treeview = Gtk.TreeView(self._liststore) + self._treeview.set_rules_hint(True) + self._treeview.connect('button_press_event', self._button_press) + self._treeview.connect('key_press_event', self._key_press) + + cellrenderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(_('Name'), cellrenderer, text=0) + column.set_expand(True) + self._treeview.append_column(column) + + column = Gtk.TreeViewColumn(_('Size'), cellrenderer, text=1) + self._treeview.append_column(column) + scrolled.add(self._treeview) + + self._ui_manager = Gtk.UIManager() + + ui_description = """ + + + + + + """ + + self._ui_manager.add_ui_from_string(ui_description) + actiongroup = Gtk.ActionGroup('mcomix-edit-archive-comment-area') + actiongroup.add_actions([ + ('remove', Gtk.STOCK_REMOVE, _('Remove from archive'), None, None, + self._remove_file)]) + self._ui_manager.insert_action_group(actiongroup, 0) + + def fetch_comments(self): + """Load all comments in the archive.""" + + for num in range(1, + self._edit_dialog.file_handler.get_number_of_comments() + 1): + + path = self._edit_dialog.file_handler.get_comment_name(num) + size = tools.format_byte_size(os.stat(path).st_size) + self._liststore.append([os.path.basename(path), size, path]) + + def add_extra_file(self, path): + """Add an extra imported file (at ) to the list.""" + size = tools.format_byte_size(os.stat(path).st_size) + self._liststore.append([os.path.basename(path), size, path]) + + def get_file_listing(self): + """Return a list with the full paths to all the files, in order.""" + file_list = [] + + for row in self._liststore: + file_list.append(row[2]) + + return file_list + + def _remove_file(self, *args): + """Remove the currently selected file from the list.""" + iterator = self._treeview.get_selection().get_selected()[1] + + if iterator is not None: + self._liststore.remove(iterator) + + def _button_press(self, treeview, event): + """Handle mouse button presses on the area.""" + path = treeview.get_path_at_pos(int(event.x), int(event.y)) + + if path is None: + return + + path = path[0] + + if event.button == 3: + self._ui_manager.get_widget('/Popup').popup(None, None, None, None, + event.button, event.time) + + def _key_press(self, iconview, event): + """Handle key presses on the area.""" + if event.keyval == Gdk.KEY_Delete: + self._remove_file() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/edit_dialog.py mcomix-2.1.0/mcomix/edit_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/edit_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/edit_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,243 @@ +"""edit_dialog.py - The dialog for the archive editing window.""" + +import os +import tempfile +from gi.repository import Gdk, Gtk, GObject +import re + +from mcomix.preferences import prefs +from mcomix import archive_packer +from mcomix import file_chooser_simple_dialog +from mcomix import image_tools +from mcomix import edit_image_area +from mcomix import edit_comment_area +from mcomix import constants +from mcomix import message_dialog + +_dialog = None + +class _EditArchiveDialog(Gtk.Dialog): + + """The _EditArchiveDialog lets users edit archives (or directories) by + reordering images and removing and adding images or comment files. The + result can be saved as a ZIP archive. + """ + + def __init__(self, window): + super(_EditArchiveDialog, self).__init__(_('Edit archive'), window, Gtk.DialogFlags.MODAL, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)) + + self._accept_changes_button = self.add_button(Gtk.STOCK_APPLY, Gtk.ResponseType.APPLY) + + self.kill = False # Dialog is killed. + self.file_handler = window.filehandler + self._window = window + self._imported_files = [] + + self._save_button = self.add_button(Gtk.STOCK_SAVE_AS, constants.RESPONSE_SAVE_AS) + + self._import_button = self.add_button(_('_Import'), constants.RESPONSE_IMPORT) + self._import_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_ADD, + Gtk.IconSize.BUTTON)) + + self.set_border_width(4) + self.resize(min(Gdk.Screen.get_default().get_width() - 50, 750), + min(Gdk.Screen.get_default().get_height() - 50, 600)) + + self.connect('response', self._response) + + self._image_area = edit_image_area._ImageArea(self, window) + self._comment_area = edit_comment_area._CommentArea(self) + + notebook = Gtk.Notebook() + notebook.set_border_width(6) + notebook.append_page(self._image_area, Gtk.Label(label=_('Images'))) + notebook.append_page(self._comment_area, Gtk.Label(label=_('Comment files'))) + self.vbox.pack_start(notebook, True, True, 0) + + self.show_all() + + GObject.idle_add(self._load_original_files) + + def _load_original_files(self): + """Load the original files from the archive or directory into + the edit dialog. + """ + self._save_button.set_sensitive(False) + self._import_button.set_sensitive(False) + self._window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) + self._image_area.fetch_images() + + if self.kill: # fetch_images() allows pending events to be handled. + return False + + self._comment_area.fetch_comments() + self._window.set_cursor(None) + self._save_button.set_sensitive(True) + self._import_button.set_sensitive(True) + + return False + + def _pack_archive(self, archive_path): + """Create a new archive with the chosen files.""" + self.set_sensitive(False) + self._window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) + + while Gtk.events_pending(): + Gtk.main_iteration_do(False) + + image_files = self._image_area.get_file_listing() + comment_files = self._comment_area.get_file_listing() + + try: + fd, tmp_path = tempfile.mkstemp( + suffix='.%s' % os.path.basename(archive_path), + prefix='tmp.', dir=os.path.dirname(archive_path)) + # Close open tempfile handle (writing is handled by the packer) + os.close(fd) + fail = False + + except: + fail = True + + if not fail: + packer = archive_packer.Packer(image_files, comment_files, tmp_path, + os.path.splitext(os.path.basename(archive_path))[0]) + packer.pack() + packing_success = packer.wait() + + if packing_success: + # Preserve permissions if currently edited files come from an archive + if (self._window.filehandler.archive_type is not None and + os.path.exists(self._window.filehandler.get_path_to_base())): + mode = os.stat(self._window.filehandler.get_path_to_base()).st_mode + else: + mode = os.stat(tmp_path).st_mode + + # Remove existing file (Win32 fails on rename otherwise) + if os.path.exists(archive_path): + os.unlink(archive_path) + + os.rename(tmp_path, archive_path) + os.chmod(archive_path, mode) + + _close_dialog() + else: + fail = True + + self._window.set_cursor(None) + if fail: + dialog = message_dialog.MessageDialog(self._window, 0, Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE) + dialog.set_text( + _("The new archive could not be saved!"), + _("The original files have not been removed.")) + dialog.run() + + self.set_sensitive(True) + + def _response(self, dialog, response): + + if response == constants.RESPONSE_SAVE_AS: + + dialog = file_chooser_simple_dialog.SimpleFileChooserDialog( + Gtk.FileChooserAction.SAVE) + + src_path = self.file_handler.get_path_to_base() + + dialog.set_current_directory(os.path.dirname(src_path)) + dialog.set_save_name('%s.cbz' % os.path.splitext( + os.path.basename(src_path))[0]) + dialog.filechooser.set_extra_widget(Gtk.Label(label= + _('Archives are stored as ZIP files.'))) + dialog.add_archive_filters() + dialog.run() + + paths = dialog.get_paths() + dialog.destroy() + + if paths: + self._pack_archive(paths[0]) + + elif response == constants.RESPONSE_IMPORT: + + dialog = file_chooser_simple_dialog.SimpleFileChooserDialog() + dialog.add_image_filters() + dialog.run() + paths = dialog.get_paths() + dialog.destroy() + + exts = '|'.join(prefs['comment extensions']) + comment_re = re.compile(r'\.(%s)\s*$' % exts, re.I) + + for path in paths: + + if image_tools.is_image_file(path): + self._imported_files.append( path ) + self._image_area.add_extra_image(path) + + elif os.path.isfile(path): + + if comment_re.search( path ): + self._imported_files.append( path ) + self._comment_area.add_extra_file(path) + + elif response == Gtk.ResponseType.APPLY: + + old_image_array = self._window.imagehandler._image_files + + treeiter = self._image_area._liststore.get_iter_first() + + new_image_array = [] + + while treeiter is not None: + path = self._image_area._liststore.get_value(treeiter, 2) + new_image_array.append(path) + treeiter = self._image_area._liststore.iter_next(treeiter) + + new_positions = [] + + end_index = len(old_image_array) - 1 + + for image_path in old_image_array: + + try: + new_position = new_image_array.index( image_path ) + new_positions.append(new_position) + except ValueError: + # the path was not found in the new array so that means it was deleted + new_positions.append(end_index) + end_index -= 1 + + self._window.imagehandler._image_files = new_image_array + self._window.imagehandler._raw_pixbufs = {} + self._window.imagehandler.do_cacheing() + self._window.thumbnailsidebar.clear() + self._window.set_page(1) + self._window.thumbnailsidebar.load_thumbnails() + + else: + _close_dialog() + self.kill = True + + def destroy(self): + self._image_area.cleanup() + Gtk.Dialog.destroy(self) + +def open_dialog(action, window): + global _dialog + + if _dialog is None: + _dialog = _EditArchiveDialog(window) + else: + _dialog.present() + + +def _close_dialog(*args): + global _dialog + + if _dialog is not None: + _dialog.destroy() + _dialog = None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/edit_image_area.py mcomix-2.1.0/mcomix/edit_image_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/edit_image_area.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/edit_image_area.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,149 @@ +"""edit_image_area.py - The area of the editing archive window that displays images.""" + +import os +from gi.repository import Gdk, GdkPixbuf, Gtk + +from mcomix import image_tools +from mcomix import i18n +from mcomix import thumbnail_tools +from mcomix import thumbnail_view +from mcomix.preferences import prefs + +class _ImageArea(Gtk.ScrolledWindow): + + """The area used for displaying and handling image files.""" + + def __init__(self, edit_dialog, window): + super(_ImageArea, self).__init__() + + self._window = window + self._edit_dialog = edit_dialog + self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + # The ListStore layout is (thumbnail, basename, full path, thumbnail status). + # Basename is used as image tooltip. + self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, bool) + self._iconview = thumbnail_view.ThumbnailIconView( + self._liststore, + 2, # UID + 0, # pixbuf + 3, # status + ) + self._iconview.generate_thumbnail = self._generate_thumbnail + self._iconview.set_tooltip_column(1) + self._iconview.set_reorderable(True) + self._iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) + self._iconview.connect('button_press_event', self._button_press) + self._iconview.connect('key_press_event', self._key_press) + self._iconview.connect_after('drag_begin', self._drag_begin) + self.add(self._iconview) + + self._thumbnail_size = 128 + self._thumbnailer = thumbnail_tools.Thumbnailer(store_on_disk=False, + size=(self._thumbnail_size, + self._thumbnail_size)) + + self._filler = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=True, bits_per_sample=8, + width=self._thumbnail_size, + height=self._thumbnail_size) + # Make the pixbuf transparent. + self._filler.fill(0) + + self._window.imagehandler.page_available += self._on_page_available + + self._ui_manager = Gtk.UIManager() + ui_description = """ + + + + + + """ + + self._ui_manager.add_ui_from_string(ui_description) + + actiongroup = Gtk.ActionGroup('mcomix-edit-archive-image-area') + actiongroup.add_actions([ + ('remove', Gtk.STOCK_REMOVE, _('Remove from archive'), None, None, + self._remove_pages)]) + self._ui_manager.insert_action_group(actiongroup, 0) + + def fetch_images(self): + """Load all the images in the archive or directory.""" + for page in range(1, self._window.imagehandler.get_number_of_pages() + 1): + path = self._window.imagehandler.get_path_to_page(page) + encoded_path = i18n.to_unicode(os.path.basename(path)) + encoded_path = encoded_path.replace('&', '&') + self._liststore.append([self._filler, encoded_path, path, False]) + + def _generate_thumbnail(self, uid): + assert isinstance(uid, str) + path = uid + try: + if not self._window.filehandler.file_is_available(path): + return None + except KeyError: + # Not a page from the current archive, ignore. + pass + pixbuf = self._thumbnailer.thumbnail(path) + if pixbuf is None: + pixbuf = image_tools.MISSING_IMAGE_ICON + return pixbuf + + def add_extra_image(self, path): + """Add an imported image (at ) to the end of the image list.""" + self._liststore.append([self._filler, os.path.basename(path), path, False]) + + def get_file_listing(self): + """Return a list with the full paths to all the images, in order.""" + return [row[2] for row in self._liststore] + + def _remove_pages(self, *args): + """Remove the currently selected pages from the list.""" + paths = self._iconview.get_selected_items() + + for path in paths: + iterator = self._liststore.get_iter(path) + self._liststore.remove(iterator) + + def _button_press(self, iconview, event): + """Handle mouse button presses on the thumbnail area.""" + path = iconview.get_path_at_pos(int(event.x), int(event.y)) + + if path is None: + return + + if event.button == 3: + + if not iconview.path_is_selected(path): + iconview.unselect_all() + iconview.select_path(path) + + self._ui_manager.get_widget('/Popup').popup(None, None, None, None, + event.button, event.time) + + def _key_press(self, iconview, event): + """Handle key presses on the thumbnail area.""" + if event.keyval == Gdk.KEY_Delete: + self._remove_pages() + + def _drag_begin(self, iconview, context): + """We hook up on drag_begin events so that we can set the hotspot + for the cursor at the top left corner of the thumbnail (so that we + might actually see where we are dropping!). + """ + path = iconview.get_cursor()[0] + surface = treeview.create_row_drag_icon(path) + width, height = surface.get_width(), surface.get_height() + pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) + Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) + + def cleanup(self): + self._iconview.stop_update() + + def _on_page_available(self, page): + """ Called whenever a new page is ready for display. """ + self._iconview.draw_thumbnails_on_screen() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/enhance_backend.py mcomix-2.1.0/mcomix/enhance_backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/enhance_backend.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/enhance_backend.py 2022-01-23 07:07:18.000000000 +0000 @@ -0,0 +1,41 @@ +"""enhance_backend.py - Image enhancement handler and dialog (e.g. contrast, +brightness etc.) +""" + +from mcomix.preferences import prefs +from mcomix import image_tools + +class ImageEnhancer(object): + + """The ImageEnhancer keeps track of the "enhancement" values and performs + these enhancements on pixbufs. Changes to the ImageEnhancer's values + can be made using an _EnhanceImageDialog. + """ + + def __init__(self, window): + self._window = window + self.brightness = prefs['brightness'] + self.contrast = prefs['contrast'] + self.saturation = prefs['saturation'] + self.sharpness = prefs['sharpness'] + self.autocontrast = prefs['auto contrast'] + + def enhance(self, pixbuf): + """Return an "enhanced" version of .""" + + if (self.brightness != 1.0 or self.contrast != 1.0 or + self.saturation != 1.0 or self.sharpness != 1.0 or + self.autocontrast): + + return image_tools.enhance(pixbuf, self.brightness, self.contrast, + self.saturation, self.sharpness, self.autocontrast) + + return pixbuf + + def signal_update(self): + """Signal to the main window that a change in the enhancement + values has been made. + """ + self._window.draw_image() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/enhance_dialog.py mcomix-2.1.0/mcomix/enhance_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/enhance_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/enhance_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,182 @@ +"""enhance_dialog.py - Image enhancement dialog.""" + +from gi.repository import Gtk +from . import histogram + +from mcomix.preferences import prefs +from mcomix import image_tools + +_dialog = None + +class _EnhanceImageDialog(Gtk.Dialog): + + """A Gtk.Dialog which allows modification of the values belonging to + an ImageEnhancer. + """ + + def __init__(self, window): + super(_EnhanceImageDialog, self).__init__(_('Enhance image'), window, 0) + + self._window = window + + reset = Gtk.Button(stock=Gtk.STOCK_REVERT_TO_SAVED) + reset.set_tooltip_text(_('Reset to defaults.')) + self.add_action_widget(reset, Gtk.ResponseType.REJECT) + save = Gtk.Button(stock=Gtk.STOCK_SAVE) + save.set_tooltip_text(_('Save the selected values as default for future files.')) + self.add_action_widget(save, Gtk.ResponseType.APPLY) + self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) + + self.set_resizable(False) + self.connect('response', self._response) + self.set_default_response(Gtk.ResponseType.OK) + + self._enhancer = window.enhancer + self._block = False + + vbox = Gtk.VBox(False, 10) + self.set_border_width(4) + vbox.set_border_width(6) + self.vbox.add(vbox) + + self._hist_image = Gtk.Image() + self._hist_image.set_size_request(262, 170) + vbox.pack_start(self._hist_image, True, True, 0) + vbox.pack_start(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL), True, True, 0) + + hbox = Gtk.HBox(False, 4) + vbox.pack_start(hbox, False, False, 2) + vbox_left = Gtk.VBox(False, 4) + vbox_right = Gtk.VBox(False, 4) + hbox.pack_start(vbox_left, False, False, 2) + hbox.pack_start(vbox_right, True, True, 2) + + def _create_scale(label_text): + label = Gtk.Label(label=label_text) + label.set_alignment(1, 0.5) + label.set_use_underline(True) + vbox_left.pack_start(label, True, False, 2) + adj = Gtk.Adjustment(0.0, -1.0, 1.0, 0.01, 0.1) + scale = Gtk.HScale.new(adj) + scale.set_digits(2) + scale.set_value_pos(Gtk.PositionType.RIGHT) + scale.connect('value-changed', self._change_values) + # FIXME + # scale.set_update_policy(Gtk.UPDATE_DELAYED) + label.set_mnemonic_widget(scale) + vbox_right.pack_start(scale, True, False, 2) + return scale + + self._brightness_scale = _create_scale(_('_Brightness:')) + self._contrast_scale = _create_scale(_('_Contrast:')) + self._saturation_scale = _create_scale(_('S_aturation:')) + self._sharpness_scale = _create_scale(_('S_harpness:')) + + vbox.pack_start(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL), True, True, 0) + + self._autocontrast_button = \ + Gtk.CheckButton.new_with_mnemonic(_('_Automatically adjust contrast')) + self._autocontrast_button.set_tooltip_text( + _('Automatically adjust contrast (both lightness and darkness), separately for each colour band.')) + vbox.pack_start(self._autocontrast_button, False, False, 2) + self._autocontrast_button.connect('toggled', self._change_values) + + self._block = True + self._brightness_scale.set_value(self._enhancer.brightness - 1) + self._contrast_scale.set_value(self._enhancer.contrast - 1) + self._saturation_scale.set_value(self._enhancer.saturation - 1) + self._sharpness_scale.set_value(self._enhancer.sharpness - 1) + self._autocontrast_button.set_active(self._enhancer.autocontrast) + self._block = False + self._contrast_scale.set_sensitive( + not self._autocontrast_button.get_active()) + + self._window.imagehandler.page_available += self._on_page_available + self._window.filehandler.file_closed += self._on_book_close + self._window.page_changed += self._on_page_change + self._on_page_change() + + self.show_all() + + def _on_book_close(self): + self.clear_histogram() + + def _on_page_change(self): + if not self._window.imagehandler.page_is_available(): + self.clear_histogram() + return + # XXX transitional(double page limitation) + pixbuf = self._window.imagehandler.get_pixbufs(1)[0] + self.draw_histogram(pixbuf) + + def _on_page_available(self, page_number): + current_page_number = self._window.imagehandler.get_current_page() + if current_page_number == page_number: + self._on_page_change() + + def draw_histogram(self, pixbuf): + """Draw a histogram representing in the dialog.""" + pixbuf = image_tools.static_image(pixbuf) + histogram_pixbuf = histogram.draw_histogram(pixbuf, text=False) + self._hist_image.set_from_pixbuf(histogram_pixbuf) + + def clear_histogram(self): + """Clear the histogram in the dialog.""" + self._hist_image.clear() + + def _change_values(self, *args): + if self._block: + return + + self._enhancer.brightness = self._brightness_scale.get_value() + 1 + self._enhancer.contrast = self._contrast_scale.get_value() + 1 + self._enhancer.saturation = self._saturation_scale.get_value() + 1 + self._enhancer.sharpness = self._sharpness_scale.get_value() + 1 + self._enhancer.autocontrast = self._autocontrast_button.get_active() + self._contrast_scale.set_sensitive( + not self._autocontrast_button.get_active()) + self._enhancer.signal_update() + + def _response(self, dialog, response): + + if response in [Gtk.ResponseType.OK, Gtk.ResponseType.DELETE_EVENT]: + _close_dialog() + + elif response == Gtk.ResponseType.APPLY: + self._change_values(self) + prefs['brightness'] = self._enhancer.brightness + prefs['contrast'] = self._enhancer.contrast + prefs['saturation'] = self._enhancer.saturation + prefs['sharpness'] = self._enhancer.sharpness + prefs['auto contrast'] = self._enhancer.autocontrast + + elif response == Gtk.ResponseType.REJECT: + self._block = True + self._brightness_scale.set_value(prefs['brightness'] - 1.0) + self._contrast_scale.set_value(prefs['contrast'] - 1.0) + self._saturation_scale.set_value(prefs['saturation'] - 1.0) + self._sharpness_scale.set_value(prefs['sharpness'] - 1.0) + self._autocontrast_button.set_active(prefs['auto contrast']) + self._block = False + self._change_values(self) + + +def open_dialog(action, window): + """Create and display the (singleton) image enhancement dialog.""" + global _dialog + + if _dialog is None: + _dialog = _EnhanceImageDialog(window) + else: + _dialog.present() + +def _close_dialog(*args): + """Destroy the image enhancement dialog.""" + global _dialog + + if _dialog is not None: + _dialog.destroy() + _dialog = None + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/event.py mcomix-2.1.0/mcomix/event.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/event.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/event.py 2022-01-26 11:34:50.000000000 +0000 @@ -0,0 +1,802 @@ +"""event.py - Event handling (keyboard, mouse, etc.) for the main window. +""" + +import urllib.request, urllib.parse, urllib.error +from gi.repository import Gdk, Gtk + +from mcomix.preferences import prefs +from mcomix import constants +from mcomix import portability +from mcomix import keybindings +from mcomix import openwith + + +class EventHandler(object): + + def __init__(self, window): + self._window = window + + self._last_pointer_pos_x = 0 + self._last_pointer_pos_y = 0 + self._pressed_pointer_pos_x = 0 + self._pressed_pointer_pos_y = 0 + + #: For scrolling "off the page". + self._extra_scroll_events = 0 + #: If True, increment _extra_scroll_events before switchting pages + self._scroll_protection = False + + def resize_event(self, widget, event): + """Handle events from resizing and moving the main window.""" + size = (event.width, event.height) + if size != self._window.previous_size: + self._window.previous_size = size + self._window.draw_image() + + def window_state_event(self, widget, event): + is_fullscreen = self._window.is_fullscreen + if self._window.was_fullscreen != is_fullscreen: + # Fullscreen state changed. + self._window.was_fullscreen = is_fullscreen + # Re-enable control, now that transition is complete. + toggleaction = self._window.actiongroup.get_action('fullscreen') + toggleaction.set_sensitive(True) + if is_fullscreen: + redraw = True + else: + # Only redraw if we don't need to restore geometry. + redraw = not self._window.restore_window_geometry() + self._window._update_toggles_sensitivity() + if redraw: + self._window.previous_size = self._window.get_size() + self._window.draw_image() + + def register_key_events(self): + """ Registers keyboard events and their default binings, and hooks + them up with their respective callback functions. """ + + manager = keybindings.keybinding_manager(self._window) + + # Navigation keys + manager.register('previous_page', + ['Page_Up', 'KP_Page_Up', 'BackSpace'], + self._flip_page, kwargs={'number_of_pages': -1}) + manager.register('next_page', + ['Page_Down', 'KP_Page_Down'], + self._flip_page, kwargs={'number_of_pages': 1}) + manager.register('previous_page_singlestep', + ['Page_Up', 'KP_Page_Up', 'BackSpace'], + self._flip_page, kwargs={'number_of_pages': -1, 'single_step': True}) + manager.register('next_page_singlestep', + ['Page_Down', 'KP_Page_Down'], + self._flip_page, kwargs={'number_of_pages': 1, 'single_step': True}) + manager.register('previous_page_dynamic', + ['Left'], + self._left_right_page_progress, kwargs={'number_of_pages': -1}) + manager.register('next_page_dynamic', + ['Right'], + self._left_right_page_progress, kwargs={'number_of_pages': 1}) + + manager.register('previous_page_ff', + ['Page_Up', 'KP_Page_Up', 'BackSpace', 'Left'], + self._flip_page, kwargs={'number_of_pages': -10}) + manager.register('next_page_ff', + ['Page_Down', 'KP_Page_Down', 'Right'], + self._flip_page, kwargs={'number_of_pages': 10}) + + + manager.register('first_page', + ['Home', 'KP_Home'], + self._window.first_page) + manager.register('last_page', + ['End', 'KP_End'], + self._window.last_page) + manager.register('go_to', + ['G'], + self._window.page_select) + + # Numpad (without numlock) aligns the image depending on the key. + manager.register('scroll_left_bottom', + ['KP_1'], + self._window.scroll_to_predefined, + kwargs={'destination': (-1, 1), 'index': constants.UNION_INDEX}) + manager.register('scroll_middle_bottom', + ['KP_2'], + self._window.scroll_to_predefined, + kwargs={'destination': (constants.SCROLL_TO_CENTER, 1), + 'index': constants.UNION_INDEX}) + manager.register('scroll_right_bottom', + ['KP_3'], + self._window.scroll_to_predefined, + kwargs={'destination': (1, 1), 'index': constants.UNION_INDEX}) + + manager.register('scroll_left_middle', + ['KP_4'], + self._window.scroll_to_predefined, + kwargs={'destination': (-1, constants.SCROLL_TO_CENTER), + 'index': constants.UNION_INDEX}) + manager.register('scroll_middle', + ['KP_5'], + self._window.scroll_to_predefined, + kwargs={'destination': (constants.SCROLL_TO_CENTER, + constants.SCROLL_TO_CENTER), 'index': constants.UNION_INDEX}) + manager.register('scroll_right_middle', + ['KP_6'], + self._window.scroll_to_predefined, + kwargs={'destination': (1, constants.SCROLL_TO_CENTER), + 'index': constants.UNION_INDEX}) + + manager.register('scroll_left_top', + ['KP_7'], + self._window.scroll_to_predefined, + kwargs={'destination': (-1, -1), 'index': constants.UNION_INDEX}) + manager.register('scroll_middle_top', + ['KP_8'], + self._window.scroll_to_predefined, + kwargs={'destination': (constants.SCROLL_TO_CENTER, -1), + 'index': constants.UNION_INDEX}) + manager.register('scroll_right_top', + ['KP_9'], + self._window.scroll_to_predefined, + kwargs={'destination': (1, -1), 'index': constants.UNION_INDEX}) + + # Enter/exit fullscreen. + manager.register('exit_fullscreen', + ['Escape'], + self.escape_event) + + # View modes + manager.register('double_page', + ['d'], + self._window.actiongroup.get_action('double_page').activate) + + + manager.register('best_fit_mode', + ['b'], + self._window.actiongroup.get_action('best_fit_mode').activate) + + manager.register('fit_width_mode', + ['w'], + self._window.actiongroup.get_action('fit_width_mode').activate) + + manager.register('fit_height_mode', + ['h'], + self._window.actiongroup.get_action('fit_height_mode').activate) + + manager.register('fit_size_mode', + ['s'], + self._window.actiongroup.get_action('fit_size_mode').activate) + + manager.register('fit_manual_mode', + ['a'], + self._window.actiongroup.get_action('fit_manual_mode').activate) + + + manager.register('manga_mode', + ['m'], + self._window.actiongroup.get_action('manga_mode').activate) + + manager.register('invert_scroll', + ['x'], + self._window.actiongroup.get_action('invert_scroll').activate) + + manager.register('keep_transformation', + ['k'], + self._window.actiongroup.get_action('keep_transformation').activate) + + manager.register('lens', + ['l'], + self._window.actiongroup.get_action('lens').activate) + + manager.register('stretch', + ['y'], + self._window.actiongroup.get_action('stretch').activate) + + # Zooming commands for manual zoom mode + manager.register('zoom_in', + ['plus', 'KP_Add', 'equal'], + self._window.actiongroup.get_action('zoom_in').activate) + manager.register('zoom_out', + ['minus', 'KP_Subtract'], + self._window.actiongroup.get_action('zoom_out').activate) + # Zoom out is already defined as GTK menu hotkey + manager.register('zoom_original', + ['0', 'KP_0'], + self._window.actiongroup.get_action('zoom_original').activate) + + manager.register('rotate_90', + ['r'], + self._window.rotate_90) + + manager.register('rotate_270', + ['r'], + self._window.rotate_270) + + manager.register('rotate_180', + [], + self._window.rotate_180) + + manager.register('flip_horiz', + [], + self._window.flip_horizontally) + + manager.register('flip_vert', + [], + self._window.flip_vertically) + + manager.register('no_autorotation', + [], + self._window.actiongroup.get_action('no_autorotation').activate) + + manager.register('rotate_90_width', + [], + self._window.actiongroup.get_action('rotate_90_width').activate) + manager.register('rotate_270_width', + [], + self._window.actiongroup.get_action('rotate_270_width').activate) + + manager.register('rotate_90_height', + [], + self._window.actiongroup.get_action('rotate_90_height').activate) + + manager.register('rotate_270_height', + [], + self._window.actiongroup.get_action('rotate_270_height').activate) + + # Arrow keys scroll the image + manager.register('scroll_down', + ['Down', 'KP_Down'], + self._scroll_down) + manager.register('scroll_up', + ['Up', 'KP_Up'], + self._scroll_up) + manager.register('scroll_right', + ['Right', 'KP_Right'], + self._scroll_right) + manager.register('scroll_left', + ['Left', 'KP_Left'], + self._scroll_left) + + # File operations + manager.register('close', + ['W'], + self._window.filehandler.close_file) + + manager.register('quit', + ['Q'], + self._window.close_program) + + manager.register('save_and_quit', + ['q'], + self._window.save_and_terminate_program) + + manager.register('delete', + ['Delete'], + self._window.delete) + + manager.register('extract_page', + ['s'], + self._window.extract_page) + + manager.register('refresh_archive', + ['R'], + self._window.filehandler.refresh_file) + + manager.register('next_archive', + ['N'], + self._window.filehandler._open_next_archive) + + manager.register('previous_archive', + ['P'], + self._window.filehandler._open_previous_archive) + + manager.register('next_directory', + ['N'], + self._window.filehandler.open_next_directory) + + manager.register('previous_directory', + ['P'], + self._window.filehandler.open_previous_directory) + + manager.register('comments', + ['c'], + self._window.actiongroup.get_action('comments').activate) + + manager.register('properties', + ['Return'], + self._window.actiongroup.get_action('properties').activate) + + manager.register('preferences', + ['F12'], + self._window.actiongroup.get_action('preferences').activate) + + manager.register('edit_archive', + [], + self._window.actiongroup.get_action('edit_archive').activate) + + manager.register('open', + ['O'], + self._window.actiongroup.get_action('open').activate) + + manager.register('enhance_image', + ['e'], + self._window.actiongroup.get_action('enhance_image').activate) + + manager.register('library', + ['L'], + self._window.actiongroup.get_action('library').activate) + + # Space key scrolls down a percentage of the window height or the + # image height at a time. When at the bottom it flips to the next + # page. + # + # It also has a "smart scrolling mode" in which we try to follow + # the flow of the comic. + # + # If Shift is pressed we should backtrack instead. + manager.register('smart_scroll_down', + ['space'], + self._smart_scroll_down) + manager.register('smart_scroll_up', + ['space'], + self._smart_scroll_up) + + # User interface + manager.register('osd_panel', + ['Tab'], + self._window.show_info_panel) + + manager.register('minimize', + ['n'], + self._window.minimize) + + manager.register('fullscreen', + ['f', 'F11'], + self._window.actiongroup.get_action('fullscreen').activate) + + manager.register('toolbar', + [], + self._window.actiongroup.get_action('toolbar').activate) + + manager.register('menubar', + ['M'], + self._window.actiongroup.get_action('menubar').activate) + + manager.register('statusbar', + [], + self._window.actiongroup.get_action('statusbar').activate) + + manager.register('scrollbar', + [], + self._window.actiongroup.get_action('scrollbar').activate) + + manager.register('thumbnails', + ['F9'], + self._window.actiongroup.get_action('thumbnails').activate) + + + manager.register('hide_all', + ['i'], + self._window.actiongroup.get_action('hide_all').activate) + + manager.register('slideshow', + ['S'], + self._window.actiongroup.get_action('slideshow').activate) + + # Execute external command. Bind keys from 1 to 9 to commands 1 to 9. + for i in range(1, 10): + manager.register('execute_command_%d' % i, ['%d' % i], + self._execute_command, args=[i - 1]) + + def key_press_event(self, widget, event, *args): + """Handle key press events on the main window.""" + + # This is set on demand by callback functions + self._scroll_protection = False + + # Dispatch keyboard input handling + manager = keybindings.keybinding_manager(self._window) + # Some keys can only be pressed with certain modifiers that + # are irrelevant to the actual hotkey. Find out and ignore them. + ALL_ACCELS_MASK = (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK | + Gdk.ModifierType.MOD1_MASK) + + keymap = Gdk.Keymap.get_default() + code = keymap.translate_keyboard_state( + event.hardware_keycode, event.get_state(), event.group) + + if code[0]: + keyval = code[1] + consumed = code[4] + + # If the resulting key is upper case (i.e. SHIFT + key), + # convert it to lower case and remove SHIFT from the consumed flags + # to match how keys are registered ( + lowercase) + if (event.get_state() & Gdk.ModifierType.SHIFT_MASK and + keyval != Gdk.keyval_to_lower(keyval)): + keyval = Gdk.keyval_to_lower(keyval) + consumed &= ~Gdk.ModifierType.SHIFT_MASK + + # 'consumed' is the modifier that was necessary to type the key + manager.execute((keyval, event.get_state() & ~consumed & ALL_ACCELS_MASK)) + + # --------------------------------------------------------------- + # Register CTRL for scrolling only one page instead of two + # pages in double page mode. This is mainly for mouse scrolling. + # --------------------------------------------------------------- + if event.keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): + self._window.imagehandler.force_single_step = True + + # ---------------------------------------------------------------- + # We kill the signals here for the Up, Down, Space and Enter keys, + # or they will start fiddling with the thumbnail selector (bad). + # ---------------------------------------------------------------- + if (event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down, + Gdk.KEY_space, Gdk.KEY_KP_Enter, Gdk.KEY_KP_Up, + Gdk.KEY_KP_Down, Gdk.KEY_KP_Home, Gdk.KEY_KP_End, + Gdk.KEY_KP_Page_Up, Gdk.KEY_KP_Page_Down) or + (event.keyval == Gdk.KEY_Return and not + 'GDK_MOD1_MASK' in event.get_state().value_names)): + + self._window.emit_stop_by_name('key_press_event') + return True + + def key_release_event(self, widget, event, *args): + """ Handle release of keys for the main window. """ + + # --------------------------------------------------------------- + # Unregister CTRL for scrolling only one page in double page mode + # --------------------------------------------------------------- + if event.keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): + self._window.imagehandler.force_single_step = False + + def escape_event(self): + """ Determines the behavior of the ESC key. """ + if prefs['escape quits']: + self._window.close_program() + else: + self._window.actiongroup.get_action('fullscreen').set_active(False) + + def scroll_wheel_event(self, widget, event, *args): + """Handle scroll wheel events on the main layout area. The scroll + wheel flips pages in best fit mode and scrolls the scrollbars + otherwise. + """ + if event.get_state() & Gdk.ModifierType.BUTTON2_MASK: + return + + has_direction, direction = event.get_scroll_direction() + if not has_direction: + direction = None + has_delta, delta_x, delta_y = event.get_scroll_deltas() + if has_delta: + if delta_y < 0: + direction = Gdk.ScrollDirection.UP + elif delta_y > 0: + direction = Gdk.ScrollDirection.DOWN + elif delta_x < 0: + direction = Gdk.ScrollDirection.LEFT + elif delta_x > 0: + direction = Gdk.ScrollDirection.RIGHT + + self._scroll_protection = True + + if direction == Gdk.ScrollDirection.UP: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: + self._window.manual_zoom_in() + elif prefs['smart scroll']: + self._smart_scroll_up(prefs['number of pixels to scroll per mouse wheel event']) + else: + self._scroll_with_flipping(0, -prefs['number of pixels to scroll per mouse wheel event']) + + elif direction == Gdk.ScrollDirection.DOWN: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: + self._window.manual_zoom_out() + elif prefs['smart scroll']: + self._smart_scroll_down(prefs['number of pixels to scroll per mouse wheel event']) + else: + self._scroll_with_flipping(0, prefs['number of pixels to scroll per mouse wheel event']) + + elif direction == Gdk.ScrollDirection.RIGHT: + if not self._window.is_manga_mode: + self._window.flip_page(+1) + else: + self._previous_page_with_protection() + + elif direction == Gdk.ScrollDirection.LEFT: + if not self._window.is_manga_mode: + self._previous_page_with_protection() + else: + self._window.flip_page(+1) + + def mouse_press_event(self, widget, event): + """Handle mouse click events on the main layout area.""" + + if self._window.was_out_of_focus: + return + + if event.button == 1: + self._pressed_pointer_pos_x = event.x_root + self._pressed_pointer_pos_y = event.y_root + self._last_pointer_pos_x = event.x_root + self._last_pointer_pos_y = event.y_root + + elif event.button == 2: + self._window.actiongroup.get_action('lens').set_active(True) + + elif (event.button == 3 and + not event.get_state() & Gdk.ModifierType.MOD1_MASK and + not event.get_state() & Gdk.ModifierType.SHIFT_MASK): + self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) + self._window.popup.popup(None, None, None, None, + event.button, event.time) + + elif event.button == 4: + self._window.show_info_panel() + + def mouse_release_event(self, widget, event): + """Handle mouse button release events on the main layout area.""" + + self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) + + if (event.button == 1): + + if event.x_root == self._pressed_pointer_pos_x and \ + event.y_root == self._pressed_pointer_pos_y and \ + not self._window.was_out_of_focus: + + if event.get_state() & Gdk.ModifierType.SHIFT_MASK: + self._flip_page(10) + else: + self._flip_page(1) + + else: + self._window.was_out_of_focus = False + + elif event.button == 2: + self._window.actiongroup.get_action('lens').set_active(False) + + elif event.button == 3: + if event.get_state() & Gdk.ModifierType.MOD1_MASK: + self._flip_page(-1) + elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: + self._flip_page(-10) + + def mouse_move_event(self, widget, event): + """Handle mouse pointer movement events.""" + + event = _get_latest_event_of_same_type(event) + + if 'GDK_BUTTON1_MASK' in event.get_state().value_names: + self._window.cursor_handler.set_cursor_type(constants.GRAB_CURSOR) + scrolled = self._window.scroll(self._last_pointer_pos_x - event.x_root, + self._last_pointer_pos_y - event.y_root) + + # Cursor wrapping stuff. See: + # https://sourceforge.net/tracker/?func=detail&aid=2988441&group_id=146377&atid=764987 + if prefs['wrap mouse scroll'] and scrolled: + # FIXME: Problems with multi-screen setups + screen = self._window.get_screen() + warp_x0 = warp_y0 = 0 + warp_x1 = screen.get_width() + warp_y1 = screen.get_height() + + new_x = _valwarp(event.x_root, warp_x1, minval=warp_x0) + new_y = _valwarp(event.y_root, warp_y1, minval=warp_y0) + if (new_x != event.x_root) or (new_y != event.y_root): + display = screen.get_display() + display.warp_pointer(screen, int(new_x), int(new_y)) + ## This might be (or might not be) necessary to avoid + ## doing one warp multiple times. + event = _get_latest_event_of_same_type(event) + + self._last_pointer_pos_x = new_x + self._last_pointer_pos_y = new_y + else: + self._last_pointer_pos_x = event.x_root + self._last_pointer_pos_y = event.y_root + self._drag_timer = event.time + + def drag_n_drop_event(self, widget, context, x, y, selection, drag_id, + eventtime): + """Handle drag-n-drop events on the main layout area.""" + # The drag source is inside MComix itself, so we ignore. + + if (Gtk.drag_get_source_widget(context) is not None): + return + + uris = selection.get_uris() + + if not uris: + return + + # Normalize URIs + uris = [portability.normalize_uri(uri) for uri in uris] + paths = [urllib.request.url2pathname(uri) for uri in uris] + + if len(paths) > 1: + self._window.filehandler.open_file(paths) + else: + self._window.filehandler.open_file(paths[0]) + + def _scroll_with_flipping(self, x, y): + """Handle scrolling with the scroll wheel or the arrow keys, for which + the pages might be flipped depending on the preferences. Returns True + if able to scroll without flipping and False if a new page was flipped + to. + """ + + self._scroll_protection = True + + if self._window.scroll(x, y): + self._extra_scroll_events = 0 + return True + + if y > 0 or (self._window.is_manga_mode and x < 0) or ( + not self._window.is_manga_mode and x > 0): + page_flipped = self._next_page_with_protection() + else: + page_flipped = self._previous_page_with_protection() + + return not page_flipped + + def _scroll_down(self): + """ Scrolls down. """ + self._scroll_with_flipping(0, prefs['number of pixels to scroll per key event']) + + def _scroll_up(self): + """ Scrolls up. """ + self._scroll_with_flipping(0, -prefs['number of pixels to scroll per key event']) + + def _scroll_right(self): + """ Scrolls right. """ + self._scroll_with_flipping(prefs['number of pixels to scroll per key event'], 0) + + def _scroll_left(self): + """ Scrolls left. """ + self._scroll_with_flipping(-prefs['number of pixels to scroll per key event'], 0) + + def _smart_scroll_down(self, small_step=None): + """ Smart scrolling. """ + self._smart_scrolling(small_step, False) + + def _smart_scroll_up(self, small_step=None): + """ Reversed smart scrolling. """ + self._smart_scrolling(small_step, True) + + def _smart_scrolling(self, small_step, backwards): + # Collect data from the environment + viewport_size = self._window.get_visible_area_size() + distance = prefs['smart scroll percentage'] + if small_step is None: + max_scroll = [distance * viewport_size[0], + distance * viewport_size[1]] # 2D only + else: + max_scroll = [small_step] * 2 # 2D only + swap_axes = constants.SWAPPED_AXES if prefs['invert smart scroll'] \ + else constants.NORMAL_AXES + self._window.update_layout_position() + + # Scroll to the new position + new_index = self._window.layout.scroll_smartly(max_scroll, backwards, swap_axes) + n = 2 if self._window.displayed_double() else 1 # XXX limited to at most 2 pages + + if new_index == -1: + self._previous_page_with_protection() + elif new_index == n: + self._next_page_with_protection() + else: + # Update actual viewport + self._window.update_viewport_position() + + + def _next_page_with_protection(self): + """ Advances to the next page. If L{_scroll_protection} is enabled, + this method will only advance if enough scrolling attempts have been made. + + @return: True when the page was flipped.""" + + if not prefs['flip with wheel']: + self._extra_scroll_events = 0 + return False + + if (not self._scroll_protection + or self._extra_scroll_events >= prefs['number of key presses before page turn'] - 1 + or not self._window.is_scrollable()): + + self._flip_page(1) + return True + + elif (self._scroll_protection): + self._extra_scroll_events = max(1, self._extra_scroll_events + 1) + return False + + else: + # This path should not be reached. + assert False, "Programmer is moron, incorrect assertion." + + def _previous_page_with_protection(self): + """ Goes back to the previous page. If L{_scroll_protection} is enabled, + this method will only go back if enough scrolling attempts have been made. + + @return: True when the page was flipped.""" + + if not prefs['flip with wheel']: + self._extra_scroll_events = 0 + return False + + if (not self._scroll_protection + or self._extra_scroll_events <= -prefs['number of key presses before page turn'] + 1 + or not self._window.is_scrollable()): + + self._flip_page(-1) + return True + + elif (self._scroll_protection): + self._extra_scroll_events = min(-1, self._extra_scroll_events - 1) + return False + + else: + # This path should not be reached. + assert False, "Programmer is moron, incorrect assertion." + + + def _flip_page(self, number_of_pages, single_step=False): + """ Switches a number of pages forwards/backwards. If C{single_step} is True, + the page count will be advanced by only one page even in double page mode. """ + self._extra_scroll_events = 0 + self._window.flip_page(number_of_pages, single_step=single_step) + + def _left_right_page_progress(self, number_of_pages=1): + """ If number_of_pages is positive, this function advances the specified + number of pages in manga mode and goes back the same number of pages in + normal mode. The opposite happens for number_of_pages being negative. """ + self._flip_page(-number_of_pages if self._window.is_manga_mode else number_of_pages) + + def _execute_command(self, cmdindex): + """ Execute an external command. cmdindex should be an integer from 0 to 9, + representing the command that should be executed. """ + manager = openwith.OpenWithManager() + commands = [cmd for cmd in manager.get_commands() if not cmd.is_separator()] + if len(commands) > cmdindex: + commands[cmdindex].execute(self._window) + + +def _get_latest_event_of_same_type(event): + """Return the latest event in the event queue that is of the same type + as , or itself if no such events are in the queue. All + events of that type will be removed from the event queue. + """ + return event + events = [] + + while Gdk.events_pending(): + queued_event = Gdk.event_get() + + if queued_event is not None: + + if queued_event.type == event.type: + event = queued_event + else: + events.append(queued_event) + + for queued_event in events: + queued_event.put() + + return event + + +def _valwarp(cur, maxval, minval=0, tolerance=3, extra=2): + """ Helper function for warping the cursor around the screen when it + comes within `tolerance` to a border (and `extra` more to avoid + jumping back and forth). """ + if cur < minval + tolerance: + overmove = minval + tolerance - cur + return maxval - tolerance - overmove - extra + if (maxval - cur) < tolerance: + overmove = tolerance - (maxval - cur) + return minval + tolerance + overmove + extra + return cur + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_base_dialog.py mcomix-2.1.0/mcomix/file_chooser_base_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_base_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_chooser_base_dialog.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,297 @@ +"""filechooser_chooser_base_dialbg.py - Custom FileChooserDialog implementations.""" + +import os +import mimetypes +import fnmatch +from gi.repository import Gtk, Pango + +from mcomix.preferences import prefs +from mcomix import image_tools +from mcomix import archive_tools +from mcomix import labels +from mcomix import constants +from mcomix import log +from mcomix import thumbnail_tools +from mcomix import message_dialog +from mcomix import file_provider +from mcomix import tools + +mimetypes.init() + +class _BaseFileChooserDialog(Gtk.Dialog): + + """We roll our own FileChooserDialog because the one in GTK seems + buggy with the preview widget. The argument dictates what type + of filechooser dialog we want (i.e. it is Gtk.FileChooserAction.OPEN + or Gtk.FileChooserAction.SAVE). + + This is a base class for the _MainFileChooserDialog, the + _LibraryFileChooserDialog and the SimpleFileChooserDialog. + + Subclasses should implement a method files_chosen(paths) that will be + called once the filechooser has done its job and selected some files. + If the dialog was closed or Cancel was pressed, is the empty list. + """ + + _last_activated_file = None + + def __init__(self, action=Gtk.FileChooserAction.OPEN): + self._action = action + self._destroyed = False + + if action == Gtk.FileChooserAction.OPEN: + title = _('Open') + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK) + + else: + title = _('Save') + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK) + + super(_BaseFileChooserDialog, self).__init__(title, None, 0, buttons) + self.set_default_response(Gtk.ResponseType.OK) + + self.filechooser = Gtk.FileChooserWidget(action=action) + self.filechooser.set_size_request(680, 420) + self.vbox.pack_start(self.filechooser, True, True, 0) + self.set_border_width(4) + self.filechooser.set_border_width(6) + self.connect('response', self._response) + self.filechooser.connect('file_activated', self._response, + Gtk.ResponseType.OK) + + preview_box = Gtk.VBox(False, 10) + preview_box.set_size_request(130, 0) + self._preview_image = Gtk.Image() + self._preview_image.set_size_request(130, 130) + preview_box.pack_start(self._preview_image, False, False, 0) + self.filechooser.set_preview_widget(preview_box) + + pango_scale_small = (1 / 1.2) + + self._namelabel = labels.FormattedLabel(weight=Pango.Weight.BOLD, + scale=pango_scale_small) + self._namelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + preview_box.pack_start(self._namelabel, False, False, 0) + + self._sizelabel = labels.FormattedLabel(scale=pango_scale_small) + self._sizelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + preview_box.pack_start(self._sizelabel, False, False, 0) + self.filechooser.set_use_preview_label(False) + preview_box.show_all() + self.filechooser.connect('update-preview', self._update_preview) + + self._all_files_filter = self.add_filter( _('All files'), [], ['*']) + + try: + current_file = self._current_file() + last_file = self.__class__._last_activated_file + + # If a file is currently open, use its path + if current_file and os.path.exists(current_file): + self.filechooser.set_current_folder(os.path.dirname(current_file)) + # If no file is open, use the last stored file + elif (last_file and os.path.exists(last_file)): + self.filechooser.set_filename(last_file) + # If no file was stored yet, fall back to preferences + elif os.path.isdir(prefs['path of last browsed in filechooser']): + if prefs['store recent file info']: + self.filechooser.set_current_folder( + prefs['path of last browsed in filechooser']) + else: + self.filechooser.set_current_folder( + constants.HOME_DIR) + + except Exception as ex: # E.g. broken prefs values. + log.debug(ex) + + self.show_all() + + def add_filter(self, name, mimes, patterns=[]): + """Add a filter, called , for each mime type in and + each pattern in to the filechooser. + """ + ffilter = Gtk.FileFilter() + ffilter.add_custom( + Gtk.FileFilterFlags.FILENAME | Gtk.FileFilterFlags.MIME_TYPE, + self._filter, (patterns, mimes)) + + ffilter.set_name(name) + self.filechooser.add_filter(ffilter) + return ffilter + + def add_archive_filters(self): + """Add archive filters to the filechooser. + """ + ffilter = Gtk.FileFilter() + ffilter.set_name(_('All archives')) + self.filechooser.add_filter(ffilter) + supported_formats = archive_tools.get_supported_formats() + for name in sorted(supported_formats): + mime_types, extensions = supported_formats[name] + patterns = ['*.%s' % ext for ext in extensions] + self.add_filter(_('%s archives') % name, mime_types, patterns) + for mime in mime_types: + ffilter.add_mime_type(mime) + for pat in patterns: + ffilter.add_pattern(pat) + + def add_image_filters(self): + """Add images filters to the filechooser. + """ + ffilter = Gtk.FileFilter() + ffilter.set_name(_('All images')) + self.filechooser.add_filter(ffilter) + supported_formats = image_tools.get_supported_formats() + for name in sorted(supported_formats): + mime_types, extensions = supported_formats[name] + patterns = ['*.%s' % ext for ext in extensions] + self.add_filter(_('%s images') % name, mime_types, patterns) + for mime in mime_types: + ffilter.add_mime_type(mime) + for pat in patterns: + ffilter.add_pattern(pat) + + def _filter(self, filter_info, data): + """ Callback function used to determine if a file + should be filtered or not. C{data} is a tuple containing + (patterns, mimes) that should pass the test. Returns True + if the file passed in C{filter_info} should be displayed. """ + + match_patterns, match_mimes = data + + matches_mime = bool([match_mime for match_mime in match_mimes if match_mime == filter_info.mime_type]) + matches_pattern = bool([match_pattern for match_pattern in match_patterns if fnmatch.fnmatch(filter_info.filename, match_pattern)]) + + return matches_mime or matches_pattern + + def collect_files_from_subdir(self, path, filter, recursive=False): + """ Finds archives within C{path} that match the + L{Gtk.FileFilter} passed in C{filter}. """ + + for root, dirs, files in os.walk(path): + for file in files: + full_path = os.path.join(root, file) + mimetype = mimetypes.guess_type(full_path)[0] or 'application/octet-stream' + filter_info = Gtk.FileFilterInfo() + filter_info.contains = Gtk.FileFilterFlags.FILENAME | Gtk.FileFilterFlags.MIME_TYPE + filter_info.filename = full_path + filter_info.mime_type = mimetype + + if (filter == self._all_files_filter or filter.filter(filter_info)): + yield full_path + + if not recursive: + break + + def set_save_name(self, name): + self.filechooser.set_current_name(name) + + def set_current_directory(self, path): + self.filechooser.set_current_folder(path) + + def should_open_recursive(self): + return False + + def _response(self, widget, response): + """Return a list of the paths of the chosen files, or None if the + event only changed the current directory. + """ + if response == Gtk.ResponseType.OK: + if not self.filechooser.get_filenames(): + return + + # Collect files, if necessary also from subdirectories + filter = self.filechooser.get_filter() + paths = [ ] + for path in self.filechooser.get_filenames(): + if os.path.isdir(path): + subdir_files = list(self.collect_files_from_subdir(path, filter, + self.should_open_recursive())) + file_provider.FileProvider.sort_files(subdir_files) + paths.extend(subdir_files) + else: + paths.append(path) + + # FileChooser.set_do_overwrite_confirmation() doesn't seem to + # work on our custom dialog, so we use a simple alternative. + first_path = self.filechooser.get_filenames()[0] + if (self._action == Gtk.FileChooserAction.SAVE and + not os.path.isdir(first_path) and + os.path.exists(first_path)): + + overwrite_dialog = message_dialog.MessageDialog(None, 0, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL) + overwrite_dialog.set_text( + _("A file named '%s' already exists. Do you want to replace it?") % + os.path.basename(first_path), + _('Replacing it will overwrite its contents.')) + response = overwrite_dialog.run() + + if response != Gtk.ResponseType.OK: + self.emit_stop_by_name('response') + return + + # Do not store path if the user chose not to keep a file history + if prefs['store recent file info']: + prefs['path of last browsed in filechooser'] = \ + self.filechooser.get_current_folder() + else: + prefs['path of last browsed in filechooser'] = \ + constants.HOME_DIR + + self.__class__._last_activated_file = first_path + self.files_chosen(paths) + + else: + self.files_chosen([]) + + self._destroyed = True + + def _update_preview(self, *args): + if self.filechooser.get_preview_filename(): + path = self.filechooser.get_preview_filename() + else: + path = None + + if path and os.path.isfile(path): + thumbnailer = thumbnail_tools.Thumbnailer(size=(128, 128), + archive_support=True) + thumbnailer.thumbnail_finished += self._preview_thumbnail_finished + thumbnailer.thumbnail(path, threaded=True) + else: + self._preview_image.clear() + self._namelabel.set_text('') + self._sizelabel.set_text('') + + def _preview_thumbnail_finished(self, filepath, pixbuf): + """ Called when the thumbnailer has finished creating + the thumbnail for . """ + + if self._destroyed: + return + + current_path = self.filechooser.get_preview_filename() + if current_path and current_path == filepath: + + if pixbuf is None: + self._preview_image.clear() + self._namelabel.set_text('') + self._sizelabel.set_text('') + + else: + pixbuf = image_tools.add_border(pixbuf, 1) + self._preview_image.set_from_pixbuf(pixbuf) + self._namelabel.set_text(os.path.basename(filepath)) + self._sizelabel.set_text(tools.format_byte_size( + os.stat(filepath).st_size)) + + def _current_file(self): + # XXX: This method defers the import of main to avoid cyclic imports + # during startup. + + from mcomix import main + return main.main_window().filehandler.get_path_to_base() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_library_dialog.py mcomix-2.1.0/mcomix/file_chooser_library_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_library_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_chooser_library_dialog.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,87 @@ +"""file_chooser_library_dialog.py - Custom FileChooserDialog implementations.""" + +from gi.repository import Gtk + +from mcomix.preferences import prefs +from mcomix import file_chooser_base_dialog + +_library_filechooser_dialog = None + +class _LibraryFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): + + """The filechooser dialog used when adding books to the library.""" + + def __init__(self, library): + super(_LibraryFileChooserDialog, self).__init__() + self.set_transient_for(library) + self.set_title(_('Add books')) + + self._library = library + + self.filechooser.set_select_multiple(True) + self.add_archive_filters() + + # Remove 'All files' filter from base class + filters = self.filechooser.list_filters() + self.filechooser.remove_filter(filters[0]) + self.filechooser.set_filter(filters[1]) + + try: + # When setting this to the first filter ("All files"), this + # fails on some GTK+ versions and sets the filter to "blank". + # The effect is the same though (i.e. display all files), and + # there is no solution that I know of, so we'll have to live + # with it. It only happens the second time a dialog is created + # though, which is very strange. + self.filechooser.set_filter(filters[ + prefs['last filter in library filechooser']]) + + except Exception: + self.filechooser.set_filter(filters[0]) + + # Remove default buttons and add buttons that make more sense + for widget in self.get_action_area().get_children(): + self.get_action_area().remove(widget) + + self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) + self.add_button(Gtk.STOCK_ADD, Gtk.ResponseType.OK) + self.set_default_response(Gtk.ResponseType.OK) + + def should_open_recursive(self): + return True + + def files_chosen(self, paths): + if paths: + try: # For some reason this fails sometimes (GTK+ bug?) + filter_index = self.filechooser.list_filters().index( + self.filechooser.get_filter()) + prefs['last filter in library filechooser'] = filter_index + + except Exception: + pass + + close_library_filechooser_dialog() + self._library.add_books(paths, None) + + else: + close_library_filechooser_dialog() + +def open_library_filechooser_dialog(library): + """Open the library filechooser dialog.""" + global _library_filechooser_dialog + + if _library_filechooser_dialog is None: + _library_filechooser_dialog = _LibraryFileChooserDialog(library) + else: + _library_filechooser_dialog.present() + +def close_library_filechooser_dialog(*args): + """Close the library filechooser dialog.""" + global _library_filechooser_dialog + + if _library_filechooser_dialog is not None: + _library_filechooser_dialog.destroy() + _library_filechooser_dialog = None + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_main_dialog.py mcomix-2.1.0/mcomix/file_chooser_main_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_main_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_chooser_main_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,71 @@ +"""file_chooser_main_dialog.py - Custom FileChooserDialog implementations.""" + +from gi.repository import Gtk + +from mcomix.preferences import prefs +from mcomix import file_chooser_base_dialog + +_main_filechooser_dialog = None + +class _MainFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): + + """The normal filechooser dialog used with the "Open" menu item.""" + + def __init__(self, window): + super(_MainFileChooserDialog, self).__init__() + self._window = window + self.set_transient_for(window) + self.filechooser.set_select_multiple(True) + self.add_archive_filters() + self.add_image_filters() + filters = self.filechooser.list_filters() + try: + # When setting this to the first filter ("All files"), this + # fails on some GTK+ versions and sets the filter to "blank". + # The effect is the same though (i.e. display all files), and + # there is no solution that I know of, so we'll have to live + # with it. It only happens the second time a dialog is created + # though, which is very strange. + self.filechooser.set_filter(filters[ + prefs['last filter in main filechooser']]) + except: + self.filechooser.set_filter(filters[0]) + + def files_chosen(self, paths): + if paths: + try: # For some reason this fails sometimes (GTK+ bug?) + filter_index = self.filechooser.list_filters().index( + self.filechooser.get_filter()) + prefs['last filter in main filechooser'] = filter_index + except: + pass + _close_main_filechooser_dialog() + + # If more than one file is selected, restrict opening + # further files to the selection. + if len(paths) > 1: + files = paths + else: + files = paths[0] + + self._window.filehandler.open_file(files) + else: + _close_main_filechooser_dialog() + +def open_main_filechooser_dialog(action, window): + """Open the main filechooser dialog.""" + global _main_filechooser_dialog + if _main_filechooser_dialog is None: + _main_filechooser_dialog = _MainFileChooserDialog(window) + else: + _main_filechooser_dialog.present() + + +def _close_main_filechooser_dialog(*args): + """Close the main filechooser dialog.""" + global _main_filechooser_dialog + if _main_filechooser_dialog is not None: + _main_filechooser_dialog.destroy() + _main_filechooser_dialog = None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_simple_dialog.py mcomix-2.1.0/mcomix/file_chooser_simple_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_chooser_simple_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_chooser_simple_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,30 @@ +"""file_chooser_simple_dialog.py - Custom FileChooserDialog implementations.""" + +from gi.repository import Gtk + +from mcomix import file_chooser_base_dialog + +class SimpleFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): + + """A simple filechooser dialog that is designed to be used with the + Gtk.Dialog.run() method. The dictates what type of filechooser + dialog we want (i.e. save or open). If the type is an open-dialog, we + use multiple selection by default. + """ + + def __init__(self, action=Gtk.FileChooserAction.OPEN): + super(SimpleFileChooserDialog, self).__init__(action) + if action == Gtk.FileChooserAction.OPEN: + self.filechooser.set_select_multiple(True) + self._paths = None + + def get_paths(self): + """Return the selected paths. To be called after run() has returned + a response. + """ + return self._paths + + def files_chosen(self, paths): + self._paths = paths + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_handler.py mcomix-2.1.0/mcomix/file_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_handler.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_handler.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,691 @@ +"""file_handler.py - File handler that takes care of opening archives and images.""" + + +import os +import shutil +import tempfile +import threading +import re +import pickle +from gi.repository import Gtk + +from mcomix.preferences import prefs +from mcomix import archive_extractor +from mcomix import archive_tools +from mcomix import image_tools +from mcomix import tools +from mcomix import constants +from mcomix import file_provider +from mcomix import callback +from mcomix import log +from mcomix import last_read_page +from mcomix import message_dialog +from mcomix.library import backend + + +class FileHandler(object): + + """The FileHandler keeps track of the actual files/archives opened. + + While ImageHandler takes care of pages/images, this class provides + the raw file names for archive members and image files, extracts + archives, and lists directories for image files. + """ + + def __init__(self, window): + #: Indicates if files/archives are currently loaded/loading. + self.file_loaded = False + self.file_loading = False + #: None if current file is not an archive, or unrecognized format. + self.archive_type = None + + #: Either path to the current archive, or first file in image list. + #: This is B{not} the path to the currently open page. + self._current_file = None + #: Reference to L{MainWindow}. + self._window = window + #: Path to opened archive file, or directory containing current images. + self._base_path = None + #: Temporary directory used for extracting archives. + self._tmp_dir = None + #: If C{True}, no longer wait for files to get extracted. + self._stop_waiting = False + #: List of comment files inside of the currently opened archive. + self._comment_files = [] + #: Mapping of absolute paths to archive path names. + self._name_table = {} + #: Archive extractor. + self._extractor = archive_extractor.Extractor() + self._extractor.file_extracted += self._extracted_file + self._extractor.contents_listed += self._listed_contents + #: Condition to wait on when extracting archives and waiting on files. + self._condition = None + #: Provides a list of available files/archives in the open directory. + self._file_provider = None + #: Keeps track of the last read page in archives + self.last_read_page = last_read_page.LastReadPage(backend.LibraryBackend()) + #: Regexp used for determining which archive files are comment files. + self._comment_re = None + self.update_comment_extensions() + + self.last_read_page.set_enabled(bool(prefs['store recent file info'])) + + def refresh_file(self, *args, **kwargs): + """ Closes the current file(s)/archive and reloads them. """ + if self.file_loaded: + current_file = os.path.abspath(self._window.imagehandler.get_real_path()) + if self.archive_type is not None: + start_page = self._window.imagehandler.get_current_page() + else: + start_page = 0 + self.open_file(current_file, start_page, keep_fileprovider=True) + + def open_file(self, path, start_page=0, keep_fileprovider=False): + """Open the file pointed to by . + + If is not set we set the current + page to 1 (first page), if it is set we set the current page to the + value of . If is non-positive it means the + last image. + + Return True if the file is successfully loaded. + """ + + self._close() + + try: + path = self._initialize_fileprovider(path, keep_fileprovider) + except ValueError as ex: + self._window.statusbar.set_message(str(ex)) + self._window.osd.show(str(ex)) + return False + + error_message = self._check_access(path) + if error_message: + self._window.statusbar.set_message(error_message) + self._window.osd.show(error_message) + self.file_opened() + return False + + self.filelist = self._file_provider.list_files() + self.archive_type = archive_tools.archive_mime_type(path) + self._start_page = start_page + self._current_file = os.path.abspath(path) + self._stop_waiting = False + + image_files = [] + current_image_index = 0 + + # Actually open the file(s)/archive passed in path. + if self.archive_type is not None: + try: + self._open_archive(self._current_file) + except Exception as ex: + self._window.statusbar.set_message(str(ex)) + self._window.osd.show(str(ex)) + self.file_opened() + return False + self.file_loading = True + else: + image_files, current_image_index = \ + self._open_image_files(self.filelist, self._current_file) + self._archive_opened(image_files) + + return True + + def _archive_opened(self, image_files): + """ Called once the archive has been opened and its contents listed. + """ + + self._window.imagehandler._base_path = self._base_path + self._window.imagehandler._image_files = image_files + self.file_opened() + + if not image_files: + msg = _("No images in '%s'") % os.path.basename(self._current_file) + self._window.statusbar.set_message(msg) + self._window.osd.show(msg) + + else: + if self.archive_type is None: + # If no extraction is required, mark all files as available. + self.file_available(self.filelist) + # Set current page to current file. + if self._current_file in self.filelist: + current_image_index = self.filelist.index(self._current_file) + else: + current_image_index = 0 + else: + last_image_index = self._get_index_for_page(self._start_page, + len(image_files), + self._current_file) + if self._start_page or \ + prefs['stored dialog choices'].get('resume-from-last-read-page', False): + current_image_index = last_image_index + else: + # Don't switch to last page yet; since we have not asked + # the user for confirmation yet. + current_image_index = 0 + if last_image_index != current_image_index: + # Bump last page closer to the front of the extractor queue. + self._window.set_page(last_image_index + 1) + + self._window.set_page(current_image_index + 1) + + if self.archive_type is not None: + self._extractor.extract() + if last_image_index != current_image_index and \ + self._ask_goto_last_read_page(self._current_file, last_image_index + 1): + self._window.set_page(last_image_index + 1) + + self.write_fileinfo_file() + + self._window.uimanager.recent.add(self._current_file) + + @callback.Callback + def file_opened(self): + """ Called when a new set of files has successfully been opened. """ + self.file_loaded = True + + @callback.Callback + def file_closed(self): + """ Called when the current file has been closed. """ + pass + + def close_file(self): + """Close the currently opened file and its provider. """ + self._close(close_provider=True) + + def _close(self, close_provider=False): + """Run tasks for "closing" the currently opened file(s).""" + if self.file_loaded or self.file_loading: + if close_provider: + self._file_provider = None + self.update_last_read_page() + if self.archive_type is not None: + self._extractor.close() + self._window.imagehandler.cleanup() + self.file_loaded = False + self.file_loading = False + self.archive_type = None + self._current_file = None + self._base_path = None + self._stop_waiting = True + self._comment_files = [] + self._name_table.clear() + self.file_closed() + # Catch up on UI events, so we don't leave idle callbacks. + while Gtk.events_pending(): + Gtk.main_iteration_do(False) + tools.garbage_collect() + if self._tmp_dir is not None: + self.thread_delete(self._tmp_dir) + self._tmp_dir = None + + def _initialize_fileprovider(self, path, keep_fileprovider): + """ Creates the L{file_provider.FileProvider} for C{path}. + + If C{path} is a list, assumes that only the files in the list + should be available. If C{path} is a string, assume that it is + either a directory or an image file, and all files in that directory + should be opened. + + @param path: List of file names, or single file/directory as string. + @param keep_fileprovider: If C{True}, no new provider is constructed. + @return: If C{path} was a list, returns the first list element. + Otherwise, C{path} is not modified.""" + + if isinstance(path, list) and len(path) == 0: + # This is a programming error and does not need translation. + assert False, "Tried to open an empty list of files." + + elif isinstance(path, list) and len(path) > 0: + # A list of files was passed - open only these files. + if self._file_provider is None or not keep_fileprovider: + self._file_provider = file_provider.get_file_provider(path) + + return path[0] + else: + # A single file was passed - use Comix' classic open mode + # and open all files in its directory. + if self._file_provider is None or not keep_fileprovider: + self._file_provider = file_provider.get_file_provider([ path ]) + + return path + + def _check_access(self, path): + """ Checks for various error that could occur when opening C{path}. + + @param path: Path to file that should be opened. + @return: An appropriate error string, or C{None} if no error was found. + """ + if not os.path.exists(path): + return _('Could not open %s: No such file.') % path + + elif not os.access(path, os.R_OK): + return _('Could not open %s: Permission denied.') % path + + else: + return None + + def _open_archive(self, path): + """ Opens the archive passed in C{path}. + + Creates an L{archive_extractor.Extractor} and extracts all images + found within the archive. + + @return: A tuple containing C{(image_files, image_index)}. """ + + self._tmp_dir = tempfile.mkdtemp(prefix='mcomix.', suffix=os.sep) + self._base_path = path + try: + self._condition = self._extractor.setup(self._base_path, + self._tmp_dir, + self.archive_type) + except Exception: + self._condition = None + raise + + def _listed_contents(self, archive, files): + + if not self.file_loading: + return + self.file_loading = False + + files = self._extractor.get_files() + archive_images = [image for image in files + if image_tools.is_image_file(image) + # Remove MacOS meta files from image list + and not '__MACOSX' in os.path.normpath(image).split(os.sep)] + + self._sort_archive_images(archive_images) + image_files = [ os.path.join(self._tmp_dir, f) + for f in archive_images ] + + comment_files = list(filter(self._comment_re.search, files)) + tools.alphanumeric_sort(comment_files) + self._comment_files = [ os.path.join(self._tmp_dir, f) + for f in comment_files ] + + self._name_table = dict(list(zip(image_files, archive_images))) + self._name_table.update(list(zip(self._comment_files, comment_files))) + + self._extractor.set_files(archive_images + comment_files) + + self._archive_opened(image_files) + + def _sort_archive_images(self, filelist): + """ Sorts the image list passed in C{filelist} based on the sorting + preference option. """ + + if prefs['sort archive by'] == constants.SORT_NAME: + tools.alphanumeric_sort(filelist) + elif prefs['sort archive by'] == constants.SORT_NAME_LITERAL: + filelist.sort() + else: + # No sorting + pass + + if prefs['sort archive order'] == constants.SORT_DESCENDING: + filelist.reverse() + + def _get_index_for_page(self, start_page, num_of_pages, path): + """ Returns the page that should be displayed for an archive. + @param start_page: If -1, show last page. If 0, show either first page + or last read page. If > 0, show C{start_page}. + @param num_of_pages: Page count. + @param path: Archive path. + """ + if start_page < 0 and prefs['default double page']: + current_image_index = num_of_pages - 2 + elif start_page < 0 and not prefs['default double page']: + current_image_index = num_of_pages - 1 + elif start_page == 0: + current_image_index = (self.last_read_page.get_page(path) or 1) - 1 + else: + current_image_index = start_page - 1 + + return min(max(0, current_image_index), num_of_pages - 1) + + def _ask_goto_last_read_page(self, path, last_read_page): + """ If the user read an archive previously, ask to continue from + that time, or from page 1. This method returns a page index, that is, + index + 1. """ + + read_date = self.last_read_page.get_date(path) + + dialog = message_dialog.MessageDialog(self._window, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, + Gtk.ButtonsType.YES_NO) + dialog.set_default_response(Gtk.ResponseType.YES) + dialog.set_should_remember_choice('resume-from-last-read-page', + (Gtk.ResponseType.YES, Gtk.ResponseType.NO)) + dialog.set_text( + (_('Continue reading from page %d?') % last_read_page), + _('You stopped reading here on %(date)s, %(time)s. ' + 'If you choose "Yes", reading will resume on page %(page)d. Otherwise, ' + 'the first page will be loaded.') % {'date': read_date.date().strftime("%x"), + 'time': read_date.time().strftime("%X"), 'page': last_read_page}) + result = dialog.run() + + return result == Gtk.ResponseType.YES + + def _open_image_files(self, filelist, image_path): + """ Opens all files passed in C{filelist}. + + If C{image_path} is found in C{filelist}, the current page will be set + to its index within C{filelist}. + + @return: Tuple of C{(image_files, image_index)} + """ + + self._base_path = self._file_provider.get_directory() + + if image_path in filelist: + current_image_index = filelist.index(image_path) + else: + current_image_index = 0 + + return filelist, current_image_index + + def get_file_number(self): + if self.archive_type is None: + # No file numbers for images. + return 0, 0 + file_list = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) + if self._current_file in file_list: + current_index = file_list.index(self._current_file) + else: + current_index = 0 + return current_index + 1, len(file_list) + + def get_number_of_comments(self): + """Return the number of comments in the current archive.""" + return len(self._comment_files) + + def get_comment_text(self, num): + """Return the text in comment or None if comment is not + readable. + """ + self._wait_on_comment(num) + try: + fd = open(self._comment_files[num - 1], 'r') + text = fd.read() + fd.close() + except Exception: + text = None + return text + + def get_comment_name(self, num): + """Return the filename of comment .""" + return self._comment_files[num - 1] + + def update_comment_extensions(self): + """Update the regular expression used to filter out comments in + archives by their filename. + """ + exts = '|'.join(prefs['comment extensions']) + self._comment_re = re.compile(r'\.(%s)\s*$' % exts, re.I) + + def get_path_to_base(self): + """Return the full path to the current base (path to archive or + image directory.) + """ + if self.archive_type is not None: + return self._base_path + elif self._window.imagehandler._image_files: + img_index = self._window.imagehandler._current_image_index + filename = self._window.imagehandler._image_files[img_index] + return os.path.dirname(filename) + else: + return None + + def get_base_filename(self): + """Return the filename of the current base (archive filename or + directory name). + """ + return os.path.basename(self.get_path_to_base()) + + def get_pretty_current_filename(self): + """Return a string with the name of the currently viewed file that is + suitable for printing. + """ + + return self._window.imagehandler.get_pretty_current_filename() + + def _open_next_archive(self, *args): + """Open the archive that comes directly after the currently loaded + archive in that archive's directory listing, sorted alphabetically. + Returns True if a new archive was opened, False otherwise. + """ + if self.archive_type is not None: + + files = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) + absolute_path = os.path.abspath(self._base_path) + if absolute_path not in files: return + current_index = files.index(absolute_path) + + for path in files[current_index + 1:]: + if archive_tools.archive_mime_type(path) is not None: + self._close() + self.open_file(path, keep_fileprovider=True) + return True + + return False + + def _open_previous_archive(self, *args): + """Open the archive that comes directly before the currently loaded + archive in that archive's directory listing, sorted alphabetically. + Returns True if a new archive was opened, False otherwise. + """ + if self.archive_type is not None: + + files = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) + absolute_path = os.path.abspath(self._base_path) + if absolute_path not in files: return + current_index = files.index(absolute_path) + + for path in reversed(files[:current_index]): + if archive_tools.archive_mime_type(path) is not None: + self._close() + self.open_file(path, prefs['open first file in prev archive']-1, + keep_fileprovider=True) + return True + + return False + + def open_next_directory(self, *args): + """ Opens the next sibling directory of the current file, as specified by + file provider. Returns True if a new directory was opened and files found. """ + + if self._file_provider is None: + return + + if self.archive_type is not None: + listmode = file_provider.FileProvider.ARCHIVES + else: + listmode = file_provider.FileProvider.IMAGES + + current_dir = self._file_provider.get_directory() + if not self._file_provider.next_directory(): + # Restore current directory if no files were found + self._file_provider.set_directory(current_dir) + return False + + files = self._file_provider.list_files(listmode) + self._close() + if len(files) > 0: + path = files[0] + else: + path = self._file_provider.get_directory() + self.open_file(path, keep_fileprovider=True) + return True + + def open_previous_directory(self, *args): + """ Opens the previous sibling directory of the current file, as specified by + file provider. Returns True if a new directory was opened and files found. """ + + if self._file_provider is None: + return + + if self.archive_type is not None: + listmode = file_provider.FileProvider.ARCHIVES + else: + listmode = file_provider.FileProvider.IMAGES + + current_dir = self._file_provider.get_directory() + if not self._file_provider.previous_directory(): + # Restore current directory if no files were found + self._file_provider.set_directory(current_dir) + return False + + files = self._file_provider.list_files(listmode) + self._close() + if len(files) > 0: + path = files[prefs['open first file in prev directory']-1] + else: + path = self._file_provider.get_directory() + + self.open_file(path, ( + prefs['open first file in prev archive'] or \ + prefs['open first file in prev directory'])-1, + keep_fileprovider=True) + return True + + def file_is_available(self, filepath): + """ Returns True if the file specified by "filepath" is available + for reading, i.e. extracted to harddisk. """ + + if self.archive_type is not None: + with self._condition: + return self._extractor.is_ready(self._name_table[filepath]) + + elif filepath is None: + return False + + elif os.path.isfile(filepath): + return True + + else: + return False + + @callback.Callback + def file_available(self, filepaths): + """ Called every time a new file from the Filehandler's opened + files becomes available. C{filepaths} is a list of now available files. + """ + pass + + def _extracted_file(self, extractor, name): + """ Called when the extractor finishes extracting the file at + . This name is relative to the temporary directory + the files were extracted to. """ + if not self.file_loaded: + return + filepath = os.path.join(extractor.get_directory(), name) + self.file_available([filepath]) + + def _wait_on_comment(self, num): + """Block the running (main) thread until the file corresponding to + comment has been fully extracted. + """ + path = self._comment_files[num - 1] + self._wait_on_file(path) + + def _wait_on_file(self, path): + """Block the running (main) thread if the file is from an + archive and has not yet been extracted. Return when the file is + ready. + """ + if self.archive_type == None or path == None: + return + + try: + name = self._name_table[path] + with self._condition: + while not self._extractor.is_ready(name) and not self._stop_waiting: + self._condition.wait() + except Exception as ex: + log.error('Waiting on extraction of "%s" failed: %s', path, ex) + return + + def _ask_for_files(self, files): + """Ask for to be given priority for extraction. + """ + if self.archive_type == None: + return + + with self._condition: + extractor_files = self._extractor.get_files() + for path in reversed(files): + name = self._name_table[path] + if not self._extractor.is_ready(name): + extractor_files.remove(name) + extractor_files.insert(0, name) + self._extractor.set_files(extractor_files) + + def thread_delete(self, path): + """Start a threaded removal of the directory tree rooted at . + This is to avoid long blockings when removing large temporary dirs. + """ + del_thread = threading.Thread(target=shutil.rmtree, args=(path, True)) + del_thread.name += '-delete' + del_thread.setDaemon(False) + del_thread.start() + + def write_fileinfo_file(self): + """Write current open file information.""" + + if self.file_loaded: + config = open(constants.FILEINFO_PICKLE_PATH, 'wb') + + path = self._window.imagehandler.get_real_path() + page_index = self._window.imagehandler.get_current_page() - 1 + current_file_info = [ path, page_index ] + + pickle.dump(current_file_info, config, pickle.HIGHEST_PROTOCOL) + config.close() + + def read_fileinfo_file(self): + """Read last loaded file info from disk.""" + + fileinfo = None + + if os.path.isfile(constants.FILEINFO_PICKLE_PATH): + config = None + try: + config = open(constants.FILEINFO_PICKLE_PATH, 'rb') + + fileinfo = pickle.load(config) + + config.close() + + except Exception as ex: + log.error(_('! Corrupt preferences file "%s", deleting...'), + constants.FILEINFO_PICKLE_PATH ) + log.info('Error was: %s', ex) + if config is not None: + config.close() + os.remove(constants.FILEINFO_PICKLE_PATH) + + return fileinfo + + def update_last_read_page(self): + """ Stores the currently viewed page. """ + if self.archive_type is None or not self.file_loaded: + return + + archive_path = self.get_path_to_base() + page = self._window.imagehandler.get_current_page() + # Do not store first page (first page is default + # behaviour and would waste space unnecessarily) + try: + if page == 1: + self.last_read_page.clear_page(archive_path) + else: + self.last_read_page.set_page(archive_path, page) + except ValueError: + # The book no longer exists in the library and has been deleted + pass + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/file_provider.py mcomix-2.1.0/mcomix/file_provider.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/file_provider.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/file_provider.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +""" file_provider.py - Handles listing files for the current directory and + switching to the next/previous directory. """ + +import os +import re + +from mcomix import image_tools +from mcomix import archive_tools +from mcomix import tools +from mcomix import constants +from mcomix import preferences +from mcomix import i18n +from mcomix import log + +def get_file_provider(filelist): + """ Initialize a FileProvider with the files in . + If len(filelist) is 1, a OrderedFileProvider will be constructed, which + will simply open all files in the passed directory. + If len(filelist) is greater 1, a PreDefinedFileProvider will be created, + which will only ever list the files that were passed into it. + If len(filelist) is zero, FileProvider will look at the last file opened, + if "Auto Open last file" is set. Otherwise, no provider is constructed. """ + + if len(filelist) > 0: + if len(filelist) == 1: + if os.path.exists(filelist[0]): + provider = OrderedFileProvider(filelist[0]) + else: + provider = None + else: + provider = PreDefinedFileProvider(filelist) + + + elif (preferences.prefs['auto load last file'] + and os.path.isfile(preferences.prefs['path to last file'])): + provider = OrderedFileProvider(preferences.prefs['path to last file']) + + else: + provider = None + + return provider + +class FileProvider(object): + """ Base class for various file listing strategies. """ + + # Constants for determining which files to list. + IMAGES, ARCHIVES = 1, 2 + + def set_directory(self, file_or_directory): + pass + + def get_directory(self): + return os.path.abspath(os.getcwd()) + + def list_files(self, mode=IMAGES): + return [] + + def next_directory(self): + return False + + def previous_directory(self): + return False + + @staticmethod + def sort_files(files): + """ Sorts a list of C{files} depending on the current preferences. + The list is sorted in-place. """ + if preferences.prefs['sort by'] == constants.SORT_NAME: + tools.alphanumeric_sort(files) + elif preferences.prefs['sort by'] == constants.SORT_LAST_MODIFIED: + # Most recently modified file first + files.sort(key=lambda filename: os.path.getmtime(filename)*-1) + elif preferences.prefs['sort by'] == constants.SORT_SIZE: + # Smallest file first + files.sort(key=lambda filename: os.stat(filename).st_size) + # else: don't sort at all: use OS ordering. + + # Default is ascending. + if preferences.prefs['sort order'] == constants.SORT_DESCENDING: + files.reverse() + + +class OrderedFileProvider(FileProvider): + """ This provider will list all files in the same directory as the + one passed to the constructor. """ + + def __init__(self, file_or_directory): + """ Initializes the file listing. If is a file, + directory will be used as base path. If it is a directory, that + will be used as base file. """ + + self.set_directory(file_or_directory) + + def set_directory(self, file_or_directory): + """ Sets the base directory. """ + + if os.path.isdir(file_or_directory): + dir = file_or_directory + elif os.path.isfile(file_or_directory): + dir = os.path.dirname(file_or_directory) + else: + # Passed file doesn't exist + raise ValueError(_("Invalid path: '%s'") % file_or_directory) + + self.base_dir = os.path.abspath(dir) + + def get_directory(self): + return self.base_dir + + def list_files(self, mode=FileProvider.IMAGES): + """ Lists all files in the current directory. + Returns a list of absolute paths, already sorted. """ + + if mode == FileProvider.IMAGES: + should_accept = image_tools.is_image_file + elif mode == FileProvider.ARCHIVES: + should_accept = archive_tools.is_archive_file + else: + should_accept = lambda file: True + + try: + files = [ os.path.join(self.base_dir, filename) for filename in + # Explicitly convert all files to Unicode, even when + # os.listdir returns a mixture of byte/unicode strings. + # (MComix bug #3424405) + [ i18n.to_unicode(fn) for fn in os.listdir(self.base_dir) ] + if should_accept(os.path.join(self.base_dir, filename)) ] + + FileProvider.sort_files(files) + + return files + except OSError: + log.warning('! ' + _('Could not open %s: Permission denied.'), self.base_dir) + return [] + + def next_directory(self): + """ Switches to the next sibling directory. Next call to + list_file() returns files in the new directory. + Returns True if the directory was changed, otherwise False. """ + + directories = self.__get_sibling_directories(self.base_dir) + current_index = directories.index(self.base_dir) + if current_index < len(directories) - 1: + self.base_dir = directories[current_index + 1] + return True + else: + return False + + + def previous_directory(self): + """ Switches to the previous sibling directory. Next call to + list_file() returns files in the new directory. + Returns True if the directory was changed, otherwise False. """ + + directories = self.__get_sibling_directories(self.base_dir) + current_index = directories.index(self.base_dir) + if current_index > 0: + self.base_dir = directories[current_index - 1] + return True + else: + return False + + def __get_sibling_directories(self, dir): + """ Returns a list of all sibling directories of , + already sorted. """ + + parent_dir = os.path.dirname(dir) + directories = [ os.path.join(parent_dir, directory) + for directory in os.listdir(parent_dir) + if os.path.isdir(os.path.join(parent_dir, directory)) ] + + tools.alphanumeric_sort(directories) + return directories + + +class PreDefinedFileProvider(FileProvider): + """ Returns only a list of files as passed to the constructor. """ + + def __init__(self, files): + """ is a list of files that should be shown. The list is filtered + to contain either only images, or only archives, depending on what the first + file is, since FileHandler will probably have problems of archives and images + are mixed in a file list. """ + + should_accept = self.__get_file_filter(files) + + self.__files = [ ] + + for file in files: + if os.path.isdir(file): + provider = OrderedFileProvider(file) + self.__files.extend(provider.list_files()) + + elif should_accept(file): + self.__files.append(os.path.abspath(file)) + + + def list_files(self, mode=FileProvider.IMAGES): + """ Returns the files as passed to the constructor. """ + + return self.__files + + def __get_file_filter(self, files): + """ Determines what kind of files should be filtered in the given list + of . Returns either a filter accepting only images, or only archives, + depending on what type of file is found first in the list. """ + + for file in files: + if os.path.isfile(file): + if image_tools.is_image_file(file): + return image_tools.is_image_file + if archive_tools.is_archive_file(file): + return archive_tools.is_archive_file + + # Default filter only accepts images. + return image_tools.is_image_file + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/histogram.py mcomix-2.1.0/mcomix/histogram.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/histogram.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/histogram.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,65 @@ +"""histogram.py - Draw histograms (RGB) from pixbufs.""" + +import PIL.Image as Image +import PIL.ImageDraw as ImageDraw +import PIL.ImageOps as ImageOps + +from mcomix import image_tools + +def draw_histogram(pixbuf, height=170, fill=170, text=True): + """Draw a histogram from and return it as another pixbuf. + + The returned prixbuf will be 262x px. + + The value of determines the colour intensity of the filled graphs, + valid values are between 0 and 255. + + If is True a label with the maximum pixel value will be added to + one corner. + """ + im = Image.new('RGB', (258, height - 4), (30, 30, 30)) + hist_data = image_tools.pixbuf_to_pil(pixbuf).histogram() + maximum = max(hist_data[:768] + [1]) + y_scale = float(height - 6) / maximum + r = [int(hist_data[n] * y_scale) for n in range(256)] + g = [int(hist_data[n] * y_scale) for n in range(256, 512)] + b = [int(hist_data[n] * y_scale) for n in range(512, 768)] + im_data = im.getdata() + # Draw the filling colours + for x in range(256): + for y in range(1, max(r[x], g[x], b[x]) + 1): + r_px = y <= r[x] and fill or 0 + g_px = y <= g[x] and fill or 0 + b_px = y <= b[x] and fill or 0 + im_data.putpixel((x + 1, height - 5 - y), (r_px, g_px, b_px)) + # Draw the outlines + for x in range(1, 256): + for y in list(range(r[x-1] + 1, r[x] + 1)) + [r[x]] * (r[x] != 0): + r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) + im_data.putpixel((x + 1, height - 5 - y), (255, g_px, b_px)) + for y in range(r[x] + 1, r[x-1] + 1): + r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) + im_data.putpixel((x, height - 5 - y), (255, g_px, b_px)) + for y in list(range(g[x-1] + 1, g[x] + 1)) + [g[x]] * (g[x] != 0): + r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) + im_data.putpixel((x + 1, height - 5 - y), (r_px, 255, b_px)) + for y in range(g[x] + 1, g[x-1] + 1): + r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) + im_data.putpixel((x, height - 5 - y), (r_px, 255, b_px)) + for y in list(range(b[x-1] + 1, b[x] + 1)) + [b[x]] * (b[x] != 0): + r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) + im_data.putpixel((x + 1, height - 5 - y), (r_px, g_px, 255)) + for y in range(b[x] + 1, b[x-1] + 1): + r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) + im_data.putpixel((x, height - 5 - y), (r_px, g_px, 255)) + if text: + maxstr = 'max: ' + str(maximum) + draw = ImageDraw.Draw(im) + draw.rectangle((0, 0, len(maxstr) * 6 + 2, 10), fill=(30, 30, 30)) + draw.text((2, 0), maxstr, fill=(255, 255, 255)) + im = ImageOps.expand(im, 1, (80, 80, 80)) + im = ImageOps.expand(im, 1, (0, 0, 0)) + return image_tools.pil_to_pixbuf(im) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/i18n.py mcomix-2.1.0/mcomix/i18n.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/i18n.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/i18n.py 2022-01-27 05:29:38.000000000 +0000 @@ -0,0 +1,113 @@ +""" i18n.py - Encoding and translation handler.""" + +import gettext +import io +import locale +import os +import pkgutil +import sys + +try: + import chardet +except ImportError: + chardet = None + +from mcomix import preferences +from mcomix import portability +from mcomix import constants + +# Translation instance to enable other modules to use +# functions other than the global _() if necessary +_translation = None + +def to_unicode(string): + """Convert to unicode. First try the default filesystem + encoding, and then fall back on some common encodings. + """ + if isinstance(string, str): + return string + + # Try chardet heuristic + if chardet: + probable_encoding = chardet.detect(string)['encoding'] or \ + locale.getpreferredencoding() # Fallback if chardet detection fails + else: + probable_encoding = locale.getpreferredencoding() + + for encoding in ( + probable_encoding, + sys.getfilesystemencoding(), + 'utf-8', + 'latin-1'): + + try: + ustring = str(string, encoding) + return ustring + + except (UnicodeError, LookupError): + pass + + return string.decode('utf-8', 'replace') + +def to_utf8(string): + """ Helper function that converts unicode objects to UTF-8 encoded + strings. Non-unicode strings are assumed to be already encoded + and returned as-is. """ + + if isinstance(string, str): + return string.encode('utf-8') + else: + return string + +def install_gettext(): + """ Initialize gettext with the correct directory that contains + MComix translations. This has to be done before any calls to gettext.gettext + have been made to ensure all strings are actually translated. """ + + # Add the sources' base directory to PATH to allow development without + # explicitly installing the package. + sys.path.append(constants.BASE_PATH) + + # Initialize default locale + locale.setlocale(locale.LC_ALL, '') + + if preferences.prefs['language'] != 'auto': + lang = preferences.prefs['language'] + lang_identifiers = [ lang ] + else: + # Get the user's current locale + lang = portability.get_default_locale() + lang_identifiers = gettext._expand_lang(lang) + + # Make sure GTK uses the correct language. + os.environ['LANGUAGE'] = lang + + domain = constants.APPNAME.lower() + + # Search for .mo files manually, since gettext doesn't support packaged resources + for lang in lang_identifiers: + resource = os.path.join('messages', lang, 'LC_MESSAGES', '%s.mo' % domain) + try: + translation_content = pkgutil.get_data('mcomix', resource) + except FileNotFoundError: + pass + else: + fp = io.BytesIO(translation_content) + translation = gettext.GNUTranslations(fp) + break + + else: + translation = gettext.NullTranslations() + + translation.install() + + global _translation + _translation = translation + +def get_translation(): + """ Returns the gettext.Translation instance that has been initialized with + install_gettext(). """ + + return _translation or gettext.NullTranslations() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/icons.py mcomix-2.1.0/mcomix/icons.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/icons.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/icons.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,63 @@ +"""icons.py - Load MComix specific icons.""" + +from gi.repository import Gtk +import pkgutil + +from mcomix import image_tools +from mcomix import log + +def mcomix_icons(): + """ Returns a list of differently sized pixbufs for the + application icon. """ + + sizes = ('16x16', '32x32', '48x48') + pixbufs = [ + image_tools.load_pixbuf_data( + pkgutil.get_data('mcomix', 'images/%s/mcomix.png' % size) + ) for size in sizes + ] + + return pixbufs + +def load_icons(): + _icons = (('gimp-flip-horizontal.png', 'mcomix-flip-horizontal'), + ('gimp-flip-vertical.png', 'mcomix-flip-vertical'), + ('gimp-rotate-180.png', 'mcomix-rotate-180'), + ('gimp-rotate-270.png', 'mcomix-rotate-270'), + ('gimp-rotate-90.png', 'mcomix-rotate-90'), + ('gimp-thumbnails.png', 'mcomix-thumbnails'), + ('gimp-transform.png', 'mcomix-transform'), + ('tango-enhance-image.png', 'mcomix-enhance-image'), + ('tango-add-bookmark.png', 'mcomix-add-bookmark'), + ('tango-archive.png', 'mcomix-archive'), + ('tango-image.png', 'mcomix-image'), + ('library.png', 'mcomix-library'), + ('comments.png', 'mcomix-comments'), + ('zoom.png', 'mcomix-zoom'), + ('lens.png', 'mcomix-lens'), + ('double-page.png', 'mcomix-double-page'), + ('manga.png', 'mcomix-manga'), + ('fitbest.png', 'mcomix-fitbest'), + ('fitwidth.png', 'mcomix-fitwidth'), + ('fitheight.png', 'mcomix-fitheight'), + ('fitmanual.png', 'mcomix-fitmanual'), + ('fitsize.png', 'mcomix-fitsize')) + + # Load window title icons. + pixbufs = mcomix_icons() + Gtk.Window.set_default_icon_list(pixbufs) + # Load application icons. + factory = Gtk.IconFactory() + for filename, stockid in _icons: + try: + icon_data = pkgutil.get_data('mcomix', 'images/%s' % filename) + pixbuf = image_tools.load_pixbuf_data(icon_data) + iconset = Gtk.IconSet(pixbuf) + factory.add(stockid, iconset) + except Exception: + log.warning(_('! Could not load icon "%s"'), filename) + factory.add_default() + + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/image_handler.py mcomix-2.1.0/mcomix/image_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/image_handler.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/image_handler.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,481 @@ +"""image_handler.py - Image handler that takes care of cacheing and giving out images.""" + +import os +import traceback + +from mcomix.preferences import prefs +from mcomix import i18n +from mcomix import tools +from mcomix import image_tools +from mcomix import thumbnail_tools +from mcomix import constants +from mcomix import callback +from mcomix import log +from mcomix.worker_thread import WorkerThread + +class ImageHandler(object): + + """The FileHandler keeps track of images, pages, caches and reads files. + + When the Filehandler's methods refer to pages, they are indexed from 1, + i.e. the first page is page 1 etc. + + Other modules should *never* read directly from the files pointed to by + paths given by the FileHandler's methods. The files are not even + guaranteed to exist at all times since the extraction of archives is + threaded. + """ + + def __init__(self, window): + + #: Reference to main window + self._window = window + + #: Caching thread + self._thread = WorkerThread(self._cache_pixbuf, name='image', + sort_orders=True) + + #: Archive path, if currently opened file is archive + self._base_path = None + #: List of image file names, either from extraction or directory + self._image_files = None + #: Index of current page + self._current_image_index = None + #: Set of images reading for decoding (i.e. already extracted) + self._available_images = set() + #: List of pixbufs we want to cache + self._wanted_pixbufs = [] + #: Pixbuf map from page > Pixbuf + self._raw_pixbufs = {} + #: How many pages to keep in cache + self._cache_pages = prefs['max pages to cache'] + + self._window.filehandler.file_available += self._file_available + + def _get_pixbuf(self, index): + """Return the pixbuf indexed by from cache. + Pixbufs not found in cache are fetched from disk first. + """ + pixbuf = image_tools.MISSING_IMAGE_ICON + + if index not in self._raw_pixbufs: + self._wait_on_page(index + 1) + + try: + pixbuf = image_tools.load_pixbuf(self._image_files[index]) + self._raw_pixbufs[index] = pixbuf + tools.garbage_collect() + except Exception as e: + self._raw_pixbufs[index] = image_tools.MISSING_IMAGE_ICON + log.error('Could not load pixbuf for page %u: %r', index + 1, e) + else: + try: + pixbuf = self._raw_pixbufs[index] + except Exception: + pass + + return pixbuf + + def get_pixbufs(self, number_of_bufs): + """Returns number_of_bufs pixbufs for the image(s) that should be + currently displayed. This method might fetch images from disk, so make + sure that number_of_bufs is as small as possible. + """ + result = [] + for i in range(number_of_bufs): + result.append(self._get_pixbuf(self._current_image_index + i)) + return result + + def get_pixbuf_auto_background(self, number_of_bufs): # XXX limited to at most 2 pages + """ Returns an automatically calculated background color + for the current page(s). """ + + pixbufs = self.get_pixbufs(number_of_bufs) + + if len(pixbufs) == 1: + auto_bg = image_tools.get_most_common_edge_colour(pixbufs[0]) + elif len(pixbufs) == 2: + left, right = pixbufs + if self._window.is_manga_mode: + left, right = right, left + + auto_bg = image_tools.get_most_common_edge_colour((left, right)) + else: + assert False, 'Unexpected pixbuf count' + + return auto_bg + + def do_cacheing(self): + """Make sure that the correct pixbufs are stored in cache. These + are (in the current implementation) the current image(s), and + if cacheing is enabled, also the one or two pixbufs before and + after the current page. All other pixbufs are deleted and garbage + collected directly in order to save memory. + """ + if not self._window.filehandler.file_loaded: + return + + # Flush caching orders. + self._thread.clear_orders() + # Get list of wanted pixbufs. + wanted_pixbufs = self._ask_for_pages(self.get_current_page()) + if -1 != self._cache_pages: + # We're not caching everything, remove old pixbufs. + for index in set(self._raw_pixbufs) - set(wanted_pixbufs): + del self._raw_pixbufs[index] + log.debug('Caching page(s) %s', ' '.join([str(index + 1) for index in wanted_pixbufs])) + self._wanted_pixbufs = wanted_pixbufs + # Start caching available images not already in cache. + wanted_pixbufs = [index for index in wanted_pixbufs + if index in self._available_images and not index in self._raw_pixbufs] + orders = [(priority, index) for priority, index in enumerate(wanted_pixbufs)] + if len(orders) > 0: + self._thread.extend_orders(orders) + + def _cache_pixbuf(self, wanted): + priority, index = wanted + log.debug('Caching page %u', index + 1) + self._get_pixbuf(index) + + def set_page(self, page_num): + """Set up filehandler to the page . + """ + assert 0 < page_num <= self.get_number_of_pages() + self._current_image_index = page_num - 1 + self.do_cacheing() + + def get_virtual_double_page(self, page=None): + """Return True if the current state warrants use of virtual + double page mode (i.e. if double page mode is on, the corresponding + preference is set, and one of the two images that should normally + be displayed has a width that exceeds its height), or if currently + on the first page. + """ + if page == None: + page = self.get_current_page() + + if (page == 1 and + prefs['virtual double page for fitting images'] & constants.SHOW_DOUBLE_AS_ONE_TITLE and + self._window.filehandler.archive_type is not None): + return True + + if (not prefs['default double page'] or + not prefs['virtual double page for fitting images'] & constants.SHOW_DOUBLE_AS_ONE_WIDE or + page == self.get_number_of_pages()): + return False + + for page in (page, page + 1): + if not self.page_is_available(page): + return False + pixbuf = self._get_pixbuf(page - 1) + width, height = pixbuf.get_width(), pixbuf.get_height() + if prefs['auto rotate from exif']: + rotation = image_tools.get_implied_rotation(pixbuf) + assert rotation in (0, 90, 180, 270) + if rotation in (90, 270): + width, height = height, width + if width > height: + return True + + return False + + def get_real_path(self): + """Return the "real" path to the currently viewed file, i.e. the + full path to the archive or the full path to the currently + viewed image. + """ + if self._window.filehandler.archive_type is not None: + return self._window.filehandler.get_path_to_base() + return self.get_path_to_page() + + def cleanup(self): + """Run clean-up tasks. Should be called prior to exit.""" + + self.first_wanted = 0 + self.last_wanted = 1 + + self._thread.stop() + self._base_path = None + self._image_files = [] + self._current_image_index = None + self._available_images.clear() + self._raw_pixbufs.clear() + self._cache_pages = prefs['max pages to cache'] + + def page_is_available(self, page=None): + """ Returns True if is available and calls to get_pixbufs + would not block. If is None, the current page(s) are assumed. """ + + if page is None: + current_page = self.get_current_page() + if not current_page: + # Current 'book' has no page. + return False + index_list = [ current_page - 1 ] + if self._window.displayed_double() and current_page < len(self._image_files): + index_list.append(current_page) + else: + index_list = [ page - 1 ] + + for index in index_list: + if not index in self._available_images: + return False + + return True + + @callback.Callback + def page_available(self, page): + """ Called whenever a new page becomes available, i.e. the corresponding + file has been extracted. """ + log.debug('Page %u is available', page) + index = page - 1 + assert index not in self._available_images + self._available_images.add(index) + # Check if we need to cache it. + priority = None + if index in self._wanted_pixbufs: + # In the list of wanted pixbufs. + priority = self._wanted_pixbufs.index(index) + elif -1 == self._cache_pages: + # We're caching everything. + priority = self.get_number_of_pages() + if priority is not None: + self._thread.append_order((priority, index)) + + def _file_available(self, filepaths): + """ Called by the filehandler when a new file becomes available. """ + # Find the page that corresponds to + if not self._image_files: + return + + available = sorted(filepaths) + for i, imgpath in enumerate(self._image_files): + if tools.bin_search(available, imgpath) >= 0: + self.page_available(i + 1) + + def get_number_of_pages(self): + """Return the number of pages in the current archive/directory.""" + if self._image_files is not None: + return len(self._image_files) + else: + return 0 + + def get_current_page(self): + """Return the current page number (starting from 1), or 0 if no file is loaded.""" + if self._current_image_index is not None: + return self._current_image_index + 1 + else: + return 0 + + def get_path_to_page(self, page=None): + """Return the full path to the image file for , or the current + page if is None. + """ + if page is None: + index = self._current_image_index + else: + index = page - 1 + + if self._image_files and 0 <= index < len(self._image_files): + return self._image_files[index] + else: + return None + + def get_page_filename(self, page=None, double=False): + """Return the filename of the , or the filename of the + currently viewed page if is None. If is True, return + a tuple (p, p') where p is the filename of (or the current + page) and p' is the filename of the page after. + """ + if page is None: + page = self.get_current_page() + + first_path = self.get_path_to_page(page) + if first_path == None: + return None + + if double: + second_path = self.get_path_to_page(page + 1) + + if second_path != None: + first = os.path.basename(first_path) + second = os.path.basename(second_path) + else: + return None + + return first, second + + return os.path.basename(first_path) + + def get_page_filesize(self, page=None, double=False): + """Return the filesize of the , or the filesize of the + currently viewed page if is None. If is True, return + a tuple (s, s') where s is the filesize of (or the current + page) and s' is the filesize of the page after. + """ + returnvalue_on_error = ('', '') if double else '' + + if not self.page_is_available(): + return returnvalue_on_error + + if page is None: + page = self.get_current_page() + + first_path = self.get_path_to_page(page) + if first_path == None: + return returnvalue_on_error + + if double: + second_path = self.get_path_to_page(page + 1) + if second_path != None: + try: + first = tools.format_byte_size(os.stat(first_path).st_size) + except OSError: + first = '' + try: + second = tools.format_byte_size(os.stat(second_path).st_size) + except OSError: + second = '' + else: + return ('', '') + return first, second + + try: + size = tools.format_byte_size(os.stat(first_path).st_size) + except OSError: + size = '' + + return size + + def get_pretty_current_filename(self): + """Return a string with the name of the currently viewed file that is + suitable for printing. + """ + if self._window.filehandler.archive_type is not None: + name = os.path.basename(self._base_path) + elif self._image_files: + img_file = os.path.abspath(self._image_files[self._current_image_index]) + name = os.path.join( + os.path.basename(os.path.dirname(img_file)), + os.path.basename(img_file) + ) + else: + name = '' + + return i18n.to_unicode(name) + + def get_size(self, page=None): + """Return a tuple (width, height) with the size of . If + is None, return the size of the current page. + """ + self._wait_on_page(page) + + page_path = self.get_path_to_page(page) + if page_path is None: + return (0, 0) + + format, dimensions, providers = image_tools.get_image_info(page_path) + return dimensions + + def get_mime_name(self, page=None): + """Return a string with the name of the mime type of . If + is None, return the mime type name of the current page. + """ + self._wait_on_page(page) + + page_path = self.get_path_to_page(page) + if page_path is None: + return None + + format, dimensions, providers = image_tools.get_image_info(page_path) + return format + + def get_thumbnail(self, page=None, width=128, height=128, create=False, + nowait=False): + """Return a thumbnail pixbuf of that fit in a box with + dimensions x. Return a thumbnail for the current + page if is None. + + If is True, and x <= 128x128, the + thumbnail is also stored on disk. + + If is True, don't wait for to be available. + """ + if not self._wait_on_page(page, check_only=nowait): + # Page is not available! + return None + path = self.get_path_to_page(page) + + if path == None: + return None + + try: + thumbnailer = thumbnail_tools.Thumbnailer(store_on_disk=create, + size=(width, height)) + return thumbnailer.thumbnail(path) + except Exception: + log.debug("Failed to create thumbnail for image `%s':\n%s", + path, traceback.format_exc()) + return image_tools.MISSING_IMAGE_ICON + + def _wait_on_page(self, page, check_only=False): + """Block the running (main) thread until the file corresponding to + image has been fully extracted. + + If is True, only check (and return status), don't wait. + """ + if page is None: + index = self._current_image_index + else: + index = page - 1 + if index in self._available_images: + # Already extracted! + return True + if check_only: + # Asked for check only... + return False + + log.debug('Waiting for page %u', page) + path = self.get_path_to_page(page) + self._window.filehandler._wait_on_file(path) + return True + + def _ask_for_pages(self, page): + """Ask for pages around to be given priority extraction. + """ + files = [] + if prefs['default double page']: + page_width = 2 + else: + page_width = 1 + if 0 == self._cache_pages: + # Only ask for current page. + num_pages = page_width + elif -1 == self._cache_pages: + # Ask for 10 pages. + num_pages = min(10, self.get_number_of_pages()) + else: + num_pages = self._cache_pages + + page_list = [page - 1 - page_width + n for n in range(num_pages)] + + # Current and next page first, followed by previous page. + previous_page = page_list[0:page_width] + del page_list[0:page_width] + page_list[2*page_width:2*page_width] = previous_page + page_list = [index for index in page_list + if index >= 0 and index < len(self._image_files)] + + log.debug('Ask for priority extraction around page %u: %s', + page, ' '.join([str(n + 1) for n in page_list])) + + for index in page_list: + if index not in self._available_images: + files.append(self._image_files[index]) + + if len(files) > 0: + self._window.filehandler._ask_for_files(files) + + return page_list + +# vim: expandtab:sw=4:ts=4 Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/16x16/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/16x16/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/22x22/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/22x22/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/24x24/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/24x24/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/32x32/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/32x32/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/48x48/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/48x48/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/comments.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/comments.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/double-page.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/double-page.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/fitbest.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/fitbest.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/fitheight.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/fitheight.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/fitmanual.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/fitmanual.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/fitsize.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/fitsize.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/fitwidth.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/fitwidth.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-flip-horizontal.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-flip-horizontal.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-flip-vertical.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-flip-vertical.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-rotate-180.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-rotate-180.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-rotate-270.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-rotate-270.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-rotate-90.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-rotate-90.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-thumbnails.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-thumbnails.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/gimp-transform.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/gimp-transform.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/lens.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/lens.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/library.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/library.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/manga.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/manga.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/tango-add-bookmark.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/tango-add-bookmark.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/tango-archive.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/tango-archive.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/tango-enhance-image.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/tango-enhance-image.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/tango-image.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/tango-image.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/images/zoom.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/images/zoom.png differ diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/image_tools.py mcomix-2.1.0/mcomix/image_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/image_tools.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/image_tools.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,720 @@ +"""image_tools.py - Various image manipulations.""" + +import operator +from gi.repository import GLib, GdkPixbuf, Gdk, Gtk +import PIL +from PIL import Image +from PIL import ImageEnhance +from PIL import ImageOps +from io import StringIO + +from mcomix.preferences import prefs +from mcomix import constants +from mcomix import log +from mcomix import tools + +PIL_VERSION = ('Pillow', PIL.__version__) + +# Unfortunately gdk_pixbuf_version is not exported, so show the GTK+ version instead. +log.info('GDK version: %s, GTK+: %s.%s', GdkPixbuf.PIXBUF_VERSION, Gtk.get_major_version(), Gtk.get_minor_version()) +log.info('PIL version: %s [%s]', PIL_VERSION[0], PIL_VERSION[1]) + +# Fallback pixbuf for missing images. +MISSING_IMAGE_ICON = None + +_missing_icon_dialog = Gtk.Dialog() +_missing_icon_pixbuf = _missing_icon_dialog.render_icon( + Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.LARGE_TOOLBAR) +MISSING_IMAGE_ICON = _missing_icon_pixbuf +assert MISSING_IMAGE_ICON + +GTK_GDK_COLOR_BLACK = Gdk.color_parse('black') +GTK_GDK_COLOR_WHITE = Gdk.color_parse('white') + + +def rotate_pixbuf(src, rotation): + rotation %= 360 + if 0 == rotation: + return src + if 90 == rotation: + return src.rotate_simple(GdkPixbuf.PixbufRotation.CLOCKWISE) + if 180 == rotation: + return src.rotate_simple(GdkPixbuf.PixbufRotation.UPSIDEDOWN) + if 270 == rotation: + return src.rotate_simple(GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) + raise ValueError("unsupported rotation: %s" % rotation) + + +def get_fitting_size(source_size, target_size, + keep_ratio=True, scale_up=False): + """ Return a scaled version of + small enough to fit in . + + Both and + must be (width, height) tuples. + + If is True, aspect ratio is kept. + + If is True, is scaled up + when smaller than . + """ + width, height = target_size + src_width, src_height = source_size + if not scale_up and src_width <= width and src_height <= height: + width, height = src_width, src_height + else: + if keep_ratio: + if float(src_width) / width > float(src_height) / height: + height = int(max(src_height * width / src_width, 1)) + else: + width = int(max(src_width * height / src_height, 1)) + return (width, height) + +def fit_pixbuf_to_rectangle(src, rect, rotation): + return fit_in_rectangle(src, rect[0], rect[1], + rotation=rotation, + keep_ratio=False, + scale_up=True) + +def fit_in_rectangle(src, width, height, keep_ratio=True, scale_up=False, rotation=0, scaling_quality=None): + """Scale (and return) a pixbuf so that it fits in a rectangle with + dimensions x . A negative or + means an unbounded dimension - both cannot be negative. + + If is 90, 180 or 270 we rotate first so that the + rotated pixbuf is fitted in the rectangle. + + Unless is True we don't stretch images smaller than the + given rectangle. + + If is True, the image ratio is kept, and the result + dimensions may be smaller than the target dimensions. + + If has an alpha channel it gets a checkboard background. + """ + # "Unbounded" really means "bounded to 10000 px" - for simplicity. + # MComix would probably choke on larger images anyway. + if width < 0: + width = 100000 + elif height < 0: + height = 100000 + width = max(width, 1) + height = max(height, 1) + + rotation %= 360 + if rotation not in (0, 90, 180, 270): + raise ValueError("unsupported rotation: %s" % rotation) + if rotation in (90, 270): + width, height = height, width + + if scaling_quality is None: + scaling_quality = prefs['scaling quality'] + + src_width = src.get_width() + src_height = src.get_height() + + width, height = get_fitting_size((src_width, src_height), + (width, height), + keep_ratio=keep_ratio, + scale_up=scale_up) + + if src.get_has_alpha(): + if prefs['checkered bg for transparent images']: + check_size, color1, color2 = 8, 0x777777, 0x999999 + else: + check_size, color1, color2 = 1024, 0xFFFFFF, 0xFFFFFF + if width == src_width and height == src_height: + # Using anything other than nearest interpolation will result in a + # modified image if no resizing takes place (even if it's opaque). + scaling_quality = GdkPixbuf.InterpType.NEAREST + src = src.composite_color_simple(width, height, scaling_quality, + 255, check_size, color1, color2) + elif width != src_width or height != src_height: + src = src.scale_simple(width, height, scaling_quality) + + src = rotate_pixbuf(src, rotation) + + return src + + +def add_border(pixbuf, thickness, colour=0x000000FF): + """Return a pixbuf from with a px border of + added. + """ + canvas = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, + pixbuf.get_width() + thickness * 2, + pixbuf.get_height() + thickness * 2) + canvas.fill(colour) + pixbuf.copy_area(0, 0, pixbuf.get_width(), pixbuf.get_height(), + canvas, thickness, thickness) + return canvas + + +def get_most_common_edge_colour(pixbufs, edge=2): + """Return the most commonly occurring pixel value along the four edges + of . The return value is a sequence, (r, g, b), with 16 bit + values. If is a tuple, the edges will be computed from + both the left and the right image. + + Note: This could be done more cleanly with subpixbuf(), but that + doesn't work as expected together with get_pixels(). + """ + + def group_colors(colors, steps=10): + """ This rounds a list of colors in C{colors} to the next nearest value, + i.e. 128, 83, 10 becomes 130, 85, 10 with C{steps}=5. This compensates for + dirty colors where no clear dominating color can be made out. + + @return: The color that appears most often in the prominent group.""" + + # Start group + group = (0, 0, 0) + # List of (count, color) pairs, group contains most colors + colors_in_prominent_group = [] + color_count_in_prominent_group = 0 + # List of (count, color) pairs, current color group + colors_in_group = [] + color_count_in_group = 0 + + for count, color in colors: + + # Round color + rounded = [0] * len(color) + for i, color_value in enumerate(color): + if steps % 2 == 0: + middle = steps // 2 + else: + middle = steps // 2 + 1 + + remainder = color_value % steps + if remainder >= middle: + color_value = color_value + (steps - remainder) + else: + color_value = color_value - remainder + + rounded[i] = min(255, max(0, color_value)) + + # Change prominent group if necessary + if rounded == group: + # Color still fits in the previous color group + colors_in_group.append((count, color)) + color_count_in_group += count + else: + # Color group changed, check if current group has more colors + # than last group + if color_count_in_group > color_count_in_prominent_group: + colors_in_prominent_group = colors_in_group + color_count_in_prominent_group = color_count_in_group + + group = rounded + colors_in_group = [ (count, color) ] + color_count_in_group = count + + # Cleanup if only one edge color group was found + if color_count_in_group > color_count_in_prominent_group: + colors_in_prominent_group = colors_in_group + + colors_in_prominent_group.sort(key=operator.itemgetter(0), reverse=True) + # List is now sorted by color count, first color appears most often + return colors_in_prominent_group[0][1] + + def get_edge_pixbuf(pixbuf, side, edge): + """ Returns a pixbuf corresponding to the side passed in . + Valid sides are 'left', 'right', 'top', 'bottom'. """ + pixbuf = static_image(pixbuf) + width = pixbuf.get_width() + height = pixbuf.get_height() + edge = min(edge, width, height) + + subpix = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, + pixbuf.get_has_alpha(), 8, edge, height) + if side == 'left': + pixbuf.copy_area(0, 0, edge, height, subpix, 0, 0) + elif side == 'right': + pixbuf.copy_area(width - edge, 0, edge, height, subpix, 0, 0) + elif side == 'top': + pixbuf.copy_area(0, 0, width, edge, subpix, 0, 0) + elif side == 'bottom': + pixbuf.copy_area(0, height - edge, width, edge, subpix, 0, 0) + else: + assert False, 'Invalid edge side' + + return subpix + + if not pixbufs: + return (0, 0, 0) + + if not isinstance(pixbufs, (tuple, list)): + left_edge = get_edge_pixbuf(pixbufs, 'left', edge) + right_edge = get_edge_pixbuf(pixbufs, 'right', edge) + else: + assert len(pixbufs) == 2, 'Expected two pages in list' + left_edge = get_edge_pixbuf(pixbufs[0], 'left', edge) + right_edge = get_edge_pixbuf(pixbufs[1], 'right', edge) + + # Find all edge colors. Color count is separate for all four edges + ungrouped_colors = [] + for edge in (left_edge, right_edge): + im = pixbuf_to_pil(edge) + ungrouped_colors.extend(im.getcolors(im.size[0] * im.size[1])) + + # Sum up colors from all edges + ungrouped_colors.sort(key=operator.itemgetter(1)) + most_used = group_colors(ungrouped_colors)[:3] + return [color * 257 for color in most_used] + +def pil_to_pixbuf(im, keep_orientation=False): + """Return a pixbuf created from the PIL .""" + if im.mode.startswith('RGB'): + has_alpha = im.mode == 'RGBA' + elif im.mode in ('LA', 'P'): + has_alpha = True + else: + has_alpha = False + target_mode = 'RGBA' if has_alpha else 'RGB' + if im.mode != target_mode: + im = im.convert(target_mode) + pixbuf = GdkPixbuf.Pixbuf.new_from_bytes( + GLib.Bytes.new(im.tobytes()), GdkPixbuf.Colorspace.RGB, + has_alpha, 8, + im.size[0], im.size[1], + (4 if has_alpha else 3) * im.size[0] + ) + if keep_orientation: + # Keep orientation metadata. + orientation = None + exif = im.getexif() + orientation = exif.get(274, None) + if orientation is None: + # Maybe it's a PNG? Try alternative method. + orientation = _get_png_implied_rotation(im) + if orientation is not None: + setattr(pixbuf, 'orientation', str(orientation)) + return pixbuf + +def pixbuf_to_pil(pixbuf): + """Return a PIL image created from .""" + dimensions = pixbuf.get_width(), pixbuf.get_height() + stride = pixbuf.get_rowstride() + pixels = pixbuf.get_pixels() + mode = 'RGBA' if pixbuf.get_has_alpha() else 'RGB' + im = Image.frombuffer(mode, dimensions, pixels, 'raw', mode, stride, 1) + return im + +def is_animation(pixbuf): + return isinstance(pixbuf, GdkPixbuf.PixbufAnimation) + +def static_image(pixbuf): + """ Returns a non-animated version of the specified pixbuf. """ + if is_animation(pixbuf): + return pixbuf.get_static_image() + return pixbuf + +def unwrap_image(image): + """ Returns an object that contains the image data based on + Gtk.Image.get_storage_type or None if image is None or image.get_storage_type + returns Gtk.IMAGE_EMPTY. """ + if image is None: + return None + t = image.get_storage_type() + if t == Gtk.IMAGE_EMPTY: + return None + if t == Gtk.IMAGE_PIXBUF: + return image.get_pixbuf() + if t == Gtk.IMAGE_ANIMATION: + return image.get_animation() + if t == Gtk.IMAGE_PIXMAP: + return image.get_pixmap() + if t == Gtk.IMAGE_IMAGE: + return image.get_image() + if t == Gtk.IMAGE_STOCK: + return image.get_stock() + if t == Gtk.IMAGE_ICON_SET: + return image.get_icon_set() + raise ValueError() + +def set_from_pixbuf(image, pixbuf): + if is_animation(pixbuf): + return image.set_from_animation(pixbuf) + else: + return image.set_from_pixbuf(pixbuf) + +def load_pixbuf(path): + """ Loads a pixbuf from a given image file. """ + pixbuf = None + last_error = None + providers = get_image_info(path)[2] + for provider in providers: + try: + # TODO use dynamic dispatch instead of "if" chain + if provider == constants.IMAGEIO_GDKPIXBUF: + if prefs['animation mode'] != constants.ANIMATION_DISABLED: + try: + pixbuf = GdkPixbuf.PixbufAnimation.new_from_file(path) + if pixbuf.is_static_image(): + pixbuf = pixbuf.get_static_image() + except GLib.GError: + # NOTE: Broken JPEGs sometimes result in this exception. + # However, one may be able to load them using + # Gdk.pixbuf_new_from_file, so we need to continue. + pass + if pixbuf is None: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) + elif provider == constants.IMAGEIO_PIL: + # TODO When using PIL, whether or how animations work is + # currently undefined. + im = Image.open(path) + pixbuf = pil_to_pixbuf(im, keep_orientation=True) + else: + raise TypeError() + except Exception as e: + # current provider could not load image + last_error = e + if pixbuf is not None: + # stop loop on success + log.debug("provider %s succeeded in loading %s", provider, path) + break + log.debug("provider %s failed to load %s", provider, path) + if pixbuf is None: + # raising necessary because caller expects pixbuf to be not None + raise last_error or TypeError() + return pixbuf + +def load_pixbuf_size(path, width, height): + """ Loads a pixbuf from a given image file and scale it to fit + inside (width, height). """ + # TODO similar to load_pixbuf, should be merged using callbacks etc. + pixbuf = None + last_error = None + image_format, image_dimensions, providers = get_image_info(path) + for provider in providers: + try: + # TODO use dynamic dispatch instead of "if" chain + if provider == constants.IMAGEIO_GDKPIXBUF: + # If we could not get the image info, still try to load + # the image to let GdkPixbuf raise the appropriate exception. + if (0, 0) == image_dimensions: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) + # Work around GdkPixbuf bug: https://bugzilla.gnome.org/show_bug.cgi?id=735422 + # (currently https://gitlab.gnome.org/GNOME/gdk-pixbuf/issues/45) + elif 'GIF' == image_format: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) + else: + # Don't upscale if smaller than target dimensions! + image_width, image_height = image_dimensions + if image_width <= width and image_height <= height: + width, height = image_width, image_height + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path, width, height) + elif provider == constants.IMAGEIO_PIL: + im = Image.open(path) + im.draft(None, (width, height)) + pixbuf = pil_to_pixbuf(im, keep_orientation=True) + else: + raise TypeError() + except Exception as e: + # current provider could not load image + last_error = e + if pixbuf is not None: + # stop loop on success + log.debug("provider %s succeeded in loading %s at size %s", provider, path, (width, height)) + break + log.debug("provider %s failed to load %s at size %s", provider, path, (width, height)) + if pixbuf is None: + # raising necessary because caller expects pixbuf to be not None + raise last_error or TypeError() + return fit_in_rectangle(pixbuf, width, height, GdkPixbuf.InterpType.BILINEAR) + +def load_pixbuf_data(imgdata): + """ Loads a pixbuf from the data passed in . """ + # TODO similar to load_pixbuf, should be merged using callbacks etc. + pixbuf = None + last_error = None + for provider in (constants.IMAGEIO_GDKPIXBUF, constants.IMAGEIO_PIL): + try: + # TODO use dynamic dispatch instead of "if" chain + if provider == constants.IMAGEIO_GDKPIXBUF: + loader = GdkPixbuf.PixbufLoader() + loader.write(imgdata) + loader.close() + pixbuf = loader.get_pixbuf() + elif provider == constants.IMAGEIO_PIL: + pixbuf = pil_to_pixbuf(Image.open(StringIO(imgdata)), keep_orientation=True) + else: + raise TypeError() + except Exception as e: + # current provider could not load image + last_error = e + if pixbuf is not None: + # stop loop on success + log.debug("provider %s succeeded in decoding %s bytes", provider, len(imgdata)) + break + log.debug("provider %s failed to decode %s bytes", provider, len(imgdata)) + if pixbuf is None: + # raising necessary because caller expects pixbuf to be not None + raise last_error + return pixbuf + +def enhance(pixbuf, brightness=1.0, contrast=1.0, saturation=1.0, + sharpness=1.0, autocontrast=False): + """Return a modified pixbuf from where the enhancement operations + corresponding to each argument has been performed. A value of 1.0 means + no change. If is True it overrides the value, + but only if the image mode is supported by ImageOps.autocontrast (i.e. + it is L or RGB.) + """ + im = pixbuf_to_pil(pixbuf) + if brightness != 1.0: + im = ImageEnhance.Brightness(im).enhance(brightness) + if autocontrast and im.mode in ('L', 'RGB'): + im = ImageOps.autocontrast(im, cutoff=0.1) + elif contrast != 1.0: + im = ImageEnhance.Contrast(im).enhance(contrast) + if saturation != 1.0: + im = ImageEnhance.Color(im).enhance(saturation) + if sharpness != 1.0: + im = ImageEnhance.Sharpness(im).enhance(sharpness) + return pil_to_pixbuf(im) + +def _get_png_implied_rotation(pixbuf_or_image): + """Same as for PNG files. + + Lookup for Exif data in the tEXt chunk. + """ + if isinstance(pixbuf_or_image, GdkPixbuf.Pixbuf): + raw_exif = pixbuf_or_image.get_option('tEXt::Raw profile type exif') + elif isinstance(pixbuf_or_image, Image.Image): + raw_exif = pixbuf_or_image.info.get('Raw profile type exif') + else: + raise ValueError() + if raw_exif is None: + return None + raw_exif = raw_exif.split('\n') + if len(raw_exif) < 4 or 'exif' != raw_exif[1]: + # Not valid Exif data. + return None + size = int(raw_exif[2]) + try: + data = bytes.fromhex(''.join(raw_exif[3:])) + except ValueError: + # Not valid hexadecimal content. + return None + if size != len(data): + # Sizes should match. + return None + exif = Image.Exif() + exif.load(data) + orientation = exif.get(274, None) # Orientation tag + if orientation is not None: + orientation = str(orientation) + return orientation + +def get_implied_rotation(pixbuf): + """Return the implied rotation in degrees: 0, 90, 180, or 270. + + The implied rotation is the angle (in degrees) that the raw pixbuf should + be rotated in order to be displayed "correctly". E.g. a photograph taken + by a camera that is held sideways might store this fact in its Exif data, + and the pixbuf loader will set the orientation option correspondingly. + """ + pixbuf = static_image(pixbuf) + orientation = getattr(pixbuf, 'orientation', None) + if orientation is None: + orientation = pixbuf.get_option('orientation') + if orientation is None: + # Maybe it's a PNG? Try alternative method. + orientation = _get_png_implied_rotation(pixbuf) + if orientation == '3': + return 180 + elif orientation == '6': + return 90 + elif orientation == '8': + return 270 + return 0 + + +def get_size_rotation(width, height): + """ Determines the rotation to be applied. + Returns the degree of rotation (0, 90, 180, 270). """ + + size_rotation = 0 + + if (height > width and + prefs['auto rotate depending on size'] in + (constants.AUTOROTATE_HEIGHT_90, constants.AUTOROTATE_HEIGHT_270)): + + if prefs['auto rotate depending on size'] == constants.AUTOROTATE_HEIGHT_90: + size_rotation = 90 + else: + size_rotation = 270 + elif (width > height and + prefs['auto rotate depending on size'] in + (constants.AUTOROTATE_WIDTH_90, constants.AUTOROTATE_WIDTH_270)): + + if prefs['auto rotate depending on size'] == constants.AUTOROTATE_WIDTH_90: + size_rotation = 90 + else: + size_rotation = 270 + + return size_rotation + +def combine_pixbufs( pixbuf1, pixbuf2, are_in_manga_mode ): + if are_in_manga_mode: + r_source_pixbuf = pixbuf1 + l_source_pixbuf = pixbuf2 + else: + l_source_pixbuf = pixbuf1 + r_source_pixbuf = pixbuf2 + + has_alpha = False + + if l_source_pixbuf.get_property( 'has-alpha' ) or \ + r_source_pixbuf.get_property( 'has-alpha' ): + has_alpha = True + + bits_per_sample = 8 + + l_source_pixbuf_width = l_source_pixbuf.get_property( 'width' ) + r_source_pixbuf_width = r_source_pixbuf.get_property( 'width' ) + + l_source_pixbuf_height = l_source_pixbuf.get_property( 'height' ) + r_source_pixbuf_height = r_source_pixbuf.get_property( 'height' ) + + new_width = l_source_pixbuf_width + r_source_pixbuf_width + + new_height = max( l_source_pixbuf_height, r_source_pixbuf_height ) + + new_pix_buf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=has_alpha, + bits_per_sample=bits_per_sample, + width=new_width, height=new_height) + + l_source_pixbuf.copy_area( 0, 0, l_source_pixbuf_width, + l_source_pixbuf_height, + new_pix_buf, 0, 0 ) + + r_source_pixbuf.copy_area( 0, 0, r_source_pixbuf_width, + r_source_pixbuf_height, + new_pix_buf, l_source_pixbuf_width, 0 ) + + return new_pix_buf + +def is_image_file(path): + """Return True if the file at is an image file recognized by PyGTK. + """ + return _SUPPORTED_IMAGE_REGEX.search(path) is not None + +def convert_rgb16list_to_rgba8int(c): + return 0x000000FF | (c[0] >> 8 << 24) | (c[1] >> 8 << 16) | (c[2] >> 8 << 8) + +def rgb_to_y_601(color): + return color[0] * 0.299 + color[1] * 0.587 + color[2] * 0.114 + +def text_color_for_background_color(bgcolor): + return GTK_GDK_COLOR_BLACK if rgb_to_y_601(bgcolor) >= \ + 65535.0 / 2.0 else GTK_GDK_COLOR_WHITE + +def color_to_floats_rgba(color, alpha=1.0): + return [c / 65535.0 for c in color[:3]] + [alpha] + +def get_image_info(path): + """Return information about and select preferred providers for loading + the image specified by C{path}. The result is a tuple + C{(format, (width, height), providers)}. + """ + image_format = None + image_dimensions = None + providers = () + try: + gdk_image_info = GdkPixbuf.Pixbuf.get_file_info(path) + except Exception: + gdk_image_info = None + + if gdk_image_info is not None and gdk_image_info[0] is not None: + image_format = gdk_image_info[0].get_name().upper() + image_dimensions = gdk_image_info[1], gdk_image_info[2] + # Prefer loading via GDK/Pixbuf if Gdk.pixbuf_get_file_info appears + # to be able to handle this path. + providers = (constants.IMAGEIO_GDKPIXBUF, constants.IMAGEIO_PIL) + else: + try: + im = Image.open(path) + image_format = im.format + image_dimensions = im.size + providers = (constants.IMAGEIO_PIL, constants.IMAGEIO_GDKPIXBUF) + except IOError: + # If the file cannot be found, or the image + # cannot be opened and identified. + pass + if image_format is None: + image_format = _('Unknown filetype') + image_dimensions = (0, 0) + return (image_format, image_dimensions, providers) + +def get_supported_formats(): + global _SUPPORTED_IMAGE_FORMATS + if _SUPPORTED_IMAGE_FORMATS is None: + + # Step 1: Collect PIL formats + # Make sure all supported formats are registered. + Image.init() + # Not all PIL formats register a mime type, + # fill in the blanks ourselves. + supported_formats_pil = { + 'BMP': (['image/bmp', 'image/x-bmp', 'image/x-MS-bmp'], []), + 'ICO': (['image/x-icon', 'image/x-ico', 'image/x-win-bitmap'], []), + 'PCX': (['image/x-pcx'], []), + 'PPM': (['image/x-portable-pixmap'], []), + 'TGA': (['image/x-tga'], []), + } + for name, mime in list(Image.MIME.items()): + mime_types, extensions = supported_formats_pil.get(name, ([], [])) + supported_formats_pil[name] = mime_types + [mime], extensions + for ext, name in list(Image.EXTENSION.items()): + assert '.' == ext[0] + mime_types, extensions = supported_formats_pil.get(name, ([], [])) + supported_formats_pil[name] = mime_types, extensions + [ext[1:]] + # Remove formats with no mime type or extension. + for name in list(supported_formats_pil.keys()): + mime_types, extensions = supported_formats_pil[name] + if not mime_types or not extensions: + del supported_formats_pil[name] + # Remove archives/videos formats. + for name in ( + 'MPEG', + 'PDF', + ): + if name in supported_formats_pil: + del supported_formats_pil[name] + + # Step 2: Collect GDK Pixbuf formats + supported_formats_gdk = {} + for format in GdkPixbuf.Pixbuf.get_formats(): + name = format.get_name().upper() + assert name not in supported_formats_gdk + supported_formats_gdk[name] = ( + format.get_mime_types(), + format.get_extensions(), + ) + + # Step 3: merge format collections + supported_formats = {} + for provider in (supported_formats_gdk, supported_formats_pil): + for name in list(provider.keys()): + mime_types, extentions = provider[name] + new_name = name.upper() + new_mime_types, new_extensions = supported_formats.get( \ + new_name, (set(), set())) + new_mime_types.update([x.lower() for x in mime_types]) + new_extensions.update([x.lower() for x in extentions]) + supported_formats[new_name] = (new_mime_types, new_extensions) + + _SUPPORTED_IMAGE_FORMATS = supported_formats + return _SUPPORTED_IMAGE_FORMATS + +_SUPPORTED_IMAGE_FORMATS = None +# Set supported image extensions regexp from list of supported formats. +# Only used internally. +_SUPPORTED_IMAGE_REGEX = tools.formats_to_regex(get_supported_formats()) +log.debug("_SUPPORTED_IMAGE_REGEX='%s'", _SUPPORTED_IMAGE_REGEX.pattern) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/keybindings_editor.py mcomix-2.1.0/mcomix/keybindings_editor.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/keybindings_editor.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/keybindings_editor.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +""" Configuration tree view for the preferences dialog to edit keybindings. """ + +from gi.repository import Gtk + +from mcomix import keybindings + + +class KeybindingEditorWindow(Gtk.ScrolledWindow): + + def __init__(self, keymanager): + """ @param keymanager: KeybindingManager instance. """ + super(KeybindingEditorWindow, self).__init__() + self.set_border_width(5) + self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) + + self.keymanager = keymanager + + accel_column_num = max([ + len(self.keymanager.get_bindings_for_action(action)) + for action in list(keybindings.BINDING_INFO.keys()) + ]) + accel_column_num = self.accel_column_num = max([3, accel_column_num]) + + # Human name, action name, true value, shortcut 1, shortcut 2, ... + model = [str, str, 'gboolean'] + model.extend( [str, ] * accel_column_num) + + treestore = self.treestore = Gtk.TreeStore(*model) + self.refresh_model() + + treeview = Gtk.TreeView(treestore) + + tvcol1 = Gtk.TreeViewColumn(_("Name")) + treeview.append_column(tvcol1) + cell1 = Gtk.CellRendererText() + tvcol1.pack_start(cell1, True) + tvcol1.set_attributes(cell1, text=0, editable=2) + + for idx in range(0, self.accel_column_num): + tvc = Gtk.TreeViewColumn(_("Key %d") % (idx +1)) + treeview.append_column(tvc) + accel_cell = Gtk.CellRendererAccel() + accel_cell.connect("accel-edited", self.get_on_accel_edited(idx)) + accel_cell.connect("accel-cleared", self.get_on_accel_cleared(idx)) + tvc.pack_start(accel_cell, True) + tvc.add_attribute(accel_cell, "text", 3 + idx) + tvc.add_attribute(accel_cell, "editable", 2) + + # Allow sorting on the column + tvcol1.set_sort_column_id(0) + + self.add_with_viewport(treeview) + + def refresh_model(self): + """ Initializes the model from data provided by the keybinding + manager. """ + self.treestore.clear() + section_order = list(set(d['group'] + for d in list(keybindings.BINDING_INFO.values()))) + section_order.sort() + section_parent_map = {} + for section_name in section_order: + row = [section_name, None, False] + row.extend( [None,] * self.accel_column_num) + section_parent_map[section_name] = self.treestore.append( + None, row + ) + + action_treeiter_map = self.action_treeiter_map = {} + # Sort actions by action name + actions = sorted(list(keybindings.BINDING_INFO.items()), + key=lambda item: item[1]['title']) + for action_name, action_data in actions: + title = action_data['title'] + group_name = action_data['group'] + old_bindings = self.keymanager.get_bindings_for_action(action_name) + acc_list = ["", ] * self.accel_column_num + for idx in range(0, self.accel_column_num): + if len(old_bindings) > idx: + acc_list[idx] = Gtk.accelerator_name(*old_bindings[idx]) + + row = [title, action_name, True] + row.extend(acc_list) + treeiter = self.treestore.append( + section_parent_map[group_name], + row + ) + action_treeiter_map[action_name] = treeiter + + def get_on_accel_edited(self, column): + def on_accel_edited(renderer, path, accel_key, accel_mods, hardware_keycode): + iter = self.treestore.get_iter(path) + col = column + 3 # accel cells start from 3 position + old_accel = self.treestore.get(iter, col)[0] + new_accel = Gtk.accelerator_name(accel_key, accel_mods) + self.treestore.set_value(iter, col, new_accel) + action_name = self.treestore.get_value(iter, 1) + affected_action = self.keymanager.edit_accel(action_name, new_accel, old_accel) + + # Find affected row and cell + if affected_action == action_name: + for idx in range(0, self.accel_column_num): + if idx != column and self.treestore.get(iter, idx + 3)[0] == new_accel: + self.treestore.set_value(iter, idx + 3, "") + elif affected_action is not None: + titer = self.action_treeiter_map[affected_action] + for idx in range(0, self.accel_column_num): + if self.treestore.get(titer, idx + 3)[0] == new_accel: + self.treestore.set_value(titer, idx + 3, "") + + # updating gtk accelerator for label in menu + if self.keymanager.get_bindings_for_action(action_name)[0] == (accel_key, accel_mods): + Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, + accel_key, accel_mods, True) + + return on_accel_edited + + def get_on_accel_cleared(self, column): + def on_accel_cleared(renderer, path, *args): + iter = self.treestore.get_iter(path) + col = column + 3 + accel = self.treestore.get(iter, col)[0] + action_name = self.treestore.get_value(iter, 1) + if accel != "": + self.keymanager.clear_accel(action_name, accel) + + # updating gtk accelerator for label in menu + if len(self.keymanager.get_bindings_for_action(action_name)) == 0: + Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, 0, 0, True) + else: + key, mods = self.keymanager.get_bindings_for_action(action_name)[0] + Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, key, mods, True) + + self.treestore.set_value(iter, col, "") + return on_accel_cleared + + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/keybindings.py mcomix-2.1.0/mcomix/keybindings.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/keybindings.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/keybindings.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,340 @@ +# -*- coding: utf-8 -*- + +""" Dynamic hotkey management + +This module handles global hotkeys that were previously hardcoded in events.py. +All menu accelerators are handled using GTK's built-in accelerator map. The map +doesn't seem to support multiple keybindings for one action, though, so this +module takes care of the problem. + +At runtime, other modules can register a callback for a specific action name. +This action name has to be registered in BINDING_INFO, or an Exception will be +thrown. The module can pass a list of default keybindings. If the user hasn't +configured different bindings, the default ones will be used. + +Afterwards, the action will be stored together with its keycode/modifier in a +dictionary: +(keycode: int, modifier: GdkModifierType) => + (action: string, callback: func, args: list, kwargs: dict) + +Default keybindings will be stored here at initialization: +action-name: string => [keycodes: list] + + +Each action_name can have multiple keybindings. +""" + +import os +import shutil +from gi.repository import Gtk +import json +from collections import defaultdict + +from mcomix import constants +from mcomix import log + +#: Bindings defined in this dictionary will appear in the configuration dialog. +#: If 'group' is None, the binding cannot be modified from the preferences dialog. +BINDING_INFO = { + # Navigation between pages, archives, directories + 'previous_page' : { 'title' : _('Previous page'), 'group' : _('Navigation') }, + 'next_page' : { 'title' : _('Next page'), 'group' : _('Navigation') }, + 'previous_page_ff' : { 'title': _('Back ten pages'), 'group': _('Navigation') }, + 'next_page_ff' : { 'title': _('Forward ten pages'), 'group': _('Navigation') }, + 'previous_page_dynamic' : { 'title': _('Previous page (dynamic)'), 'group': _('Navigation') }, + 'next_page_dynamic' : { 'title': _('Next page (dynamic)'), 'group': _('Navigation') }, + 'previous_page_singlestep': { 'title': _('Previous page (always one page)'), 'group': _('Navigation') }, + 'next_page_singlestep': { 'title': _('Next page (always one page)'), 'group': _('Navigation') }, + + 'first_page' : { 'title': _('First page'), 'group': _('Navigation') }, + 'last_page' : { 'title': _('Last page'), 'group': _('Navigation') }, + 'go_to' : { 'title': _('Go to page'), 'group': _('Navigation') }, + + 'next_archive' : { 'title': _('Next archive'), 'group': _('Navigation') }, + 'previous_archive' : { 'title': _('Previous archive'), 'group': _('Navigation') }, + 'next_directory' : { 'title': _('Next directory'), 'group': _('Navigation') }, + 'previous_directory' : { 'title': _('Previous directory'), 'group': _('Navigation') }, + + # Scrolling + 'scroll_left_bottom' : { 'title' : _('Scroll to bottom left'), 'group' : _('Scroll')}, + 'scroll_middle_bottom' : { 'title' : _('Scroll to bottom center'), 'group' : _('Scroll')}, + 'scroll_right_bottom' : { 'title' : _('Scroll to bottom right'), 'group' : _('Scroll')}, + + 'scroll_left_middle' : { 'title' : _('Scroll to middle left'), 'group' : _('Scroll')}, + 'scroll_middle' : { 'title' : _('Scroll to center'), 'group' : _('Scroll')}, + 'scroll_right_middle' : { 'title' : _('Scroll to middle right'), 'group' : _('Scroll')}, + + 'scroll_left_top' : { 'title' : _('Scroll to top left'), 'group' : _('Scroll')}, + 'scroll_middle_top' : { 'title' : _('Scroll to top center'), 'group' : _('Scroll')}, + 'scroll_right_top' : { 'title' : _('Scroll to top right'), 'group' : _('Scroll')}, + + 'scroll_down' : { 'title' : _('Scroll down'), 'group' : _('Scroll') }, + 'scroll_up' : { 'title' : _('Scroll up'), 'group' : _('Scroll') }, + 'scroll_right' : { 'title' : _('Scroll right'), 'group' : _('Scroll') }, + 'scroll_left' : { 'title' : _('Scroll left'), 'group' : _('Scroll') }, + + 'smart_scroll_up' : { 'title' : _('Smart scroll up'), 'group' : _('Scroll') }, + 'smart_scroll_down' : { 'title' : _('Smart scroll down'), 'group' : _('Scroll') }, + + # View + 'zoom_in' : { 'title' : _('Zoom in'), 'group' : _('Zoom')}, + 'zoom_out' : { 'title' : _('Zoom out'), 'group' : _('Zoom')}, + 'zoom_original' : { 'title' : _('Normal size'), 'group' : _('Zoom')}, + + 'keep_transformation' : { 'title': _('Keep transformation'), 'group': _('Transformation') }, + 'rotate_90' : { 'title': _('Rotate 90 degrees CW'), 'group': _('Transformation') }, + 'rotate_180' : { 'title': _('Rotate 180 degrees'), 'group': _('Transformation') }, + 'rotate_270' : { 'title': _('Rotate 90 degrees CCW'), 'group': _('Transformation') }, + 'flip_horiz' : { 'title': _('Flip horizontally'), 'group': _('Transformation') }, + 'flip_vert' : { 'title': _('Flip vertically'), 'group': _('Transformation') }, + 'no_autorotation' : { 'title': _('Never autorotate'), 'group': _('Transformation') }, + + 'rotate_90_width' : { 'title': _('Rotate 90 degrees CW'), 'group': _('Autorotate by width') }, + 'rotate_270_width' : { 'title': _('Rotate 90 degrees CCW'), 'group': _('Autorotate by width') }, + 'rotate_90_height' : { 'title': _('Rotate 90 degrees CW'), 'group': _('Autorotate by height') }, + 'rotate_270_height' : { 'title': _('Rotate 90 degrees CCW'), 'group': _('Autorotate by height') }, + + 'double_page' : { 'title': _('Double page mode'), 'group': _('View mode') }, + 'manga_mode' : { 'title': _('Manga mode'), 'group': _('View mode') }, + 'invert_scroll' : { 'title': _('Invert smart scroll'), 'group': _('View mode') }, + + 'lens' : { 'title': _('Magnifying lens'), 'group': _('View mode') }, + 'stretch' : { 'title': _('Stretch small images'), 'group': _('View mode') }, + + 'best_fit_mode' : { 'title': _('Best fit mode'), 'group': _('View mode') }, + 'fit_width_mode' : { 'title': _('Fit width mode'), 'group': _('View mode') }, + 'fit_height_mode' : { 'title': _('Fit height mode'), 'group': _('View mode') }, + 'fit_size_mode' : { 'title': _('Fit size mode'), 'group': _('View mode') }, + 'fit_manual_mode' : { 'title': _('Manual zoom mode'), 'group': _('View mode') }, + + # General UI + 'exit_fullscreen' : { 'title' : _('Exit from fullscreen'), 'group' : _('User interface')}, + + 'osd_panel' : { 'title' : _('Show OSD panel'), 'group' : _('User interface') }, + 'minimize' : { 'title' : _('Minimize'), 'group' : _('User interface') }, + 'fullscreen' : { 'title': _('Fullscreen'), 'group': _('User interface') }, + 'toolbar' : { 'title': _('Show/hide toolbar'), 'group': _('User interface') }, + 'menubar' : { 'title': _('Show/hide menubar'), 'group': _('User interface') }, + 'statusbar' : { 'title': _('Show/hide statusbar'), 'group': _('User interface') }, + 'scrollbar' : { 'title': _('Show/hide scrollbars'), 'group': _('User interface') }, + 'thumbnails' : { 'title': _('Thumbnails'), 'group': _('User interface') }, + 'hide_all' : { 'title': _('Show/hide all'), 'group': _('User interface') }, + 'slideshow' : { 'title': _('Start slideshow'), 'group': _('User interface') }, + + # File operations + 'delete' : { 'title' : _('Delete'), 'group' : _('File') }, + 'refresh_archive' : { 'title': _('Refresh'), 'group': _('File') }, + 'close' : { 'title': _('Close'), 'group': _('File') }, + 'quit' : { 'title': _('Quit'), 'group': _('File') }, + 'save_and_quit' : { 'title': _('Save and quit'), 'group': _('File') }, + 'extract_page' : { 'title': _('Save As'), 'group': _('File') }, + + 'comments' : { 'title': _('Archive comments'), 'group': _('File') }, + 'properties' : { 'title': _('Properties'), 'group': _('File') }, + 'preferences' : { 'title': _('Preferences'), 'group': _('File') }, + + 'edit_archive' : { 'title': _('Edit archive'), 'group': _('File') }, + 'open' : { 'title': _('Open'), 'group': _('File') }, + 'enhance_image' : { 'title': _('Enhance image'), 'group': _('File') }, + 'library' : { 'title': _('Library'), 'group': _('File') }, +} + +# Generate 9 entries for executing command 1 to 9 +for i in range(1, 10): + BINDING_INFO['execute_command_%d' %i] = { + 'title' : _('Execute external command') + ' (%d)' % i, + 'group' : _('External commands') + } + + +class _KeybindingManager(object): + def __init__(self, window): + #: Main window instance + self._window = window + + self._action_to_callback = {} # action name => (func, args, kwargs) + self._action_to_bindings = defaultdict(list) # action name => [ (key code, key modifier), ] + self._binding_to_action = {} # (key code, key modifier) => action name + + self._migrate_from_old_bindings() + self._initialize() + + def register(self, name, bindings, callback, args=[], kwargs={}): + """ Registers an action for a predefined keybinding name. + @param name: Action name, defined in L{BINDING_INFO}. + @param bindings: List of keybinding strings, as understood + by L{Gtk.accelerator_parse}. Only used if no + bindings were loaded for this action. + @param callback: Function callback + @param args: List of arguments to pass to the callback + @param kwargs: List of keyword arguments to pass to the callback. + """ + assert name in BINDING_INFO, "'%s' isn't a valid keyboard action." % name + + # Load stored keybindings, or fall back to passed arguments + keycodes = self._action_to_bindings[name] + if keycodes == []: + keycodes = [Gtk.accelerator_parse(binding) for binding in bindings ] + + for keycode in keycodes: + if keycode in list(self._binding_to_action.keys()): + if self._binding_to_action[keycode] != name: + log.warning(_('Keybinding for "%(action)s" overrides hotkey for another action.'), + {"action": name}) + log.warning('Binding %s overrides %r', keycode, self._binding_to_action[keycode]) + else: + self._binding_to_action[keycode] = name + self._action_to_bindings[name].append(keycode) + + # Add gtk accelerator for labels in menu + if len(self._action_to_bindings[name]) > 0: + key, mod = self._action_to_bindings[name][0] + Gtk.AccelMap.change_entry('/mcomix-main/%s' % name, key, mod, True) + + self._action_to_callback[name] = (callback, args, kwargs) + + + def edit_accel(self, name, new_binding, old_binding): + """ Changes binding for an action + @param name: Action name + @param new_binding: Binding to be assigned to action + @param old_binding: Binding to be removed from action [ can be empty: "" ] + + @return None: new_binding wasn't in any action + action name: where new_binding was before + """ + assert name in BINDING_INFO, "'%s' isn't a valid keyboard action." % name + + nb = Gtk.accelerator_parse(new_binding) + old_action_with_nb = self._binding_to_action.get(nb) + if old_action_with_nb is not None: + # The new key is already bound to an action, erase the action + self._binding_to_action.pop(nb) + self._action_to_bindings[old_action_with_nb].remove(nb) + + if old_binding and name != old_action_with_nb: + # The action already had a key that is now being replaced + ob = Gtk.accelerator_parse(old_binding) + self._binding_to_action[nb] = name + + # Remove action bound to the key. + if ob in self._binding_to_action: + self._binding_to_action.pop(ob) + + if ob in self._action_to_bindings[name]: + idx = self._action_to_bindings[name].index(ob) + self._action_to_bindings[name].pop(idx) + self._action_to_bindings[name].insert(idx, nb) + else: + self._binding_to_action[nb] = name + self._action_to_bindings[name].append(nb) + + self.save() + return old_action_with_nb + + def clear_accel(self, name, binding): + """ Remove binding for an action """ + assert name in BINDING_INFO, "'%s' isn't a valid keyboard action." % name + + ob = Gtk.accelerator_parse(binding) + self._action_to_bindings[name].remove(ob) + self._binding_to_action.pop(ob) + + self.save() + + def clear_all(self): + """ Removes all keybindings. The changes are only persisted if + save() is called afterwards. """ + self._action_to_callback = {} + self._action_to_bindings = defaultdict(list) + self._binding_to_action = {} + + def execute(self, keybinding): + """ Executes an action that has been registered for the + passed keyboard event. If no action is bound to the passed key, this + method is a no-op. """ + if keybinding in self._binding_to_action: + action = self._binding_to_action[keybinding] + func, args, kwargs = self._action_to_callback[action] + self._window.emit_stop_by_name('key_press_event') + return func(*args, **kwargs) + + # Some keys enable additional modifiers (NumLock enables GDK_MOD2_MASK), + # which prevent direct lookup simply by being pressed. + # XXX: Looking up by key/modifier probably isn't the best implementation, + # so limit possible states to begin with? + for stored_binding, action in self._binding_to_action.items(): + stored_keycode, stored_flags = stored_binding + if stored_keycode == keybinding[0] and stored_flags & keybinding[1]: + func, args, kwargs = self._action_to_callback[action] + self._window.emit_stop_by_name('key_press_event') + return func(*args, **kwargs) + + def save(self): + """ Stores the keybindings that have been set to disk. """ + # Collect keybindings for all registered actions + action_to_keys = {} + for action, bindings in self._action_to_bindings.items(): + if bindings is not None: + action_to_keys[action] = [ + Gtk.accelerator_name(keyval, modifiers) for + (keyval, modifiers) in bindings + ] + fp = open(constants.KEYBINDINGS_CONF_PATH, "w") + json.dump(action_to_keys, fp, indent=2) + fp.close() + + def _initialize(self): + """ Restore keybindings from disk. """ + try: + fp = open(constants.KEYBINDINGS_CONF_PATH, "r") + stored_action_bindings = json.load(fp) + fp.close() + except Exception as e: + log.error(_("Couldn't load keybindings: %s"), e) + stored_action_bindings = {} + + for action in BINDING_INFO.keys(): + if action in stored_action_bindings: + bindings = [ + Gtk.accelerator_parse(keyname) + for keyname in stored_action_bindings[action] ] + self._action_to_bindings[action] = bindings + for binding in bindings: + self._binding_to_action[binding] = action + else: + self._action_to_bindings[action] = [] + + def get_bindings_for_action(self, name): + """ Returns a list of (keycode, modifier) for the action C{name}. """ + return self._action_to_bindings[name] + + def _migrate_from_old_bindings(self): + """ This method deals with upgrading from MComix 1.0 and older to + MComix 1.01, which integrated all UI hotkeys into this class. Simply + remove old files and start from default values. """ + gtkrc = os.path.join(constants.CONFIG_DIR, 'keybindings-Gtk.rc') + if os.path.isfile(gtkrc): + # In case the user has made modifications to his files, + # keep the old ones around for reference. + if not os.path.isfile(gtkrc + '.delete-me'): + shutil.move(gtkrc, gtkrc + '.delete-me') + + if os.path.isfile(constants.KEYBINDINGS_CONF_PATH) and \ + not os.path.isfile(constants.KEYBINDINGS_CONF_PATH + '.delete-me'): + shutil.move(constants.KEYBINDINGS_CONF_PATH, + constants.KEYBINDINGS_CONF_PATH + '.delete-me') + +_manager = None + + +def keybinding_manager(window): + """ Returns a singleton instance of the keybinding manager. """ + global _manager + if _manager: + return _manager + else: + _manager = _KeybindingManager(window) + return _manager + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/labels.py mcomix-2.1.0/mcomix/labels.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/labels.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/labels.py 2022-12-17 11:34:07.000000000 +0000 @@ -0,0 +1,49 @@ +"""labels.py - Gtk.Label convenience classes.""" + +from gi.repository import GLib, Gtk, Pango + +class FormattedLabel(Gtk.Label): + + """FormattedLabel keeps a label always formatted with some pango weight, + style and scale, even when new text is set using set_text(). + """ + + _STYLES = { + Pango.Style.NORMAL : 'normal', + Pango.Style.OBLIQUE: 'oblique', + Pango.Style.ITALIC : 'italic', + } + + def __init__(self, text='', weight=Pango.Weight.NORMAL, + style=Pango.Style.NORMAL, scale=1.0): + super(FormattedLabel, self).__init__() + self._weight = weight + self._style = style + self._scale = scale + self.set_text(text) + + def set_text(self, text): + markup = '%s' % ( + int(self._scale * 10 * 1024), + self._weight, + self._STYLES[self._style], + GLib.markup_escape_text(text) + ) + self.set_markup(markup) + +class BoldLabel(FormattedLabel): + + """A FormattedLabel that is always bold and otherwise normal.""" + + def __init__(self, text=''): + super(BoldLabel, self).__init__(text=text, weight=Pango.Weight.BOLD) + +class ItalicLabel(FormattedLabel): + + """A FormattedLabel that is always italic and otherwise normal.""" + + def __init__(self, text=''): + super(ItalicLabel, self).__init__(text=text, style=Pango.Style.ITALIC) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/last_read_page.py mcomix-2.1.0/mcomix/last_read_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/last_read_page.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/last_read_page.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,233 @@ +# -*- coding: utf-8 -*- + +import os + +from mcomix import log +from mcomix import constants + +# This import is only used for legacy data that is imported +# into the library at upgrade. +try: + from sqlite3 import dbapi2 +except ImportError: + try: + from pysqlite2 import dbapi2 + except ImportError: + log.warning( _('! Could neither find pysqlite2 nor sqlite3.') ) + dbapi2 = None + + +class LastReadPage(object): + """ Automatically stores the last page the user read for all book files, + and restores the page the next time the archive is opened. When the book + is finished, the page will be cleared. + + If L{enabled} is set to C{false}, all methods will do nothing. This + simplifies code in other places, as it does not have to check each time + if the preference option to store pages automatically is enabled. + """ + + def __init__(self, backend): + """ Constructor. + @param backend: Library backend instance. + """ + #: If disabled, all methods will be no-ops. + self.enabled = False + #: Library backend. + self.backend = backend + + def set_enabled(self, enabled): + """ Enables (or disables) all functionality of this module. + @type enabled: bool + """ + if self.backend.enabled: + self.enabled = enabled + else: + self.enabled = False + + def count(self): + """ Number of stored book/page combinations. This method is + not affected by setting L{enabled} to false. + @return: The number of entries stored by this module. """ + + if not self.backend.enabled: + return 0 + + cursor = self.backend.execute("""SELECT COUNT(*) FROM recent""") + count = cursor.fetchone() + cursor.close() + + return count + + def set_page(self, path, page): + """ Sets C{page} as last read page for the book at C{path}. + @param path: Path to book. Raises ValueError if file doesn't exist. + @param page: Page number. + """ + if not self.enabled: + return + + full_path = os.path.abspath(path) + book = self.backend.get_book_by_path(full_path) + + if not book: + self.backend.add_book( + full_path, self.backend.get_recent_collection().id) + book = self.backend.get_book_by_path(full_path) + + if not book: + raise ValueError("Book doesn't exist") + else: + self.backend.add_book_to_collection( + book.id, self.backend.get_recent_collection().id) + + book.set_last_read_page(page) + + def clear_page(self, path): + """ Removes stored page for book at C{path}. + @param path: Path to book. + """ + if not self.enabled: + return + + full_path = os.path.abspath(path) + book = self.backend.get_book_by_path(full_path) + + if book: + book.set_last_read_page(None) + + def clear_all(self): + """ Removes all stored books from the library's 'Recent' collection, + and removes all information from the recent table. This method is + not affected by setting L{enabled} to false. """ + + if not self.backend.enabled: + return + + # Collect books that are only present in "Recent" collection + # and have an entry in table "recent". Those must be removed. + sql = """SELECT c.book FROM contain c + JOIN (SELECT book FROM contain + GROUP BY book HAVING COUNT(*) = 1 + ) t ON t.book = c.book + JOIN recent r ON r.book = c.book + WHERE c.collection = ?""" + cursor = self.backend.execute(sql, + (self.backend.get_recent_collection().id,)) + for book in cursor.fetchall(): + self.backend.remove_book(book) + cursor.execute("""DELETE FROM recent""") + cursor.execute("""DELETE FROM contain WHERE collection = ?""", + (self.backend.get_recent_collection().id,)) + cursor.close() + + def get_page(self, path): + """ Gets the last read page for book at C{path}. + + @param path: Path to book. + @return: Page that was last read, or C{None} if the book + wasn't opened before. + """ + if not self.enabled: + return None + + full_path = os.path.abspath(path) + book = self.backend.get_book_by_path(full_path) + if book: + page = book.get_last_read_page() + if page is not None and page < book.pages: + return page + else: + # If the last read page was the last in the book, + # start from scratch. + return None + else: + return None + + def get_date(self, path): + """ Gets the date at which the page for path was set. + + @param path: Path to book. + @return: C{datetime} object, or C{None} if no page was set. + """ + if not self.enabled: + return None + + full_path = os.path.abspath(path) + book = self.backend.get_book_by_path(full_path) + if book: + return book.get_last_read_date() + else: + return None + + def migrate_database_to_library(self, recent_collection): + """ Moves all information saved in the legacy database + constants.LASTPAGE_DATABASE_PATH into the library, + and deleting the old database. """ + + if not self.backend.enabled: + return + + database = self._init_database(constants.LASTPAGE_DATABASE_PATH) + + if database: + cursor = database.execute('''SELECT path, page, time_set + FROM lastread''') + rows = cursor.fetchall() + cursor.close() + database.close() + + for path, page, time_set in rows: + book = self.backend.get_book_by_path(path) + + if not book: + # The path doesn't exist in the library yet + if not os.path.exists(path): + # File might no longer be available + continue + + self.backend.add_book(path, recent_collection) + book = self.backend.get_book_by_path(path) + + if not book: + # The book could not be added + continue + else: + # The book exists, move into recent collection + self.backend.add_book_to_collection(book.id, recent_collection) + + # Set recent info on retrieved book + # XXX: If the book calls get_backend during migrate_database, + # the library isn't constructed yet and breaks in an + # endless recursion. + book.get_backend = lambda: self.backend + book.set_last_read_page(page, time_set) + + try: + os.unlink(constants.LASTPAGE_DATABASE_PATH) + except IOError as e: + log.error(_('! Could not remove file "%s"'), + constants.LASTPAGE_DATABASE_PATH) + + def _init_database(self, dbfile): + """ Creates or opens new SQLite database at C{dbfile}, and initalizes + the required table(s). + + @param dbfile: Database file name. This file needn't exist. + @return: Open SQLite database connection. + """ + if not dbapi2: + return None + + db = dbapi2.connect(dbfile, isolation_level=None) + sql = """CREATE TABLE IF NOT EXISTS lastread ( + path TEXT PRIMARY KEY, + page INTEGER, + time_set DATETIME + )""" + cursor = db.execute(sql) + cursor.close() + + return db + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/layout.py mcomix-2.1.0/mcomix/layout.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/layout.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/layout.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,253 @@ +""" Layout. """ + +import operator + +from mcomix import constants +from mcomix import scrolling +from mcomix import tools +from mcomix import box + + +class FiniteLayout(object): # 2D only + + @staticmethod + def create_finite_layout(box_count, orientation, spacing, + distribution_axis, alignment_axis, + scrollbar_update, visible_area_update, sizes_update): + viewport_size = () # dummy + expand_area = False + scrollbar_requests = [False] * 2 # 2D only + # Visible area size is recomputed depending on scrollbar visibility + while True: + scrollbar_update(scrollbar_requests) + new_viewport_size = visible_area_update() + if new_viewport_size == viewport_size: + break + viewport_size = new_viewport_size + zoom_dummy_size = list(viewport_size) + dasize = zoom_dummy_size[distribution_axis] - \ + spacing * (box_count - 1) + if dasize <= 0: + dasize = 1 + zoom_dummy_size[distribution_axis] = dasize + scaled_sizes_distorted = sizes_update(zoom_dummy_size) + result = FiniteLayout(scaled_sizes_distorted[0], scaled_sizes_distorted[1], + viewport_size, orientation, spacing, expand_area, distribution_axis, + alignment_axis) + union_scaled_size = result.get_union_box().get_size() + scrollbar_requests = list(map(operator.or_, scrollbar_requests, + tools.smaller(viewport_size, union_scaled_size))) + if len([_f for _f in scrollbar_requests if _f]) > 1 and not expand_area: + expand_area = True + viewport_size = () # start anew + return result + + + def __init__(self, content_sizes, content_distorted, viewport_size, orientation, + spacing, wrap_individually, distribution_axis, alignment_axis): + """ Lays out a finite number of Boxes along the first axis. + @param content_sizes: The sizes of the Boxes to lay out. + @param content_distorted: Booleans indicating whether the corresponding + Box size is stretched irrespective of aspect ratio. + @param viewport_size: The size of the viewport. + @param orientation: The orientation to use. + @param spacing: Number of additional pixels between Boxes. + @param wrap_individually: True if each content box should get its own + wrapper box, False if the only wrapper box should be the union of all + content boxes. + @param distribution_axis: the axis along which the Boxes are distributed. + @param alignment_axis: the axis to center. """ + self.scroller = scrolling.Scrolling() + self.current_index = -1 + self.wrap_individually = wrap_individually + self._reset(content_sizes, content_distorted, viewport_size, orientation, + spacing, wrap_individually, distribution_axis, alignment_axis) + + + def set_viewport_position(self, viewport_position): + """ Moves the viewport to the specified position. + @param viewport_position: The new viewport position. """ + self.viewport_box = self.viewport_box.set_position(viewport_position) + self.dirty_current_index = True + + + def scroll_smartly(self, max_scroll, backwards, axis_map, index=None): + """ Applies a "smart scrolling" step to the current viewport position. + If there are not enough Boxes to scroll to, the viewport is not moved + and an appropriate value is returned. + @param max_scroll: The maximum numbers of pixels to scroll in one step. + @param backwards: True for backwards scrolling, False otherwise. + @param axis_map: The index of the dimension to modify. + @param index: The index of the Box the scrolling step is related to, + or None to use the index of the current Box. + @return: The index of the current Box after scrolling, or -1 if there + were not enough Boxes to scroll backwards, or the number of Boxes if + there were not enough Boxes to scroll forwards. """ + # TODO reconsider interface + if (index == None) or (not self.wrap_individually): + index = self.get_current_index() + if not self.wrap_individually: + wrapper_index = 0 + else: + wrapper_index = index + o = tools.vector_opposite(self.orientation) if backwards \ + else self.orientation + new_pos = self.scroller.scroll_smartly(self.wrapper_boxes[wrapper_index], + self.viewport_box, o, max_scroll, axis_map) + if new_pos == []: + if self.wrap_individually: + index += -1 if backwards else 1 + n = len(self.get_content_boxes()) + if (index < n) and (index >= 0): + self.scroll_to_predefined(tools.vector_opposite(o), index) + return index + else: + index = -1 if backwards else len(self.get_content_boxes()) + return index + self.set_viewport_position(new_pos) + return index + + + def scroll_to_predefined(self, destination, index=None): + """ Scrolls the viewport to a predefined destination. + @param destination: An integer representing a predefined destination. + Either 1 (towards the greatest possible values in this dimension), + -1 (towards the smallest value in this dimension), 0 (keep position), + SCROLL_TO_CENTER (scroll to the center of the content in this + dimension), SCROLL_TO_START (scroll to where the content starts in this + dimension) or SCROLL_TO_END (scroll to where the content ends in this + dimension). + @param index: The index of the Box the scrolling is related to, None to + use the index of the current Box, or UNION_INDEX to use the union box + instead. Note that the current implementation always uses the union box + if self.wrap_individually is False. """ + if index == None: + index = self.get_current_index() + if not self.wrap_individually: + index = constants.UNION_INDEX + if index == constants.UNION_INDEX: + current_box = self.union_box + else: + if index == constants.LAST_INDEX: + index = len(self.content_boxes) - 1 + current_box = self.wrapper_boxes[index] + self.set_viewport_position(self.scroller.scroll_to_predefined( + current_box, self.viewport_box, self.orientation, destination)) + + + def get_content_boxes(self): + """ Returns the Boxes as they are arranged in this layout. + @return: The Boxes as they are arranged in this layout. """ + return self.content_boxes + + + def get_content_distorted(self): + """ Returns Booleans indicating whether the corresponding content + Box is stretched irrespective of aspect ratio. + @return: Booleans indicating whether the corresponding content + Box is stretched irrespective of aspect ratio. """ + return self.content_distorted + + + def get_wrapper_boxes(self): + """ Returns the wrapper Boxes as they are arranged in this layout. + @return: The wrapper Boxes as they are arranged in this layout. """ + return self.wrapper_boxes + + + def get_union_box(self): + """ Returns the union Box for this layout. + @return: The union Box for this layout. """ + return self.union_box + + + def get_current_index(self): + """ Returns the index of the Box that is said to be the current Box. + @return: The index of the Box that is said to be the current Box. """ + if self.dirty_current_index: + self.current_index = self.viewport_box.current_box_index( + self.orientation, self.content_boxes) + self.dirty_current_index = False + return self.current_index + + + def get_viewport_box(self): + """ Returns the current viewport Box. + @return: The current viewport Box. """ + return self.viewport_box + + + def get_orientation(self): + """ Returns the orientation for this layout. + @return: The orientation for this layout. """ + return self.orientation + + + def set_orientation(self, orientation): + self.orientation = orientation + + + def _reset(self, content_sizes, content_distorted, viewport_size, orientation, + spacing, wrap_individually, distribution_axis, alignment_axis): + # reverse order if necessary + if orientation[distribution_axis] == -1: + content_sizes = tuple(reversed(content_sizes)) + temp_cb_list = list(map(box.Box, content_sizes)) + # align to center + temp_cb_list = box.Box.align_center(temp_cb_list, alignment_axis, 0, + orientation[alignment_axis]) + # distribute + temp_cb_list = box.Box.distribute(temp_cb_list, distribution_axis, 0, + spacing) + if wrap_individually: + temp_wb_list, temp_bb = FiniteLayout._wrap_individually(temp_cb_list, + viewport_size, orientation) + else: + temp_wb_list, temp_bb = FiniteLayout._wrap_union(temp_cb_list, + viewport_size, orientation) + # move to global origin + bbp = temp_bb.get_position() + for i in range(len(temp_cb_list)): + temp_cb_list[i] = temp_cb_list[i].translate_opposite(bbp) + for i in range(len(temp_wb_list)): + temp_wb_list[i] = temp_wb_list[i].translate_opposite(bbp) + temp_bb = temp_bb.translate_opposite(bbp) + # reverse order again, if necessary + if orientation[distribution_axis] == -1: + temp_cb_list = tuple(reversed(temp_cb_list)) + temp_wb_list = tuple(reversed(temp_wb_list)) + # done + self.content_boxes = temp_cb_list + self.content_distorted = content_distorted + self.wrapper_boxes = temp_wb_list + self.union_box = temp_bb + self.viewport_box = box.Box(viewport_size) + self.orientation = orientation + self.dirty_current_index = True + + + @staticmethod + def _wrap_individually(temp_cb_list, viewport_size, orientation): + # calculate (potentially oversized) wrapper Boxes + temp_wb_list = [None] * len(temp_cb_list) + for i in range(len(temp_cb_list)): + temp_wb_list[i] = temp_cb_list[i].wrapper_box(viewport_size, + orientation) + # calculate bounding Box + temp_bb = box.Box.bounding_box(temp_wb_list) + return (temp_wb_list, temp_bb) + + + @staticmethod + def _wrap_union(temp_cb_list, viewport_size, orientation): + # calculate bounding Box + temp_wb_list = [box.Box.bounding_box(temp_cb_list).wrapper_box( + viewport_size, orientation)] + return (temp_wb_list, temp_wb_list[0]) + + +def create_dummy_layout(): + return FiniteLayout(((1,1),), ((False, False),), (1,1), (1,1), 0, False, 0, 0) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/lens.py mcomix-2.1.0/mcomix/lens.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/lens.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/lens.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,260 @@ +"""lens.py - Magnifying lens.""" + +import math + +from gi.repository import Gdk, GdkPixbuf, Gtk + +from mcomix.preferences import prefs +from mcomix import image_tools +from mcomix import constants + + +class MagnifyingLens(object): + + """The MagnifyingLens creates cursors from the raw pixbufs containing + the unscaled data for the currently displayed images. It does this by + looking at the cursor position and calculating what image data to put + in the "lens" cursor. + + Note: The mapping is highly dependent on the exact layout of the main + window images, thus this module isn't really independent from the main + module as it uses implementation details not in the interface. + """ + + def __init__(self, window): + self._window = window + self._area = self._window._main_layout + self._area.connect('motion-notify-event', self._motion_event) + + #: Stores lens state + self._enabled = False + #: Stores a tuple of the last mouse coordinates + self._point = None + #: Stores the last rectangle that was used to render the lens + self._last_lens_rect = None + + def get_enabled(self): + return self._enabled + + def set_enabled(self, enabled): + self._enabled = enabled + + if enabled: + # FIXME: If no file is currently loaded, the cursor will still be hidden. + self._window.cursor_handler.set_cursor_type(constants.NO_CURSOR) + self._window.osd.clear() + + if self._point: + self._draw_lens(*self._point) + else: + self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) + self._clear_lens() + self._last_lens_rect = None + + enabled = property(get_enabled, set_enabled) + + def _draw_lens(self, x, y): + """Calculate what image data to put in the lens and update the cursor + with it; and are the positions of the cursor within the + main window layout area. + """ + if self._window.images[0].get_storage_type() not in (Gtk.ImageType.PIXBUF, + Gtk.ImageType.ANIMATION): + return + + rectangle = self._calculate_lens_rect(x, y, prefs['lens size'], prefs['lens size']) + pixbuf = self._get_lens_pixbuf(x, y) + + draw_region = Gdk.Rectangle() + draw_region.x, draw_region.y, draw_region.width, draw_region.height = rectangle + if self._last_lens_rect: + last_region = Gdk.Rectangle() + last_region.x, last_region.y, last_region.width, last_region.height = self._last_lens_rect + draw_region = Gdk.rectangle_union(draw_region, last_region) + + window = self._window._main_layout.get_bin_window() + window.begin_paint_rect(draw_region) + + self._clear_lens() + + cr = window.cairo_create() + surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, 0, window) + cr.set_source_surface(surface, rectangle[0], rectangle[1]) + cr.paint() + + window.end_paint() + + self._last_lens_rect = rectangle + + def _calculate_lens_rect(self, x, y, width, height): + """ Calculates the area where the lens will be drawn on screen. This method takes + screen space into calculation and moves the rectangle accordingly when the the rectangle + would otherwise flow over the allocated area. """ + + lens_x = max(x - width // 2, 0) + lens_y = max(y - height // 2, 0) + + max_width, max_height = self._window.get_visible_area_size() + max_width += int(self._window._hadjust.get_value()) + max_height += int(self._window._vadjust.get_value()) + lens_x = min(lens_x, max_width - width) + lens_y = min(lens_y, max_height - height) + + # Don't forget 1 pixel border... + return lens_x, lens_y, width + 2, height + 2 + + def _clear_lens(self, current_lens_region=None): + """ Invalidates the area that was damaged by the last call to draw_lens. """ + + if not self._last_lens_rect: + return + + window = self._window._main_layout.get_bin_window() + crect = Gdk.Rectangle() + crect.x, crect.y, crect.width, crect.height = self._last_lens_rect + window.invalidate_rect(crect, True) + window.process_updates(True) + self._last_lens_rect = None + + def toggle(self, action): + """Toggle on or off the lens depending on the state of .""" + self.enabled = action.get_active() + + def _motion_event(self, widget, event): + """ Called whenever the mouse moves over the image area. """ + self._point = (int(event.x), int(event.y)) + if self.enabled: + self._draw_lens(*self._point) + + def _get_lens_pixbuf(self, x, y): + """Get a pixbuf containing the appropiate image data for the lens + where and are the positions of the cursor. + """ + canvas = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=True, bits_per_sample=8, + width=prefs['lens size'], + height=prefs['lens size']) + canvas.fill(image_tools.convert_rgb16list_to_rgba8int(self._window.get_bg_colour())) + cb = self._window.layout.get_content_boxes() + source_pixbufs = self._window.imagehandler.get_pixbufs(len(cb)) + for i in range(len(cb)): + if image_tools.is_animation(source_pixbufs[i]): + continue + cpos = cb[i].get_position() + self._add_subpixbuf(canvas, x - cpos[0], y - cpos[1], + cb[i].get_size(), source_pixbufs[i]) + + return image_tools.add_border(canvas, 1) + + def _add_subpixbuf(self, canvas, x, y, image_size, source_pixbuf): + """Copy a subpixbuf from to as it should + be in the lens if the coordinates , are the mouse pointer + position on the main window layout area. + + The displayed image (scaled from the ) must have + size . + """ + # Prevent division by zero exceptions further down + if not image_size[0]: + return + + # FIXME This merely prevents Errors being raised if source_pixbuf is an + # animation. The result might be broken, though, since animation, + # rotation etc. might not match or will be ignored: + source_pixbuf = image_tools.static_image(source_pixbuf) + + rotation = 0 + if prefs['auto rotate from exif']: + rotation = image_tools.get_implied_rotation(source_pixbuf) + + rotation += image_tools.get_size_rotation(source_pixbuf.get_width(), + source_pixbuf.get_height()) + rotation = (rotation + prefs['rotation']) % 360 + + if rotation in [90, 270]: + scale = float(source_pixbuf.get_height()) / image_size[0] + else: + scale = float(source_pixbuf.get_width()) / image_size[0] + + x *= scale + y *= scale + + source_mag = prefs['lens magnification'] / scale + width = height = prefs['lens size'] / source_mag + + paste_left = x > width / 2 + paste_top = y > height / 2 + dest_x = max(0, int(math.ceil((width / 2 - x) * source_mag))) + dest_y = max(0, int(math.ceil((height / 2 - y) * source_mag))) + + if rotation == 90: + x, y = y, source_pixbuf.get_height() - x + elif rotation == 180: + x = source_pixbuf.get_width() - x + y = source_pixbuf.get_height() - y + elif rotation == 270: + x, y = source_pixbuf.get_width() - y, x + if prefs['horizontal flip']: + if rotation in (90, 270): + y = source_pixbuf.get_height() - y + else: + x = source_pixbuf.get_width() - x + if prefs['vertical flip']: + if rotation in (90, 270): + x = source_pixbuf.get_width() - x + else: + y = source_pixbuf.get_height() - y + + src_x = x - width / 2 + src_y = y - height / 2 + if src_x < 0: + width += src_x + src_x = 0 + if src_y < 0: + height += src_y + src_y = 0 + width = max(0, min(source_pixbuf.get_width() - src_x, width)) + height = max(0, min(source_pixbuf.get_height() - src_y, height)) + if width < 1 or height < 1: + return + + subpixbuf = source_pixbuf.new_subpixbuf(int(src_x), int(src_y), + int(width), int(height)) + subpixbuf = subpixbuf.scale_simple( + int(math.ceil(source_mag * subpixbuf.get_width())), + int(math.ceil(source_mag * subpixbuf.get_height())), + prefs['scaling quality']) + + if rotation == 90: + subpixbuf = subpixbuf.rotate_simple( + GdkPixbuf.PixbufRotation.CLOCKWISE) + elif rotation == 180: + subpixbuf = subpixbuf.rotate_simple( + GdkPixbuf.PixbufRotation.UPSIDEDOWN) + elif rotation == 270: + subpixbuf = subpixbuf.rotate_simple( + GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) + if prefs['horizontal flip']: + subpixbuf = subpixbuf.flip(horizontal=True) + if prefs['vertical flip']: + subpixbuf = subpixbuf.flip(horizontal=False) + + subpixbuf = self._window.enhancer.enhance(subpixbuf) + + if paste_left: + dest_x = 0 + else: + dest_x = min(canvas.get_width() - subpixbuf.get_width(), dest_x) + if paste_top: + dest_y = 0 + else: + dest_y = min(canvas.get_height() - subpixbuf.get_height(), dest_y) + + if subpixbuf.get_has_alpha() and prefs['checkered bg for transparent images']: + subpixbuf = subpixbuf.composite_color_simple(subpixbuf.get_width(), subpixbuf.get_height(), + GdkPixbuf.InterpType.NEAREST, 255, 8, 0x777777, 0x999999) + + subpixbuf.copy_area(0, 0, subpixbuf.get_width(), + subpixbuf.get_height(), canvas, dest_x, dest_y) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/add_progress_dialog.py mcomix-2.1.0/mcomix/library/add_progress_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/add_progress_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/add_progress_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,86 @@ +"""library_add_progress_dialog.py - Progress bar for the library.""" + +from gi.repository import Gtk +from gi.repository import Pango + +from mcomix import labels + +_dialog = None +# The "All books" collection is not a real collection stored in the library, +# but is represented by this ID in the library's TreeModels. +_COLLECTION_ALL = -1 + +class _AddLibraryProgressDialog(Gtk.Dialog): + + """Dialog with a ProgressBar that adds books to the library.""" + + def __init__(self, library, window, paths, collection): + """Adds the books at to the library, and also to the + , unless it is None. + """ + super(_AddLibraryProgressDialog, self).__init__(_('Adding books'), library, + Gtk.DialogFlags.MODAL, (Gtk.STOCK_STOP, Gtk.ResponseType.CLOSE)) + + self._window = window + self._destroy = False + self.set_size_request(400, -1) + self.set_resizable(False) + self.set_border_width(4) + self.connect('response', self._response) + self.set_default_response(Gtk.ResponseType.CLOSE) + + main_box = Gtk.VBox(False, 5) + main_box.set_border_width(6) + self.vbox.pack_start(main_box, False, False, 0) + hbox = Gtk.HBox(False, 10) + main_box.pack_start(hbox, False, False, 5) + left_box = Gtk.VBox(True, 5) + right_box = Gtk.VBox(True, 5) + hbox.pack_start(left_box, False, False, 0) + hbox.pack_start(right_box, False, False, 0) + + label = labels.BoldLabel(_('Added books:')) + label.set_alignment(1.0, 1.0) + left_box.pack_start(label, True, True, 0) + number_label = Gtk.Label(label='0') + number_label.set_alignment(0, 1.0) + right_box.pack_start(number_label, True, True, 0) + + bar = Gtk.ProgressBar() + main_box.pack_start(bar, False, False, 0) + + added_label = labels.ItalicLabel() + added_label.set_alignment(0, 0.5) + added_label.set_width_chars(64) + added_label.set_max_width_chars(64) + added_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + main_box.pack_start(added_label, False, False, 0) + self.show_all() + + total_paths_int = len(paths) + total_paths_float = float(len(paths)) + total_added = 0 + + for path in paths: + + if library.backend.add_book(path, collection): + total_added += 1 + + number_label.set_text('%d / %d' % (total_added, total_paths_int)) + + added_label.set_text(_("Adding '%s'...") % path) + bar.set_fraction(total_added / total_paths_float) + + while Gtk.events_pending(): + Gtk.main_iteration_do(False) + + if self._destroy: + return + + self._response() + + def _response(self, *args): + self._destroy = True + self.destroy() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/backend.py mcomix-2.1.0/mcomix/library/backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/backend.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/backend.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,679 @@ +"""library_backend.py - Comic book library backend using sqlite.""" + +import os +import datetime + +from mcomix import archive_tools +from mcomix import constants +from mcomix import thumbnail_tools +from mcomix import log +from mcomix import callback +from mcomix.library import backend_types +# Only for importing legacy data from last-read module +from mcomix import last_read_page + +try: + from sqlite3 import dbapi2 +except ImportError: + try: + from pysqlite2 import dbapi2 + except ImportError: + log.warning( _('! Could neither find pysqlite2 nor sqlite3.') ) + dbapi2 = None + + +#: Identifies the 'Recent' collection that stores recently read books. +COLLECTION_RECENT = -2 + + +class _LibraryBackend(object): + + """The LibraryBackend handles the storing and retrieval of library + data to and from disk. + """ + + #: Current version of the library database structure. + # See method _upgrade_database() for changes between versions. + DB_VERSION = 6 + + def __init__(self): + + def row_factory(cursor, row): + """Return rows as sequences only when they have more than + one element. + """ + if len(row) == 1: + return row[0] + return row + + if dbapi2 is not None: + self._con = dbapi2.connect(constants.LIBRARY_DATABASE_PATH, + check_same_thread=False, isolation_level=None) + self._con.row_factory = row_factory + self.enabled = True + + self.watchlist = backend_types._WatchList(self) + + version = self._library_version() + self._upgrade_database(version, _LibraryBackend.DB_VERSION) + else: + self._con = None + self.watchlist = None + self.enabled = False + + def get_books_in_collection(self, collection=None, filter_string=None): + """Return a sequence with all the books in , or *ALL* + books if is None. If is not None, we + only return books where the occurs in the path. + """ + if collection is None: + if filter_string is None: + cur = self._con.execute('''select id from Book''') + else: + cur = self._con.execute('''select id from Book + where path like ?''', ("%%%s%%" % filter_string, )) + + return cur.fetchall() + else: + books = [] + subcollections = self.get_all_collections_in_collection(collection) + for coll in [ collection ] + subcollections: + if filter_string is None: + cur = self._con.execute('''select id from Book + where id in (select book from Contain where collection = ?) + ''', (coll,)) + else: + cur = self._con.execute('''select id from Book + where id in (select book from Contain where collection = ?) + and path like ?''', (coll, "%%%s%%" % filter_string)) + books.extend(cur.fetchall()) + return books + + def get_book_by_path(self, path): + """ Retrieves a book from the library, specified by C{path}. + If the book doesn't exist, None is returned. Otherwise, a + L{backend_types._Book} instance is returned. """ + + path = os.path.abspath(path) + + cur = self.execute('''select id, name, path, pages, format, + size, added + from book where path = ?''', (path,)) + book = cur.fetchone() + cur.close() + + if book: + return backend_types._Book(*book) + else: + return None + + def get_book_by_id(self, id): + """ Retrieves a book from the library, specified by C{id}. + If the book doesn't exist, C{None} is returned. Otherwise, a + L{backend_types._Book} instance is returned. """ + + cur = self.execute('''select id, name, path, pages, format, + size, added + from book where id = ?''', (id,)) + book = cur.fetchone() + cur.close() + + if book: + return backend_types._Book(*book) + else: + return None + + def get_book_cover(self, book): + """Return a pixbuf with a thumbnail of the cover of , or + None if the cover can not be fetched. + """ + try: + path = self._con.execute('''select path from Book + where id = ?''', (book,)).fetchone() + except Exception: + log.error( _('! Non-existant book #%i'), book ) + return None + + return self.get_book_thumbnail(path) + + def get_book_path(self, book): + """Return the filesystem path to , or None if isn't + in the library. + """ + try: + path = self._con.execute('''select path from Book + where id = ?''', (book,)).fetchone() + except Exception: + log.error( _('! Non-existant book #%i'), book ) + return None + + return path + + def get_book_thumbnail(self, path): + """ Returns a pixbuf with a thumbnail of the cover of the book at , + or None, if no thumbnail could be generated. """ + + # Use the maximum image size allowed by the library, so that thumbnails + # might be downscaled, but never need to be upscaled (and look ugly). + thumbnailer = thumbnail_tools.Thumbnailer(dst_dir=constants.LIBRARY_COVERS_PATH, + store_on_disk=True, + archive_support=True, + size=(constants.MAX_LIBRARY_COVER_SIZE, + constants.MAX_LIBRARY_COVER_SIZE)) + thumb = thumbnailer.thumbnail(path) + + if thumb is None: log.warning( _('! Could not get cover for book "%s"'), path ) + return thumb + + def get_book_name(self, book): + """Return the name of , or None if isn't in the + library. + """ + cur = self._con.execute('''select name from Book + where id = ?''', (book,)) + name = cur.fetchone() + if name is not None: + return name + else: + return None + + def get_book_pages(self, book): + """Return the number of pages in , or None if isn't + in the library. + """ + cur = self._con.execute('''select pages from Book + where id = ?''', (book,)) + return cur.fetchone() + + def get_book_format(self, book): + """Return the archive format of , or None if isn't + in the library. + """ + cur = self._con.execute('''select format from Book + where id = ?''', (book,)) + return cur.fetchone() + + def get_book_size(self, book): + """Return the size of in bytes, or None if isn't + in the library. + """ + cur = self._con.execute('''select size from Book + where id = ?''', (book,)) + return cur.fetchone() + + def get_collections_in_collection(self, collection=None): + """Return a sequence with all the subcollections in , + or all top-level collections if is None. + """ + if collection is None: + cur = self._con.execute('''select id from Collection + where supercollection isnull + order by name''') + else: + cur = self._con.execute('''select id from Collection + where supercollection = ? + order by name''', (collection,)) + return cur.fetchall() + + def get_all_collections_in_collection(self, collection): + """ Returns a sequence of subcollections in , + that is, even subcollections that are again a subcollection of one + of the previous subcollections. """ + + if collection is None: raise ValueError("Collection must not be ") + + to_search = [ collection ] + collections = [ ] + # This assumes that the library is built like a tree, so no circular references. + while len(to_search) > 0: + collection = to_search.pop() + subcollections = self.get_collections_in_collection(collection) + collections.extend(subcollections) + to_search.extend(subcollections) + + return collections + + def get_all_collections(self): + """Return a sequence with all collections (flattened hierarchy). + The sequence is sorted alphabetically by collection name. + """ + cur = self._con.execute('''select id from Collection + order by name''') + return cur.fetchall() + + def get_collection_name(self, collection): + """Return the name field of the , or None if the + collection does not exist. + """ + cur = self._con.execute('''select name from Collection + where id = ?''', (collection,)) + name = cur.fetchone() + if name is not None: + return name + else: + return None + + def get_collection_by_name(self, name): + """Return the collection called , or None if no such + collection exists. Names are unique, so at most one such collection + can exist. + """ + cur = self._con.execute('''select id, name, supercollection + from collection + where name = ?''', (name,)) + result = cur.fetchone() + cur.close() + if result: + return backend_types._Collection(*result) + else: + return None + + def get_collection_by_id(self, id): + """ Returns the collection with ID C{id}. + @param id: Integer value. May be C{-1} or C{None} for default collection. + @return: L{_Collection} if found, None otherwise. + """ + if id is None or id == -1: + return backend_types.DefaultCollection + else: + cur = self._con.execute('''select id, name, supercollection + from collection + where id = ?''', (id,)) + result = cur.fetchone() + cur.close() + + if result: + return backend_types._Collection(*result) + else: + return None + + def get_recent_collection(self): + """ Returns the "Recent" collection, especially created for + storing recently opened files. """ + return self.get_collection_by_id(COLLECTION_RECENT) + + def get_supercollection(self, collection): + """Return the supercollection of .""" + cur = self._con.execute('''select supercollection from Collection + where id = ?''', (collection,)) + return cur.fetchone() + + def add_book(self, path, collection=None): + """Add the archive at to the library. If is + not None, it is the collection that the books should be put in. + Return True if the book was successfully added (or was already + added). + """ + path = os.path.abspath(path) + name = os.path.basename(path) + info = archive_tools.get_archive_info(path) + if info is None: + return False + format, pages, size = info + + # Thumbnail for the newly added book will be generated once it + # is actually needed with get_book_thumbnail(). + old = self._con.execute('''select id from Book + where path = ?''', (path,)).fetchone() + try: + cursor = self._con.cursor() + if old is not None: + cursor.execute('''update Book set + name = ?, pages = ?, format = ?, size = ? + where path = ?''', (name, pages, format, size, path)) + book_id = old + else: + cursor.execute('''insert into Book + (name, path, pages, format, size) + values (?, ?, ?, ?, ?)''', + (name, path, pages, format, size)) + book_id = cursor.lastrowid + + book = backend_types._Book(book_id, name, path, pages, + format, size, datetime.datetime.now().isoformat()) + self.book_added(book) + + cursor.close() + + if collection is not None: + self.add_book_to_collection(book_id, collection) + + return True + except dbapi2.Error: + log.error( _('! Could not add book "%s" to the library'), path ) + return False + + @callback.Callback + def book_added(self, book): + """ Event that triggers when a new book is successfully added to the + library. + @param book: L{_Book} instance of the newly added book. + """ + pass + + @callback.Callback + def book_added_to_collection(self, book, collection_id): + """ Event that triggers when a book is added to the + specified collection. + @param book: L{_Book} instance of the added book. + @param collection_id: ID of the collection. + """ + pass + + + def add_collection(self, name): + """Add a new collection with to the library. Return True + if the collection was successfully added. + """ + try: + # The Recent pseudo collection initializes the lowest rowid + # with -2, meaning that instead of starting from 1, + # auto-incremental will start from -1. Avoid this. + cur = self._con.execute('''select max(id) from collection''') + maxid = cur.fetchone() + if maxid is not None and maxid < 1: + self._con.execute('''insert into collection + (id, name) values (?, ?)''', (1, name)) + else: + self._con.execute('''insert into Collection + (name) values (?)''', (name,)) + return True + except dbapi2.Error: + log.error( _('! Could not add collection "%s"'), name ) + return False + + def add_book_to_collection(self, book, collection): + """Put into .""" + try: + self._con.execute('''insert into Contain + (collection, book) values (?, ?)''', (collection, book)) + self.book_added_to_collection(self.get_book_by_id(book), + collection) + except dbapi2.DatabaseError: # E.g. book already in collection. + pass + except dbapi2.Error: + log.error( _('! Could not add book %(book)s to collection %(collection)s'), + {"book" : book, "collection" : collection} ) + + def add_collection_to_collection(self, subcollection, supercollection): + """Put into , or put + in the root if is None. + """ + if supercollection is None: + self._con.execute('''update Collection + set supercollection = NULL + where id = ?''', (subcollection,)) + else: + self._con.execute('''update Collection + set supercollection = ? + where id = ?''', (supercollection, subcollection)) + + def rename_collection(self, collection, name): + """Rename the to . Return True if the renaming + was successful. + """ + try: + self._con.execute('''update Collection set name = ? + where id = ?''', (name, collection)) + return True + except dbapi2.DatabaseError: # E.g. name taken. + pass + except dbapi2.Error: + log.error( _('! Could not rename collection to "%s"'), name ) + return False + + def duplicate_collection(self, collection): + """Duplicate the by creating a new collection + containing the same books. Return True if the duplication was + successful. + """ + name = self.get_collection_name(collection) + if name is None: # Original collection does not exist. + return False + copy_name = name + ' ' + _('(Copy)') + while self.get_collection_by_name(copy_name): + copy_name = copy_name + ' ' + _('(Copy)') + if self.add_collection(copy_name) is None: # Could not create the new. + return False + copy_collection = self._con.execute('''select id from Collection + where name = ?''', (copy_name,)).fetchone() + self._con.execute('''insert or ignore into Contain (collection, book) + select ?, book from Contain + where collection = ?''', (copy_collection, collection)) + return True + + def clean_collection(self, collection=None): + """ Removes files from that no longer exist. If + is None, all collections are cleaned. Returns the number of deleted books. """ + book_ids = self.get_books_in_collection(collection) + deleted = 0 + for id in book_ids: + path = self.get_book_path(id) + if path and not os.path.isfile(path): + self.remove_book(id) + deleted += 1 + + return deleted + + def remove_book(self, book): + """Remove the from the library.""" + path = self.get_book_path(book) + if path is not None: + thumbnailer = thumbnail_tools.Thumbnailer(dst_dir=constants.LIBRARY_COVERS_PATH) + thumbnailer.delete(path) + self._con.execute('delete from Book where id = ?', (book,)) + self._con.execute('delete from Contain where book = ?', (book,)) + + def remove_collection(self, collection): + """Remove the (sans books) from the library.""" + self._con.execute('''update watchlist set collection = NULL + where collection = ?''', (collection,)) + self._con.execute('delete from Collection where id = ?', (collection,)) + self._con.execute('delete from Contain where collection = ?', + (collection,)) + self._con.execute('''update Collection set supercollection = NULL + where supercollection = ?''', (collection,)) + + def remove_book_from_collection(self, book, collection): + """Remove from .""" + self._con.execute('''delete from Contain + where book = ? and collection = ?''', (book, collection)) + + def execute(self, *args): + """ Passes C{args} directly to the C{execute} method of the SQL + connection. """ + return self._con.execute(*args) + + def begin_transaction(self): + """ Normally, the connection is in auto-commit mode. Calling + this method will switch to transactional mode, automatically + starting a transaction when a DML statement is used. """ + self._con.isolation_level = 'IMMEDIATE' + + def end_transaction(self): + """ Commits any changes to the database and switches back + to auto-commit mode. """ + self._con.commit() + self._con.isolation_level = None + + def close(self): + """Commit changes and close cleanly.""" + if self._con is not None: + self._con.commit() + self._con.close() + + global _backend + _backend = None + + def _table_exists(self, table): + """ Checks if C{table} exists in the database. """ + cursor = self._con.cursor() + exists = cursor.execute('pragma table_info(%s)' % table).fetchone() is not None + cursor.close() + return exists + + def _library_version(self): + """ Examines the library database structure to determine + which version of MComix created it. + + @return C{version} from the table C{Info} if available, + C{0} otherwise. C{-1} if the database has not been created yet.""" + + # Check if Comix' tables exist + tables = ('book', 'collection', 'contain') + for table in tables: + if not self._table_exists(table): + return -1 + + if self._table_exists('info'): + cursor = self._con.cursor() + version = cursor.execute('''select value from info + where key = 'version' ''').fetchone() + cursor.close() + + if not version: + log.warning(_('Could not determine library database version!')) + return -1 + else: + return int(version) + else: + # Comix database format + return 0 + + def _create_tables(self): + """ Creates all required tables in the database. """ + self._create_table_book() + self._create_table_collection() + self._create_table_contain() + self._create_table_info() + self._create_table_watchlist() + self._create_table_recent() + + def _upgrade_database(self, from_version, to_version): + """ Performs sequential upgrades to the database, bringing + it from C{from_version} to C{to_version}. If C{from_version} + is -1, the database structure will simply be re-created at the + current version. """ + + if from_version == -1: + self._create_tables() + return + + if from_version != to_version: + upgrades = list(range(from_version, to_version)) + log.info(_("Upgrading library database version from %(from)d to %(to)d."), + { "from" : from_version, "to" : to_version }) + + if 0 in upgrades: + # Upgrade from Comix database structure to DB version 1 + # (Added table 'info') + self._create_table_info() + + if 1 in upgrades: + # Upgrade to database structure version 2. + # (Added table 'watchlist' for storing auto-add directories) + self._create_table_watchlist() + + if 2 in upgrades: + # Changed 'added' field in 'book' from date to datetime. + self._con.execute('''alter table book rename to book_old''') + self._create_table_book() + self._con.execute('''insert into book + (id, name, path, pages, format, size, added) + select id, name, path, pages, format, size, datetime(added) + from book_old''') + self._con.execute('''drop table book_old''') + + if 3 in upgrades: + # Added field 'recursive' to table 'watchlist' + self._con.execute('''alter table watchlist rename to watchlist_old''') + self._create_table_watchlist() + self._con.execute('''insert into watchlist + (path, collection, recursive) + select path, collection, 0 from watchlist_old''') + self._con.execute('''drop table watchlist_old''') + + if 4 in upgrades: + # Added table 'recent' to store recently viewed book information and + # create a collection (-2, Recent) + self._create_table_recent() + lastread = last_read_page.LastReadPage(self) + lastread.migrate_database_to_library(COLLECTION_RECENT) + + if 5 in upgrades: + # Changed all 'string' columns into 'text' columns + self._con.execute('''alter table book rename to book_old''') + self._create_table_book() + self._con.execute('''insert into book + (id, name, path, pages, format, size, added) + select id, name, path, pages, format, size, added from book_old''') + self._con.execute('''drop table book_old''') + + self._con.execute('''alter table collection rename to collection_old''') + self._create_table_collection() + self._con.execute('''insert into collection + (id, name, supercollection) + select id, name, supercollection from collection_old''') + self._con.execute('''drop table collection_old''') + + self._con.execute('''update info set value = ? where key = 'version' ''', + (str(_LibraryBackend.DB_VERSION),)) + + def _create_table_book(self): + self._con.execute('''create table if not exists book ( + id integer primary key, + name text, + path text unique, + pages integer, + format integer, + size integer, + added datetime default current_timestamp)''') + + def _create_table_collection(self): + self._con.execute('''create table if not exists collection ( + id integer primary key, + name text unique, + supercollection integer)''') + + def _create_table_contain(self): + self._con.execute('''create table if not exists contain ( + collection integer not null, + book integer not null, + primary key (collection, book))''') + + def _create_table_info(self): + self._con.execute('''create table if not exists info ( + key text primary key, + value text)''') + self._con.execute('''insert into info + (key, value) values ('version', ?)''', + (str(_LibraryBackend.DB_VERSION),)) + + def _create_table_watchlist(self): + self._con.execute('''create table if not exists watchlist ( + path text primary key, + collection integer references collection (id) on delete set null, + recursive boolean not null)''') + + def _create_table_recent(self): + self._con.execute('''create table if not exists recent ( + book integer primary key, + page integer, + time_set datetime)''') + self._con.execute('''insert or ignore into collection (id, name) + values (?, ?)''', (COLLECTION_RECENT, _('Recent'))) + + +_backend = None + + +def LibraryBackend(): + """ Returns the singleton instance of the library backend. """ + global _backend + if _backend is not None: + return _backend + else: + _backend = _LibraryBackend() + return _backend + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/backend_types.py mcomix-2.1.0/mcomix/library/backend_types.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/backend_types.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/backend_types.py 2022-01-28 05:23:22.000000000 +0000 @@ -0,0 +1,404 @@ +""" Data class for library books and collections. """ + +import os +import threading +import datetime + +from mcomix import callback +from mcomix import archive_tools + + +class _BackendObject(object): + + def get_backend(self): + # XXX: Delayed import to avoid circular import + from mcomix.library.backend import LibraryBackend + return LibraryBackend() + + +class _Book(_BackendObject): + """ Library book instance. """ + + def __init__(self, id, name, path, pages, format, size, added): + """ Creates a book instance. + @param id: Book id + @param name: Base name of the book + @param path: Full path to the book + @param pages: Number of pages + @param format: One of the archive formats in L{constants} + @param size: File size in bytes + @param added: Datetime when book was added to library """ + + self.id = id + self.name = name + self.path = path + self.pages = pages + self.format = format + self.size = size + self.added = added + + def get_collections(self): + """ Gets a list of collections this book is part of. If it + belongs to no collections, [DefaultCollection] is returned. """ + cursor = self.get_backend().execute( + '''SELECT id, name, supercollection FROM collection + JOIN contain on contain.collection = collection.id + WHERE contain.book = ?''', (self.id,)) + rows = cursor.fetchall() + if rows: + return [_Collection(*row) for row in rows] + else: + return [DefaultCollection] + + def get_last_read_page(self): + """ Gets the page of this book that was last read when the book was + closed. Returns C{None} if no such page exists. """ + cursor = self.get_backend().execute( + '''SELECT page FROM recent WHERE book = ?''', (self.id,)) + row = cursor.fetchone() + cursor.close() + if row: + return row + else: + return None + + def get_last_read_date(self): + """ Gets the datetime the book was most recently read. Returns + C{None} if no information was set, or a datetime object otherwise. """ + cursor = self.get_backend().execute( + """SELECT time_set FROM recent WHERE book = ?""", (self.id,)) + date = cursor.fetchone() + cursor.close() + + if date: + try: + return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S.%f') + except ValueError: + # Certain operating systems do not store fractions + return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S') + else: + return None + + def set_last_read_page(self, page, time=None): + """ Sets the page that was last read when the book was closed. + Passing C{None} as argument clears the recent information. + + @param page: Page number, starting from 1 (page 1 throws ValueError) + @param time: Time of reading. If None, current time is used. """ + + if page is not None and page < 1: + # Avoid wasting memory by creating a recently viewed entry when + # an archive was opened on page 1. + raise ValueError('Invalid page (must start from 1)') + + # Remove any old recent row for this book + cursor = self.get_backend().execute( + '''DELETE FROM recent WHERE book = ?''', (self.id,)) + # If a new page was passed, set it as recently read + if page is not None: + if not time: + time = datetime.datetime.now() + cursor.execute('''INSERT INTO recent (book, page, time_set) + VALUES (?, ?, ?)''', + (self.id, page, time)) + + cursor.close() + + +class _Collection(_BackendObject): + """ Library collection instance. + This class should NOT be instianted directly, but only with methods from + L{LibraryBackend} instead. """ + + def __init__(self, id, name, supercollection=None): + """ Creates a collection instance. + @param id: Collection id + @param name: Name of the collection + @param supercollection: Parent collection, or C{None} """ + + self.id = id + self.name = name + self.supercollection = supercollection + + def __eq__(self, other): + if isinstance(other, _Collection): + return self.id == other.id + elif isinstance(other, int): + return self.id == other + else: + return False + + def get_books(self, filter_string=None): + """ Returns all books that are part of this collection, + including subcollections. """ + + books = [] + for collection in [ self ] + self.get_all_collections(): + sql = '''SELECT book.id, book.name, book.path, book.pages, book.format, + book.size, book.added + FROM book + JOIN contain ON contain.book = book.id + AND contain.collection = ? + ''' + + sql_args = [collection.id] + if filter_string: + sql += ''' WHERE book.name LIKE '%' || ? || '%' ''' + sql_args.append(filter_string) + + cursor = self.get_backend().execute(sql, sql_args) + rows = cursor.fetchall() + cursor.close() + + books.extend([ _Book(*cols) for cols in rows ]) + + return books + + def get_collections(self): + """ Returns a list of all direct subcollections of this instance. """ + + cursor = self.get_backend().execute('''SELECT id, name, supercollection + FROM collection + WHERE supercollection = ? + ORDER by name''', [self.id]) + result = cursor.fetchall() + cursor.close() + + return [ _Collection(*row) for row in result ] + + def get_all_collections(self): + """ Returns all collections that are subcollections of this instance, + or subcollections of a subcollection of this instance. """ + + to_search = [ self ] + collections = [ ] + # This assumes that the library is built like a tree, so no circular references. + while len(to_search) > 0: + collection = to_search.pop() + subcollections = collection.get_collections() + collections.extend(subcollections) + to_search.extend(subcollections) + + return collections + + def add_collection(self, subcollection): + """ Sets C{subcollection} as child of this collection. """ + + self.get_backend().execute('''UPDATE collection + SET supercollection = ? + WHERE id = ?''', (self.id, subcollection.id)) + subcollection.supercollection = self.id + + +class _DefaultCollection(_Collection): + """ Represents the default collection that books belong to if + no explicit collection was specified. """ + + def __init__(self): + + self.id = None + self.name = _("All books") + self.supercollection = None + + def get_books(self, filter_string=None): + """ Returns all books in the library """ + sql = '''SELECT book.id, book.name, book.path, book.pages, book.format, + book.size, book.added + FROM book + ''' + + sql_args = [] + if filter_string: + sql += ''' WHERE book.name LIKE '%' || ? || '%' ''' + sql_args.append(filter_string) + + cursor = self.get_backend().execute(sql, sql_args) + rows = cursor.fetchall() + cursor.close() + + return [ _Book(*cols) for cols in rows ] + + def add_collection(self, subcollection): + """ Removes C{subcollection} from any supercollections and moves + it to the root level of the tree. """ + + assert subcollection is not DefaultCollection, "Cannot change DefaultCollection" + + self.get_backend().execute('''UPDATE collection + SET supercollection = NULL + WHERE id = ?''', (subcollection.id,)) + subcollection.supercollection = None + + def get_collections(self): + """ Returns a list of all root collections. """ + + cursor = self.get_backend().execute('''SELECT id, name, supercollection + FROM collection + WHERE supercollection IS NULL + ORDER by name''') + result = cursor.fetchall() + cursor.close() + + return [ _Collection(*row) for row in result ] + + +DefaultCollection = _DefaultCollection() + + +class _WatchList(object): + """ Scans watched directories and updates the database when new books have + been added. This object is part of the library backend, i.e. + C{library.backend.watchlist}. """ + + def __init__(self, backend): + self.backend = backend + + def add_directory(self, path, collection=DefaultCollection, recursive=False): + """ Adds a new watched directory. """ + + directory = os.path.normpath(os.path.abspath(path)) + sql = """INSERT OR IGNORE INTO watchlist (path, collection, recursive) + VALUES (?, ?, ?)""" + cursor = self.backend.execute(sql, [directory, collection.id, recursive]) + cursor.close() + + def get_watchlist(self): + """ Returns a list of watched directories. + @return: List of L{_WatchListEntry} objects. """ + + sql = """SELECT watchlist.path, + watchlist.recursive, + collection.id, collection.name, + collection.supercollection + FROM watchlist + LEFT JOIN collection ON watchlist.collection = collection.id""" + + cursor = self.backend.execute(sql) + entries = [self._result_row_to_watchlist_entry(row) for row in cursor.fetchall()] + cursor.close() + + return entries + + def get_watchlist_entry(self, path): + """ Returns a single watchlist entry, specified by C{path} """ + sql = """SELECT watchlist.path, + watchlist.recursive, + collection.id, collection.name, + collection.supercollection + FROM watchlist + LEFT JOIN collection ON watchlist.collection = collection.id + WHERE watchlist.path = ?""" + + cursor = self.backend.execute(sql, (os.path.normpath(path), )) + result = cursor.fetchone() + cursor.close() + + if result: + return self._result_row_to_watchlist_entry(result) + else: + raise ValueError("Watchlist entry doesn't exist") + + def scan_for_new_files(self): + """ Begins scanning for new files in the watched directories. + When the scan finishes, L{new_files_found} will be called + asynchronously. """ + thread = threading.Thread(target=self._scan_for_new_files_thread) + thread.name += '-scan_for_new_files' + thread.start() + + def _scan_for_new_files_thread(self): + """ Executes the actual scanning operation in a new thread. """ + existing_books = [book.path for book in DefaultCollection.get_books() + # Also add book if it was only found in Recent collection + if book.get_collections() != [-2]] + for entry in self.get_watchlist(): + new_files = entry.get_new_files(existing_books) + self.new_files_found(new_files, entry) + + def _result_row_to_watchlist_entry(self, row): + """ Converts the result of a SELECT statement to a WatchListEntry. """ + collection_id = row[2] + if collection_id: + collection = _Collection(*row[2:]) + else: + collection = DefaultCollection + + return _WatchListEntry(row[0], row[1], collection) + + + @callback.Callback + def new_files_found(self, paths, watchentry): + """ Called after scan_for_new_files finishes. + @param paths: List of filenames for newly added files. This list + may be empty if no new files were found during the scan. + @param watchentry: Watchentry for files/directory. + """ + pass + + +class _WatchListEntry(_BackendObject): + """ A watched directory. """ + + def __init__(self, directory, recursive, collection): + self.directory = os.path.normpath(os.path.abspath(directory)) + self.recursive = bool(recursive) + self.collection = collection + + def get_new_files(self, filelist): + """ Returns a list of files that are present in the watched directory, + but not in the list of files passed in C{filelist}. """ + + if not self.is_valid(): + return [] + + old_files = frozenset([os.path.abspath(path) for path in filelist]) + + if not self.recursive: + available_files = frozenset([os.path.join(self.directory, filename) + for filename in os.listdir(self.directory) + if archive_tools.is_archive_file(filename)]) + else: + available_files = [] + for dirpath, dirnames, filenames in os.walk(self.directory): + for filename in filter(archive_tools.is_archive_file, filenames): + path = os.path.join(dirpath, filename) + available_files.append(path) + + available_files = frozenset(available_files) + + return list(available_files.difference(old_files)) + + def is_valid(self): + """ Check if the watched directory is a valid directory and exists. """ + return os.path.isdir(self.directory) + + def remove(self): + """ Removes this entry from the watchlist, deleting its associated + path from the database. """ + sql = """DELETE FROM watchlist WHERE path = ?""" + cursor = self.get_backend().execute(sql, (self.directory,)) + cursor.close() + + self.directory = "" + self.collection = None + + def set_collection(self, new_collection): + """ Updates the collection associated with this watchlist entry. """ + if new_collection != self.collection: + sql = """UPDATE watchlist SET collection = ? WHERE path = ?""" + cursor = self.get_backend().execute(sql, + (new_collection.id, self.directory)) + cursor.close() + self.collection = new_collection + + def set_recursive(self, recursive): + """ Enables or disables recursive scanning. """ + if recursive != self.recursive: + sql = """UPDATE watchlist SET recursive = ? WHERE path = ?""" + cursor = self.get_backend().execute(sql, + (recursive, self.directory)) + cursor.close() + self.recursive = recursive + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/book_area.py mcomix-2.1.0/mcomix/library/book_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/book_area.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/book_area.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,722 @@ +"""library_book_area.py - The window of the library that displays the covers of books.""" + +import os +import urllib.request, urllib.parse, urllib.error +from gi.repository import Gdk, GdkPixbuf, Gtk, GObject +import PIL.Image as Image +import PIL.ImageDraw as ImageDraw + +from mcomix.preferences import prefs +from mcomix import thumbnail_view +from mcomix import file_chooser_library_dialog +from mcomix import image_tools +from mcomix import constants +from mcomix import portability +from mcomix import i18n +from mcomix import status +from mcomix import log +from mcomix import message_dialog +from mcomix import tools +from mcomix.library.pixbuf_cache import get_pixbuf_cache + +_dialog = None + +# The "All books" collection is not a real collection stored in the library, but is represented by this ID in the +# library's TreeModels. +_COLLECTION_ALL = -1 + + +class _BookArea(Gtk.ScrolledWindow): + + """The _BookArea is the central area in the library where the book + covers are displayed. + """ + + # Thumbnail border width in pixels. + _BORDER_SIZE = 1 + + def __init__(self, library): + super(_BookArea, self).__init__() + + self._library = library + self._cache = get_pixbuf_cache() + + self._library.backend.book_added_to_collection += self._new_book_added + + self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + + # Store Cover, book ID, book path, book size, date added to library, + # is thumbnail loaded? + + # The SORT_ constants must correspond to the correct column here, + # i.e. SORT_SIZE must be 3, since 3 is the size column in the ListStore. + self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, + GObject.TYPE_INT, GObject.TYPE_STRING, GObject.TYPE_INT64, + GObject.TYPE_STRING, GObject.TYPE_BOOLEAN) + self._liststore.set_sort_func(constants.SORT_NAME, self._sort_by_name, None) + self._liststore.set_sort_func(constants.SORT_PATH, self._sort_by_path, None) + self.set_sort_order() + self._liststore.connect('row-inserted', self._icon_added) + self._iconview = thumbnail_view.ThumbnailIconView( + self._liststore, + 1, # UID + 0, # pixbuf + 5, # status + ) + self._iconview.generate_thumbnail = self._get_pixbuf + self._iconview.connect('item_activated', self._book_activated) + self._iconview.connect('selection_changed', self._selection_changed) + self._iconview.connect_after('drag_begin', self._drag_begin) + self._iconview.connect('drag_data_get', self._drag_data_get) + self._iconview.connect('drag_data_received', self._drag_data_received) + self._iconview.connect('button_press_event', self._button_press) + self._iconview.connect('key_press_event', self._key_press) + self._iconview.connect('popup_menu', self._popup_menu) + self._iconview.modify_base(Gtk.StateType.NORMAL, image_tools.GTK_GDK_COLOR_BLACK) + self._iconview.enable_model_drag_source( + Gdk.ModifierType.BUTTON1_MASK, + [Gtk.TargetEntry.new('book', Gtk.TargetFlags.SAME_APP, + constants.LIBRARY_DRAG_EXTERNAL_ID)], + Gdk.DragAction.MOVE) + self._iconview.drag_dest_set( + Gtk.DestDefaults.ALL, + [Gtk.TargetEntry.new('text/uri-list', 0, + constants.LIBRARY_DRAG_EXTERNAL_ID)], + Gdk.DragAction.COPY | Gdk.DragAction.MOVE) + self._iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) + self.add(self._iconview) + + self._iconview.set_margin(0) + self._iconview.set_row_spacing(0) + self._iconview.set_column_spacing(0) + + self._ui_manager = Gtk.UIManager() + self._tooltipstatus = status.TooltipStatusHelper(self._ui_manager, + self._library.get_status_bar()) + + ui_description = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + + self._ui_manager.add_ui_from_string(ui_description) + actiongroup = Gtk.ActionGroup('mcomix-library-book-area') + # General book actions + actiongroup.add_actions([ + ('_title', None, _('Library books'), None, None, + None), + ('open', Gtk.STOCK_OPEN, _('_Open'), None, + _('Opens the selected books for viewing.'), + self.open_selected_book), + ('open keep library', Gtk.STOCK_OPEN, + _('Open _without closing library'), None, + _('Opens the selected books, but keeps the library window open.'), + self.open_selected_book_noclose), + ('add', Gtk.STOCK_ADD, _('_Add...'), 'a', + _('Add more books to the library.'), + lambda *args: file_chooser_library_dialog.open_library_filechooser_dialog(self._library)), + ('remove from collection', Gtk.STOCK_REMOVE, + _('Remove from this _collection'), None, + _('Removes the selected books from the current collection.'), + self._remove_books_from_collection), + ('remove from library', Gtk.STOCK_REMOVE, + _('Remove from the _library'), None, + _('Completely removes the selected books from the library.'), + self._remove_books_from_library), + ('completely remove', Gtk.STOCK_DELETE, + _('_Remove and delete from disk'), None, + _('Deletes the selected books from disk.'), + self._completely_remove_book), + ('copy to clipboard', Gtk.STOCK_COPY, + _('_Copy'), None, + _('Copies the selected book\'s path to clipboard.'), + self._copy_selected), + ('sort', None, _('_Sort'), None, + _('Changes the sort order of the library.'), None), + ('cover size', None, _('Cover si_ze'), None, + _('Changes the book cover size.'), None) + ]) + # Sorting the view + actiongroup.add_radio_actions([ + ('by name', None, _('Book name'), None, None, constants.SORT_NAME), + ('by path', None, _('Full path'), None, None, constants.SORT_PATH), + ('by size', None, _('File size'), None, None, constants.SORT_SIZE), + ('by date added', None, _('Date added'), None, None, constants.SORT_LAST_MODIFIED)], + prefs['lib sort key'], self._sort_changed) + actiongroup.add_radio_actions([ + ('ascending', Gtk.STOCK_SORT_ASCENDING, _('Ascending'), None, None, + constants.SORT_ASCENDING), + ('descending', Gtk.STOCK_SORT_DESCENDING, _('Descending'), None, None, + constants.SORT_DESCENDING)], + prefs['lib sort order'], self._sort_changed) + + # Library cover size + actiongroup.add_radio_actions([ + ('huge', None, _('Huge') + ' (%dpx)' % constants.SIZE_HUGE, + None, None, constants.SIZE_HUGE), + ('large', None, _('Large') + ' (%dpx)' % constants.SIZE_LARGE, + None, None, constants.SIZE_LARGE), + ('normal', None, _('Normal') + ' (%dpx)' % constants.SIZE_NORMAL, + None, None, constants.SIZE_NORMAL), + ('small', None, _('Small') + ' (%dpx)' % constants.SIZE_SMALL, + None, None, constants.SIZE_SMALL), + ('tiny', None, _('Tiny') + ' (%dpx)' % constants.SIZE_TINY, + None, None, constants.SIZE_TINY), + ('custom', None, _('Custom...'), None, None, 0)], + prefs['library cover size'] + if prefs['library cover size'] in (constants.SIZE_HUGE, + constants.SIZE_LARGE, constants.SIZE_NORMAL, + constants.SIZE_SMALL, constants.SIZE_TINY) + else 0, + self._book_size_changed) + + self._ui_manager.insert_action_group(actiongroup, 0) + library.add_accel_group(self._ui_manager.get_accel_group()) + + def close(self): + """Run clean-up tasks for the _BookArea prior to closing.""" + + self.stop_update() + + # We must unselect all or we will trigger selection_changed events + # when closing with multiple books selected. + self._iconview.unselect_all() + # We must (for some reason) explicitly clear the ListStore in + # order to not leak memory. + self._liststore.clear() + + def display_covers(self, collection_id): + """Display the books in in the IconView.""" + + adjustment = self.get_vadjustment() + if adjustment: + adjustment.set_value(0) + + self.stop_update() + # Temporarily detach model to speed up updates + self._iconview.set_model(None) + self._liststore.clear() + + collection = self._library.backend.get_collection_by_id(collection_id) + books = collection.get_books(self._library.filter_string) + self.add_books(books) + + # Re-attach model here + self._iconview.set_model(self._liststore) + + def stop_update(self): + """Signal that the updating of book covers should stop.""" + self._iconview.stop_update() + + def add_books(self, books): + """ Adds new book covers to the icon view. + @param books: List of L{_Book} instances. """ + filler = self._get_empty_thumbnail() + + for book in books: + # Fill the liststore with a filler pixbuf. + self._liststore.append([filler, book.id, + book.path, + book.size, book.added, False]) + + self._iconview.draw_thumbnails_on_screen() + + def _new_book_added(self, book, collection): + """ Callback function for L{LibraryBackend.book_added}. """ + if collection is None: + collection = _COLLECTION_ALL + + if (collection == self._library.collection_area.get_current_collection() or + self._library.collection_area.get_current_collection() == _COLLECTION_ALL): + # Make sure not to show a book twice when COLLECTION_ALL is selected + # and the book is added to another collection, triggering this event. + if self.is_book_displayed(book): + return + + # If the current view is filtered, only draw new books that match the filter + if not (self._library.filter_string and + self._library.filter_string.lower() not in book.name.lower()): + self.add_books([book]) + + def is_book_displayed(self, book): + """ Returns True when the current view contains the book passed. + @param book: L{_Book} instance. """ + if not book: + return False + + for row in self._liststore: + if row[1] == book.id: + return True + + return False + + def remove_book_at_path(self, path): + """Remove the book at from the ListStore (and thus from + the _BookArea). + """ + iterator = self._liststore.get_iter(path) + filepath = self._liststore.get_value(iterator, 2) + self._liststore.remove(iterator) + self._cache.invalidate(filepath) + + def get_book_at_path(self, path): + """Return the book ID corresponding to the IconView .""" + iterator = self._liststore.get_iter(path) + return self._liststore.get_value(iterator, 1) + + def get_book_path(self, book): + """Return the to the book from the ListStore. + """ + return self._liststore.get_iter(book) + + def open_selected_book(self, *args): + """Open the currently selected book.""" + selected = self._iconview.get_selected_items() + if not selected: + return + self._book_activated(self._iconview, selected, False) + + def open_selected_book_noclose(self, *args): + """Open the currently selected book, keeping the library open.""" + selected = self._iconview.get_selected_items() + if not selected: + return + self._book_activated(self._iconview, selected, True) + + def set_sort_order(self): + """ Orders the list store based on the key passed in C{sort_key}. + Should be one of the C{SORT_} constants from L{constants}. + """ + if prefs['lib sort order'] == constants.SORT_ASCENDING: + sortorder = Gtk.SortType.ASCENDING + else: + sortorder = Gtk.SortType.DESCENDING + + self._liststore.set_sort_column_id(prefs['lib sort key'], sortorder) + + def _sort_changed(self, old, current): + """ Called whenever the sorting options changed. """ + name = current.get_name() + if name == 'by name': + prefs['lib sort key'] = constants.SORT_NAME + elif name == 'by path': + prefs['lib sort key'] = constants.SORT_PATH + elif name == 'by size': + prefs['lib sort key'] = constants.SORT_SIZE + elif name == 'by date added': + prefs['lib sort key'] = constants.SORT_LAST_MODIFIED + + if name == 'ascending': + prefs['lib sort order'] = constants.SORT_ASCENDING + elif name == 'descending': + prefs['lib sort order'] = constants.SORT_DESCENDING + + self.set_sort_order() + + def _sort_by_name(self, treemodel, iter1, iter2, user_data): + """ Compares two books based on their file name without the + path component. """ + path1 = self._liststore.get_value(iter1, 2) + path2 = self._liststore.get_value(iter2, 2) + + # Catch None values from liststore + if path1 is None: + return 1 + elif path2 is None: + return -1 + + name1 = os.path.split(path1.decode('utf-8'))[1].lower() + name2 = os.path.split(path2.decode('utf-8'))[1].lower() + + return tools.alphanumeric_compare(name1, name2) + + def _sort_by_path(self, treemodel, iter1, iter2, user_data): + """ Compares two books based on their full path, in natural order. """ + path1 = self._liststore.get_value(iter1, 2) + path2 = self._liststore.get_value(iter2, 2) + return tools.alphanumeric_compare(path1, path2) + + def _icon_added(self, model, path, iter, *args): + """ Justifies the alignment of all cell renderers when new data is + added to the model. """ + width, height = self._pixbuf_size() + for cell in self._iconview.get_cells(): + cell.set_fixed_size(width, height) + cell.set_alignment(0.5, 0.5) + + def _book_size_changed(self, old, current): + """ Called when library cover size changes. """ + old_size = prefs['library cover size'] + name = current.get_name() + if name == 'huge': + prefs['library cover size'] = constants.SIZE_HUGE + elif name == 'large': + prefs['library cover size'] = constants.SIZE_LARGE + elif name == 'normal': + prefs['library cover size'] = constants.SIZE_NORMAL + elif name == 'small': + prefs['library cover size'] = constants.SIZE_SMALL + elif name == 'tiny': + prefs['library cover size'] = constants.SIZE_TINY + elif name == 'custom': + dialog = message_dialog.MessageDialog(self._library, Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.OK) + dialog.set_auto_destroy(False) + dialog.set_text(_('Set library cover size')) + + # Add adjustment scale + adjustment = Gtk.Adjustment(prefs['library cover size'], 20, + constants.MAX_LIBRARY_COVER_SIZE, 10, 25, 0) + cover_size_scale = Gtk.HScale(adjustment) + cover_size_scale.set_size_request(200, -1) + cover_size_scale.set_digits(0) + cover_size_scale.set_draw_value(True) + cover_size_scale.set_value_pos(Gtk.PositionType.LEFT) + for mark in (constants.SIZE_HUGE, constants.SIZE_LARGE, + constants.SIZE_NORMAL, constants.SIZE_SMALL, + constants.SIZE_TINY): + cover_size_scale.add_mark(mark, Gtk.PositionType.TOP, None) + + dialog.get_message_area().pack_end(cover_size_scale, True, True, 0) + response = dialog.run() + size = int(adjustment.get_value()) + dialog.destroy() + + if response == Gtk.ResponseType.OK: + prefs['library cover size'] = size + + if prefs['library cover size'] != old_size: + self._cache.invalidate_all() + collection = self._library.collection_area.get_current_collection() + GObject.idle_add(self.display_covers, collection) + + def _pixbuf_size(self, border_size=_BORDER_SIZE): + # Don't forget the extra pixels for the border! + # The ratio (0.67) is just above the normal aspect ratio for books. + return (int(0.67 * prefs['library cover size']) + 2 * border_size, + prefs['library cover size'] + 2 * border_size) + + def _get_pixbuf(self, uid): + """ Get or create the thumbnail for the selected book . """ + assert isinstance(uid, int) + book = self._library.backend.get_book_by_id(uid) + if self._cache.exists(book.path): + pixbuf = self._cache.get(book.path) + else: + width, height = self._pixbuf_size(border_size=0) + try: + pixbuf = self._library.backend.get_book_thumbnail(book.path) or image_tools.MISSING_IMAGE_ICON + except: + pixbuf = image_tools.MISSING_IMAGE_ICON + pixbuf = image_tools.fit_in_rectangle(pixbuf, width, height, scale_up=True) + pixbuf = image_tools.add_border(pixbuf, 1, 0xFFFFFFFF) + self._cache.add(book.path, pixbuf) + + # Display indicator of having finished reading the book. + # This information isn't cached in the pixbuf cache, as it changes frequently. + + # Anything smaller than 50px means that the status icon will not fit + if prefs['library cover size'] < 50: + return pixbuf + + last_read_page = book.get_last_read_page() + if last_read_page is None or last_read_page != book.pages: + return pixbuf + + # Composite icon on the lower right corner of the book cover pixbuf. + book_pixbuf = self.render_icon(Gtk.STOCK_APPLY, Gtk.IconSize.LARGE_TOOLBAR) + translation_x = pixbuf.get_width() - book_pixbuf.get_width() - 1 + translation_y = pixbuf.get_height() - book_pixbuf.get_height() - 1 + book_pixbuf.composite(pixbuf, translation_x, translation_y, + book_pixbuf.get_width(), book_pixbuf.get_height(), + translation_x, translation_y, + 1.0, 1.0, GdkPixbuf.InterpType.NEAREST, 0xFF) + + return pixbuf + + def _get_empty_thumbnail(self): + """ Create an empty filler pixmap. """ + width, height = self._pixbuf_size() + pixbuf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=True, + bits_per_sample=8, + width=width, height=height) + + # Make the pixbuf transparent. + pixbuf.fill(0) + + return pixbuf + + def _book_activated(self, iconview, paths, keep_library_open=False): + """Open the book at the (liststore) .""" + if not isinstance(paths, list): + paths = [ paths ] + + if not keep_library_open: + # Necessary to prevent a deadlock at exit when trying to "join" the + # worker thread. + self.stop_update() + books = [ self.get_book_at_path(path) for path in paths ] + self._library.open_book(books, keep_library_open=keep_library_open) + + def _selection_changed(self, iconview): + """Update the displayed info in the _ControlArea when a new book + is selected. + """ + selected = iconview.get_selected_items() + self._library.control_area.update_info(selected) + + def _remove_books_from_collection(self, *args): + """Remove the currently selected books from the current collection, + and thus also from the _BookArea. + """ + collection = self._library.collection_area.get_current_collection() + if collection == _COLLECTION_ALL: + return + selected = self._iconview.get_selected_items() + self._library.backend.begin_transaction() + for path in selected: + book = self.get_book_at_path(path) + self._library.backend.remove_book_from_collection(book, collection) + self.remove_book_at_path(path) + self._library.backend.end_transaction() + + coll_name = self._library.backend.get_collection_name(collection) + message = i18n.get_translation().ngettext( + "Removed %(num)d book from '%(collection)s'.", + "Removed %(num)d books from '%(collection)s'.", + len(selected)) + self._library.set_status_message( + message % {'num': len(selected), 'collection': coll_name}) + + def _remove_books_from_library(self, *args): + """Remove the currently selected books from the library, and thus + also from the _BookArea. + """ + + selected = self._iconview.get_selected_items() + self._library.backend.begin_transaction() + + for path in selected: + book = self.get_book_at_path(path) + self._library.backend.remove_book(book) + self.remove_book_at_path(path) + + self._library.backend.end_transaction() + + msg = i18n.get_translation().ngettext( + 'Removed %d book from the library.', + 'Removed %d books from the library.', + len(selected)) + self._library.set_status_message(msg % len(selected)) + + def _completely_remove_book(self, request_response=True, *args): + """Remove the currently selected books from the library and the + hard drive. + """ + + if request_response: + + choice_dialog = message_dialog.MessageDialog(self._library, 0, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO) + choice_dialog.set_default_response(Gtk.ResponseType.YES) + choice_dialog.set_should_remember_choice('library-remove-book-from-disk', + (Gtk.ResponseType.YES,)) + choice_dialog.set_text( + _('Remove books from the library?'), + _('The selected books will be removed from the library and ' + 'permanently deleted. Are you sure that you want to continue?') + ) + response = choice_dialog.run() + + # if no request is needed or the user has told us they definitely want to delete the book + if not request_response or (request_response and response == Gtk.ResponseType.YES): + + # get the array of currently selected books in the book window + selected_books = self._iconview.get_selected_items() + book_ids = [ self.get_book_at_path(book) for book in selected_books ] + paths = [ self._library.backend.get_book_path(book_id) for book_id in book_ids ] + + # Remove books from library + self._remove_books_from_library() + + # Remove from the harddisk + for book_path in paths: + try: + # try to delete the book. + # this can throw an exception if the path points to folder instead + # of a single file + os.remove(book_path) + except Exception: + log.error(_('! Could not remove file "%s"'), book_path) + + def _copy_selected(self, *args): + """ Copies the currently selected item to clipboard. """ + paths = self._iconview.get_selected_items() + if len(paths) == 1: + model = self._iconview.get_model() + iter = model.get_iter(paths[0]) + path = model.get_value(iter, 2).decode('utf-8') + pixbuf = model.get_value(iter, 0) + + self._library._window.clipboard.copy(path, pixbuf) + + def _button_press(self, iconview, event): + """Handle mouse button presses on the _BookArea.""" + path = iconview.get_path_at_pos(int(event.x), int(event.y)) + + if event.button == 3: + if path and not iconview.path_is_selected(path): + iconview.unselect_all() + iconview.select_path(path) + + self._popup_book_menu() + + def _popup_book_menu(self): + """ Shows the book panel popup menu. """ + + selected = self._iconview.get_selected_items() + books_selected = len(selected) > 0 + collection = self._library.collection_area.get_current_collection() + is_collection_all = collection == _COLLECTION_ALL + + for action in ('open', 'open keep library', 'remove from library', 'completely remove'): + self._set_sensitive(action, books_selected) + + self._set_sensitive('_title', False) + self._set_sensitive('add', collection is not None) + self._set_sensitive('remove from collection', books_selected and not is_collection_all) + self._set_sensitive('copy to clipboard', len(selected) == 1) + + menu = self._ui_manager.get_widget('/library books') + menu.popup(None, None, None, None, 3, Gtk.get_current_event_time()) + + def _set_sensitive(self, action, sensitive): + """ Enables the popup menu action based on . """ + + control = self._ui_manager.get_action('/library books/' + action) + control.set_sensitive(sensitive) + + def _key_press(self, iconview, event): + """Handle key presses on the _BookArea.""" + if event.keyval == Gdk.KEY_Delete: + self._remove_books_from_collection() + + def _popup_menu(self, iconview): + """ Called when the menu key is pressed to open the popup menu. """ + self._popup_book_menu() + return True + + def _drag_begin(self, iconview, context): + """Create a cursor image for drag-n-drop from the library. + + This method relies on implementation details regarding PIL's + drawing functions and default font to produce good looking results. + If those are changed in a future release of PIL, this method might + produce bad looking output (e.g. non-centered text). + + It's also used with connect_after() to overwrite the cursor + automatically created when using enable_model_drag_source(), so in + essence it's a hack, but at least it works. + """ + icon_path = iconview.get_cursor()[1] + num_books = len(iconview.get_selected_items()) + book = self.get_book_at_path(icon_path) + + cover = self._library.backend.get_book_cover(book) + if cover is None: + cover = image_tools.MISSING_IMAGE_ICON + + cover = cover.scale_simple(max(0, cover.get_width() // 2), + max(0, cover.get_height() // 2), prefs['scaling quality']) + cover = image_tools.add_border(cover, 1, 0xFFFFFFFF) + cover = image_tools.add_border(cover, 1) + + if num_books > 1: + cover_width = cover.get_width() + cover_height = cover.get_height() + pointer = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=True, bits_per_sample=8, + width=max(30, cover_width + 15), + height=max(30, cover_height + 10)) + pointer.fill(0x00000000) + cover.composite(pointer, 0, 0, cover_width, cover_height, 0, 0, + 1, 1, prefs['scaling quality'], 255) + im = Image.new('RGBA', (30, 30), 0x00000000) + draw = ImageDraw.Draw(im) + draw.polygon( + (8, 0, 20, 0, 28, 8, 28, 20, 20, 28, 8, 28, 0, 20, 0, 8), + fill=(0, 0, 0), outline=(0, 0, 0)) + draw.polygon( + (8, 1, 20, 1, 27, 8, 27, 20, 20, 27, 8, 27, 1, 20, 1, 8), + fill=(128, 0, 0), outline=(255, 255, 255)) + text = str(num_books) + draw.text((15 - (6 * len(text) // 2), 9), text, + fill=(255, 255, 255)) + circle = image_tools.pil_to_pixbuf(im) + circle.composite(pointer, max(0, cover_width - 15), + max(0, cover_height - 20), 30, 30, max(0, cover_width - 15), + max(0, cover_height - 20), 1, 1, prefs['scaling quality'], 255) + else: + pointer = cover + + Gtk.drag_set_icon_pixbuf(context, pointer, -5, -5) + + def _drag_data_get(self, iconview, context, selection, *args): + """Fill the SelectionData with (iconview) paths for the dragged books + formatted as a string with each path separated by a comma. + """ + paths = iconview.get_selected_items() + text = ','.join([str(path[0]) for path in paths]) + selection.set('text/plain', 8, text) + + def _drag_data_received(self, widget, context, x, y, data, *args): + """Handle drag-n-drop events ending on the book area (i.e. from + external apps like the file manager). + """ + uris = data.get_uris() + if not uris: + return + + uris = [ portability.normalize_uri(uri) for uri in uris ] + paths = [ urllib.request.url2pathname(uri).decode('utf-8') for uri in uris ] + + collection = self._library.collection_area.get_current_collection() + collection_name = self._library.backend.get_collection_name(collection) + self._library.add_books(paths, collection_name) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/collection_area.py mcomix-2.1.0/mcomix/library/collection_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/collection_area.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/collection_area.py 2022-12-17 12:42:37.000000000 +0000 @@ -0,0 +1,465 @@ +"""library_collection_area.py - Comic book library window that displays the collections.""" + +from xml.sax.saxutils import escape as xmlescape +from gi.repository import Gdk, GdkPixbuf, Gtk, GObject + +from mcomix.preferences import prefs +from mcomix import constants +from mcomix import i18n +from mcomix import status +from mcomix import file_chooser_library_dialog +from mcomix import message_dialog + +_dialog = None +# The "All books" collection is not a real collection stored in the library, +# but is represented by this ID in the library's TreeModels. +_COLLECTION_ALL = -1 +_COLLECTION_RECENT = -2 + +class _CollectionArea(Gtk.ScrolledWindow): + + """The _CollectionArea is the sidebar area in the library where + different collections are displayed in a tree. + """ + + def __init__(self, library): + super(_CollectionArea, self).__init__() + self._library = library + self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + + self._treestore = Gtk.TreeStore(str, int) # (Name, ID) of collections. + self._treeview = Gtk.TreeView(self._treestore) + self._treeview.connect('cursor_changed', self._collection_selected) + self._treeview.connect('drag_data_received', self._drag_data_received) + self._treeview.connect('drag_motion', self._drag_motion) + self._treeview.connect_after('drag_begin', self._drag_begin) + self._treeview.connect('button_press_event', self._button_press) + self._treeview.connect('key_press_event', self._key_press) + self._treeview.connect('popup_menu', self._popup_menu) + self._treeview.connect('row_activated', self._expand_or_collapse_row) + self._treeview.set_headers_visible(False) + self._treeview.set_rules_hint(True) + self._set_acceptable_drop(True) + self._treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, + [('collection', Gtk.TargetFlags.SAME_WIDGET, constants.LIBRARY_DRAG_COLLECTION_ID)], + Gdk.DragAction.MOVE) + + cellrenderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn(None, cellrenderer, markup=0) + self._treeview.append_column(column) + self.add(self._treeview) + + self._ui_manager = Gtk.UIManager() + self._tooltipstatus = status.TooltipStatusHelper(self._ui_manager, + self._library.get_status_bar()) + ui_description = """ + + + + + + + + + + + + + + + """ + self._ui_manager.add_ui_from_string(ui_description) + actiongroup = Gtk.ActionGroup('mcomix-library-collection-area') + actiongroup.add_actions([ + ('_title', None, _("Library collections"), None, None, + lambda *args: False), + ('add', Gtk.STOCK_ADD, _('_Add...'), None, + _('Add more books to the library.'), + lambda *args: file_chooser_library_dialog.open_library_filechooser_dialog(self._library)), + ('new', Gtk.STOCK_NEW, _('New'), None, + _('Add a new empty collection.'), + self.add_collection), + ('rename', Gtk.STOCK_EDIT, _('Re_name'), None, + _('Renames the selected collection.'), + self._rename_collection), + ('duplicate', Gtk.STOCK_COPY, _('_Duplicate'), None, + _('Creates a duplicate of the selected collection.'), + self._duplicate_collection), + ('cleanup', Gtk.STOCK_CLEAR, _('_Clean up'), None, + _('Removes no longer existant books from the collection.'), + self._clean_collection), + ('remove', Gtk.STOCK_REMOVE, _('_Remove'), None, + _('Deletes the selected collection.'), + self._remove_collection)]) + self._ui_manager.insert_action_group(actiongroup, 0) + + self.display_collections() + + def get_current_collection(self): + """Return the collection ID for the currently selected collection, + or None if no collection is selected. + """ + treepath, focuspath = self._treeview.get_cursor() + if treepath is not None: + return self._get_collection_at_path(treepath) + else: + return None + + def display_collections(self): + """Display the library collections by redrawing them from the + backend data. Should be called on startup or when the collections + hierarchy has been changed (e.g. after moving, adding, renaming). + Any row that was expanded before the call will have it's + corresponding new row also expanded after the call. + """ + + def _recursive_add(parent_iter, supercoll): + for coll in self._library.backend.get_collections_in_collection( + supercoll): + name = self._library.backend.get_collection_name(coll) + child_iter = self._treestore.append(parent_iter, + [xmlescape(name), coll]) + _recursive_add(child_iter, coll) + + def _expand_and_select(treestore, path, iterator): + collection = treestore.get_value(iterator, 1) + if collection == prefs['last library collection']: + # Reset to trigger update of book area. + prefs['last library collection'] = None + self._treeview.expand_to_path(path) + self._treeview.set_cursor(path) + elif collection in expanded_collections: + self._treeview.expand_to_path(path) + + def _expanded_rows_accumulator(treeview, path): + collection = self._get_collection_at_path(path) + expanded_collections.append(collection) + + expanded_collections = [] + self._treeview.map_expanded_rows(_expanded_rows_accumulator) + self._treestore.clear() + self._treestore.append(None, ['%s' % xmlescape(_('All books')), + _COLLECTION_ALL]) + _recursive_add(None, None) + self._treestore.foreach(_expand_and_select) + + def add_collection(self, *args): + """Add a new collection to the library, through a dialog.""" + add_dialog = message_dialog.MessageDialog(self._library, 0, Gtk.MessageType.INFO, + Gtk.ButtonsType.OK_CANCEL) + add_dialog.set_auto_destroy(False) + add_dialog.set_default_response(Gtk.ResponseType.OK) + add_dialog.set_text( + _('Add new collection?'), + _('Please enter a name for the new collection.') + ) + + box = Gtk.HBox() # To get nice line-ups with the padding. + add_dialog.vbox.pack_start(box, True, True, 0) + entry = Gtk.Entry() + entry.set_activates_default(True) + box.pack_start(entry, True, True, 6) + box.show_all() + + response = add_dialog.run() + name = entry.get_text() + add_dialog.destroy() + if response == Gtk.ResponseType.OK and name: + if self._library.backend.add_collection(name): + collection = self._library.backend.get_collection_by_name(name) + prefs['last library collection'] = collection.id + self._library.collection_area.display_collections() + else: + message = _("Could not add a new collection called '%s'.") % ( + name) + if (self._library.backend.get_collection_by_name(name) + is not None): + message = '%s %s' % (message, + _('A collection by that name already exists.')) + self._library.set_status_message(message) + + def clean_collection(self, collection): + """ Check all books in the collection, removing those that + no longer exist. If C{collection} is None, the whole library + will be cleaned. """ + + removed = self._library.backend.clean_collection(collection) + + msg = i18n.get_translation().ngettext( + 'Removed %d book from the library.', + 'Removed %d books from the library.', + removed) + self._library.set_status_message(msg % removed) + + if removed > 0: + collection = self._library.collection_area.get_current_collection() + GObject.idle_add(self._library.book_area.display_covers, collection) + + def _get_collection_at_path(self, path): + """Return the collection ID of the collection at the (TreeView) + . + """ + iterator = self._treestore.get_iter(path) + return self._treestore.get_value(iterator, 1) + + def _collection_selected(self, treeview): + """Change the viewed collection (in the _BookArea) to the + currently selected one in the sidebar, if it has been changed. + """ + collection = self.get_current_collection() + if (collection is None or + collection == prefs['last library collection']): + return + prefs['last library collection'] = collection + GObject.idle_add(self._library.book_area.display_covers, collection) + + def _clean_collection(self, *args): + """ Menu item hook to clean a collection. """ + + collection = self.get_current_collection() + + # The backend expects _COLLECTION_ALL to be passed as None + if collection == _COLLECTION_ALL: + collection = None + + self.clean_collection(collection) + + def _remove_collection(self, action=None): + """Remove the currently selected collection from the library.""" + collection = self.get_current_collection() + + if collection not in (_COLLECTION_ALL, _COLLECTION_RECENT): + self._library.backend.remove_collection(collection) + prefs['last library collection'] = _COLLECTION_ALL + self.display_collections() + + def _rename_collection(self, action): + """Rename the currently selected collection, using a dialog.""" + collection = self.get_current_collection() + try: + old_name = self._library.backend.get_collection_name(collection) + except Exception: + return + rename_dialog = message_dialog.MessageDialog(self._library, 0, + Gtk.MessageType.INFO, Gtk.ButtonsType.OK_CANCEL) + rename_dialog.set_auto_destroy(False) + rename_dialog.set_text( + _('Rename collection?'), + _('Please enter a new name for the selected collection.') + ) + rename_dialog.set_default_response(Gtk.ResponseType.OK) + + box = Gtk.HBox() # To get nice line-ups with the padding. + rename_dialog.vbox.pack_start(box, True, True, 0) + entry = Gtk.Entry() + entry.set_text(old_name) + entry.set_activates_default(True) + box.pack_start(entry, True, True, 6) + box.show_all() + + response = rename_dialog.run() + new_name = entry.get_text() + rename_dialog.destroy() + if response == Gtk.ResponseType.OK and new_name: + if self._library.backend.rename_collection(collection, new_name): + self.display_collections() + else: + message = _("Could not change the name to '%s'.") % new_name + if (self._library.backend.get_collection_by_name(new_name) + is not None): + message = '%s %s' % (message, + _('A collection by that name already exists.')) + self._library.set_status_message(message) + + def _duplicate_collection(self, action): + """Duplicate the currently selected collection.""" + collection = self.get_current_collection() + if self._library.backend.duplicate_collection(collection): + self.display_collections() + else: + self._library.set_status_message( + _('Could not duplicate collection.')) + + def _button_press(self, treeview, event): + """Handle mouse button presses on the _CollectionArea.""" + + if event.button == 3: + row = treeview.get_path_at_pos(int(event.x), int(event.y)) + if row: + path, column, x, y = row + collection = self._get_collection_at_path(path) + else: + collection = None + + self._popup_collection_menu(collection) + + def _popup_menu(self, treeview): + """ Called to open the control's popup menu via + keyboard controls. """ + + model, iter = treeview.get_selection().get_selected() + if iter is not None: + book_path = model.get_path(iter)[0] + collection = self._get_collection_at_path(book_path) + else: + collection = None + + self._popup_collection_menu(collection) + return True + + def _popup_collection_menu(self, collection): + """ Show the library collection popup. Depending on the + value of C{collection}, menu items will be disabled or enabled. """ + + is_collection_all = collection in (_COLLECTION_ALL, _COLLECTION_RECENT) + + for path in ('rename', 'duplicate', 'remove'): + control = self._ui_manager.get_action( + '/library collections/' + path) + control.set_sensitive(collection is not None and + not is_collection_all) + + self._ui_manager.get_action('/library collections/add').set_sensitive(collection is not None) + self._ui_manager.get_action('/library collections/cleanup').set_sensitive(collection is not None) + self._ui_manager.get_action('/library collections/_title').set_sensitive(False) + + menu = self._ui_manager.get_widget('/library collections') + menu.popup(None, None, None, None, 3, Gtk.get_current_event_time()) + + def _key_press(self, treeview, event): + """Handle key presses on the _CollectionArea.""" + if event.keyval == Gdk.KEY_Delete: + self._remove_collection() + + def _expand_or_collapse_row(self, treeview, path, column): + """Expand or collapse the activated row.""" + if treeview.row_expanded(path): + treeview.collapse_row(path) + else: + treeview.expand_to_path(path) + + def _drag_data_received(self, treeview, context, x, y, selection, drag_id, + eventtime): + """Move books dragged from the _BookArea to the target collection, + or move some collection into another collection. + """ + self._library.set_status_message('') + drop_row = treeview.get_dest_row_at_pos(x, y) + if drop_row is None: # Drop "after" the last row. + dest_path, pos = ((len(self._treestore) - 1,), + Gtk.TreeViewDropPosition.AFTER) + else: + dest_path, pos = drop_row + src_collection = self.get_current_collection() + dest_collection = self._get_collection_at_path(dest_path) + if drag_id == constants.LIBRARY_DRAG_COLLECTION_ID: + if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): + dest_collection = self._library.backend.get_supercollection( + dest_collection) + self._library.backend.add_collection_to_collection( + src_collection, dest_collection) + self.display_collections() + elif drag_id == constants.LIBRARY_DRAG_BOOK_ID: + for path_str in selection.get_text().split(','): # IconView path + book = self._library.book_area.get_book_at_path(int(path_str)) + self._library.backend.add_book_to_collection(book, + dest_collection) + if src_collection != _COLLECTION_ALL: + self._library.backend.remove_book_from_collection(book, + src_collection) + self._library.book_area.remove_book_at_path(int(path_str)) + + def _drag_motion(self, treeview, context, x, y, *args): + """Set the library statusbar text when hovering a drag-n-drop over + a collection (either books or from the collection area itself). + Also set the TreeView to accept drops only when we are hovering over + a valid drop position for the current drop type. + + This isn't pretty, but the details of treeviews and drag-n-drops + are not pretty to begin with. + """ + drop_row = treeview.get_dest_row_at_pos(x, y) + src_collection = self.get_current_collection() + # Why isn't the drag ID passed along with drag-motion events? + if Gtk.drag_get_source_widget(context) is self._treeview: # Moving collection. + model, src_iter = treeview.get_selection().get_selected() + if drop_row is None: # Drop "after" the last row. + dest_path, pos = (len(model) - 1,), Gtk.TreeViewDropPosition.AFTER + else: + dest_path, pos = drop_row + dest_iter = model.get_iter(dest_path) + if model.is_ancestor(src_iter, dest_iter): # No cycles! + self._set_acceptable_drop(False) + self._library.set_status_message('') + return + dest_collection = self._get_collection_at_path(dest_path) + if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): + dest_collection = self._library.backend.get_supercollection( + dest_collection) + if (_COLLECTION_ALL in (src_collection, dest_collection) or + _COLLECTION_RECENT in (src_collection, dest_collection) or + src_collection == dest_collection): + self._set_acceptable_drop(False) + self._library.set_status_message('') + return + src_name = self._library.backend.get_collection_name( + src_collection) + if dest_collection is None: + dest_name = _('Root') + else: + dest_name = self._library.backend.get_collection_name( + dest_collection) + message = (_("Put the collection '%(subcollection)s' in the collection '%(supercollection)s'.") % + {'subcollection': src_name, 'supercollection': dest_name}) + else: # Moving book(s). + if drop_row is None: + self._set_acceptable_drop(False) + self._library.set_status_message('') + return + dest_path, pos = drop_row + if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): + self._set_acceptable_drop(False) + self._library.set_status_message('') + return + dest_collection = self._get_collection_at_path(dest_path) + if (src_collection == dest_collection or + dest_collection == _COLLECTION_ALL): + self._set_acceptable_drop(False) + self._library.set_status_message('') + return + dest_name = self._library.backend.get_collection_name( + dest_collection) + if src_collection == _COLLECTION_ALL: + message = _("Add books to '%s'.") % dest_name + else: + src_name = self._library.backend.get_collection_name( + src_collection) + message = (_("Move books from '%(source collection)s' to '%(destination collection)s'.") % + {'source collection': src_name, + 'destination collection': dest_name}) + self._set_acceptable_drop(True) + self._library.set_status_message(message) + + def _set_acceptable_drop(self, acceptable): + """Set the TreeView to accept drops if is True.""" + if acceptable: + self._treeview.enable_model_drag_dest( + [('book', Gtk.TargetFlags.SAME_APP, constants.LIBRARY_DRAG_BOOK_ID), + ('collection', Gtk.TargetFlags.SAME_WIDGET, constants.LIBRARY_DRAG_COLLECTION_ID)], + Gdk.DragAction.MOVE) + else: + self._treeview.enable_model_drag_dest([], Gdk.DragAction.MOVE) + + def _drag_begin(self, treeview, context): + """Create a cursor image for drag-n-drop of collections. We use the + default one (i.e. the row with text), but put the hotspot in the + top left corner so that one can actually see where one is dropping, + which unfortunately isn't the default case. + """ + path = treeview.get_cursor()[0] + surface = treeview.create_row_drag_icon(path) + width, height = surface.get_width(), surface.get_height() + pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) + Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/control_area.py mcomix-2.1.0/mcomix/library/control_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/control_area.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/control_area.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,171 @@ +"""library_control_area.py - The window in the library that contains buttons +and displays info.""" + +import os +from gi.repository import Gtk +from gi.repository import GObject +from gi.repository import Pango + +from mcomix import i18n +from mcomix import labels +from mcomix.library.watchlist import WatchListDialog + +# The "All books" collection is not a real collection stored in the library, +# but is represented by this ID in the library's TreeModels. +_COLLECTION_ALL = -1 + + +class _ControlArea(Gtk.HBox): + + """The _ControlArea is the bottom area of the library window where + information is displayed and controls such as buttons reside. + """ + + def __init__(self, library): + super(_ControlArea, self).__init__(False, 12) + + self._library = library + self.set_border_width(10) + + borderbox = Gtk.Frame() + borderbox.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + borderbox.set_size_request(350, -1) + + insidebox = Gtk.EventBox() + insidebox.set_border_width(1) + insidebox.set_state(Gtk.StateType.ACTIVE) + + infobox = Gtk.VBox(False, 5) + infobox.set_border_width(10) + self.pack_start(borderbox, True, True, 0) + borderbox.add(insidebox) + insidebox.add(infobox) + + self._namelabel = labels.BoldLabel() + self._namelabel.set_alignment(0, 0.5) + self._namelabel.set_selectable(True) + self._namelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + infobox.pack_start(self._namelabel, False, False, 0) + + self._filelabel = Gtk.Label() + self._filelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + self._filelabel.set_alignment(0, 0.5) + infobox.pack_start(self._filelabel, False, False, 0) + + self._dirlabel = Gtk.Label() + self._dirlabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) + self._dirlabel.set_alignment(0, 0.5) + self._dirlabel.set_selectable(True) + infobox.pack_start(self._dirlabel, False, False, 0) + + vbox = Gtk.VBox(False, 10) + vbox.set_size_request(350, -1) + self.pack_start(vbox, False, False, 0) + + # First line of controls, containing the search box + hbox = Gtk.HBox(False) + vbox.pack_start(hbox, True, True, 0) + + label = Gtk.Label(label=_('_Search:')) + label.set_use_underline(True) + hbox.pack_start(label, False, False, 0) + search_entry = Gtk.Entry() + search_entry.connect('activate', self._filter_books) + search_entry.set_tooltip_text( + _('Display only those books that have the specified text string ' + 'in their full path. The search is not case sensitive.')) + hbox.pack_start(search_entry, True, True, 6) + label.set_mnemonic_widget(search_entry) + + # Last line of controls, containing buttons like 'Open' + hbox = Gtk.HBox(False, 10) + vbox.pack_end(hbox, True, True, 0) + + watchlist_button = Gtk.Button(label=_("_Watch list"), use_underline=True) + watchlist_button.set_always_show_image(True) + watchlist_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.BUTTON)) + watchlist_button.set_image_position(Gtk.PositionType.LEFT) + watchlist_button.connect('clicked', + lambda *args: WatchListDialog(self._library)) + watchlist_button.set_tooltip_text( + _('Open the watchlist management dialog.')) + hbox.pack_start(watchlist_button, True, True, 0) + + self._open_button = Gtk.Button(label=_("_Open list"), use_underline=True) + self._open_button.set_always_show_image(True) + self._open_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON)) + self._open_button.set_image_position(Gtk.PositionType.LEFT) + self._open_button.connect('clicked', + self._library.book_area.open_selected_book) + self._open_button.set_tooltip_text(_('Open the selected book.')) + self._open_button.set_sensitive(False) + hbox.pack_end(self._open_button, True, True, 0) + + def update_info(self, selected): + """Update the info box using the currently books from + the _BookArea. + """ + + if selected: + book_id = self._library.book_area.get_book_at_path(selected[0]) + book = self._library.backend.get_book_by_id(book_id) + else: + book = None + + if book: + name = book.name + dir_path = os.path.dirname(book.path) + pages = book.pages + size = book.size + last_page = book.get_last_read_page() + last_date = book.get_last_read_date() + else: + name = dir_path = pages = size = last_page = last_date = None + + if len(selected) > 0: + self._open_button.set_sensitive(True) + else: + self._open_button.set_sensitive(False) + + if name is not None: + self._namelabel.set_text(i18n.to_unicode(name)) + self._namelabel.set_tooltip_text(i18n.to_unicode(name)) + else: + self._namelabel.set_text('') + self._namelabel.set_has_tooltip(False) + + infotext = [] + + if last_page is not None and pages is not None and last_page != pages: + infotext.append('%s %d/%d' % (_('Page'), last_page, pages)) + elif pages is not None: + infotext.append(_('%d pages') % pages) + + if size is not None: + infotext.append('%.1f MiB' % (size / 1048576.0)) + + if (pages is not None and last_page is not None and + last_date is not None and last_page == pages): + infotext.append(_('Finished reading on %(date)s, %(time)s') % { + 'date': last_date.strftime('%x'), + 'time': last_date.strftime('%X') }) + + self._filelabel.set_text(', '.join(infotext)) + + if dir_path is not None: + self._dirlabel.set_text(i18n.to_unicode(dir_path)) + else: + self._dirlabel.set_text('') + + def _filter_books(self, entry, *args): + """Display only the books in the current collection whose paths + contain the string in the Gtk.Entry. The string is not + case-sensitive. + """ + self._library.filter_string = entry.get_text() + if not self._library.filter_string: + self._library.filter_string = None + collection = self._library.collection_area.get_current_collection() + GObject.idle_add(self._library.book_area.display_covers, collection) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/main_dialog.py mcomix-2.1.0/mcomix/library/main_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/main_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/main_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,193 @@ +"""library_main_dialog.py - The library dialog window.""" + +import os +from gi.repository import Gdk, Gtk + +from mcomix.preferences import prefs +from mcomix import i18n +from mcomix import tools +from mcomix import log +from mcomix import file_chooser_library_dialog +from mcomix import status +from mcomix.library import backend as library_backend +from mcomix.library import book_area as library_book_area +from mcomix.library import collection_area as library_collection_area +from mcomix.library import control_area as library_control_area +from mcomix.library import add_progress_dialog as library_add_progress_dialog + +_dialog = None +# The "All books" collection is not a real collection stored in the library, +# but is represented by this ID in the library's TreeModels. +_COLLECTION_ALL = -1 + +class _LibraryDialog(Gtk.Window): + + """The library window. Automatically creates and uses a new + library_backend.LibraryBackend when opened. + """ + + def __init__(self, window, file_handler): + super(_LibraryDialog, self).__init__(Gtk.WindowType.TOPLEVEL) + + self._window = window + + self.resize(prefs['lib window width'], prefs['lib window height']) + self.set_title(_('Library')) + self.connect('delete_event', self.close) + self.connect('key-press-event', self._key_press_event) + + self.filter_string = None + self._file_handler = file_handler + self._statusbar = Gtk.Statusbar() + self.backend = library_backend.LibraryBackend() + self.book_area = library_book_area._BookArea(self) + self.control_area = library_control_area._ControlArea(self) + self.collection_area = library_collection_area._CollectionArea(self) + + self.backend.watchlist.new_files_found += self._new_files_found + + table = Gtk.Table(2, 2, False) + table.attach(self.collection_area, 0, 1, 0, 1, Gtk.AttachOptions.FILL, + Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL) + table.attach(self.book_area, 1, 2, 0, 1, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, + Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL) + table.attach(self.control_area, 0, 2, 1, 2, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, + Gtk.AttachOptions.FILL) + + if prefs['show statusbar']: + table.attach(self._statusbar, 0, 2, 2, 3, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL) + + self.add(table) + self.show_all() + self.present() + + def open_book(self, books, keep_library_open=False): + """Open the book with ID .""" + + paths = [ self.backend.get_book_path(book) for book in books ] + + if not keep_library_open: + self.hide() + + self._window.present() + + if len(paths) > 1: + self._file_handler.open_file(paths) + elif len(paths) == 1: + self._file_handler.open_file(paths[0]) + + def scan_for_new_files(self): + """ Start scanning for new files from the watch list. """ + + if len(self.backend.watchlist.get_watchlist()) > 0: + self.set_status_message(_("Scanning for new books...")) + self.backend.watchlist.scan_for_new_files() + + def _new_files_found(self, filelist, watchentry): + """ Called after the scan for new files finished. """ + + if len(filelist) > 0: + if watchentry.collection.id is not None: + collection_name = watchentry.collection.name + else: + collection_name = None + + self.add_books(filelist, collection_name) + + if len(filelist) == 1: + message = _("Added new book '%(bookname)s' " + "from directory '%(directory)s'.") + else: + message = _("Added %(count)d new books " + "from directory '%(directory)s'.") + + self.set_status_message(message % {'directory': watchentry.directory, + 'count': len(filelist), 'bookname': os.path.basename(filelist[0])}) + else: + self.set_status_message( + _("No new books found in directory '%s'.") % watchentry.directory) + + def get_status_bar(self): + """ Returns the window's status bar. """ + return self._statusbar + + def set_status_message(self, message): + """Set a specific message on the statusbar, replacing whatever was + there earlier. + """ + self._statusbar.pop(0) + self._statusbar.push(0, + ' ' * status.Statusbar.SPACING + '%s' % i18n.to_unicode(message)) + + def close(self, *args): + """Close the library and do required cleanup tasks.""" + prefs['lib window width'], prefs['lib window height'] = self.get_size() + self.backend.watchlist.new_files_found -= self._new_files_found + self.book_area.stop_update() + self.book_area.close() + file_chooser_library_dialog.close_library_filechooser_dialog() + _close_dialog() + + def add_books(self, paths, collection_name=None): + """Add the books at to the library. If + is not None, it is the name of a (new or existing) collection the + books should be put in. + """ + if collection_name is None: + collection_id = self.collection_area.get_current_collection() + else: + collection = self.backend.get_collection_by_name(collection_name) + + if collection is None: # Collection by that name doesn't exist. + self.backend.add_collection(collection_name) + collection = self.backend.get_collection_by_name( + collection_name) + + collection_id = collection.id + + library_add_progress_dialog._AddLibraryProgressDialog(self, self._window, paths, collection_id) + + if collection_id is not None: + prefs['last library collection'] = collection_id + + def _key_press_event(self, widget, event, *args): + """ Handle key press events for closing the library on Escape press. """ + + if event.keyval == Gdk.KEY_Escape: + self.hide() + + +def open_dialog(action, window): + """ Shows the library window. If sqlite is not available, this method + does nothing and returns False. Otherwise, True is returned. """ + global _dialog + + if _dialog is None: + + if library_backend.dbapi2 is None: + text = _('! You need an sqlite wrapper to use the library.') + window.osd.show(text) + log.error(text) + return False + + else: + _dialog = _LibraryDialog(window, window.filehandler) + + else: + _dialog.present() + + if prefs['scan for new books on library startup']: + _dialog.scan_for_new_files() + + return True + + +def _close_dialog(*args): + global _dialog + + if _dialog is not None: + _dialog.destroy() + _dialog = None + tools.garbage_collect() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/pixbuf_cache.py mcomix-2.1.0/mcomix/library/pixbuf_cache.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/pixbuf_cache.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/pixbuf_cache.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,74 @@ +""" pixbuf_cache.py - Caches book covers for the library display.""" +# -*- coding: utf-8 -*- + + +import threading + +__all__ = ["get_pixbuf_cache"] + +class _PixbufCache(object): + + """ Pixbuf cache for the library window. Instead of loading book covers + from disk again after switching collection or using filtering, this class + stores a pre-defined amount of pixbufs in memory, evicting older pixbufs + as necessary. + """ + + def __init__(self, size): + #: Cache size, in images + assert size > 0 + self.cachesize = size + #: Store book id => pixbuf + self._cache = {} + #: Ensure thread safety + self._lock = threading.RLock() + + def add(self, id, pixbuf): + """ Adds a cache object with and associates it with the + passed pixbuf. """ + + with self._lock: + if len(self._cache) > self.cachesize: + first = list(self._cache.items())[0] + self.invalidate(first[0]) + + self._cache[id] = pixbuf + + def exists(self, id): + """ Checks if there is an entry for the given id in the cache. """ + return id in self._cache + + def get(self, id): + """ Returns the pixbuf for the given cache id, or None, if such + an entry does not exist. """ + if id in self._cache: + return self._cache[id] + else: + return None + + def invalidate(self, id): + """ Invalidates the object with the specified cache ID. """ + with self._lock: + if id in self._cache: + del self._cache[id] + + def invalidate_all(self): + """ Invalidates all cached objects. """ + with self._lock: + self._cache.clear() + + +_cache = None + +def get_pixbuf_cache(): + global _cache + + if _cache: + return _cache + else: + # 500 items is about 130 MB of RAM with 500px thumbnails, + # and about 35 MB at 250px. + _cache = _PixbufCache(500) + return _cache + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/library/watchlist.py mcomix-2.1.0/mcomix/library/watchlist.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/library/watchlist.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/library/watchlist.py 2022-01-28 05:21:52.000000000 +0000 @@ -0,0 +1,236 @@ +""" Library watch list dialog and backend classes. """ + +import os +from gi.repository import Gtk +from gi.repository import GObject + +from mcomix.library import backend_types +from mcomix.preferences import prefs + + +COL_DIRECTORY = 0 +COL_COLLECTION = 0 +COL_COLLECTION_ID = 1 +COL_RECURSIVE = 2 + +class WatchListDialog(Gtk.Dialog): + """ Dialog for managing watched directories. """ + + RESPONSE_SCANNOW = 1000 + + def __init__(self, library): + """ Dialog constructor. + @param library: Dialog parent window, should be library window. + """ + super(WatchListDialog, self).__init__(_("Library watch list"), + library, Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, + (_('_Scan now'), WatchListDialog.RESPONSE_SCANNOW, + Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) + + #: Stores a reference to the library + self.library = library + #: True if changes were made to the watchlist. Not 100% accurate. + self._changed = False + + self.set_default_response(Gtk.ResponseType.CLOSE) + + # Initialize treeview control showing existing watch directories + self._treeview = Gtk.TreeView(self._create_model()) + self._treeview.set_headers_visible(True) + self._treeview.get_selection().connect('changed', self._item_selected_cb) + + dir_renderer = Gtk.CellRendererText() + dir_column = Gtk.TreeViewColumn(_("Directory"), dir_renderer) + dir_column.set_attributes(dir_renderer, text=COL_DIRECTORY) + dir_column.set_expand(True) + self._treeview.append_column(dir_column) + + collection_model = self._create_collection_model() + collection_renderer = Gtk.CellRendererCombo() + collection_renderer.set_property('model', collection_model) + collection_renderer.set_property('text-column', COL_COLLECTION) + collection_renderer.set_property('editable', True) + collection_renderer.set_property('has-entry', False) + collection_renderer.connect('changed', self._collection_changed_cb, collection_model) + collection_column = Gtk.TreeViewColumn(_("Collection"), collection_renderer) + collection_column.set_cell_data_func(collection_renderer, + self._treeview_collection_id_to_name) + self._treeview.append_column(collection_column) + + recursive_renderer = Gtk.CellRendererToggle() + recursive_renderer.set_activatable(True) + recursive_renderer.connect('toggled', self._recursive_changed_cb) + recursive_column = Gtk.TreeViewColumn(_("With subdirectories"), + recursive_renderer) + recursive_column.add_attribute(recursive_renderer, 'active', COL_RECURSIVE) + self._treeview.append_column(recursive_column) + + add_button = Gtk.Button(_("_Add"), Gtk.STOCK_ADD, use_underline=True) + add_button.connect('clicked', self._add_cb) + self._remove_button = remove_button = Gtk.Button(_("_Remove"), Gtk.STOCK_REMOVE, use_underline=True) + remove_button.set_sensitive(False) + remove_button.connect('clicked', self._remove_cb) + + button_box = Gtk.VBox() + button_box.pack_start(add_button, False, True, 0) + button_box.pack_start(remove_button, False, True, 2) + + main_box = Gtk.HBox() + scroll_window = Gtk.ScrolledWindow() + scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scroll_window.add(self._treeview) + main_box.pack_start(scroll_window, True, True, 2) + main_box.pack_end(button_box, False, True, 0) + self.vbox.pack_start(main_box, True, True, 0) + + auto_checkbox = Gtk.CheckButton( + _('Automatically scan for new books when library is _opened'), use_underline=True) + auto_checkbox.set_active(prefs['scan for new books on library startup']) + auto_checkbox.connect('toggled', self._auto_scan_toggled_cb) + self.vbox.pack_end(auto_checkbox, False, False, 5) + + self.resize(475, 350) + self.connect('response', self._close_cb) + self.show_all() + + def get_selected_watchlist_entry(self): + """ Returns the selected watchlist entry, or C{None} if no + item is selected. """ + selection = self._treeview.get_selection() + + model, iter = selection.get_selected() + if iter is not None: + path = str(model.get_value(iter, COL_DIRECTORY)) + return self.library.backend.watchlist.get_watchlist_entry(path) + else: + return None + + def get_watchlist_entry_for_treepath(self, treepath): + """ Converts a tree path to WatchlistEntry object. """ + model = self._treeview.get_model() + iter = model.get_iter(treepath) + dirpath = str(model.get_value(iter, COL_DIRECTORY)) + return self.library.backend.watchlist.get_watchlist_entry(dirpath) + + def _create_model(self): + """ Creates a model containing all watched directories. """ + # Watched directory, associated library collection ID + model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT, GObject.TYPE_BOOLEAN) + self._fill_model(model) + return model + + def _fill_model(self, model): + """ Empties the model's data and updates it from the database. """ + model.clear() + for entry in self.library.backend.watchlist.get_watchlist(): + if entry.collection.id is None: + id = -1 + else: + id = entry.collection.id + + model.append((entry.directory, id, entry.recursive)) + + def _create_collection_model(self): + """ Creates a model containing all available collections. """ + # Collection ID, collection name + model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT) + + ids = self.library.backend.get_all_collections() + model.append((backend_types.DefaultCollection.name, -1)) + for id in ids: + model.append((self.library.backend.get_collection_name(id), id)) + + return model + + def _collection_changed_cb(self, column, path, + collection_iter, collection_model, *args): + """ A new collection was set for a watched directory. """ + # Get new collection ID from collection model + new_id = collection_model.get_value(collection_iter, COL_COLLECTION_ID) + collection = self.library.backend.get_collection_by_id(new_id) + + # Update database + self.get_watchlist_entry_for_treepath(path).set_collection(collection) + + # Update collection ID in watchlist model + model = self._treeview.get_model() + iter = model.get_iter(path) + # Editing the model in the CellRendererCombo callback stops the editing + # operation, causing GTK warnings. Delay until callback is finished. + GObject.idle_add(model.set_value, iter, COL_COLLECTION_ID, new_id) + + self._changed = True + + def _recursive_changed_cb(self, toggle_renderer, path, *args): + """ Recursive reading was enabled or disabled. """ + status = not toggle_renderer.get_active() + self.get_watchlist_entry_for_treepath(path).set_recursive(status) + + # Update recursive status in watchlist model + model = self._treeview.get_model() + iter = model.get_iter(path) + model.set_value(iter, COL_RECURSIVE, status) + + self._changed = True + + def _add_cb(self, button, *args): + """ Called when a new watch list entry should be added. """ + filechooser = Gtk.FileChooserDialog(parent=self, + action=Gtk.FileChooserAction.SELECT_FOLDER, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, + Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) + result = filechooser.run() + if filechooser.get_filename() is not None: + directory = filechooser.get_filename() + else: + directory = "" + filechooser.destroy() + + if result == Gtk.ResponseType.ACCEPT \ + and os.path.isdir(directory): + + self.library.backend.watchlist.add_directory(directory) + self._fill_model(self._treeview.get_model()) + + self._changed = True + + def _remove_cb(self, button, *args): + """ Called when a watch list entry should be removed. """ + entry = self.get_selected_watchlist_entry() + if entry: + entry.remove() + + # Remove selection from list + selection = self._treeview.get_selection() + model, iter = selection.get_selected() + model.remove(iter) + + def _item_selected_cb(self, selection, *args): + """ Called when an item is selected. Enables or disables the "Remove" + button. """ + self._remove_button.set_sensitive(selection.count_selected_rows() > 0) + + def _auto_scan_toggled_cb(self, checkbox, *args): + """ Toggles automatic library book scanning. """ + prefs['scan for new books on library startup'] = checkbox.get_active() + + def _treeview_collection_id_to_name(self, column, cell, model, iter, *args): + """ Maps a collection ID to the corresponding collection name. """ + id = model.get_value(iter, COL_COLLECTION_ID) + if id != -1: + text = self.library.backend.get_collection_name(id) + else: + text = backend_types.DefaultCollection.name + + cell.set_property("text", text) + + def _close_cb(self, dialog, response, *args): + """ Trigger scan for new files after watch dialog closes. """ + self.destroy() + if response == Gtk.ResponseType.CLOSE and self._changed: + self.library.scan_for_new_files() + elif response == WatchListDialog.RESPONSE_SCANNOW: + self.library.scan_for_new_files() + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/log.py mcomix-2.1.0/mcomix/log.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/log.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/log.py 2022-12-17 11:34:07.000000000 +0000 @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" Logging module for MComix. Provides a logger 'mcomix' with a few +pre-configured settings. Functions in this module are redirected to +this default logger. """ + +import sys +import logging +from logging import DEBUG, INFO, WARNING, ERROR + + +__all__ = ['debug', 'info', 'warning', 'error', 'setLevel', + 'DEBUG', 'INFO', 'WARNING', 'ERROR'] + +# Set up default logger. +__logger = logging.getLogger('mcomix') +__logger.setLevel(WARNING) +if not __logger.handlers: + __handler = logging.StreamHandler(sys.stdout) + __handler.setFormatter(logging.Formatter( + '%(asctime)s [%(threadName)s] %(levelname)s: %(message)s', + '%H:%M:%S')) + __logger.handlers = [ __handler ] + +# The following functions direct all input to __logger. + +debug = __logger.debug +info = __logger.info +warning = __logger.warning +error = __logger.error +setLevel = __logger.setLevel + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/main.py mcomix-2.1.0/mcomix/main.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/main.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/main.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,1180 @@ +"""main.py - Main window.""" + +import sys +import math +import os +import shutil +import threading + +from gi.repository import GObject, Gdk, Gtk, GLib + +from mcomix import constants +from mcomix import cursor_handler +from mcomix import i18n +from mcomix import icons +from mcomix import enhance_backend +from mcomix import event +from mcomix import file_handler +from mcomix import image_handler +from mcomix import image_tools +from mcomix import lens +from mcomix import preferences +from mcomix.preferences import prefs +from mcomix import ui +from mcomix import slideshow +from mcomix import status +from mcomix import thumbbar +from mcomix import clipboard +from mcomix import pageselect +from mcomix import osd +from mcomix import keybindings +from mcomix import zoom +from mcomix import bookmark_backend +from mcomix import message_dialog +from mcomix import callback +from mcomix.library import backend, main_dialog +from mcomix import tools +from mcomix import box +from mcomix import layout +from mcomix import log + + +class MainWindow(Gtk.Window): + + """The main window, is created at start and terminates the + program when closed. + """ + + def __init__(self, fullscreen=False, is_slideshow=slideshow, + show_library=False, manga_mode=False, double_page=False, + zoom_mode=None, open_path=None, open_page=1): + super(MainWindow, self).__init__(Gtk.WindowType.TOPLEVEL) + + # ---------------------------------------------------------------- + # Attributes + # ---------------------------------------------------------------- + # Used to detect window fullscreen state transitions. + self.was_fullscreen = False + self.is_manga_mode = False + self.previous_size = (None, None) + self.was_out_of_focus = False + #: Used to remember if changing to fullscreen enabled 'Hide all' + self.hide_all_forced = False + # Remember last scroll destination. + self._last_scroll_destination = constants.SCROLL_TO_START + + self.layout = layout.create_dummy_layout() + self._spacing = prefs['space between two pages'] + self._waiting_for_redraw = False + + self._image_box = Gtk.HBox(False, 2) # XXX transitional(kept for osd.py) + self._main_layout = Gtk.Layout() + # Wrap main layout into an event box so + # we can change its background color. + self._event_box = Gtk.EventBox() + self._event_box.add(self._main_layout) + self._event_handler = event.EventHandler(self) + self._vadjust = self._main_layout.get_vadjustment() + self._hadjust = self._main_layout.get_hadjustment() + self._scroll = ( + Gtk.Scrollbar.new(Gtk.Orientation.HORIZONTAL, self._hadjust), + Gtk.Scrollbar.new(Gtk.Orientation.VERTICAL, self._vadjust), + ) + + self.filehandler = file_handler.FileHandler(self) + self.filehandler.file_closed += self._on_file_closed + self.filehandler.file_opened += self._on_file_opened + self.imagehandler = image_handler.ImageHandler(self) + self.imagehandler.page_available += self._page_available + self.thumbnailsidebar = thumbbar.ThumbnailSidebar(self) + + self.statusbar = status.Statusbar() + self.clipboard = clipboard.Clipboard(self) + self.slideshow = slideshow.Slideshow(self) + self.cursor_handler = cursor_handler.CursorHandler(self) + self.enhancer = enhance_backend.ImageEnhancer(self) + self.lens = lens.MagnifyingLens(self) + self.osd = osd.OnScreenDisplay(self) + self.zoom = zoom.ZoomModel() + self.uimanager = ui.MainUI(self) + self.menubar = self.uimanager.get_widget('/Menu') + self.toolbar = self.uimanager.get_widget('/Tool') + self.popup = self.uimanager.get_widget('/Popup') + self.actiongroup = self.uimanager.get_action_groups()[0] + + self.images = [Gtk.Image(), Gtk.Image()] # XXX limited to at most 2 pages + + # ---------------------------------------------------------------- + # Setup + # ---------------------------------------------------------------- + self.set_title(constants.APPNAME) + self.set_size_request(300, 300) # Avoid making the window *too* small + + # Hook up keyboard shortcuts + self._event_handler.register_key_events() + + # This is a hack to get the focus away from the toolbar so that + # we don't activate it with space or some other key (alternative?) + self.toolbar.set_focus_child( + self.uimanager.get_widget('/Tool/expander')) + self.toolbar.set_style(Gtk.ToolbarStyle.ICONS) + self.toolbar.set_icon_size(Gtk.IconSize.LARGE_TOOLBAR) + + for img in self.images: + self._main_layout.put(img, 0, 0) + self.set_bg_colour(prefs['bg colour']) + + self._vadjust.step_increment = 15 + self._vadjust.page_increment = 1 + self._hadjust.step_increment = 15 + self._hadjust.page_increment = 1 + + table = Gtk.Table(2, 2, False) + table.attach(self.thumbnailsidebar, 0, 1, 2, 5, Gtk.AttachOptions.FILL, + Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, 0, 0) + + table.attach(self._event_box, 1, 2, 2, 3, Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, + Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, 0, 0) + table.attach(self._scroll[constants.HEIGHT_AXIS], 2, 3, 2, 3, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, + Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, 0, 0) + table.attach(self._scroll[constants.WIDTH_AXIS], 1, 2, 4, 5, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, + Gtk.AttachOptions.FILL, 0, 0) + table.attach(self.menubar, 0, 3, 0, 1, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, + Gtk.AttachOptions.FILL, 0, 0) + table.attach(self.toolbar, 0, 3, 1, 2, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, + Gtk.AttachOptions.FILL, 0, 0) + table.attach(self.statusbar, 0, 3, 5, 6, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, + Gtk.AttachOptions.FILL, 0, 0) + + if prefs['default double page'] or double_page: + self.actiongroup.get_action('double_page').activate() + + if prefs['default manga mode'] or manga_mode: + self.actiongroup.get_action('manga_mode').activate() + + # Determine zoom mode. If zoom_mode is passed, it overrides + # the zoom mode preference. + zoom_actions = { constants.ZOOM_MODE_BEST : 'best_fit_mode', + constants.ZOOM_MODE_WIDTH : 'fit_width_mode', + constants.ZOOM_MODE_HEIGHT : 'fit_height_mode', + constants.ZOOM_MODE_SIZE : 'fit_size_mode', + constants.ZOOM_MODE_MANUAL : 'fit_manual_mode' } + + if zoom_mode is not None: + zoom_action = zoom_actions[zoom_mode] + else: + zoom_action = zoom_actions[prefs['zoom mode']] + + if zoom_action == 'fit_manual_mode': + # This little ugly hack is to get the activate call on + # 'fit_manual_mode' to actually create an event (and callback). + # Since manual mode is the default selected radio button action + # it won't send an event if we activate it when it is already + # the selected one. + self.actiongroup.get_action('best_fit_mode').activate() + + self.actiongroup.get_action(zoom_action).activate() + + if prefs['stretch']: + self.actiongroup.get_action('stretch').activate() + + if prefs['invert smart scroll']: + self.actiongroup.get_action('invert_scroll').activate() + + if prefs['keep transformation']: + prefs['keep transformation'] = False + self.actiongroup.get_action('keep_transformation').activate() + else: + prefs['rotation'] = 0 + prefs['vertical flip'] = False + prefs['horizontal flip'] = False + + # List of "toggles" than can be shown/hidden by the user. + self._toggle_list = ( + # Preference Action Widget(s) + ('show menubar' , 'menubar' , (self.menubar,) ), + ('show scrollbar' , 'scrollbar' , self._scroll ), + ('show statusbar' , 'statusbar' , (self.statusbar,) ), + ('show thumbnails', 'thumbnails', (self.thumbnailsidebar,)), + ('show toolbar' , 'toolbar' , (self.toolbar,) ), + ) + + # Each "toggle" widget "eats" part of the main layout visible area. + self._toggle_axis = { + self.thumbnailsidebar : constants.WIDTH_AXIS , + self._scroll[constants.HEIGHT_AXIS]: constants.WIDTH_AXIS , + self._scroll[constants.WIDTH_AXIS] : constants.HEIGHT_AXIS, + self.statusbar : constants.HEIGHT_AXIS, + self.toolbar : constants.HEIGHT_AXIS, + self.menubar : constants.HEIGHT_AXIS, + } + + # Start with all "toggle" widgets hidden to avoid ugly transitions. + for preference, action, widget_list in self._toggle_list: + for widget in widget_list: + widget.hide() + + toggleaction = self.actiongroup.get_action('hide_all') + toggleaction.set_active(prefs['hide all']) + + # Sync each "toggle" widget active state with its preference. + for preference, action, widget_list in self._toggle_list: + self.actiongroup.get_action(action).set_active(prefs[preference]) + + self.actiongroup.get_action('menu_autorotate_width').set_sensitive(False) + self.actiongroup.get_action('menu_autorotate_height').set_sensitive(False) + + self.add(table) + table.show() + self._event_box.show_all() + + self._main_layout.set_events(Gdk.EventMask.BUTTON1_MOTION_MASK | + Gdk.EventMask.BUTTON2_MOTION_MASK | + Gdk.EventMask.BUTTON_PRESS_MASK | + Gdk.EventMask.BUTTON_RELEASE_MASK | + Gdk.EventMask.POINTER_MOTION_MASK) + + self._main_layout.drag_dest_set(Gtk.DestDefaults.ALL, + [Gtk.TargetEntry.new('text/uri-list', 0, 0)], + Gdk.DragAction.COPY | + Gdk.DragAction.MOVE) + + self.connect('focus-in-event', self.gained_focus) + self.connect('focus-out-event', self.lost_focus) + self.connect('delete_event', self.close_program) + self.connect('key_press_event', self._event_handler.key_press_event) + self.connect('key_release_event', self._event_handler.key_release_event) + self.connect('configure_event', self._event_handler.resize_event) + self.connect('window-state-event', self._event_handler.window_state_event) + + self._main_layout.connect('button_release_event', + self._event_handler.mouse_release_event) + self._main_layout.connect('scroll_event', + self._event_handler.scroll_wheel_event) + self._main_layout.connect('button_press_event', + self._event_handler.mouse_press_event) + self._main_layout.connect('motion_notify_event', + self._event_handler.mouse_move_event) + self._main_layout.connect('drag_data_received', + self._event_handler.drag_n_drop_event) + + self.uimanager.set_sensitivities() + self.show() + self.restore_window_geometry() + + if prefs['default fullscreen'] or fullscreen: + toggleaction = self.actiongroup.get_action('fullscreen') + toggleaction.set_active(True) + + if prefs['previous quit was quit and save']: + fileinfo = self.filehandler.read_fileinfo_file() + + if fileinfo != None: + + open_path = fileinfo[0] + open_page = fileinfo[1] + 1 + + prefs['previous quit was quit and save'] = False + + if open_path is not None: + self.filehandler.open_file(open_path) + + if is_slideshow: + self.actiongroup.get_action('slideshow').activate() + + if show_library: + self.actiongroup.get_action('library').activate() + + self.cursor_handler.auto_hide_on() + # Make sure we receive *all* mouse motion events, + # even if a modal dialog is being shown. + def _on_event(event): + if Gdk.EventType.MOTION_NOTIFY == event.type: + self.cursor_handler.refresh() + Gtk.main_do_event(event) + Gdk.event_handler_set(_on_event) + + def gained_focus(self, *args): + def _delayed_unset_out_of_focus(_): + self.was_out_of_focus = False + return False + + if self.was_out_of_focus: + # Since clicking into an unfocused window triggers the + # focus event first, then the mouse event, the mouse event + # can no longer detect that it should be skipped. Thus, delay + # unsetting was_out_of_focus. + GLib.idle_add(_delayed_unset_out_of_focus, None, + priority=GLib.PRIORITY_DEFAULT_IDLE) + + def lost_focus(self, *args): + self.was_out_of_focus = True + + # If the user presses CTRL for a keyboard shortcut, e.g. to + # open the library, key_release_event isn't fired and force_single_step + # isn't properly unset. + self.imagehandler.force_single_step = False + + def draw_image(self, scroll_to=None): + """Draw the current pages and update the titlebar and statusbar. + """ + # FIXME: what if scroll_to is different? + if not self._waiting_for_redraw: # Don't stack up redraws. + self._waiting_for_redraw = True + GObject.idle_add(self._draw_image, scroll_to, + priority=GObject.PRIORITY_HIGH_IDLE) + + def _update_toggle_preference(self, preference, toggleaction): + ''' Update "toggle" widget corresponding . + + Note: the widget visibily itself is left unchanged. ''' + prefs[preference] = toggleaction.get_active() + if 'hide all' == preference: + self._update_toggles_sensitivity() + # Since the size of the drawing area is dependent + # on the visible "toggles", redraw the page. + self.draw_image() + + def _should_toggle_be_visible(self, preference): + ''' Return if "toggle" widget for should be visible. ''' + if self.is_fullscreen: + visible = not prefs['hide all in fullscreen'] + else: + visible = not prefs['hide all'] + visible &= prefs[preference] + if 'show thumbnails' == preference: + visible &= self.filehandler.file_loaded + visible &= self.imagehandler.get_number_of_pages() > 0 + return visible + + def _update_toggles_sensitivity(self): + ''' Update each "toggle" widget sensitivity. ''' + sensitive = True + if prefs['hide all']: + sensitive = False + elif prefs['hide all in fullscreen'] and self.is_fullscreen: + sensitive = False + for preference, action, widget_list in self._toggle_list: + self.actiongroup.get_action(action).set_sensitive(sensitive) + + def _update_toggles_visibility(self): + ''' Update each "toggle" widget visibility. ''' + for preference, action, widget_list in self._toggle_list: + should_be_visible = self._should_toggle_be_visible(preference) + for widget in widget_list: + # No change in visibility? + if should_be_visible != widget.get_visible(): + (widget.show if should_be_visible else widget.hide)() + + def _draw_image(self, scroll_to): + + self._update_toggles_visibility() + + self.osd.clear() + + if not self.filehandler.file_loaded: + self._clear_main_area() + self._waiting_for_redraw = False + return False + + if self.imagehandler.page_is_available(): + distribution_axis = constants.DISTRIBUTION_AXIS + alignment_axis = constants.ALIGNMENT_AXIS + pixbuf_count = 2 if self.displayed_double() else 1 # XXX limited to at most 2 pages + pixbuf_list = list(self.imagehandler.get_pixbufs(pixbuf_count)) + do_not_transform = [image_tools.is_animation(x) for x in pixbuf_list] + size_list = [[pixbuf.get_width(), pixbuf.get_height()] + for pixbuf in pixbuf_list] + + if self.is_manga_mode: + orientation = constants.MANGA_ORIENTATION + else: + orientation = constants.WESTERN_ORIENTATION + + # Rotation handling: + # - apply Exif rotation on individual images + # - apply automatic rotation (size based) on whole page + # - apply manual rotation on whole page + if prefs['auto rotate from exif']: + rotation_list = [image_tools.get_implied_rotation(pixbuf) + for pixbuf in pixbuf_list] + else: + rotation_list = [0] * len(pixbuf_list) + virtual_size = [0, 0] + for i in range(pixbuf_count): + if rotation_list[i] in (90, 270): + size_list[i].reverse() + size = size_list[i] + virtual_size[distribution_axis] += size[distribution_axis] + virtual_size[alignment_axis] = max(virtual_size[alignment_axis], + size[alignment_axis]) + rotation = image_tools.get_size_rotation(*virtual_size) + rotation = (rotation + prefs['rotation']) % 360 + if rotation in (90, 270): + distribution_axis, alignment_axis = alignment_axis, distribution_axis + orientation = list(orientation) + orientation.reverse() + for i in range(pixbuf_count): + if do_not_transform[i]: + continue + size_list[i].reverse() + if rotation in (180, 270): + orientation = tools.vector_opposite(orientation) + for i in range(pixbuf_count): + rotation_list[i] = (rotation_list[i] + rotation) % 360 + if prefs['vertical flip'] and rotation in (90, 270): + orientation = tools.vector_opposite(orientation) + if prefs['horizontal flip'] and rotation in (0, 180): + orientation = tools.vector_opposite(orientation) + + self.layout = layout.FiniteLayout.create_finite_layout( + pixbuf_count, orientation, self._spacing, distribution_axis, + alignment_axis, self._show_scrollbars, self.get_visible_area_size, + lambda zoom_dummy_size: self.zoom.get_zoomed_size(size_list, zoom_dummy_size, + distribution_axis, do_not_transform, + prefs['double page autoresize'] in (constants.DOUBLE_PAGE_AUTORESIZE_SIZE, + constants.DOUBLE_PAGE_AUTORESIZE_FIT_SIZE), + prefs['double page autoresize'] == constants.DOUBLE_PAGE_AUTORESIZE_FIT_SIZE)) + content_boxes = self.layout.get_content_boxes() + scaled_sizes = list(map(box.Box.get_size, content_boxes)) + + for i in range(pixbuf_count): + if do_not_transform[i]: + continue + pixbuf_list[i] = image_tools.fit_pixbuf_to_rectangle( + pixbuf_list[i], scaled_sizes[i], rotation_list[i]) + + for i in range(pixbuf_count): + if do_not_transform[i]: + continue + if prefs['horizontal flip']: + pixbuf_list[i] = pixbuf_list[i].flip(horizontal=True) + if prefs['vertical flip']: + pixbuf_list[i] = pixbuf_list[i].flip(horizontal=False) + pixbuf_list[i] = self.enhancer.enhance(pixbuf_list[i]) + + for i in range(pixbuf_count): + image_tools.set_from_pixbuf(self.images[i], pixbuf_list[i]) + + scales = tuple(map(lambda x, y: math.sqrt(tools.div( + tools.volume(x), tools.volume(y))), scaled_sizes, size_list)) + + resolutions = tuple(map(lambda sz, sc, ds: sz + [sc, ds], size_list, + scales, self.layout.get_content_distorted())) + if self.is_manga_mode: + resolutions = tuple(reversed(resolutions)) + self.statusbar.set_resolution(resolutions) + self.statusbar.update() + + smartbg = prefs['smart bg'] + smartthumbbg = prefs['smart thumb bg'] and prefs['show thumbnails'] + if smartbg or smartthumbbg: + bg_colour = self.imagehandler.get_pixbuf_auto_background(pixbuf_count) + if smartbg: + self.set_bg_colour(bg_colour) + if smartthumbbg: + self.thumbnailsidebar.change_thumbnail_background_color(bg_colour) + + self._main_layout.get_bin_window().freeze_updates() + + self._main_layout.set_size(*(self.layout.get_union_box().get_size())) + for i in range(pixbuf_count): + self._main_layout.move(self.images[i], + *content_boxes[i].get_position()) + + for i in range(pixbuf_count): + self.images[i].show() + for i in range(pixbuf_count, len(self.images)): + self.images[i].hide() + + # Reset orientation so scrolling behaviour is sane. + if self.is_manga_mode: + self.layout.set_orientation(constants.MANGA_ORIENTATION) + else: + self.layout.set_orientation(constants.WESTERN_ORIENTATION) + + if scroll_to is not None: + destination = (scroll_to,) * 2 + if constants.SCROLL_TO_START == scroll_to: + index = constants.FIRST_INDEX + elif constants.SCROLL_TO_END == scroll_to: + index = constants.LAST_INDEX + else: + index = None + self.scroll_to_predefined(destination, index) + + self._main_layout.get_bin_window().thaw_updates() + else: + # Save scroll destination for when the page becomes available. + self._last_scroll_destination = scroll_to + # If the pixbuf for the current page(s) isn't available, + # hide all images to clear any old pixbufs. + # XXX How about calling self._clear_main_area? + for i in range(len(self.images)): + self.images[i].hide() + self._show_scrollbars([False] * len(self._scroll)) + + self._waiting_for_redraw = False + + return False + + def _update_page_information(self): + """ Updates the window with information that can be gathered + even when the page pixbuf(s) aren't ready yet. """ + + page_number = self.imagehandler.get_current_page() + if not page_number: + return + if self.displayed_double(): + number_of_pages = 2 + left_filename, right_filename = self.imagehandler.get_page_filename(double=True) + left_filesize, right_filesize = self.imagehandler.get_page_filesize(double=True) + if self.is_manga_mode: + left_filename, right_filename = right_filename, left_filename + left_filesize, right_filesize = right_filesize, left_filesize + filename = left_filename + ', ' + right_filename + filesize = left_filesize + ', ' + right_filesize + else: + number_of_pages = 1 + filename = self.imagehandler.get_page_filename() + filesize = self.imagehandler.get_page_filesize() + self.statusbar.set_page_number(page_number, + self.imagehandler.get_number_of_pages(), + number_of_pages) + self.statusbar.set_filename(filename) + self.statusbar.set_root(self.filehandler.get_base_filename()) + self.statusbar.set_filesize(filesize) + self.statusbar.update() + self.update_title() + + def _page_available(self, page): + """ Called whenever a new page is ready for displaying. """ + # Refresh display when currently opened page becomes available. + current_page = self.imagehandler.get_current_page() + nb_pages = 2 if self.displayed_double() else 1 + if current_page <= page < (current_page + nb_pages): + self.draw_image(scroll_to=self._last_scroll_destination) + self._update_page_information() + + # Use first page as application icon when opening archives. + if (page == 1 + and self.filehandler.archive_type is not None + and prefs['archive thumbnail as icon']): + pixbuf = self.imagehandler.get_thumbnail(page, 48, 48) + self.set_icon(pixbuf) + + def _on_file_opened(self): + self.uimanager.set_sensitivities() + number, count = self.filehandler.get_file_number() + self.statusbar.set_file_number(number, count) + self.statusbar.update() + + def _on_file_closed(self): + self.clear() + self.thumbnailsidebar.hide() + self.thumbnailsidebar.clear() + self.uimanager.set_sensitivities() + self.set_icon_list(icons.mcomix_icons()) + + def new_page(self, at_bottom=False): + """Draw a *new* page correctly (as opposed to redrawing the same + image with a new size or whatever). + """ + if not prefs['keep transformation']: + prefs['rotation'] = 0 + prefs['horizontal flip'] = False + prefs['vertical flip'] = False + + if at_bottom: + scroll_to = constants.SCROLL_TO_END + else: + scroll_to = constants.SCROLL_TO_START + + self.draw_image(scroll_to=scroll_to) + + @callback.Callback + def page_changed(self): + """ Called on page change. """ + self.thumbnailsidebar.load_thumbnails() + self._update_page_information() + + def set_page(self, num, at_bottom=False): + if num == self.imagehandler.get_current_page(): + return + self.imagehandler.set_page(num) + self.page_changed() + self.new_page(at_bottom=at_bottom) + self.slideshow.update_delay() + + def next_book(self): + archive_open = self.filehandler.archive_type is not None + next_archive_opened = False + if (self.slideshow.is_running() and \ + prefs['slideshow can go to next archive']) or \ + prefs['auto open next archive']: + next_archive_opened = self.filehandler._open_next_archive() + + # If "Auto open next archive" is disabled, do not go to the next + # directory if current file was an archive. + if not next_archive_opened and \ + prefs['auto open next directory'] and \ + (not archive_open or prefs['auto open next archive']): + self.filehandler.open_next_directory() + + def previous_book(self): + archive_open = self.filehandler.archive_type is not None + previous_archive_opened = False + if (self.slideshow.is_running() and \ + prefs['slideshow can go to next archive']) or \ + prefs['auto open next archive']: + previous_archive_opened = self.filehandler._open_previous_archive() + + # If "Auto open next archive" is disabled, do not go to the previous + # directory if current file was an archive. + if not previous_archive_opened and \ + prefs['auto open next directory'] and \ + (not archive_open or prefs['auto open next archive']): + self.filehandler.open_previous_directory() + + def flip_page(self, step, single_step=False): + + if not self.filehandler.file_loaded: + return + + current_page = self.imagehandler.get_current_page() + number_of_pages = self.imagehandler.get_number_of_pages() + + new_page = current_page + step + if (1 == abs(step) and + not single_step and + prefs['default double page'] and + prefs['double step in double page mode']): + if +1 == step and not self.imagehandler.get_virtual_double_page(): + new_page += 1 + elif -1 == step and not self.imagehandler.get_virtual_double_page(new_page - 1): + new_page -= 1 + + if new_page <= 0: + # Only switch to previous page when flipping one page before the + # first one. (Note: check for (page number <= 1) to handle empty + # archive case). + if -1 == step and current_page <= 1: + return self.previous_book() + # Handle empty archive case. + new_page = min(1, number_of_pages) + elif new_page > number_of_pages: + if 1 == step: + return self.next_book() + new_page = number_of_pages + + if new_page != current_page: + self.set_page(new_page, at_bottom=(-1 == step)) + + def first_page(self): + number_of_pages = self.imagehandler.get_number_of_pages() + if number_of_pages: + self.set_page(1) + + def last_page(self): + number_of_pages = self.imagehandler.get_number_of_pages() + if number_of_pages: + self.set_page(number_of_pages) + + def page_select(self, *args): + pageselect.Pageselector(self) + + def rotate_90(self, *args): + prefs['rotation'] = (prefs['rotation'] + 90) % 360 + self.draw_image() + + def rotate_180(self, *args): + prefs['rotation'] = (prefs['rotation'] + 180) % 360 + self.draw_image() + + def rotate_270(self, *args): + prefs['rotation'] = (prefs['rotation'] + 270) % 360 + self.draw_image() + + def flip_horizontally(self, *args): + prefs['horizontal flip'] = not prefs['horizontal flip'] + self.draw_image() + + def flip_vertically(self, *args): + prefs['vertical flip'] = not prefs['vertical flip'] + self.draw_image() + + def change_double_page(self, toggleaction): + prefs['default double page'] = toggleaction.get_active() + self._update_page_information() + self.draw_image() + + def change_manga_mode(self, toggleaction): + prefs['default manga mode'] = toggleaction.get_active() + self.is_manga_mode = toggleaction.get_active() + self._update_page_information() + self.draw_image() + + def change_invert_scroll(self, toggleaction): + prefs['invert smart scroll'] = toggleaction.get_active() + + @property + def is_fullscreen(self): + window_state = self.get_window().get_state() + return 0 != (window_state & Gdk.WindowState.FULLSCREEN) + + def change_fullscreen(self, toggleaction): + # Disable action until transition if complete. + toggleaction.set_sensitive(False) + if toggleaction.get_active(): + self.save_window_geometry() + self.fullscreen() + else: + self.unfullscreen() + # No need to call draw_image explicitely, + # as we'll be receiving a window state + # change or resize event. + + def change_zoom_mode(self, radioaction=None, *args): + if radioaction: + prefs['zoom mode'] = radioaction.get_current_value() + self.zoom.set_fit_mode(prefs['zoom mode']) + self.zoom.set_scale_up(prefs['stretch']) + self.zoom.reset_user_zoom() + self.draw_image() + + def change_autorotation(self, radioaction=None, *args): + """ Switches between automatic rotation modes, depending on which + radiobutton is currently activated. """ + if radioaction: + prefs['auto rotate depending on size'] = radioaction.get_current_value() + self.draw_image() + + def change_stretch(self, toggleaction, *args): + """ Toggles stretching small images. """ + prefs['stretch'] = toggleaction.get_active() + self.zoom.set_scale_up(prefs['stretch']) + self.draw_image() + + def change_toolbar_visibility(self, toggleaction): + self._update_toggle_preference('show toolbar', toggleaction) + + def change_menubar_visibility(self, toggleaction): + self._update_toggle_preference('show menubar', toggleaction) + + def change_statusbar_visibility(self, toggleaction): + self._update_toggle_preference('show statusbar', toggleaction) + + def change_scrollbar_visibility(self, toggleaction): + self._update_toggle_preference('show scrollbar', toggleaction) + + def change_thumbnails_visibility(self, toggleaction): + self._update_toggle_preference('show thumbnails', toggleaction) + + def change_hide_all(self, toggleaction): + self._update_toggle_preference('hide all', toggleaction) + + def change_keep_transformation(self, *args): + prefs['keep transformation'] = not prefs['keep transformation'] + + def manual_zoom_in(self, *args): + self.zoom.zoom_in() + self.draw_image() + + def manual_zoom_out(self, *args): + self.zoom.zoom_out() + self.draw_image() + + def manual_zoom_original(self, *args): + self.zoom.reset_user_zoom() + self.draw_image() + + def _show_scrollbars(self, request): + """ Enables scroll bars depending on requests and preferences. """ + + limit = self._should_toggle_be_visible('show scrollbar') + for i in range(len(self._scroll)): + if limit and request[i]: + self._scroll[i].show() + else: + self._scroll[i].hide() + + def is_scrollable(self): + """ Returns True if the current images do not fit into the viewport. """ + if self.layout is None: + return False + return not all(tools.smaller_or_equal(self.layout.get_union_box().get_size(), + self.get_visible_area_size())) + + def scroll_with_flipping(self, x, y): + """Returns true if able to scroll without flipping to + a new page and False otherwise.""" + return self._event_handler._scroll_with_flipping(x, y) + + def scroll(self, x, y, bound=None): + """Scroll px horizontally and px vertically. If is + 'first' or 'second', we will not scroll out of the first or second + page respectively (dependent on manga mode). The argument + only makes sense in double page mode. + + Return True if call resulted in new adjustment values, False + otherwise. + """ + old_hadjust = self._hadjust.get_value() + old_vadjust = self._vadjust.get_value() + + visible_width, visible_height = self.get_visible_area_size() + + hadjust_upper = max(0, self._hadjust.get_upper() - visible_width) + vadjust_upper = max(0, self._vadjust.get_upper() - visible_height) + hadjust_lower = 0 + + if bound is not None and self.is_manga_mode: + bound = {'first': 'second', 'second': 'first'}[bound] + + if bound == 'first': + hadjust_upper = max(0, hadjust_upper - + self.images[1].size_request().width - 2) # XXX transitional(double page limitation) + + elif bound == 'second': + hadjust_lower = self.images[0].size_request().width + 2 # XXX transitional(double page limitation) + + new_hadjust = old_hadjust + x + new_vadjust = old_vadjust + y + + new_hadjust = max(hadjust_lower, new_hadjust) + new_vadjust = max(0, new_vadjust) + + new_hadjust = min(hadjust_upper, new_hadjust) + new_vadjust = min(vadjust_upper, new_vadjust) + + self._vadjust.set_value(new_vadjust) + self._hadjust.set_value(new_hadjust) + self._scroll[0].queue_resize_no_redraw() + self._scroll[1].queue_resize_no_redraw() + + return old_vadjust != new_vadjust or old_hadjust != new_hadjust + + def scroll_to_predefined(self, destination, index=None): + self.layout.scroll_to_predefined(destination, index) + self.update_viewport_position() + + def update_viewport_position(self): + viewport_position = self.layout.get_viewport_box().get_position() + self._hadjust.set_value(viewport_position[0]) # 2D only + self._vadjust.set_value(viewport_position[1]) # 2D only + self._scroll[0].queue_resize_no_redraw() + self._scroll[1].queue_resize_no_redraw() + + def update_layout_position(self): + self.layout.set_viewport_position( + (int(round(self._hadjust.get_value())), int(round(self._vadjust.get_value())))) + + def clear(self): + """Clear the currently displayed data (i.e. "close" the file).""" + self.set_title(constants.APPNAME) + self.statusbar.set_message('') + self.draw_image() + + def _clear_main_area(self): + for i in self.images: + i.hide() + for i in self.images: + i.clear() + self._show_scrollbars([False] * len(self._scroll)) + self.layout = layout.create_dummy_layout() + self._main_layout.set_size(*self.layout.get_union_box().get_size()) + self.set_bg_colour(prefs['bg colour']) + + def displayed_double(self): + """Return True if two pages are currently displayed.""" + return (self.imagehandler.get_current_page() and + prefs['default double page'] and + not self.imagehandler.get_virtual_double_page() and + self.imagehandler.get_current_page() != self.imagehandler.get_number_of_pages()) + + def get_visible_area_size(self): + """Return a 2-tuple with the width and height of the visible part + of the main layout area. + """ + dimensions = list(self.get_size()) + + for preference, action, widget_list in self._toggle_list: + for widget in widget_list: + if widget.get_visible(): + axis = self._toggle_axis[widget] + requisition = widget.size_request() + if constants.WIDTH_AXIS == axis: + size = requisition.width + elif constants.HEIGHT_AXIS == axis: + size = requisition.height + dimensions[axis] -= size + + return tuple(dimensions) + + def get_layout_pointer_position(self): + """Return a 2-tuple with the x and y coordinates of the pointer + on the main layout area, relative to the layout. + """ + x, y = self._main_layout.get_pointer() + x += self._hadjust.get_value() + y += self._vadjust.get_value() + + return (x, y) + + def set_cursor(self, mode): + """Set the cursor on the main layout area to . You should + probably use the cursor_handler instead of using this method + directly. + """ + self._main_layout.get_bin_window().set_cursor(mode) + + def update_title(self): + """Set the title acording to current state.""" + this_screen = 2 if self.displayed_double() else 1 # XXX limited to at most 2 pages + # TODO introduce formatter to merge these string ops with the ops for status bar updates + title = '[' + for i in range(this_screen): + title += '%d' % (self.imagehandler.get_current_page() + i) + if i < this_screen - 1: + title += ',' + title += ' / %d] %s' % (self.imagehandler.get_number_of_pages(), + self.imagehandler.get_pretty_current_filename()) + title = i18n.to_unicode(title) + + if self.slideshow.is_running(): + title = '[%s] %s' % (_('SLIDESHOW'), title) + + self.set_title(title) + + def set_bg_colour(self, colour): + """Set the background colour to . Colour is a sequence in the + format (r, g, b). Values are 16-bit. + """ + colour = colour[:3] + self._event_box.modify_bg(Gtk.StateType.NORMAL, Gdk.Color(*colour)) + if prefs['thumbnail bg uses main colour']: + self.thumbnailsidebar.change_thumbnail_background_color(prefs['bg colour'][:3]) + self._bg_colour = colour + + def get_bg_colour(self): + return self._bg_colour + + def extract_page(self, *args): + """Save the currently displayed images to disk, appending a number if a + file with an identical name was already found in the target directory. + """ + this_screen = 2 if self.displayed_double() else 1 # XXX limited to at most 2 pages + for i in reversed(range(this_screen)) if self.is_manga_mode \ + else range(this_screen): + file_path = self.imagehandler.get_path_to_page( + self.imagehandler.get_current_page() + i) + if not file_path: + return + file_name = os.path.split(file_path)[-1] + + if self.filehandler.archive_type is not None: + # Prepend the archive base name to the filename being displayed + archive_name = self.filehandler.get_pretty_current_filename() + file_name = ( + os.path.splitext(archive_name)[0] + '_' + file_name) + + target_dir = prefs['path of last saved in filechooser'] + os.sep + suggest_name = i18n.to_unicode(file_name) + attempt = 1 + while os.path.exists(target_dir + suggest_name): + suggest_name = tools.append_number_to_filename( + file_name, number=attempt) + attempt += 1 + + save_dialog = Gtk.FileChooserDialog(_('Save page as'), self, + Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, + Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT) + ) + save_dialog.set_do_overwrite_confirmation(True) + save_dialog.set_create_folders(True) + save_dialog.set_current_name(suggest_name) + save_dialog.set_current_folder(target_dir) + + if save_dialog.run() == Gtk.ResponseType.ACCEPT: + target = save_dialog.get_filename() + if target: + target = i18n.to_unicode(target) + try: + shutil.copy2(file_path, target) + except Exception as e: + log.warning(e) + + prefs['path of last saved in filechooser'] = \ + save_dialog.get_current_folder() \ + if prefs['store last saved in directory'] \ + else constants.HOME_DIR + + save_dialog.destroy() + + def delete(self, *args): + """ The currently opened file/archive will be deleted after showing + a confirmation dialog. """ + + current_file = self.imagehandler.get_real_path() + dialog = message_dialog.MessageDialog(self, Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.NONE) + dialog.set_should_remember_choice('delete-opend-file', (Gtk.ResponseType.OK,)) + dialog.set_text( + _('Delete "%s"?') % os.path.basename(current_file), + _('The file will be deleted from your harddisk.')) + dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) + dialog.add_button(Gtk.STOCK_DELETE, Gtk.ResponseType.OK) + dialog.set_default_response(Gtk.ResponseType.OK) + result = dialog.run() + + if result == Gtk.ResponseType.OK: + # Go to next page/archive, and delete current file + if self.filehandler.archive_type is not None: + self.filehandler.last_read_page.clear_page(current_file) + + next_opened = self.filehandler._open_next_archive() + if not next_opened: + next_opened = self.filehandler._open_previous_archive() + if not next_opened: + self.filehandler.close_file() + + if os.path.isfile(current_file): + os.unlink(current_file) + else: + if self.imagehandler.get_number_of_pages() > 1: + # Open the next/previous file + if self.imagehandler.get_current_page() >= self.imagehandler.get_number_of_pages(): + self.flip_page(-1) + else: + self.flip_page(+1) + # Unlink the desired file + if os.path.isfile(current_file): + os.unlink(current_file) + # Refresh the directory + self.filehandler.refresh_file() + else: + self.filehandler.close_file() + if os.path.isfile(current_file): + os.unlink(current_file) + + def show_info_panel(self): + """ Shows an OSD displaying information about the current page. """ + + if not self.filehandler.file_loaded: + return + + text = '' + filename = self.imagehandler.get_pretty_current_filename() + if filename: + text += '%s\n' % filename + file_number, file_count = self.filehandler.get_file_number() + if file_count: + text += '(%d / %d)\n' % (file_number, file_count) + else: + text += '\n' + page_number = self.imagehandler.get_current_page() + if page_number: + text += '%s %s' % (_('Page'), page_number) + text = text.strip('\n') + if text: + self.osd.show(text) + + def minimize(self, *args): + """ Minimizes the MComix window. """ + self.iconify() + + def write_config_files(self): + + self.filehandler.write_fileinfo_file() + preferences.write_preferences_file() + bookmark_backend.BookmarksStore.write_bookmarks_file() + + # Write keyboard accelerator map + keybindings.keybinding_manager(self).save() + + def save_and_terminate_program(self, *args): + prefs['previous quit was quit and save'] = True + + self.terminate_program() + + def get_window_geometry(self): + return self.get_position() + self.get_size() + + def save_window_geometry(self): + ( + prefs['window x'], + prefs['window y'], + prefs['window width'], + prefs['window height'], + + ) = self.get_window_geometry() + + def restore_window_geometry(self): + if self.get_window_geometry() == (prefs['window x'], + prefs['window y'], + prefs['window width'], + prefs['window height']): + return False + self.resize(prefs['window width'], prefs['window height']) + # FIXME: Moving the Window on Windows causes it to go completely offscreen + if sys.platform != 'win32': + self.move(prefs['window x'], prefs['window y']) + return True + + def update_space(self): + self._spacing = prefs['space between two pages'] + self.draw_image() + + def close_program(self, *args): + if not self.is_fullscreen: + self.save_window_geometry() + self.terminate_program() + + def terminate_program(self): + """Run clean-up tasks and exit the program.""" + + self.hide() + + if Gtk.main_level() > 0: + Gtk.main_quit() + + if prefs['auto load last file'] and self.filehandler.file_loaded: + prefs['path to last file'] = self.imagehandler.get_real_path() + prefs['page of last file'] = self.imagehandler.get_current_page() + + else: + prefs['path to last file'] = '' + prefs['page of last file'] = 1 + + if prefs['hide all'] and self.hide_all_forced and self.fullscreen: + prefs['hide all'] = False + + self.write_config_files() + + self.filehandler.close_file() + if main_dialog._dialog is not None: + main_dialog._dialog.close() + backend.LibraryBackend().close() + + # This hack is to avoid Python issue #1856. + for thread in threading.enumerate(): + if thread is not threading.currentThread(): + log.debug('Waiting for thread %s to finish before exit', thread) + thread.join() + +#: Main window instance +__main_window = None + + +def main_window(): + """ Returns the global main window instance. """ + return __main_window + + +def set_main_window(window): + global __main_window + __main_window = window + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/about_dialog.py mcomix-2.1.0/mcomix/mcomix/about_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/about_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/about_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -'''about_dialog.py - About dialog.''' - -from gi.repository import Gtk -import webbrowser - -from mcomix import constants -from mcomix import strings -from mcomix import image_tools -from mcomix import tools - -class _AboutDialog(Gtk.AboutDialog): - - def __init__(self, window): - super(_AboutDialog, self).__init__() - self.set_transient_for(window) - - self.set_name(constants.APPNAME) - self.set_program_name(constants.APPNAME) - self.set_version(constants.VERSION) - self.set_website('https://sourceforge.net/p/mcomix/wiki/') - self.set_copyright('Copyright © 2005-2016') - - icon_data = tools.read_binary('images', 'mcomix.png') - pixbuf = image_tools.load_pixbuf_data(icon_data) - self.set_logo(pixbuf) - - comment = \ - _('%s is an image viewer specifically designed to handle comic books.') % \ - constants.APPNAME + ' ' + \ - _('It reads ZIP, RAR and tar archives, as well as plain image files.') - self.set_comments(comment) - - license = \ - _('%s is licensed under the terms of the GNU General Public License.') % constants.APPNAME + \ - ' ' + \ - _('A copy of this license can be obtained from %s') % \ - 'http://www.gnu.org/licenses/gpl-2.0.html' - self.set_wrap_license(True) - self.set_license(license) - - authors = [ '%s: %s' % (name, description) for name, description in strings.AUTHORS ] - self.set_authors(authors) - - translators = [ '%s: %s' % (name, description) for name, description in strings.TRANSLATORS ] - self.set_translator_credits('\n'.join(translators)) - - artists = [ '%s: %s' % (name, description) for name, description in strings.ARTISTS ] - self.set_artists(artists) - - self.connect('activate-link', self._on_activate_link) - - self.show_all() - - def _on_activate_link(self, about_dialog, uri): - webbrowser.open(uri) - return True - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/anime_tools.py mcomix-2.1.0/mcomix/mcomix/anime_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/anime_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/anime_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ - -import math -from gi.repository import GdkPixbuf - -from mcomix import constants -from mcomix.preferences import prefs - -class AnimeFrameBuffer: - def __init__(self,n_frames,loop=1): - self.n_frames=n_frames - self.width=0 - self.height=0 - if prefs['animation mode'] == constants.ANIMATION_INF: - self.loop=0 - elif prefs['animation mode'] == constants.ANIMATION_ONCE: - self.loop=1 - else: - self.loop=0 if loop>10 else loop # loop over 10 is infinitely - - self.framelist=[None]*n_frames - self.duration=0 - self.fps=0 - - def add_frame(self,index,pixbuf,duration,background=None): - if self.n_frames<=index: - raise EOFError('index over') - width=pixbuf.get_width() - height=pixbuf.get_height() - if self.width*self.height: - if width!=self.width or height!=self.height: - raise ValueError('frame with different size') - else: - self.width=width - self.height=height - if prefs['animation background'] and background: - pixbuf=pixbuf.composite_color_simple( - width,height,GdkPixbuf.InterpType.NEAREST, - 255,1024,background,background - ) - self.framelist[index]=(pixbuf,duration) - self.duration=math.gcd(duration,self.duration) - - def copy(self): - newbuffer=AnimeFrameBuffer(self.n_frames,loop=self.loop) - for n,frame in enumerate(self.framelist): - pixbuf,duration=frame - newbuffer.add_frame(n,pixbuf,duration) - return newbuffer - - def create_animation(self): - if not self.width*self.height: - raise ValueError('no frames') - if not self.fps: - if self.duration: - self.fps=1000/self.duration - else: - # all duration is 0, set fps to 60 - # TODO: correctly deal with 0 duration - self.fps=60 - anime=GdkPixbuf.PixbufSimpleAnim.new(self.width,self.height,self.fps) - if self.loop: - anime.set_loop(False) - else: - anime.set_loop(True) - for l in range(max(1,self.loop)): - for n,frame in enumerate(self.framelist): - if not frame: - raise OSError('animation corrupted') - pixbuf,duration=frame - if not (duration and self.duration): - loop=1 - else: - loop=duration//self.duration - for c in range(loop): - anime.add_frame(pixbuf) - - anime._framebuffer=self - - return anime - -def frame_executor(animation,function,args=(),kwargs={}): - if not prefs['animation transform']: - # transform disabled, do nothing - return animation - if not callable(function): - # function is not a function, do nothing - return animation - framebuffer=getattr(animation,'_framebuffer',None) - if not framebuffer: - # animation does not have AnimeFrameBuffer, do nothing - return animation - # call function on every frame - anime=AnimeFrameBuffer(framebuffer.n_frames,loop=framebuffer.loop) - for n,frame in enumerate(framebuffer.framelist): - pixbuf,duration=frame - anime.add_frame(n,function(pixbuf,*args,**kwargs),duration) - return anime.create_animation() diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archive_base.py mcomix-2.1.0/mcomix/mcomix/archive/archive_base.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archive_base.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/archive_base.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,327 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Base class for unified handling of various archive formats. Used for simplifying -extraction and adding new archive formats. ''' - -import os -import errno -import shutil -import sys -import threading - -from mcomix import archive -from mcomix import callback -from mcomix import i18n -from mcomix import portability -from mcomix import process -from mcomix import tools -from mcomix.lib import mountmanager -from mcomix.preferences import prefs - -class BaseArchive(object): - ''' Base archive interface. All filenames passed from and into archives - are expected to be Unicode objects. Archive files are converted to - Unicode with some guess-work. ''' - - ''' True if concurrent calls to extract is supported. ''' - support_concurrent_extractions = False - - def __init__(self, archive): - assert isinstance(archive, str), 'File should be an Unicode string.' - - self.archive = archive - self._password = None - self.is_encrypted = False - self._event = threading.Event() - if self.support_concurrent_extractions: - # When multiple concurrent extractions are supported, - # we need a lock to handle concurent calls to _get_password. - self._lock = threading.Lock() - self._waiting_for_password = False - - def iter_contents(self): - ''' Generator for listing the archive contents.''' - yield - - def list_contents(self): - ''' Returns a list of unicode filenames relative to the archive root. - These names do not necessarily exist in the actual archive since they - need to saveable on the local filesystems, so some characters might - need to be replaced. ''' - return [filename for filename in self.iter_contents()] - - def extract(self, filename, destination_dir): - ''' Extracts the file specified by and return the path of it. - This filename must be obtained by calling list_contents(). - The file is saved to . ''' - - assert isinstance(filename, str) and \ - isinstance(destination_dir, str) - return os.path.join(destination_dir, filename) - - def iter_extract(self, entries, destination_dir): - ''' Generator to extract from archive to . ''' - wanted = set(entries) - for filename in self.iter_contents(): - if filename not in wanted: - continue - self.extract(filename, destination_dir) - yield filename - wanted.remove(filename) - if not wanted: - break - - def close(self): - ''' Closes the archive and releases held resources. ''' - pass - - def is_solid(self): - ''' Returns True if the archive is solid and extraction should be done - in one pass. ''' - return False - - def _replace_invalid_filesystem_chars(self, filename): - ''' Replaces characters in that cannot be saved to the disk - with underscore and returns the cleaned-up name. ''' - - unsafe_chars = portability.invalid_filesystem_chars() - translation_table = {} - replacement_char = '_' - for char in unsafe_chars: - translation_table[ord(char)] = replacement_char - - new_name = filename.translate(translation_table) - - # Make sure the filename does not contain portions that might - # traverse directories, i.e. do not allow absolute paths - # and paths containing ../ - normalized = os.path.normpath(new_name) - return normalized.lstrip('..' + os.sep).lstrip(os.sep) - - def _create_directory(self, directory): - ''' Recursively create a directory if it doesn't exist yet. ''' - if os.path.exists(directory): - return - try: - os.makedirs(directory) - except OSError as e: - # Can happen with concurrent calls. - if e.errno != errno.EEXIST: - raise e - - def _create_file(self, dst_path): - ''' Open for writing, making sure base directory exists. ''' - dst_dir = os.path.dirname(dst_path) - # Create directory if it doesn't exist - self._create_directory(dst_dir) - return open(dst_path, 'wb') - - @callback.Callback - def _password_required(self): - ''' Asks the user for a password and sets . - If is None, no password has been requested yet. - If an empty string is set, assume that the user did not provide - a password. ''' - - password = archive.ask_for_password(self.archive) - if password is None: - password = '' - - self._password = password - self._event.set() - - def _get_password(self): - ask_for_password = self._password is None - # Don't trigger concurrent password dialogs. - if ask_for_password and self.support_concurrent_extractions: - with self._lock: - if self._waiting_for_password: - ask_for_password = False - else: - self._waiting_for_password = True - if ask_for_password: - self._password_required() - self._event.wait() - -class NonUnicodeArchive(BaseArchive): - ''' Base class for archives that manage a conversion of byte member names -> - Unicode member names internally. Required for formats that do not provide - wide character member names. ''' - - def __init__(self, archive): - super(NonUnicodeArchive, self).__init__(archive) - # Maps Unicode names to regular names as expected by the original archive format - self.unicode_mapping = {} - - def _rename_in_dir(self, srcname, dstname, directory): - if srcname is dstname: - return - src = os.path.join(directory, srcname) - dst = os.path.join(directory, dstname) - os.makedirs(os.path.dirname(dst), exist_ok=True) - os.rename(src, dst) - try: - os.removedirs(os.path.dirname(src)) - except: - pass - - def _unicode_filename(self, filename, conversion_func=i18n.to_unicode): - ''' Instead of returning archive members directly, map each filename through - this function first to convert them to Unicode. ''' - - unicode_name = conversion_func(filename) - safe_name = self._replace_invalid_filesystem_chars(unicode_name) - self.unicode_mapping[safe_name] = filename - return safe_name - - def _original_filename(self, filename): - ''' Map Unicode filename back to original archive name. ''' - if filename in self.unicode_mapping: - return self.unicode_mapping[filename] - else: - return i18n.to_utf8(filename) - -class ExternalExecutableArchive(NonUnicodeArchive): - ''' For archives that are extracted by spawning an external - application. ''' - - # Since we're using an external program for extraction, - # concurrent calls are supported. - support_concurrent_extractions = True - - def __init__(self, archive): - super(ExternalExecutableArchive, self).__init__(archive) - # Flag to determine if list_contents() has been called - # This builds the Unicode mapping and is likely required - # for extracting filenames that have been internally mapped. - self.filenames_initialized = False - - def _get_executable(self): - ''' Returns the executable's name or path. Return None if no executable - was found on the system. ''' - raise NotImplementedError('Subclasses must override _get_executable.') - - def _get_list_arguments(self): - ''' Returns an array of arguments required for the executable - to produce a list of archive members. ''' - raise NotImplementedError('Subclasses must override _get_list_arguments.') - - def _get_extract_arguments(self): - ''' Returns an array of arguments required for the executable - to extract a file to STDOUT. ''' - raise NotImplementedError('Subclasses must override _get_extract_arguments.') - - def _parse_list_output_line(self, line): - ''' Parses the output of the external executable's list command - and return either a file path relative to the archive's root, - or None if the current line doesn't contain any file references. ''' - return line - - def iter_contents(self): - if not self._get_executable(): - return - - with process.popen([self._get_executable()] + - self._get_list_arguments() + - [self.archive]) as proc: - for line in proc.stdout: - filename = self._parse_list_output_line(line.rstrip(os.linesep)) - if filename is not None: - yield self._unicode_filename(filename) - - self.filenames_initialized = True - - def extract(self, filename, destination_dir): - ''' Extract from the archive to . ''' - assert isinstance(filename, str) and \ - isinstance(destination_dir, str) - - if not self._get_executable(): - return - - if not self.filenames_initialized: - self.list_contents() - - destination_path = os.path.join(destination_dir, filename) - - with self._create_file(destination_path) as output: - process.call([self._get_executable()] + - self._get_extract_arguments() + - [self.archive, self._original_filename(filename)], - stdout=output) - return destination_path - -class MountArchive(BaseArchive): - def __init__(self,archive,mounter,options=[]): - super(MountArchive,self).__init__(archive) - self._src=self.archive - self._mounter=mounter - self._mountoptions=options - try: - self._mgr=mountmanager.MountManager(self._mounter) - except mountmanager.MountManager.CommandNotFound: - self._mgr=None - return - self._contents=[] - self._lock=threading.Lock() - - with self._lock: - with self._mgr(self._src,options=self._mountoptions) as m: - for paths in tools.walkpath(m.mountpoint): - self._contents.append(os.path.join(*paths)) - self._contents.sort() - - def iter_contents(self): - yield from self._contents - - def list_contents(self): - return self._contents.copy() - - def is_solid(self): - return True - - def extract(self,fn,dstdir): - with self._lock: - dstfile=os.path.join(dstdir,fn) - if self._mgr.is_mounted(): - with open(os.path.join(self._mgr.mountpoint,fn),mode='rb') as src: - data=src.read() - else: - with self._mgr(self._src,options=self._mountoptions) as m: - with open(os.path.join(m.mountpoint,fn),mode='rb') as src: - data=src.read() - with self._create_file(dstfile) as dst: - dst.write(data) - return dstfile - - def iter_extract(self,names,dstdir): - with self._lock: - self._create_directory(dstdir) - if self._mgr.is_mounted(): - if dstdir!=self._mgr.mountpoint: - # umount before change mountpoint - self._mgr.umount() - if not self._mgr.is_mounted(): - self._mgr.mount(self._src,options=self._mountoptions, - mountpoint=dstdir) - for name in names: - if name in self._contents: - yield name - - def close(self): - with self._lock: - while self._mgr.is_mounted(): - try: - self._mgr.umount() - except: - self._lock.acquire(timeout=.5) - - @staticmethod - def _is_available(mounter): - if sys.platform!='linux': - return False - if not prefs['mount']: - return False - return shutil.which(mounter) and shutil.which('fusermount') - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archivemount.py mcomix-2.1.0/mcomix/mcomix/archive/archivemount.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archivemount.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/archivemount.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -from mcomix.archive import archive_base - -class ArchivemountArchive(archive_base.MountArchive): - def __init__(self,archive): - super(ArchivemountArchive,self).__init__( - archive,'archivemount', - options=['readonly','auto_cache']) - - @staticmethod - def is_available(): - return archive_base.MountArchive._is_available('archivemount') diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archive_recursive.py mcomix-2.1.0/mcomix/mcomix/archive/archive_recursive.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/archive_recursive.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/archive_recursive.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Class for transparently handling an archive containing sub-archives. ''' - -import os -import tempfile - -from mcomix.preferences import prefs -from mcomix.archive import archive_base -from mcomix import archive_tools -from mcomix import log - -class RecursiveArchive(archive_base.BaseArchive): - - def __init__(self, archive, prefix='mcomix.'): - super(RecursiveArchive, self).__init__(archive.archive) - self._main_archive = archive - self.is_encrypted = self._main_archive.is_encrypted - self._tempdir = tempfile.TemporaryDirectory( - prefix=prefix, dir=prefs['temporary directory']) - self._sub_tempdirs = [] - self._sub_archives = set() - self.destdir = self._tempdir.name - self._archive_list = [] - # Map entry name to its archive+name. - self._entry_mapping = {} - # Map archive to its root. - self._archive_root = {} - self._contents_listed = False - self._contents = [] - # Assume concurrent extractions are not supported. - self.support_concurrent_extractions = False - - def _iter_contents(self, archive, root=None, decrypt=True): - if archive.is_encrypted and not decrypt: - return - if not root: - root = os.path.join(self.destdir,'main_archive') - self._archive_list.append(archive) - self._archive_root[archive] = root - sub_archive_list = [] - for f in archive.iter_contents(): - if archive_tools.is_archive_file(f): - # We found a sub-archive, don't try to extract it now, as we - # must finish listing the containing archive contents before - # any extraction can be done. - sub_archive_list.append(f) - name = f if root is None else os.path.join(root, f) - self._entry_mapping[name] = (archive, f) - self._sub_archives.add(name) - continue - name = f - if root is not None: - name = os.path.join(root, name) - self._entry_mapping[name] = (archive, f) - yield name - for f in sub_archive_list: - # Extract sub-archive. - destination_dir = self.destdir - if root is not None: - destination_dir = os.path.join(destination_dir, root) - sub_archive_path = archive.extract(f, destination_dir) - # And open it and list its contents. - sub_archive = archive_tools.get_archive_handler(sub_archive_path) - if sub_archive is None: - log.warning('Non-supported archive format: %s', - os.path.basename(sub_archive_path)) - continue - sub_tempdir = tempfile.TemporaryDirectory( - prefix='sub_archive.{:04}.'.format(len(self._archive_list)), - dir=self.destdir) - sub_root = sub_tempdir.name - self._sub_tempdirs.append(sub_tempdir) - for name in self._iter_contents(sub_archive, sub_root): - yield name - os.remove(sub_archive_path) - - def _check_concurrent_extraction_support(self): - supported = True - # We need all archives to support concurrent extractions. - for archive in self._archive_list: - if not archive.support_concurrent_extractions: - supported = False - break - self.support_concurrent_extractions = supported - - def iter_contents(self, decrypt=True): - if self._contents_listed: - for f in self._contents: - yield f - return - self._contents = [] - for f in self._iter_contents(self._main_archive, decrypt=decrypt): - self._contents.append(f) - yield f - self._contents_listed = True - # We can now check if concurrent extractions are really supported. - self._check_concurrent_extraction_support() - - def list_contents(self, decrypt=True): - if self._contents_listed: - return self._contents - return [f for f in self.iter_contents(decrypt=decrypt)] - - def extract(self, filename): - if not self._contents_listed: - self.list_contents() - archive, name = self._entry_mapping[filename] - root = self._archive_root[archive] - destination_dir = self.destdir - if root is not None: - destination_dir = os.path.join(destination_dir, root) - log.debug('extracting from %s to %s: %s', - archive.archive, destination_dir, filename) - return archive.extract(name, destination_dir) - - def iter_extract(self, entries, destination_dir): - if not self._contents_listed: - self.list_contents() - # Unfortunately we can't just rely on BaseArchive default - # implementation if solid archives are to be correctly supported: - # we need to call iter_extract (not extract) for each archive ourselves. - wanted = set(entries)|self._sub_archives - for archive in self._archive_list: - archive_wanted = {} - for name in wanted: - name_archive, name_archive_name = self._entry_mapping[name] - if name_archive == archive: - archive_wanted[name_archive_name] = name - if 0 == len(archive_wanted): - continue - root = self._archive_root[archive] - archive_destination_dir = destination_dir - if root is not None: - archive_destination_dir = os.path.join(destination_dir, root) - log.debug('extracting from %s to %s: %s', - archive.archive, archive_destination_dir, - ' '.join(archive_wanted.keys())) - for f in archive.iter_extract(archive_wanted.keys(), archive_destination_dir): - name = archive_wanted[f] - if name in self._sub_archives: - continue - yield name - wanted -= set(archive_wanted.values()) - if 0 == len(wanted): - break - - def is_solid(self): - if not self._contents_listed: - self.list_contents() - # We're solid if at least one archive is solid. - for archive in self._archive_list: - if archive.is_solid(): - return True - return False - - def close(self): - # close all archives before cleanup temporary directory - for archive in reversed(self._archive_list): - archive.close() - for tempdir in self._sub_tempdirs: - tempdir.cleanup() - self._tempdir.cleanup() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/__init__.py mcomix-2.1.0/mcomix/mcomix/archive/__init__.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/__init__.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- - -from gi.repository import Gtk - -from mcomix import main -from mcomix import message_dialog - -def ask_for_password(archive): - """ Openes an input dialog to ask for a password. Returns either - an Unicode string (the password), or None.""" - dialog = message_dialog.MessageDialog( - main.main_window(), - flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.QUESTION, - buttons=Gtk.ButtonsType.OK_CANCEL) - dialog.set_text( - _("The archive is password-protected:"), - archive + '\n\n' + - ("Please enter the password to continue:")) - dialog.set_default_response(Gtk.ResponseType.OK) - dialog.set_auto_destroy(False) - - password_box = Gtk.Entry() - password_box.set_visibility(False) - password_box.set_activates_default(True) - dialog.get_content_area().pack_end(password_box, True, True, 0) - dialog.set_focus(password_box) - - result = dialog.run() - password = password_box.get_text() - dialog.destroy() - - if result == Gtk.ResponseType.OK and password: - return password - else: - return None - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/lha_external.py mcomix-2.1.0/mcomix/mcomix/archive/lha_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/lha_external.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/lha_external.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -''' LHA archive extractor. ''' - -import re - -from mcomix import process -from mcomix.archive import archive_base - -# Filled on-demand by LhaArchive -_lha_executable = -1 - -class LhaArchive(archive_base.ExternalExecutableArchive): - ''' LHA file extractor using the lha executable. ''' - - def _get_executable(self): - return LhaArchive._find_lha_executable() - - def _get_list_arguments(self): - return ['l', '-g', '-q2'] - - def _get_extract_arguments(self): - return ['p', '-q2'] - - def _parse_list_output_line(self, line): - match = re.search(r'\[generic\]\s+\d+\s+\S+?\s+\w+\s+\d+\s+\d+\s+(.+)$', line) - if match: - return match.group(1) - else: - return None - - @staticmethod - def _find_lha_executable(): - ''' Tries to start lha, and returns either 'lha' if - it was started successfully or None otherwise. ''' - global _lha_executable - if _lha_executable == -1: - _lha_executable = process.find_executable(('lha',)) - return _lha_executable - - @staticmethod - def is_available(): - return bool(LhaArchive._find_lha_executable()) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/pdf_external.py mcomix-2.1.0/mcomix/mcomix/archive/pdf_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/pdf_external.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/pdf_external.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- - -''' PDF handler. ''' - -from distutils.version import LooseVersion -import math -import os -import re - -from mcomix import log -from mcomix import process -from mcomix.archive import archive_base - -# Default DPI for rendering. -PDF_RENDER_DPI_DEF = 72 * 4 -# Maximum DPI for rendering. -PDF_RENDER_DPI_MAX = 72 * 10 - -_pdf_possible = None -_mutool_exec = [] -_mudraw_exec = [] -_mudraw_trace_args = [] - -class PdfArchive(archive_base.BaseArchive): - - ''' Concurrent calls to extract welcome! ''' - support_concurrent_extractions = True - - _fill_image_regex = re.compile(r'^\s*[^"]+)".*\bwidth="(?P\d+)".*\bheight="(?P\d+)".*/>\s*$') - - def __init__(self, archive): - super(PdfArchive, self).__init__(archive) - - def iter_contents(self): - with process.popen(_mutool_exec + ['show', '--', self.archive, 'pages'], - universal_newlines=True) as proc: - for line in proc.stdout: - if line.startswith('page '): - yield line.split()[1] + '.png' - - def extract(self, filename, destination_dir): - self._create_directory(destination_dir) - destination_path = os.path.join(destination_dir, filename) - page_num, ext = os.path.splitext(filename) - # Try to find optimal DPI. - cmd = _mudraw_exec + _mudraw_trace_args + ['--', self.archive, str(page_num)] - log.debug('finding optimal DPI for %s: %s', filename, ' '.join(cmd)) - with process.popen(cmd, universal_newlines=True) as proc: - max_size = 0 - max_dpi = PDF_RENDER_DPI_DEF - for line in proc.stdout: - match = self._fill_image_regex.match(line) - if not match: - continue - matrix = [float(f) for f in match.group('matrix').split()] - for size, coeff1, coeff2 in ( - (int(match.group('width')), matrix[0], matrix[1]), - (int(match.group('height')), matrix[2], matrix[3]), - ): - if size < max_size: - continue - render_size = math.sqrt(coeff1 * coeff1 + coeff2 * coeff2) - dpi = int(size * 72 / render_size) - if dpi > PDF_RENDER_DPI_MAX: - dpi = PDF_RENDER_DPI_MAX - max_size = size - max_dpi = dpi - # Render... - cmd = _mudraw_exec + ['-r', str(max_dpi), '-o', destination_path, '--', self.archive, str(page_num)] - log.debug('rendering %s: %s', filename, ' '.join(cmd)) - process.call(cmd) - return destination_path - - @staticmethod - def is_available(): - global _pdf_possible - if _pdf_possible is not None: - return _pdf_possible - mutool = process.find_executable(('mutool',)) - _pdf_possible = False - version = None - if mutool is None: - log.debug('mutool executable not found') - else: - _mutool_exec.append(mutool) - # Find MuPDF version; assume 1.6 version since - # the '-v' switch is only supported from 1.7 onward... - version = '1.6' - with process.popen([mutool, '-v'], - stdout=process.NULL, - stderr=process.PIPE, - universal_newlines=True) as proc: - output = proc.stderr.read() - if output.startswith('mutool version '): - version = output[15:].rstrip() - version = LooseVersion(version) - if version >= LooseVersion('1.8'): - # Mutool executable with draw support. - _mudraw_exec.extend((mutool, 'draw', '-q')) - _mudraw_trace_args.extend(('-F', 'trace')) - _pdf_possible = True - else: - # Separate mudraw executable. - mudraw = process.find_executable(('mudraw',)) - if mudraw is None: - log.debug('mudraw executable not found') - else: - _mudraw_exec.append(mudraw) - if version >= LooseVersion('1.7'): - _mudraw_trace_args.extend(('-F', 'trace')) - else: - _mudraw_trace_args.append('-x') - _pdf_possible = True - if _pdf_possible: - log.info('Using MuPDF version: %s', version) - log.debug('mutool: %s', ' '.join(_mutool_exec)) - log.debug('mudraw: %s', ' '.join(_mudraw_exec)) - log.debug('mudraw trace arguments: %s', ' '.join(_mudraw_trace_args)) - else: - log.info('MuPDF not available.') - return _pdf_possible - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/rar_external.py mcomix-2.1.0/mcomix/mcomix/archive/rar_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/rar_external.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/rar_external.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- - -''' RAR archive extractor. ''' - -import os -import sys - -from mcomix import log -from mcomix import process -from mcomix.archive import archive_base - -# Filled on-demand by RarArchive -_rar_executable = -1 - -class RarArchive(archive_base.ExternalExecutableArchive): - ''' RAR file extractor using the unrar/rar executable. ''' - - STATE_HEADER, STATE_LISTING = 1, 2 - - class EncryptedHeader(Exception): - pass - - def __init__(self, archive): - super(RarArchive, self).__init__(archive) - self._is_solid = False - self._contents = [] - - self.is_encrypted = False - self.is_encrypted = self._has_encryption() - - def _get_executable(self): - return self._find_unrar_executable() - - def _get_password_argument(self): - if not self.is_encrypted: - # Add a dummy password anyway, to prevent deadlock on reading for - # input if we did not correctly detect the archive is encrypted. - return '-p-' - self._get_password() - # Check for invalid empty password, see comment above. - if not self._password: - return '-p-' - return '-p' + self._password - - def _get_list_arguments(self): - args = [self._get_executable(), 'vt'] - args.append(self._get_password_argument()) - args.extend(('--', self.archive)) - return args - - def _get_extract_arguments(self): - args = [self._get_executable(), 'p', '-inul', '-@'] - args.append(self._get_password_argument()) - args.extend(('--', self.archive)) - return args - - def _parse_list_output_line(self, line): - if self._state == self.STATE_HEADER: - if line.startswith('Details: '): - flags = line[9:].split(', ') - if 'solid' in flags: - self._is_solid = True - self._state = self.STATE_LISTING - return None - if self._state == self.STATE_LISTING: - line = line.lstrip() - if line.startswith('Name: '): - self._path = line[6:] - return self._path - if line.startswith('Size: '): - filesize = int(line[6:]) - if filesize > 0: - self._contents.append((self._path, filesize)) - if line.startswith('Flags: '): - flags = line[7:].split() - if 'solid' in flags: - self._is_solid = True - return None - - def is_solid(self): - return self._is_solid - - def _has_encryption(self): - with process.popen(self._get_list_arguments(), - stderr=process.STDOUT, - universal_newlines=True) as proc: - for line in proc.stdout: - line=line.strip() - if line.startswith('Details: ') and 'encrypted headers' in line: - return True - if line.startswith('Flags: ') and 'encrypted' in line: - return True - return False - - def iter_contents(self): - if not self._get_executable(): - return - - # We'll try at most 2 times: - # - the first time without a password - # - a second time with a password if the header is encrypted - for retry_count in range(2): - #: Indicates which part of the file listing has been read. - self._state = self.STATE_HEADER - #: Current path while listing contents. - self._path = None - with process.popen(self._get_list_arguments(), stderr=process.STDOUT, universal_newlines=True) as proc: - try: - for line in proc.stdout: - filename = self._parse_list_output_line(line.rstrip(os.linesep)) - if filename is not None: - yield self._unicode_filename(filename) - except self.EncryptedHeader: - # The header is encrypted, try again - # if it was our first attempt. - if 0 == retry_count: - continue - break - - self.filenames_initialized = True - - def extract(self, filename, destination_dir): - ''' Extract from the archive to . ''' - assert isinstance(filename, str) and \ - isinstance(destination_dir, str) - - if not self._get_executable(): - return - - if not self.filenames_initialized: - self.list_contents() - - destination_path = os.path.join(destination_dir, filename) - desired_filename = self._original_filename(filename) - cmd = self._get_extract_arguments() + [desired_filename] - with self._create_file(destination_path) as output: - process.call(cmd, stdout=output) - return destination_path - - def iter_extract(self, entries, destination_dir): - - if not self._get_executable(): - return - - if not self.filenames_initialized: - self.list_contents() - - with process.popen(self._get_extract_arguments()) as proc: - wanted = dict([(self._original_filename(unicode_name), unicode_name) - for unicode_name in entries]) - - for filename, filesize in self._contents: - data = proc.stdout.read(filesize) - if filename not in wanted: - continue - unicode_name = wanted.get(filename, None) - if unicode_name is None: - continue - with self._create_file(os.path.join(destination_dir, unicode_name)) as new: - new.write(data) - yield unicode_name - del wanted[filename] - if 0 == len(wanted): - break - - @staticmethod - def _find_unrar_executable(): - ''' Tries to start rar/unrar, and returns either 'rar' or 'unrar' if - one of them was started successfully. - Returns None if neither could be started. ''' - global _rar_executable - if _rar_executable == -1: - if 'win32' == sys.platform: - is_not_unrar_free = lambda exe: True - else: - def is_not_unrar_free(exe): - real_exe = exe - while os.path.islink(real_exe): - real_exe = os.readlink(real_exe) - if real_exe.endswith(os.path.sep + 'unrar-free'): - log.warning('RAR executable %s is unrar-free, ignoring', exe) - return False - return True - _rar_executable = process.find_executable(('unrar-nonfree', 'unrar', 'rar'), - is_valid_candidate=is_not_unrar_free) - return _rar_executable - - @staticmethod - def is_available(): - return bool(RarArchive._find_unrar_executable()) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/rar.py mcomix-2.1.0/mcomix/mcomix/archive/rar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/rar.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/rar.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,379 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Glue around libunrar.so/unrar.dll to extract RAR files without having to -resort to calling rar/unrar manually. ''' - -import sys, os -import ctypes, ctypes.util - -from mcomix import constants -from mcomix.archive import archive_base -from mcomix import log - -if sys.platform == 'win32': - UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint, - ctypes.c_long, ctypes.c_long, - ctypes.c_long) -else: - UNRARCALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_uint, - ctypes.c_long, ctypes.c_long, - ctypes.c_long) - -class RarArchive(archive_base.BaseArchive): - ''' Wrapper class for libunrar. All string values passed to this class must be unicode objects. - In turn, all values returned are also unicode. ''' - - # Nope! Not a good idea... - support_concurrent_extractions = False - - class _OpenMode(object): - ''' Rar open mode ''' - RAR_OM_LIST = 0 - RAR_OM_EXTRACT = 1 - - class _ProcessingMode(object): - ''' Rar file processing mode ''' - RAR_SKIP = 0 - RAR_EXTRACT = 2 - - class _ErrorCode(object): - ''' Rar error codes ''' - ERAR_END_ARCHIVE = 10 - ERAR_NO_MEMORY = 11 - ERAR_BAD_DATA = 12 - ERAR_BAD_ARCHIVE = 13 - ERAR_UNKNOWN_FORMAT = 14 - ERAR_EOPEN = 15 - ERAR_ECREATE = 16 - ERAR_ECLOSE = 17 - ERAR_EREAD = 18 - ERAR_EWRITE = 19 - ERAR_SMALL_BUF = 20 - ERAR_UNKNOWN = 21 - ERAR_MISSING_PASSWORD = 22 - - class _RAROpenArchiveDataEx(ctypes.Structure): - ''' Archive header structure. Used by DLL calls. ''' - _pack_ = 1 - _fields_ = [ - ('ArcName', ctypes.c_char_p), - ('ArcNameW', ctypes.c_wchar_p), - ('OpenMode', ctypes.c_uint), - ('OpenResult', ctypes.c_uint), - ('CmtBuf', ctypes.c_char_p), - ('CmtBufSize', ctypes.c_uint), - ('CmtSize', ctypes.c_uint), - ('CmtState', ctypes.c_uint), - ('Flags', ctypes.c_uint), - ('Callback', UNRARCALLBACK), - ('UserData', ctypes.c_long), - ('Reserved', ctypes.c_uint * 28), - ] - - class _RARHeaderDataEx(ctypes.Structure): - ''' Archive file structure. Used by DLL calls. ''' - _pack_ = 1 - _fields_ = [ - ('ArcName', ctypes.c_char * 1024), - ('ArcNameW', ctypes.c_wchar * 1024), - ('FileName', ctypes.c_char * 1024), - ('FileNameW', ctypes.c_wchar * 1024), - ('Flags', ctypes.c_uint), - ('PackSize', ctypes.c_uint), - ('PackSizeHigh', ctypes.c_uint), - ('UnpSize', ctypes.c_uint), - ('UnpSizeHigh', ctypes.c_uint), - ('HostOS', ctypes.c_uint), - ('FileCRC', ctypes.c_uint), - ('FileTime', ctypes.c_uint), - ('UnpVer', ctypes.c_uint), - ('Method', ctypes.c_uint), - ('FileAttr', ctypes.c_uint), - ('CmtBuf', ctypes.c_char_p), - ('CmtBufSize', ctypes.c_uint), - ('CmtSize', ctypes.c_uint), - ('CmtState', ctypes.c_uint), - ('Reserved', ctypes.c_uint * 1024), - ] - - - @staticmethod - def is_available(): - ''' Returns True if unrar.dll can be found, False otherwise. ''' - return bool(_get_unrar_dll()) - - def __init__(self, archive): - ''' Initialize Unrar.dll. ''' - super(RarArchive, self).__init__(archive) - self._unrar = _get_unrar_dll() - self._handle = None - self._callback_function = None - self._is_solid = False - self.is_encrypted = False - # Information about the current file will be stored in this structure - self._headerdata = RarArchive._RARHeaderDataEx() - self._current_filename = None - - # Set up function prototypes. - # Mandatory since pointers get truncated on x64 otherwise! - self._unrar.RAROpenArchiveEx.restype = ctypes.c_void_p - self._unrar.RAROpenArchiveEx.argtypes = \ - [ctypes.POINTER(RarArchive._RAROpenArchiveDataEx)] - self._unrar.RARCloseArchive.restype = ctypes.c_int - self._unrar.RARCloseArchive.argtypes = \ - [ctypes.c_void_p] - self._unrar.RARReadHeaderEx.restype = ctypes.c_int - self._unrar.RARReadHeaderEx.argtypes = \ - [ctypes.c_void_p, ctypes.POINTER(RarArchive._RARHeaderDataEx)] - self._unrar.RARProcessFileW.restype = ctypes.c_int - self._unrar.RARProcessFileW.argtypes = \ - [ctypes.c_void_p, ctypes.c_int, ctypes.c_wchar_p, ctypes.c_wchar_p] - self._unrar.RARSetCallback.argtypes = \ - [ctypes.c_void_p, UNRARCALLBACK, ctypes.c_long] - - self._has_encryption() - - def is_solid(self): - return self._is_solid - - def iter_contents(self): - ''' List archive contents. ''' - self._close() - self._open() - try: - while True: - self._read_header() - if 0 != (0x10 & self._headerdata.Flags): - self._is_solid = True - filename = self._current_filename - yield filename - # Skip to the next entry if we're still on the same name - # (extract may have been called by iter_extract). - if filename == self._current_filename: - self._process() - except UnrarException as exc: - log.error('Error while listing contents: %s', str(exc)) - except EOFError: - # End of archive reached. - pass - finally: - self._close() - - def extract(self, filename, destination_dir): - ''' Extract from the archive to . ''' - if not self._handle: - self._open() - looped = False - destination_path = os.path.join(destination_dir, filename) - while True: - # Check if the current entry matches the requested file. - if self._current_filename is not None: - if (self._current_filename == filename): - # It's the entry we're looking for, extract it. - dest = ctypes.c_wchar_p(destination_path) - self._process(dest) - break - # Not the right entry, skip it. - self._process() - try: - self._read_header() - except EOFError: - # Archive end was reached, this might be due to out-of-order - # extraction while the handle was still open. Close the - # archive and jump back to archive start and try to extract - # file again. Do this only once; if the file isn't found after - # a second full pass, it probably doesn't even exist in the - # archive. - if looped: - break - self._open() - # After the method returns, the RAR handler is still open and pointing - # to the next archive file. This will improve extraction speed for sequential file reads. - # After all files have been extracted, close() should be called to free the handler resources. - return destination_path - - def close(self): - ''' Close the archive handle ''' - self._close() - - def _open(self): - ''' Open rar handle for extraction. ''' - self._callback_function = UNRARCALLBACK(self._password_callback) - archivedata = RarArchive._RAROpenArchiveDataEx(ArcNameW=self.archive, - OpenMode=RarArchive._OpenMode.RAR_OM_EXTRACT, - Callback=self._callback_function, - UserData=0) - - handle = self._unrar.RAROpenArchiveEx(ctypes.byref(archivedata)) - if not handle: - errormessage = UnrarException.get_error_message(archivedata.OpenResult) - raise UnrarException('Couldn\'t open archive: %s' % errormessage) - self._unrar.RARSetCallback(handle, self._callback_function, 0) - self._handle = handle - - def _has_encryption(self): - ''' Checks archive encryption. ''' - archivedata = RarArchive._RAROpenArchiveDataEx( - ArcNameW=self.archive, - OpenMode=RarArchive._OpenMode.RAR_OM_LIST, - UserData=0 - ) - - handle = self._unrar.RAROpenArchiveEx(ctypes.byref(archivedata)) - if not handle: - errormessage = UnrarException.get_error_message(archivedata.OpenResult) - raise UnrarException('Couldn\'t open archive: %s' % errormessage) - self._handle = handle - # 0x0080 Block headers are encrypted - if archivedata.Flags & 0x0080: - self.is_encrypted = True - else: - self._read_header() - # 0x04 File encrypted with password - if 0x04 & self._headerdata.Flags: - self.is_encrypted = True - self._close() - - def _check_errorcode(self, errorcode): - if 0 == errorcode: - # No error. - return - self._close() - if RarArchive._ErrorCode.ERAR_END_ARCHIVE == errorcode: - # End of archive reached. - exc = EOFError() - else: - errormessage = UnrarException.get_error_message(errorcode) - exc = UnrarException(errormessage) - raise exc - - def _read_header(self): - self._current_filename = None - errorcode = self._unrar.RARReadHeaderEx(self._handle, ctypes.byref(self._headerdata)) - self._check_errorcode(errorcode) - self._current_filename = self._headerdata.FileNameW - - def _process(self, dest=None): - ''' Process current entry: extract or skip it. ''' - if dest is None: - mode = RarArchive._ProcessingMode.RAR_SKIP - else: - mode = RarArchive._ProcessingMode.RAR_EXTRACT - errorcode = self._unrar.RARProcessFileW(self._handle, mode, None, dest) - self._current_filename = None - self._check_errorcode(errorcode) - - def _close(self): - ''' Close the rar handle previously obtained by open. ''' - if self._handle is None: - return - errorcode = self._unrar.RARCloseArchive(self._handle) - if errorcode != 0: - errormessage = UnrarException.get_error_message(errorcode) - raise UnrarException('Couldn\'t close archive: %s' % errormessage) - self._handle = None - - def _password_callback(self, msg, userdata, buffer_address, buffer_size): - ''' Called by the unrar library in case of missing password. ''' - if msg == 2: # UCM_NEEDPASSWORD - self._get_password() - if len(self._password) == 0: - # Abort extraction - return -1 - password = ctypes.create_unicode_buffer(self._password).value.encode('utf8') - copy_size = min(buffer_size, len(password)) - ctypes.memmove(buffer_address, password, copy_size) - return 0 - else: - # Continue operation - return 1 - -class UnrarException(Exception): - ''' Exception class for RarArchive. ''' - - _exceptions = { - RarArchive._ErrorCode.ERAR_END_ARCHIVE: 'End of archive', - RarArchive._ErrorCode.ERAR_NO_MEMORY: 'Not enough memory to initialize data structures', - RarArchive._ErrorCode.ERAR_BAD_DATA: 'Bad data, CRC mismatch', - RarArchive._ErrorCode.ERAR_BAD_ARCHIVE: 'Volume is not valid RAR archive', - RarArchive._ErrorCode.ERAR_UNKNOWN_FORMAT: 'Unknown archive format', - RarArchive._ErrorCode.ERAR_EOPEN: 'Volume open error', - RarArchive._ErrorCode.ERAR_ECREATE: 'File create error', - RarArchive._ErrorCode.ERAR_ECLOSE: 'File close error', - RarArchive._ErrorCode.ERAR_EREAD: 'Read error', - RarArchive._ErrorCode.ERAR_EWRITE: 'Write error', - RarArchive._ErrorCode.ERAR_SMALL_BUF: 'Buffer too small', - RarArchive._ErrorCode.ERAR_UNKNOWN: 'Unknown error', - RarArchive._ErrorCode.ERAR_MISSING_PASSWORD: 'Password missing', - } - - @staticmethod - def get_error_message(errorcode): - if errorcode in UnrarException._exceptions: - return UnrarException._exceptions[errorcode] - else: - return 'Unkown error' - -# Filled on-demand by _get_unrar_dll -_unrar_dll = -1 - -def _get_unrar_dll(): - ''' Tries to load libunrar and will return a handle of it. - Returns None if an error occured or the library couldn't be found. ''' - global _unrar_dll - if _unrar_dll != -1: - return _unrar_dll - - # Load unrar.dll on win32 - if sys.platform == 'win32': - # file name of x64 version of unrar.dll is unrar64.dll - dllname = 'unrar64.dll' if sys.maxsize > 2**32 else 'unrar.dll' - - # First, search for unrar.dll in PATH - unrar_path = ctypes.util.find_library(dllname) - if unrar_path: - try: - _unrar_dll = ctypes.windll.LoadLibrary(unrar_path) - return _unrar_dll - except WindowsError: - pass - - # The file wasn't found in PATH, try MComix' root directory - try: - _unrar_dll = ctypes.windll.LoadLibrary(os.path.join(constants.BASE_PATH, dllname)) - return _unrar_dll - except WindowsError: - pass - - # Last attempt, just use the current directory - try: - _unrar_dll = ctypes.windll.LoadLibrary(dllname) - except WindowsError: - _unrar_dll = None - - return _unrar_dll - - # Load libunrar.so on UNIX - else: - # find_library on UNIX uses various mechanisms to determine the path - # of a library, so one could assume the library is not installed - # when find_library fails - unrar_path = ctypes.util.find_library('unrar') or \ - '/usr/lib/libunrar.so' - - if unrar_path: - try: - _unrar_dll = ctypes.cdll.LoadLibrary(unrar_path) - return _unrar_dll - except OSError: - pass - - # Last attempt, try the current directory - try: - _unrar_dll = ctypes.cdll.LoadLibrary(os.path.join(os.getcwd(), 'libunrar.so')) - except OSError: - _unrar_dll = None - - return _unrar_dll - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/sevenzip_external.py mcomix-2.1.0/mcomix/mcomix/archive/sevenzip_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/sevenzip_external.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/sevenzip_external.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- - -''' 7z archive extractor. ''' - -import os -import sys -import tempfile - -from mcomix import process -from mcomix.archive import archive_base - -# Filled on-demand by SevenZipArchive -_7z_executable = -1 - -class SevenZipArchive(archive_base.ExternalExecutableArchive): - ''' 7z file extractor using the 7z executable. ''' - - STATE_HEADER, STATE_LISTING, STATE_FOOTER = 1, 2, 3 - - class EncryptedHeader(Exception): - pass - - def __init__(self, archive): - super(SevenZipArchive, self).__init__(archive) - self._is_solid = False - self._contents = [] - - self.is_encrypted = False - self.is_encrypted = self._has_encryption() - - def _get_executable(self): - return SevenZipArchive._find_7z_executable() - - def _get_password_argument(self): - if self.is_encrypted: - self._get_password() - return '-p' + self._password - else: - # Add an empty password anyway, to prevent deadlock on reading for - # input if we did not correctly detect the archive is encrypted. - return '-p' - - def _get_list_arguments(self): - args = [self._get_executable(), 'l', '-slt'] - if sys.platform == 'win32': - # This switch is only supported on Win32. - args.append('-sccUTF-8') - args.append(self._get_password_argument()) - args.extend(('--', self.archive)) - return args - - def _get_extract_arguments(self, list_file=None): - args = [self._get_executable(), 'x', '-so'] - if list_file is not None: - args.append('-i@' + list_file) - args.append(self._get_password_argument()) - args.extend(('--', self.archive)) - return args - - def _parse_list_output_line(self, line): - ''' Start parsing after the first delimiter (bunch of - characters), - and end when delimiters appear again. Format: - Date Time Attr Size Compressed Name''' - - # Encoding is only guaranteed on win32 due to the -scc switch. - if sys.platform == 'win32': - line = line.decode('utf-8') - - if line.startswith('----------'): - if self._state == self.STATE_HEADER: - # First delimiter reached, start reading from next line. - self._state = self.STATE_LISTING - elif self._state == self.STATE_LISTING: - # Last delimiter read, stop reading from now on. - self._state = self.STATE_FOOTER - - return None - - if self._state == self.STATE_HEADER: - if (line.startswith('Error:') or line.startswith('ERROR:')) and \ - line.endswith(': Can not open encrypted archive. Wrong password?'): - raise self.EncryptedHeader() - if 'Solid = +' == line: - self._is_solid = True - - if self._state == self.STATE_LISTING: - if line.startswith('Path = '): - self._path = line[7:] - return self._path - if line.startswith('Size = '): - filesize = int(line[7:]) - if filesize > 0: - self._contents.append((self._path, filesize)) - - return None - - def _has_encryption(self): - with process.popen(self._get_list_arguments(), - stderr=process.STDOUT, - universal_newlines=True) as proc: - for line in proc.stdout: - if line.startswith('Encrypted = +'): - return True - if 'Can not open encrypted archive. Wrong password' in line: - return True - return False - - def is_solid(self): - return self._is_solid - - def iter_contents(self): - if not self._get_executable(): - return - - # We'll try at most 2 times: - # - the first time without a password - # - a second time with a password if the header is encrypted - for retry_count in range(2): - #: Indicates which part of the file listing has been read. - self._state = self.STATE_HEADER - #: Current path while listing contents. - self._path = None - with process.popen(self._get_list_arguments(), stderr=process.STDOUT, universal_newlines=True) as proc: - try: - for line in proc.stdout: - filename = self._parse_list_output_line(line.rstrip(os.linesep)) - if filename is not None: - yield self._unicode_filename(filename) - except self.EncryptedHeader: - # The header is encrypted, try again - # if it was our first attempt. - if 0 == retry_count: - continue - break - - self.filenames_initialized = True - - def extract(self, filename, destination_dir): - ''' Extract from the archive to . ''' - assert isinstance(filename, str) and \ - isinstance(destination_dir, str) - - if not self._get_executable(): - return - - if not self.filenames_initialized: - self.list_contents() - - destination_path = os.path.join(destination_dir, filename) - with tempfile.NamedTemporaryFile(mode='wt', prefix='mcomix.7z.') as tmplistfile: - desired_filename = self._original_filename(filename) - tmplistfile.write(desired_filename + os.linesep) - tmplistfile.flush() - with self._create_file(destination_path) as output: - process.call(self._get_extract_arguments(list_file=tmplistfile.name), - stdout=output) - return destination_path - - def iter_extract(self, entries, destination_dir): - - if not self._get_executable(): - return - - if not self.filenames_initialized: - self.list_contents() - - with process.popen(self._get_extract_arguments()) as proc: - wanted = dict([(self._original_filename(unicode_name), unicode_name) - for unicode_name in entries]) - - for filename, filesize in self._contents: - data = proc.stdout.read(filesize) - if filename not in wanted: - continue - unicode_name = wanted.get(filename, None) - if unicode_name is None: - continue - with self._create_file(os.path.join(destination_dir, unicode_name)) as new: - new.write(data) - yield unicode_name - del wanted[filename] - if 0 == len(wanted): - break - - @staticmethod - def _find_7z_executable(): - ''' Tries to start 7z, and returns either '7z' if - it was started successfully or None otherwise. ''' - global _7z_executable - if _7z_executable == -1: - _7z_executable = process.find_executable(('7z',)) - return _7z_executable - - @staticmethod - def is_available(): - return bool(SevenZipArchive._find_7z_executable()) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/squashfs.py mcomix-2.1.0/mcomix/mcomix/archive/squashfs.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/squashfs.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/squashfs.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -from mcomix.archive import archive_base - -class SquashfsArchive(archive_base.MountArchive): - def __init__(self,archive): - super(SquashfsArchive,self).__init__(archive,'squashfuse') - - @staticmethod - def is_available(): - return archive_base.MountArchive._is_available('squashfuse') diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/tar.py mcomix-2.1.0/mcomix/mcomix/archive/tar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/tar.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/tar.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Unicode-aware wrapper for tarfile.TarFile. ''' - -import collections -import os -import tarfile -import threading - -from mcomix import log -from mcomix.archive import archive_base - -class TarArchive(archive_base.NonUnicodeArchive): - def __init__(self, archive): - super(TarArchive, self).__init__(archive) - self._tar = tarfile.open(self.archive, 'r:*') - self._lock = threading.Lock() - - # tarfile is not thread-safe - # so use OrderedDict to save TarInfo in order - # {unicode_name: TarInfo} - self._contents_info = collections.OrderedDict() - for member in self._tar.getmembers(): - if tarfile.ENCODING == 'utf-8': - # filename is utf8 encoded - self._contents_info[member.name] = member - else: - # tarfile use tarfile.ENCODING to decode non-utf8 filename - # revert to bytes before guessing encode - name_bytes = member.name.encode(tarfile.ENCODING) - self._contents_info[self._unicode_filename(name_bytes)] = member - - def is_solid(self): - return True - - def iter_contents(self): - yield from self._contents_info.keys() - - def extract(self, filename, destination_dir): - destination_path = os.path.join(destination_dir, filename) - member = self._contents_info[filename] - with self._lock: - try: - with self._tar.extractfile(member) as fp: - data = fp.read() - except AttributeError: - log.warning(_('Corrupted file: %(filename)s'), - {'filename': filename}) - with self._create_file(destination_path) as new: - new.write(data) - return destination_path - - def close(self): - self._tar.close() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/zip_external.py mcomix-2.1.0/mcomix/mcomix/archive/zip_external.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/zip_external.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/zip_external.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- - -''' ZIP archive extractor via executable.''' - -from mcomix import i18n -from mcomix import process -from mcomix.archive import archive_base - -# Filled on-demand by ZipArchive -_zip_executable = -1 - -class ZipArchive(archive_base.ExternalExecutableArchive): - ''' ZIP file extractor using unzip executable. ''' - - def _get_executable(self): - return ZipArchive._find_unzip_executable() - - def _get_list_arguments(self): - return ['-Z1'] - - def _get_extract_arguments(self): - return ['-p', '-P', ''] - - @staticmethod - def _find_unzip_executable(): - ''' Tries to run unzip, and returns 'unzip' on success. - Returns None on failure. ''' - global _zip_executable - if -1 == _zip_executable: - _zip_executable = process.find_executable(('unzip',)) - return _zip_executable - - @staticmethod - def is_available(): - return bool(ZipArchive._find_unzip_executable()) - - def _unicode_filename(self, filename, conversion_func=i18n.to_unicode): - unicode_name = conversion_func(filename) - safe_name = self._replace_invalid_filesystem_chars(unicode_name) - # As it turns out, unzip will try to interpret filenames as glob... - for c in '[*?': - filename = filename.replace(c, '[' + c + ']') - # Won't work on Windows... - filename = filename.replace('\\', '\\\\') - self.unicode_mapping[safe_name] = filename - return safe_name - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/zip_py.py mcomix-2.1.0/mcomix/mcomix/archive/zip_py.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive/zip_py.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive/zip_py.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Unicode-aware wrapper for zipfile.ZipFile. ''' - -import collections -import os -import threading -import zipfile - -from mcomix import log -from mcomix.archive import archive_base - -def is_py_supported_zipfile(path): - '''Check if a given zipfile has all internal files stored with Python supported compression - ''' - with zipfile.ZipFile(path, mode='r') as zip_file: - for file_info in zip_file.infolist(): - try: - descr=zipfile._get_decompressor(file_info.compress_type) - except: - return False - return True - -class ZipArchive(archive_base.NonUnicodeArchive): - def __init__(self, archive): - super(ZipArchive, self).__init__(archive) - self._zip = zipfile.ZipFile(archive, 'r') - self._lock = threading.Lock() - - # zipfile is usually not thread-safe - # so use OrderedDict to save ZipInfo in order - # {unicode_name: ZipInfo} - self._contents_info = collections.OrderedDict() - for info in self._zip.infolist(): - if info.flag_bits & 0x800: - # filename is utf8 encoded - self._contents_info[info.filename] = info - else: - # zipfile use cp437 to decode non-utf8 filename - # revert to bytes before guessing encode - fn_bytes = info.filename.encode('cp437') - self._contents_info[self._unicode_filename(fn_bytes)] = info - - self.is_encrypted = self._has_encryption() - self._password = None - - def is_solid(self): - # zipfile is usually not thread-safe - # so treat it as a solid archive to reduce seek operate - return True - - def iter_contents(self): - if self.is_encrypted and not self._password: - self._get_password() - self._zip.setpassword(self._password) - yield from self._contents_info.keys() - - def extract(self, filename, destination_dir): - destination_path = os.path.join(destination_dir, filename) - info = self._contents_info[filename] - with self._lock: - data = self._zip.read(info) - with self._create_file(destination_path) as new: - filelen = new.write(data) - - if filelen != info.file_size: - log.warning( - _('%(filename)s\'s extracted size is %(actual_size)d bytes,' - ' but should be %(expected_size)d bytes.' - ' The archive might be corrupt or in an unsupported format.'), - {'filename': filename, 'actual_size': filelen, - 'expected_size': info.file_size}) - return destination_path - - def close(self): - self._zip.close() - - def _has_encryption(self): - ''' Checks all files in the archive for encryption. - Returns True if at least one encrypted file was found. ''' - for info in self._contents_info.values(): - if info.flag_bits & 0x1: # File is encrypted - return True - return False - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_extractor.py mcomix-2.1.0/mcomix/mcomix/archive_extractor.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_extractor.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive_extractor.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,212 +0,0 @@ -'''archive_extractor.py - Archive extraction class.''' - -import os -import threading -import traceback - -from mcomix import archive_tools -from mcomix import callback -from mcomix import log -from mcomix.lib import mt -from mcomix.preferences import prefs - -class Extractor(object): - - '''Extractor is a threaded class for extracting different archive formats. - - The Extractor can be loaded with paths to archives and a path to a - destination directory. Once an archive has been set and its contents - listed, it is possible to filter out the files to be extracted and set the - order in which they should be extracted. The extraction can then be - started in a new thread in which files are extracted one by one, and a - signal is sent on a condition after each extraction, so that it is possible - for other threads to wait on specific files to be ready. - - Note: Support for gzip/bzip2 compressed tar archives is limited, see - set_files() for more info. - ''' - - def __init__(self): - self._setupped = False - self._threadpool = mt.ThreadPool( - name=self.__class__.__name__, - processes=prefs['max extract threads'] or None) - - def setup(self, src, type=None): - '''Setup the extractor with archive and destination dir . - Return a threading.Condition related to the is_ready() method, or - None if the format of isn't supported. - ''' - self._src = src - self._files = [] - self._extracted = set() - self._archive = archive_tools.get_recursive_archive_handler( - src, type=type, prefix='mcomix.extractor.') - if self._archive is None: - msg = _('Non-supported archive format: %s') % os.path.basename(src) - log.warning(msg) - raise ArchiveException(msg) - - self._dst = self._archive.destdir - self._contents_listed = False - self._extract_started = False - self._condition = threading.Condition() - self._threadpool.apply_async( - self._list_contents,callback=self._list_contents_cb, - error_callback=self._list_contents_errcb) - self._setupped = True - - return self._condition - - def get_files(self): - '''Return a list of names of all the files the extractor is currently - set for extracting. After a call to setup() this is by default all - files found in the archive. The paths in the list are relative to - the archive root and are not absolute for the files once extracted. - ''' - with self._condition: - if not self._contents_listed: - return - return self._files[:] - - def get_directory(self): - '''Returns the root extraction directory of this extractor.''' - return self._dst - - def set_files(self, files): - '''Set the files that the extractor should extract from the archive in - the order of extraction. Normally one would get the list of all files - in the archive using get_files(), then filter and/or permute this - list before sending it back using set_files(). - - Note: Random access on gzip or bzip2 compressed tar archives is - no good idea. These formats are supported *only* for backwards - compability. They are fine formats for some purposes, but should - not be used for scanned comic books. So, we cheat and ignore the - ordering applied with this method on such archives. - ''' - with self._condition: - if not self._contents_listed: - return - self._files[:] = [f for f in files if f not in self._extracted] - if not self._files: - # Nothing to do! - return - if self._extract_started: - self.extract() - - def is_ready(self, name): - '''Return True if the file in the extractor's file list - (as set by set_files()) is fully extracted. - ''' - with self._condition: - return name in self._extracted - - def stop(self): - '''Signal the extractor to stop extracting and kill the extracting - thread. Blocks until the extracting thread has terminated. - ''' - self._threadpool.renew() - if self._setupped: - if self._extract_started: - self._extract_thread.stop() - self._extract_started = False - self.setupped = False - - def extract(self): - '''Start extracting the files in the file list one by one using a - new thread. Every time a new file is extracted a notify() will be - signalled on the Condition that was returned by setup(). - ''' - with self._condition: - if not self._contents_listed: - return - if not self._extract_started: - mt = self._archive.support_concurrent_extractions \ - and not self._archive.is_solid() - if mt: - self._threadpool.ucbmap( - self._extract_file,self._files, - callback=self._extraction_finished, - error_callback=self._extract_files_errcb) - else: - self._threadpool.apply_async( - self._extract_all_files, - error_callback=self._extract_files_errcb) - - @callback.Callback - def contents_listed(self, extractor, files): - ''' Called after the contents of the archive has been listed. ''' - pass - - @callback.Callback - def file_extracted(self, extractor, filename): - ''' Called whenever a new file is extracted and ready. ''' - pass - - def close(self): - '''Close any open file objects, need only be called manually if the - extract() method isn't called. - ''' - self.stop() - if self._archive: - self._archive.close() - - def _extraction_finished(self, name): - if self._threadpool.closed: - return - with self._condition: - self._files.remove(name) - self._extracted.add(name) - self._condition.notifyAll() - self.file_extracted(self, name) - - def _extract_all_files(self): - # With multiple extractions for each pass, some of the files might have - # already been extracted. - with self._condition: - files = list(set(self._files) - self._extracted) - - log.debug('Extracting from "%s" to "%s": "%s"', - self._src, self._dst, '", "'.join(files)) - for name in self._archive.iter_extract(files, self._dst): - self._extraction_finished(name) - - def _extract_file(self, name): - '''Extract the file named to the destination directory, - mark the file as "ready", then signal a notify() on the Condition - returned by setup(). - ''' - log.debug('Extracting from "%s" to "%s": "%s"', - self._src, self._dst, name) - self._archive.extract(name) - return name - - def _extract_files_errcb(self, name, etype, value, tb): - # Better to ignore any failed extractions (e.g. from a corrupt - # archive) than to crash here and leave the main thread in a - # possible infinite block. Damaged or missing files *should* be - # handled gracefully by the main program anyway. - log.error(_('! Extraction error: %s'), value) - log.debug('Traceback:\n%s', - ''.join(traceback.format_tb(tb)).strip()) - - def _list_contents(self): - return [filename for filename in self._archive.iter_contents()] - - def _list_contents_cb(self, files): - with self._condition: - self._files[:] = files - self._contents_listed = True - self.contents_listed(self, files) - - def _list_contents_errcb(self, name, etype, value, tb): - log.error(_('! Extraction error: %s'), value) - log.debug('Traceback:\n%s', - ''.join(traceback.format_tb(tb)).strip()) - -class ArchiveException(Exception): - ''' Indicate error during extraction operations. ''' - pass - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_packer.py mcomix-2.1.0/mcomix/mcomix/archive_packer.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_packer.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive_packer.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -'''archive_packer.py - Archive creation class.''' - -import io -import os -import shutil -import threading -import zipfile - -from mcomix import log - -class Packer(object): - - '''Packer is a threaded class for packing files into ZIP archives. - - It would be straight-forward to add support for more archive types, - but basically all other types are less well fitted for this particular - task than ZIP archives are (yes, really). - ''' - - def __init__(self, image_files, other_files, archive_path, base_name): - '''Setup a Packer object to create a ZIP archive at . - All files pointed to by paths in the sequences and - will be included in the archive when packed. - - The files in will be renamed on the form - "NN - .ext", so that the lexical ordering of their - filenames match that of their order in the list. - - The files in will be included as they are, - assuming their filenames does not clash with other filenames in - the archive. All files are placed in the archive root. - ''' - self._image_files = image_files - self._other_files = other_files - self._archive_path = archive_path - self._base_name = base_name - self._pack_thread = None - self._packing_successful = False - - def pack(self): - '''Pack all the files in the file lists into the archive.''' - self._pack_thread = threading.Thread(target=self._thread_pack) - self._pack_thread.name += '-pack' - self._pack_thread.daemon=False - self._pack_thread.start() - - def wait(self): - '''Block until the packer thread has finished. Return True if the - packer finished its work successfully. - ''' - if self._pack_thread != None: - self._pack_thread.join() - - return self._packing_successful - - def _thread_pack(self): - - used = set() - fmt = '{{page:0{}d}} - {}{{ext}}'.format( - len(str(len(self._image_files))), self._base_name) - with io.BytesIO() as buf: - with zipfile.ZipFile(buf, mode='w', allowZip64=True) as zfile: - try: - for i, path in enumerate(self._image_files, start=1): - b, e = os.path.splitext(path) - fname = fmt.format(page=i, ext=e) - used.add(fname) - zfile.write(path, arcname=fname, - compress_type=zipfile.ZIP_DEFLATED, - compresslevel=9) - - for path in self._other_files: - fname = os.path.basename(path) - while fname in used: - fname = '_{}'.format(fname) - used.add(fname) - zfile.write(path, arcname=fname, - compress_type=zipfile.ZIP_DEFLATED, - compresslevel=9) - - except Exception as e: - log.error(_('! Could not create archive, {}').format(e)) - return - - # full data of zipfile is completed here - archivedata = buf.getvalue() - - archive_dir = os.path.dirname(self._archive_path) - archive_len = len(archivedata) - if shutil.disk_usage(archive_dir).free < archive_len: - log.error(_('! Directory {} is out of space, {} needed.').format( - archive_dir, tools.format_byte_size(archive_len) - )) - return - - try: - with open(self._archive_path, mode='wb') as fp: - fp.write(archivedata) - except Exception as e: - log.error(_('! Could not create archive at path "%s", {}').format(e), - self._archive_path) - try: - os.remove(self._archive_path) - except: - pass - else: - self._packing_successful = True - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_tools.py mcomix-2.1.0/mcomix/mcomix/archive_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/archive_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/archive_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,230 +0,0 @@ -'''archive_tools.py - Archive tool functions.''' - -import os -import re -import shutil -import zipfile -import tarfile -import tempfile -import operator - -from mcomix import image_tools -from mcomix import constants -from mcomix import log -from mcomix.archive import ( - archivemount, - lha_external, - pdf_external, - rar, - rar_external, - sevenzip_external, - squashfs, - tar, - zip_py, - zip_external, -) - -# Handlers for each archive type. -_HANDLERS = { - constants.ZIP: ( - zip_py.ZipArchive, - ), - constants.ZIP_EXTERNAL: ( - # Prefer 7z over zip executable for encryption and Unicode support. - sevenzip_external.SevenZipArchive, - zip_external.ZipArchive - ), - constants.TAR: ( - archivemount.ArchivemountArchive, - tar.TarArchive, - ), - constants.GZIP: ( - tar.TarArchive, - ), - constants.BZIP2: ( - tar.TarArchive, - ), - constants.XZ: ( - tar.TarArchive, - ), - constants.RAR: ( - rar.RarArchive, - rar_external.RarArchive, - # Last resort: some versions of 7z support RAR. - sevenzip_external.SevenZipArchive, - ), - constants.LHA: ( - # Prefer 7z over lha executable for Unicode support. - sevenzip_external.SevenZipArchive, - lha_external.LhaArchive, - ), - constants.SEVENZIP: ( - sevenzip_external.SevenZipArchive, - ), - constants.PDF: ( - pdf_external.PdfArchive, - ), - constants.SQUASHFS: ( - squashfs.SquashfsArchive, - sevenzip_external.SevenZipArchive, - ), -} - -def _get_handler(archive_type): - ''' Return best archive class for format ''' - - for handler in _HANDLERS[archive_type]: - if not hasattr(handler, 'is_available'): - return handler - if handler.is_available(): - return handler - -def _is_available(archive_type): - ''' Return True if a handler supporting the format is available ''' - return _get_handler(archive_type) is not None - -def szip_available(): - return _is_available(constants.SEVENZIP) - -def rar_available(): - return _is_available(constants.RAR) - -def lha_available(): - return _is_available(constants.LHA) - -def pdf_available(): - return _is_available(constants.PDF) - -def squashfs_available(): - return _is_available(constants.SQUASHFS) - -SUPPORTED_ARCHIVE_EXTS=set() -SUPPORTED_ARCHIVE_FORMATS={} - -def init_supported_formats(): - for name, formats, is_available in ( - ('ZIP', constants.ZIP_FORMATS , True ), - ('Tar', constants.TAR_FORMATS , True ), - ('RAR', constants.RAR_FORMATS , rar_available() ), - ('7z' , constants.SZIP_FORMATS, szip_available()), - ('LHA', constants.LHA_FORMATS , lha_available() ), - ('PDF', constants.PDF_FORMATS , pdf_available() ), - ('SquashFS', constants.SQUASHFS_FORMATS , squashfs_available() ), - ): - if not is_available: - continue - SUPPORTED_ARCHIVE_FORMATS[name]=(set(),set()) - for ext, mime in formats: - SUPPORTED_ARCHIVE_FORMATS[name][0].add(mime.lower()) - SUPPORTED_ARCHIVE_FORMATS[name][1].add(ext.lower()) - # also add to supported extensions list - SUPPORTED_ARCHIVE_EXTS.update(SUPPORTED_ARCHIVE_FORMATS[name][1]) - -def get_supported_formats(): - if not SUPPORTED_ARCHIVE_FORMATS: - init_supported_formats() - return SUPPORTED_ARCHIVE_FORMATS - -def is_archive_file(path): - if not SUPPORTED_ARCHIVE_FORMATS: - init_supported_formats() - return path.lower().endswith(tuple(SUPPORTED_ARCHIVE_EXTS)) - -def archive_mime_type(path): - '''Return the archive type of or None for non-archives.''' - try: - - if os.path.isfile(path): - - if not os.access(path, os.R_OK): - return None - - if zipfile.is_zipfile(path): - if zip_py.is_py_supported_zipfile(path): - return constants.ZIP - else: - return constants.ZIP_EXTERNAL - - with open(path, 'rb') as fd: - magic = fd.read(10) - - try: - istarfile = tarfile.is_tarfile(path) - except IOError: - # Tarfile raises an error when accessing certain network shares - istarfile = False - - if istarfile and os.path.getsize(path) > 0: - if magic.startswith(b'\x1f\x8b\x08'): - return constants.GZIP - elif magic.startswith(b'BZh') and magic[4:10] == b'1AY&SY': - return constants.BZIP2 - elif magic.startswith((b'\x5d\x00\x00\x80', b'\xfd7zXZ')): - return constants.XZ - else: - return constants.TAR - - if magic.startswith(b'Rar!\x1a\x07'): - return constants.RAR - - if magic[0:6] == b'7z\xbc\xaf\x27\x1c': - return constants.SEVENZIP - - if magic[2:].startswith((b'-lh',b'-lz')): - return constants.LHA - - if magic[0:4] == b'%PDF': - return constants.PDF - - if magic.startswith((b'sqsh',b'hsqs')): - return constants.SQUASHFS - - except Exception: - log.warning(_('! Could not read %s'), path) - - return None - -def get_archive_info(path): - '''Return a tuple (mime, num_pages, size) with info about the archive - at , or None if doesn't point to a supported - ''' - mime = archive_mime_type(path) - with get_recursive_archive_handler(path, type=mime, - prefix='mcomix_archive_info.') as archive: - if archive is None: - return None - - files = archive.list_contents(decrypt=False) - num_pages = sum([image_tools.is_image_file(f) for f in files]) - size = os.stat(path).st_size - - return (mime, num_pages, size) - -def get_archive_handler(path, type=None): - ''' Returns a fitting extractor handler for the archive passed - in (with optional mime type . Returns None if no matching - extractor was found. - ''' - if type is None: - type = archive_mime_type(path) - if type is None: - return None - - handler = _get_handler(type) - if handler is None: - return None - - return handler(path) - -def get_recursive_archive_handler(path, type=None, **kwargs): - ''' Same as but the handler will transparently handle - archives within archives. - ''' - archive = get_archive_handler(path, type=type) - if archive is None: - return None - # XXX: Deferred import to avoid circular dependency - from mcomix.archive import archive_recursive - return archive_recursive.RecursiveArchive(archive, **kwargs) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_backend.py mcomix-2.1.0/mcomix/mcomix/bookmark_backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_backend.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/bookmark_backend.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,225 +0,0 @@ -'''bookmark_backend.py - Bookmarks handler.''' - -import json -import operator -import os -import time - -from gi.repository import Gtk - -from mcomix import constants -from mcomix import log -from mcomix import bookmark_menu_item -from mcomix import callback -from mcomix import i18n -from mcomix import message_dialog -from mcomix import tools -from mcomix.preferences import prefs - -class __BookmarksStore(object): - - '''The _BookmarksStore is a backend for both the bookmarks menu and dialog. - Changes in the _BookmarksStore are mirrored in both. - ''' - - def __init__(self): - self._initialized = False - self._window = None - self._file_handler = None - self._image_handler = None - - bookmarks, mtime = self.load_bookmarks() - - #: List of bookmarks - self._bookmarks = bookmarks - #: Modification date of bookmarks file - self._bookmarks_mtime = mtime - - def initialize(self, window): - ''' Initializes references to the main window and file/image handlers. ''' - if not self._initialized: - self._window = window - self._file_handler = window.filehandler - self._image_handler = window.imagehandler - self._initialized = True - - # Update already loaded bookmarks with window and file handler information - for bookmark in self._bookmarks: - bookmark._window = window - bookmark._file_handler = window.filehandler - - def add_bookmark_by_values(self, name, path, page, numpages, archive_type, epoch): - '''Create a bookmark and add it to the list.''' - bookmark = bookmark_menu_item._Bookmark( - self._window, self._file_handler, - name, path, page, numpages, archive_type, epoch) - - self.add_bookmark(bookmark) - - @callback.Callback - def add_bookmark(self, bookmark): - '''Add the to the list.''' - self._bookmarks.append(bookmark) - self.write_bookmarks_file() - - @callback.Callback - def remove_bookmark(self, bookmark): - '''Remove the from the list.''' - self._bookmarks.remove(bookmark) - self.write_bookmarks_file() - - def add_current_to_bookmarks(self): - '''Add the currently viewed page to the list.''' - name = self._image_handler.get_pretty_current_filename() - path = self._image_handler.get_real_path() - - path = tools.relpath2root(path,abs_fallback=prefs['portable allow abspath']) - if not path: - # path is None, means running in portable mode - # and currect image is out of same mount point - # so do not create bookmarks - return - - page = self._image_handler.get_current_page() - numpages = self._image_handler.get_number_of_pages() - archive_type = self._file_handler.archive_type - epoch = time.time() - - same_file_bookmarks = [] - - for bookmark in self._bookmarks: - if bookmark.same_path(path): - if bookmark.same_page(page): - # Do not create identical bookmarks - return - else: - same_file_bookmarks.append(bookmark) - - # If the same file was already bookmarked, ask to replace - # the existing bookmarks before deleting them. - if len(same_file_bookmarks) > 0: - response = self.show_replace_bookmark_dialog(same_file_bookmarks, page) - - # Delete old bookmarks - if response == Gtk.ResponseType.YES: - for bookmark in same_file_bookmarks: - self.remove_bookmark(bookmark) - # Perform no action - elif response not in (Gtk.ResponseType.YES, Gtk.ResponseType.NO): - return - - self.add_bookmark_by_values( - name, path, page, numpages, archive_type, epoch) - - def clear_bookmarks(self): - '''Remove all bookmarks from the list.''' - - while not self.is_empty(): - self.remove_bookmark(self._bookmarks[-1]) - - def get_bookmarks(self): - '''Return all the bookmarks in the list.''' - if not self.file_was_modified(): - return self._bookmarks - else: - self._bookmarks, self._bookmarks_mtime = self.load_bookmarks() - return self._bookmarks - - def is_empty(self): - '''Return True if the bookmark list is empty.''' - return len(self._bookmarks) == 0 - - def load_bookmarks(self): - ''' Loads persisted bookmarks from a local file. - @return: Tuple of (bookmarks, file mtime) - ''' - - path = constants.BOOKMARK_JSON_PATH - bookmarks = [] - mtime = 0 - - if os.path.isfile(path): - try: - mtime = os.stat(path).st_mtime - with open(path, mode='rt', encoding='utf8') as fd: - version,packs = json.load(fd) - except Exception: - log.error(_('! Could not parse bookmarks file %s'), path) - else: - for pack in packs: - bookmarks.append(bookmark_menu_item._Bookmark( - self._window, self._file_handler, *pack)) - - return bookmarks, mtime - - def file_was_modified(self): - ''' Checks the bookmark store's mtime to see if it has been modified - since it was last read. ''' - path = constants.BOOKMARK_JSON_PATH - if os.path.isfile(path): - try: - mtime = os.stat(path).st_mtime - except IOError: - mtime = 0 - - if mtime > self._bookmarks_mtime: - return True - else: - return False - else: - return True - - def write_bookmarks_file(self): - '''Store relevant bookmark info in the mcomix directory.''' - - # Merge changes in case file was modified from within other instances - if self.file_was_modified(): - new_bookmarks, _ = self.load_bookmarks() - self._bookmarks = list(set(self._bookmarks + new_bookmarks)) - - with open(constants.BOOKMARK_JSON_PATH, mode='wt', encoding='utf8') as fd: - packs = [bookmark.pack() for bookmark in self._bookmarks] - json.dump((constants.VERSION, packs), fd, ensure_ascii=False, indent=2) - - self._bookmarks_mtime = time.time() - - - def show_replace_bookmark_dialog(self, old_bookmarks, new_page): - ''' Present a confirmation dialog to replace old bookmarks. - @return RESPONSE_YES to create replace bookmarks, - RESPONSE_NO to create a new bookmark, RESPONSE_CANCEL to abort creating - a new bookmark. ''' - dialog = message_dialog.MessageDialog( - self._window, - flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.NONE) - dialog.add_buttons( - Gtk.STOCK_YES, Gtk.ResponseType.YES, - Gtk.STOCK_NO, Gtk.ResponseType.NO, - Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - dialog.set_default_response(Gtk.ResponseType.YES) - dialog.set_should_remember_choice( - 'replace-existing-bookmark', - (Gtk.ResponseType.YES, Gtk.ResponseType.NO)) - - pages = map(str, sorted(map(operator.attrgetter('_page'), old_bookmarks))) - dialog.set_text( - i18n.get_translation().ngettext( - 'Replace existing bookmark on page %s?', - 'Replace existing bookmarks on pages %s?', - len(list(pages)) - ) % ', '.join(pages), - - _('The current book already contains marked pages. ' - 'Do you want to replace them with a new bookmark on page %d? ') % new_page + - '\n\n' + - _('Selecting "No" will create a new bookmark without affecting the other bookmarks.')) - - return dialog.run() - - -# Singleton instance of the bookmarks store. -BookmarksStore = __BookmarksStore() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_dialog.py mcomix-2.1.0/mcomix/mcomix/bookmark_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/bookmark_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ -'''bookmark_dialog.py - Bookmarks dialog handler.''' - -from gi.repository import Gdk, GdkPixbuf, Gtk, GObject - -from mcomix import constants -from mcomix import bookmark_menu_item -from mcomix.tools import cmp - -class _BookmarksDialog(Gtk.Dialog): - - '''_BookmarksDialog lets the user remove or rearrange bookmarks.''' - - _SORT_TYPE, _SORT_NAME, _SORT_PAGE, _SORT_ADDED = 100, 101, 102, 103 - - def __init__(self, window, bookmarks_store): - super(_BookmarksDialog, self).__init__(title=_('Edit Bookmarks'), destroy_with_parent=True) - self.set_transient_for(window) - - self.add_buttons( - Gtk.STOCK_REMOVE, constants.RESPONSE_REMOVE, - Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE - ) - - self._bookmarks_store = bookmarks_store - - self.set_resizable(True) - self.set_default_response(Gtk.ResponseType.CLOSE) - # scroll area fill to the edge (TODO window should not really be a dialog) - self.set_border_width(0) - - scrolled = Gtk.ScrolledWindow() - scrolled.set_border_width(0) - scrolled.set_shadow_type(Gtk.ShadowType.IN) - scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self.vbox.pack_start(scrolled, True, True, 0) - - self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, GObject.TYPE_STRING, - GObject.TYPE_STRING, GObject.TYPE_STRING, - GObject.TYPE_STRING, bookmark_menu_item._Bookmark) - - self._treeview = Gtk.TreeView(model=self._liststore) - self._treeview.set_rules_hint(True) - self._treeview.set_reorderable(True) - # search by typing first few letters of name - self._treeview.set_search_column(1) - self._treeview.set_enable_search(True) - self._treeview.set_headers_clickable(True) - self._selection = self._treeview.get_selection() - - scrolled.add(self._treeview) - - cellrenderer_text = Gtk.CellRendererText() - cellrenderer_pbuf = Gtk.CellRendererPixbuf() - - self._icon_col = Gtk.TreeViewColumn(_('Type'), cellrenderer_pbuf) - self._name_col = Gtk.TreeViewColumn(_('Name'), cellrenderer_text) - self._page_col = Gtk.TreeViewColumn(_('Page'), cellrenderer_text) - self._path_col = Gtk.TreeViewColumn(_('Location'), cellrenderer_text) - # TRANSLATORS: "Added" as in "Date Added" - self._date_add_col = Gtk.TreeViewColumn(_('Added'), cellrenderer_text) - - self._treeview.append_column(self._icon_col) - self._treeview.append_column(self._name_col) - self._treeview.append_column(self._page_col) - self._treeview.append_column(self._path_col) - self._treeview.append_column(self._date_add_col) - - self._icon_col.set_attributes(cellrenderer_pbuf, pixbuf=0) - self._name_col.set_attributes(cellrenderer_text, text=1) - self._page_col.set_attributes(cellrenderer_text, text=2) - self._path_col.set_attributes(cellrenderer_text, text=3) - self._date_add_col.set_attributes(cellrenderer_text, text=4) - self._name_col.set_expand(True) - - self._liststore.set_sort_func(_BookmarksDialog._SORT_TYPE, - self._sort_model, ('_archive_type', '_name', '_page')) - self._liststore.set_sort_func(_BookmarksDialog._SORT_NAME, - self._sort_model, ('_name', '_page', '_path')) - self._liststore.set_sort_func(_BookmarksDialog._SORT_PAGE, - self._sort_model, ('_page', '_numpages', '_name')) - self._liststore.set_sort_func(_BookmarksDialog._SORT_ADDED, - self._sort_model, ('_date_added',)) - - self._icon_col.set_sort_column_id(_BookmarksDialog._SORT_TYPE) - self._name_col.set_sort_column_id(_BookmarksDialog._SORT_NAME) - self._page_col.set_sort_column_id(_BookmarksDialog._SORT_PAGE) - self._path_col.set_sort_column_id(3) - self._date_add_col.set_sort_column_id(_BookmarksDialog._SORT_ADDED) - - self._icon_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self._name_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self._page_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self._path_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - self._date_add_col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) - - # FIXME Hide extra columns. Needs UI controls to enable these. - self._path_col.set_visible(False) - - self.resize(600, 450) - - self.connect('response', self._response) - self.connect('delete_event', self._close) - - self._treeview.connect('key_press_event', self._key_press_event) - self._treeview.connect('row_activated', self._bookmark_activated) - - for bookmark in self._bookmarks_store.get_bookmarks(): - self._add_bookmark(bookmark) - - self.show_all() - - def _add_bookmark(self, bookmark): - '''Add the to the dialog.''' - self._liststore.prepend(bookmark.to_row()) - - def _remove_selected(self): - '''Remove the currently selected bookmark from the dialog and from - the store.''' - - treeiter = self._selection.get_selected()[1] - - if treeiter is not None: - - bookmark = self._liststore.get_value(treeiter, 5) - self._liststore.remove(treeiter) - self._bookmarks_store.remove_bookmark(bookmark) - - def _bookmark_activated(self, treeview, path, view_column, *args): - ''' Open the activated bookmark. ''' - - iter = treeview.get_model().get_iter(path) - bookmark = treeview.get_model().get_value(iter, 5) - - self._close() - bookmark._load() - - def _sort_model(self, treemodel, iter1, iter2, user_data): - ''' Custom sort function to sort to model entries based on the - BookmarkMenuItem's fields specified in @C{user_data}. This is a list - of field names. ''' - if iter1 == iter2: - return 0 - if iter1 is None: - return 1 - elif iter2 is None: - return -1 - - bookmark1 = treemodel.get_value(iter1, 5) - bookmark2 = treemodel.get_value(iter2, 5) - - for field in user_data: - result = cmp(getattr(bookmark1, field), - getattr(bookmark2, field)) - if result != 0: - return result - - # If the loop didn't return, both entries are equal. - return 0 - - def _response(self, dialog, response): - - if response == Gtk.ResponseType.CLOSE: - self._close() - - elif response == constants.RESPONSE_REMOVE: - self._remove_selected() - - else: - self.destroy() - - def _key_press_event(self, dialog, event, *args): - - if event.keyval == Gdk.KEY_Delete: - self._remove_selected() - - def _close(self, *args): - '''Close the dialog and update the _BookmarksStore with the new - ordering.''' - - ordering = [] - treeiter = self._liststore.get_iter_first() - - while treeiter is not None: - bookmark = self._liststore.get_value(treeiter, 5) - ordering.insert(0, bookmark) - treeiter = self._liststore.iter_next(treeiter) - - for bookmark in ordering: - self._bookmarks_store.remove_bookmark(bookmark) - self._bookmarks_store.add_bookmark(bookmark) - - self.destroy() - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_menu_item.py mcomix-2.1.0/mcomix/mcomix/bookmark_menu_item.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_menu_item.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/bookmark_menu_item.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -'''bookmark_menu_item.py - A signle bookmark item.''' -from datetime import datetime - -from gi.repository import Gtk - -class _Bookmark(Gtk.ImageMenuItem): - - '''_Bookmark represents one bookmark. It extends the Gtk.ImageMenuItem - and is thus put directly in the bookmarks menu. - ''' - - def __init__(self, window, file_handler, name, path, page, numpages, archive_type, epoch): - - self._name = name - self._path = path - self._page = page - self._numpages = numpages - self._window = window - self._archive_type = archive_type - self._file_handler = file_handler - self._date_added = datetime.fromtimestamp(epoch) - - super(_Bookmark, self).__init__(label=str(self), use_underline=False) - - if self._archive_type is not None: - im = Gtk.Image.new_from_stock('mcomix-archive', Gtk.IconSize.MENU) - - else: - im = Gtk.Image.new_from_stock('mcomix-image', Gtk.IconSize.MENU) - - self.set_image(im) - self.connect('activate', self._load) - - def __str__(self): - return '%s, (%d / %d)' % (self._name, self._page, self._numpages) - - def _load(self, *args): - '''Open the file and page the bookmark represents.''' - - if self._file_handler._base_path != self._path: - self._file_handler.open_file(self._path, self._page) - else: - self._window.set_page(self._page) - - self._window.toolbar.hide() - self._window.toolbar.show() - - def same_path(self, path): - '''Return True if the bookmark is for the file .''' - return path == self._path - - def same_page(self, page): - '''Return True if the bookmark is for the same page.''' - return page == self._page - - def to_row(self): - '''Return a tuple corresponding to one row in the _BookmarkDialog's - ListStore. - ''' - stock = self.get_image().get_stock() - pixbuf = self.render_icon(*stock) - page = '%d / %d' % (self._page, self._numpages) - date = self._date_added.strftime('%x %X') - - return (pixbuf, self._name, page, self._path, date, self) - - def pack(self): - '''Return a tuple suitable for pickling. The bookmark can be fully - re-created using the values in the tuple. - ''' - return (self._name, self._path, self._page, self._numpages, - self._archive_type, self._date_added.timestamp()) - - def clone(self): - ''' Creates a copy of the provided Bookmark menu item. This is necessary - since one bookmark item cannot be anchored in more than one menu. There are, - however, at least two: The main menu and the popup menu. ''' - return _Bookmark( - self._window, - self._file_handler, - self._name, - self._path, - self._page, - self._numpages, - self._archive_type, - self._date_added.timestamp()) - - def __eq__(self, other): - ''' Equality comparison for Bookmark items. ''' - if isinstance(other, _Bookmark): - return self._path == other._path and self._page == other._page - else: - return False - - def __hash__(self): - ''' Hash for this object. ''' - return hash(self._path) | hash(self._page) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_menu.py mcomix-2.1.0/mcomix/mcomix/bookmark_menu.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/bookmark_menu.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/bookmark_menu.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -'''bookmark_menu.py - Bookmarks menu.''' - -from gi.repository import Gtk - -from mcomix import bookmark_backend -from mcomix import bookmark_dialog - -class BookmarksMenu(Gtk.Menu): - - '''BookmarksMenu extends Gtk.Menu with convenience methods relating to - bookmarks. It contains fixed items for adding bookmarks etc. as well - as dynamic items corresponding to the current bookmarks. - ''' - - def __init__(self, ui, window): - super(BookmarksMenu, self).__init__() - - self._window = window - self._bookmarks_store = bookmark_backend.BookmarksStore - self._bookmarks_store.initialize(window) - - self._actiongroup = Gtk.ActionGroup(name='mcomix-bookmarks') - self._actiongroup.add_actions([ - ('add_bookmark', 'mcomix-add-bookmark', _('Add _Bookmark'), - 'D', None, self._add_current_to_bookmarks), - ('edit_bookmarks', None, _('_Edit Bookmarks...'), - 'B', None, self._edit_bookmarks)]) - - action = self._actiongroup.get_action('add_bookmark') - action.set_accel_group(ui.get_accel_group()) - self.add_button = action.create_menu_item() - self.append(self.add_button) - - action = self._actiongroup.get_action('edit_bookmarks') - action.set_accel_group(ui.get_accel_group()) - self.edit_button = action.create_menu_item() - self.append(self.edit_button) - - # Re-create the bookmarks menu if one was added/removed - self._create_bookmark_menuitems() - self._bookmarks_store.add_bookmark += lambda bookmark: self._create_bookmark_menuitems() - self._bookmarks_store.remove_bookmark += lambda bookmark: self._create_bookmark_menuitems() - - self.show_all() - - def _create_bookmark_menuitems(self): - # Delete all old menu entries - for item in self.get_children(): - if item not in (self.add_button, self.edit_button): - self.remove(item) - - bookmarks = self._bookmarks_store.get_bookmarks() - - # Add separator - if bookmarks: - separator = Gtk.SeparatorMenuItem() - separator.show() - self.append(separator) - - # Add new bookmarks - for bookmark in bookmarks: - self.add_bookmark(bookmark) - - def add_bookmark(self, bookmark): - '''Add to the menu.''' - bookmark = bookmark.clone() - bookmark.show() - self.insert(bookmark, 3) - - def _add_current_to_bookmarks(self, *args): - '''Add the current page to the bookmarks list.''' - self._bookmarks_store.add_current_to_bookmarks() - - def _edit_bookmarks(self, *args): - '''Open the bookmarks dialog.''' - bookmark_dialog._BookmarksDialog(self._window, self._bookmarks_store) - - def set_sensitive(self, loaded): - '''Set the sensitivities of menu items as appropriate if - represents whether a file is currently loaded in the main program - or not. - ''' - self._actiongroup.get_action('add_bookmark').set_sensitive(loaded) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/box.py mcomix-2.1.0/mcomix/mcomix/box.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/box.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/box.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,346 +0,0 @@ -''' Hyperrectangles. ''' - -from mcomix import tools - - -class Box(object): - - def __init__(self, position, size=None): - ''' A Box is immutable and always axis-aligned. - Each component of size should be positive (i.e. non-zero). - Both position and size must have equal number of dimensions. - If there is only one argument, it must be the size. In this case, the - position is set to origin (i.e. all coordinates are 0) by definition. - @param position: The position of this Box. - @param size: The size of this Box.''' - if size is None: - self.position = (0,) * len(position) - self.size = tuple(position) - else: - self.position = tuple(position) - self.size = tuple(size) - if len(self.position) != len(self.size): - raise ValueError('different number of dimensions: ' + - str(len(self.position)) + ' != ' + str(len(self.size))) - - - def __str__(self): - ''' Returns a string representation of this Box. ''' - return '{' + str(self.get_position()) + ':' + str(self.get_size()) + '}' - - - def __eq__(self, other): - ''' Two Boxes are said to be equal if and only if the number of - dimensions, the positions and the sizes of the two Boxes are equal, - respectively. ''' - return (self.get_position() == other.get_position()) and \ - (self.get_size() == other.get_size()) - - - def __len__(self): - ''' Returns the number of dimensions of this Box. ''' - return len(self.position) - - - def get_size(self): - ''' Returns the size of this Box. - @return: The size of this Box. ''' - return self.size - - - def get_position(self): - ''' Returns the position of this Box. - @return: The position of this Box. ''' - return self.position - - - def set_position(self, position): - ''' Returns a new Box that has the same size as this Box and the - specified position. - @return: A new Box as specified above. ''' - return Box(position, self.get_size()) - - - def set_size(self, size): - ''' Returns a new Box that has the same position as this Box and the - specified size. - @return: A new Box as specified above. ''' - return Box(self.get_position(), size) - - - def distance_point_squared(self, point): - ''' Returns the square of the Euclidean distance between this Box and a - point. If the point lies within the Box, this Box is said to have a - distance of zero. Otherwise, the square of the Euclidean distance - between point and the closest point of the Box is returned. - @param point: The point of interest. - @return The distance between the point and the Box as specified above. - ''' - result = 0 - for i in range(len(point)): - p = point[i] - bs = self.position[i] - be = self.size[i] + bs - if p < bs: - r = bs - p - elif p >= be: - r = p - be + 1 - else: - continue - result += r * r - return result - - - def translate(self, delta): - ''' Returns a new Box that has the same size as this Box and a - translated position as specified by delta. - @param delta: The distance to the position of this Box. - @return: A new Box as specified above. ''' - return Box(tools.vector_add(self.get_position(), delta), - self.get_size()) - - - def translate_opposite(self, delta): - ''' Returns a new Box that has the same size as this Box and a - oppositely translated position as specified by delta. - @param delta: The distance to the position of this Box, with opposite - direction. - @return: A new Box as specified above. ''' - return Box(tools.vector_sub(self.get_position(), delta), - self.get_size()) - - - @staticmethod - def closest_boxes(point, boxes, orientation=None): - ''' Returns the indices of the Boxes that are closest to the specified - point. First, the Euclidean distance between point and the closest point - of the respective Box is used to determine which of these Boxes are the - closest ones. If two Boxes have the same distance, the Box that is - closer to the origin as defined by orientation is said to have a shorter - distance. - @param point: The point of interest. - @param boxes: A list of Boxes. - @param orientation: The orientation which shows where "forward" points - to. Either 1 (towards larger values in this dimension when reading) or - -1 (towards smaller values in this dimension when reading). If - orientation is set to None, it will be ignored. - @return The indices of the closest Boxes as specified above. ''' - result = [] - mindist = -1 - for i in range(len(boxes)): - # 0 --> keep - # 1 --> append - # 2 --> replace - keep_append_replace = 0 - b = boxes[i] - dist = b.distance_point_squared(point) - if (result == []) or (dist < mindist): - keep_append_replace = 2 - elif dist == mindist: - if orientation is not None: - # Take orientation into account. - # If result is small, a simple iteration shouldn't be a - # performance issue. - for ri in range(len(result)): - c = Box._compare_distance_to_origin(b, - boxes[result[ri]], orientation) - if c < 0: - keep_append_replace = 2 - break - if c == 0: - keep_append_replace = 1 - else: - keep_append_replace = 1 - - if keep_append_replace == 1: - result.append(i) - if keep_append_replace == 2: - mindist = dist - result = [i] - return result - - - @staticmethod - def _compare_distance_to_origin(box1, box2, orientation): - ''' Returns an integer that is less than, equal to or greater than zero - if the distance between box1 and the origin is less than, equal to or - greater than the distance between box2 and the origin, respectively. - The origin is implied by orientation. - @param box1: The first Box. - @param box2: The second Box. - @param orientation: The orientation which shows where "forward" points - to. Either 1 (towards larger values in this dimension when reading) or - -1 (towards smaller values in this dimension when reading). - @return An integer as specified above. ''' - for i in range(len(orientation)): - o = orientation[i] - if o == 0: - continue - box1edge = box1.get_position()[i] - box2edge = box2.get_position()[i] - if o < 0: - box1edge = box1.get_size()[i] - box1edge - box2edge = box2.get_size()[i] - box2edge - d = box1edge - box2edge - if d != 0: - return d - return 0 - - - def get_center(self, orientation): - ''' Returns the center of this Box. If the exact value is not equal to - an integer, the integer that is closer to the origin (as implied by - orientation) is chosen. - @orientation: The orientation which shows where "forward" points - to. Either 1 (towards larger values in this dimension when reading) or - -1 (towards smaller values in this dimension when reading). - @return The center of this Box as specified above. ''' - result = [0] * len(orientation) - bp = self.get_position() - bs = self.get_size() - for i in range(len(orientation)): - result[i] = Box._box_to_center_offset_1d(bs[i] - 1, - orientation[i]) + bp[i] - return result - - - @staticmethod - def _box_to_center_offset_1d(box_size_delta, orientation): - if orientation == -1: - box_size_delta += 1 - return box_size_delta >> 1 - - - def current_box_index(self, orientation, boxes): - ''' Calculates the index of the Box that is closest to the center of - this Box. - @param orientation: The orientation to use. - @param boxes: The Boxes to examine. - @return: The index as specified above. ''' - return Box.closest_boxes(self.get_center(orientation), boxes, - orientation)[0] - - - @staticmethod - def align_center(boxes, axis, fix, orientation): - ''' Aligns Boxes so that the center of each Box appears on the same - line. - @param axis: the axis to center. - @param fix: the index of the Box that should not move. - @param orientation: The orientation to use. - @return: A list of new Boxes with accordingly translated positions. ''' - if len(boxes) == 0: - return [] - center_box = boxes[fix] - cs = center_box.get_size()[axis] - if cs % 2 != 0: - cs +=1 - cp = center_box.get_position()[axis] - result = [] - for b in boxes: - s = b.get_size() - p = list(b.get_position()) - p[axis] = cp + Box._box_to_center_offset_1d(cs - s[axis], - orientation) - result.append(Box(p, s)) - return result - - - @staticmethod - def distribute(boxes, axis, fix, spacing=0): - ''' Ensures that the Boxes do not overlap. For this purpose, the Boxes - are distributed according to the index of the respective Box. - @param axis: the axis along which the Boxes are distributed. - @param fix: the index of the Box that should not move. - @param spacing: the number of additional pixels between Boxes. - @return: A new list with new Boxes that are accordingly translated. ''' - if len(boxes) == 0: - return [] - result = [None] * len(boxes) - initialSum = boxes[fix].get_position()[axis] - partial_sum = initialSum - for bi in range(fix, len(boxes)): - b = boxes[bi] - s = b.get_size() - p = list(b.get_position()) - p[axis] = partial_sum - result[bi] = Box(p, s) - partial_sum += s[axis] + spacing - partial_sum = initialSum - for bi in range(fix - 1, -1, -1): - b = boxes[bi] - s = b.get_size() - p = list(b.get_position()) - partial_sum -= s[axis] + spacing - p[axis] = partial_sum - result[bi] = Box(p, s) - return result - - - def wrapper_box(self, viewport_size, orientation): - ''' Returns a Box that covers the same area that is covered by a - scrollable viewport showing this Box. - @param viewport_size: The size of the viewport. - @param orientation: The orientation to use. - @return: A Box as specified above. ''' - size = self.get_size() - position = self.get_position() - result_size = [0] * len(size) - result_position = [0] * len(size) - for i in range(len(size)): - c = size[i] - v = viewport_size[i] - result_size[i] = max(c, v) - result_position[i] = Box._box_to_center_offset_1d(c - result_size[i], - orientation[i]) + position[i] - return Box(result_position, result_size) - - - @staticmethod - def bounding_box(boxes): - ''' Returns the union of all specified Boxes (that is, the smallest Box - that contains all specified Boxes). - @param boxes: The Boxes to calculate the union from. - @return: A Box as specified above. ''' - if len(boxes) == 0: - return Box((), ()) - mins = [None] * len(boxes[0].get_size()) - maxes = [None] * len(mins) - for b in boxes: - s = b.get_size() - p = b.get_position() - for i in range(len(mins)): - if (mins[i] is None) or (p[i] < mins[i]): - mins[i] = p[i] - ps = p[i] + s[i] - if (maxes[i] is None) or (ps > maxes[i]): - maxes[i] = ps - return Box(mins, tools.vector_sub(maxes, mins)) - - - @staticmethod - def intersect(boxA, boxB): # TODO test! docs! - aPos = boxA.get_position() - bPos = boxB.get_position() - aSize = boxA.get_size() - bSize = boxB.get_size() - resPos = [0] * len(aPos) - resSize = [0] * len(aSize) - for i in range(len(aPos)): - ax1 = aPos[i] - bx1 = bPos[i] - ax2 = ax1 - ax2 += aSize[i] - bx2 = bx1 - bx2 += bSize[i] - if ax1 < bx1: - ax1 = bx1 - if ax2 > bx2: - ax2 = bx2 - ax2 -= ax1 - resPos[i] = ax1 - resSize[i] = ax2 - return Box(resPos, resSize) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/callback.py mcomix-2.1.0/mcomix/mcomix/callback.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/callback.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/callback.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- - -import traceback -import weakref -import threading -from gi.repository import GLib - -from mcomix import log - -class CallbackList(object): - ''' Helper class for implementing callbacks within the main thread. - Add listeners to method calls with method += callback_function. ''' - - def __init__(self, obj, function): - self.__callbacks = [] - self.__object = obj - self.__function = function - - def __call__(self, *args, **kwargs): - ''' Runs the wrapped function. After the funtion has finished, - callbacks are run. Code within the function and the callback is - always executed in the main thread. ''' - - if threading.currentThread().name == 'MainThread': - if self.__object: - # Assume that the Callback object is bound to a class method. - result = self.__function(self.__object, *args, **kwargs) - else: - # Otherwise, the callback should be bound to a normal function. - result = self.__function(*args, **kwargs) - - self.__run_callbacks(*args, **kwargs) - return result - else: - # Call this method again in the main thread. - GLib.idle_add(self.__mainthread_call, (args, kwargs)) - - def __iadd__(self, function): - ''' Support for 'method += callback_function' syntax. ''' - obj, func = self.__get_function(function) - - if (obj, func) not in self.__callbacks: - self.__callbacks.append((obj, func)) - - return self - - def __isub__(self, function): - ''' Support for 'method -= callback_function' syntax. ''' - obj, func = self.__get_function(function) - - if (obj, func) in self.__callbacks: - self.__callbacks.remove((obj, func)) - - return self - - def __mainthread_call(self, params): - ''' Helper function to execute code in the main thread. - This will be called by GLib.idle_add, with being a tuple - of (args, kwargs). ''' - - result = self(*params[0], **params[1]) - - # Remove this function from the idle queue - return 0 - - def __run_callbacks(self, *args, **kwargs): - ''' Executes callback functions. ''' - for obj_ref, func in self.__callbacks: - - if obj_ref is None: - # Callback is a normal function - callback = func - elif obj_ref() is not None: - # Callback is a bound method. - # Recreate it by binding the function to the object. - callback = func.__get__(obj_ref()) - else: - # Callback is a bound method, object - # no longer exists. - callback = None - - if callback: - try: - callback(*args, **kwargs) - except Exception as e: - log.error(_('! Callback %(function)r failed: %(error)s'), - { 'function' : callback, 'error' : e }) - log.debug('Traceback:\n%s', traceback.format_exc()) - - def __callback_deleted(self, obj_ref): - ''' Called whenever one of the callback objects is collected by gc. - This removes all callback functions registered by the object. ''' - self.__callbacks = filter(lambda callback: callback[0] != obj_ref, - self.__callbacks) - - def __get_function(self, func): - ''' If is a normal function, return (None, func). - If is a bound method, return (weakref(obj), func), with - being the object is bound to. This is required since - weak references do not work on bound methods. ''' - - if hasattr(func, 'im_self') and getattr(func, 'im_self') is not None: - return (weakref.ref(func.im_self, self.__callback_deleted), func.im_func) - else: - return (None, func) - -class Callback(object): - ''' Decorator class for using the CallbackList helper. ''' - - def __init__(self, function): - # This is the function the Callback is decorating. - self.__function = function - - def __get__(self, obj, cls): - ''' This method makes Callback implement the descriptor interface. - Enables calling bound methods with the correct reference. - Do not ask me why or how this actually works, I simply do not know. ''' - - return CallbackList(obj, self.__function) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/clipboard.py mcomix-2.1.0/mcomix/mcomix/clipboard.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/clipboard.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/clipboard.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -'''clipboard.py - Clipboard handler''' - -from gi.repository import Gdk, Gtk - -from mcomix import image_tools - - -class Clipboard(object): - - '''The Clipboard takes care of all necessary copy-paste functionality - ''' - - def __init__(self, window): - self._clipboard = Gtk.Clipboard.get(Gdk.Atom.intern('CLIPBOARD', False)) - self._window = window - - def copy_image(self, *args): - ''' Copies the current image to clipboard. ''' - - if self._window.filehandler.file_loaded: - # Get pixbuf for current page - current_page_pixbufs = self._window.imagehandler.get_pixbufs( - 2 if self._window.displayed_double() else 1) # XXX limited to at most 2 pages - - if len(current_page_pixbufs) == 1: - pixbuf = current_page_pixbufs[ 0 ] - else: - pixbuf = image_tools.combine_pixbufs( - current_page_pixbufs[ 0 ], - current_page_pixbufs[ 1 ], - self._window.is_manga_mode ) - - self._clipboard.set_image(pixbuf) - - def copy_cover(self, cover_pixbuf): - ''' Copies the current cover to clipboard. ''' - - self._clipboard.set_image(cover_pixbuf) - - def copy_image_path(self, *args): - ''' Copies the current page to clipboard. ''' - - path = self._window.imagehandler.get_path_to_page() - self._clipboard.set_text(path, -1) - - def copy_book_path(self, book_path): - ''' Copies the current book path to clipboard. ''' - - self._clipboard.set_text(book_path, -1) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/comment_dialog.py mcomix-2.1.0/mcomix/mcomix/comment_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/comment_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/comment_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -'''comment.py - Comments dialog.''' - -import os -from gi.repository import Gtk - -from mcomix import i18n - -class _CommentsDialog(Gtk.Dialog): - - def __init__(self, window): - super(_CommentsDialog, self).__init__(title=_('Comments')) - self.set_transient_for(window) - self.add_buttons(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) - self.set_resizable(True) - self.set_default_response(Gtk.ResponseType.CLOSE) - self.set_default_size(600, 550) - self.set_border_width(4) - - tag = Gtk.TextTag() - tag.set_property('editable', False) - tag.set_property('editable-set', True) - tag.set_property('family', 'Monospace') - tag.set_property('family-set', True) - tag.set_property('scale', 0.9) - tag.set_property('scale-set', True) - tag_table = Gtk.TextTagTable() - tag_table.add(tag) - - self._tag = tag - self._tag_table = tag_table - self._notebook = None - self._window = window - self._comments = [] - - self._window.filehandler.file_available += self._on_file_available - self._window.filehandler.file_opened += self._update_comments - self._window.filehandler.file_closed += self._update_comments - self._update_comments() - self.show_all() - - def _on_file_available(self, path_list): - for path in path_list: - if path in self._comments: - self._add_comment(path, self._comments[path]) - self._notebook.show_all() - - def _update_comments(self): - - if self._notebook is not None: - self._notebook.destroy() - self._notebook = None - - notebook = Gtk.Notebook() - notebook.set_scrollable(True) - notebook.set_border_width(6) - self.vbox.pack_start(notebook, True, True, 0) - self._notebook = notebook - self._comments = {} - - for num in range(1, self._window.filehandler.get_number_of_comments() + 1): - path = self._window.filehandler.get_comment_name(num) - if self._window.filehandler.file_is_available(path): - self._add_comment(path, num) - else: - # In case it's not ready yet, bump it's - # extraction in front of the queue. - self._window.filehandler._ask_for_files([path]) - self._comments[path] = num - - self._notebook.show_all() - - def _add_comment(self, path, num): - - name = os.path.basename(path) - - page = Gtk.VBox(False) - page.set_border_width(8) - - scrolled = Gtk.ScrolledWindow() - scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - page.pack_start(scrolled, True, True, 0) - - outbox = Gtk.EventBox() - scrolled.add_with_viewport(outbox) - - inbox = Gtk.EventBox() - inbox.set_border_width(6) - outbox.add(inbox) - - text = self._window.filehandler.get_comment_text(num) - if text is None: - text = _('Could not read %s') % name - - text_buffer = Gtk.TextBuffer(tag_table=self._tag_table) - text_buffer.set_text(i18n.to_unicode(text)) - text_buffer.apply_tag(self._tag, *text_buffer.get_bounds()) - text_view = Gtk.TextView(buffer=text_buffer) - inbox.add(text_view) - - bg_color = text_view.get_default_attributes().pg_bg_color - outbox.modify_bg(Gtk.StateType.NORMAL, bg_color) - tab_label = Gtk.Label(label=i18n.to_unicode(name)) - self._notebook.insert_page(page, tab_label, -1) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/constants.py mcomix-2.1.0/mcomix/mcomix/constants.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/constants.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/constants.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- -'''constants.py - Miscellaneous constants.''' - -import re -import os -import operator - -from mcomix import tools - -APPNAME = 'MComix' -VERSION = '1.3.0.dev0' - -REQUIRED_PIL_VERSION = '5.1.0' - -CPU_COUNT = os.cpu_count() -STARTDIR = os.getcwd() -PORTABLE_MODE = tools.is_portable_mode() - -HOME_DIR = tools.get_home_directory() -CONFIG_DIR = tools.get_config_directory() -DATA_DIR = tools.get_data_directory() - -BASE_PATH = tools.rootdir() -THUMBNAIL_PATH = tools.get_thumbnails_directory() -LIBRARY_DATABASE_PATH = os.path.join(DATA_DIR, 'library.db') -LIBRARY_COVERS_PATH = os.path.join(DATA_DIR, 'library_covers') -PREFERENCE_PATH = os.path.join(CONFIG_DIR, 'preferences.conf') -KEYBINDINGS_CONF_PATH = os.path.join(CONFIG_DIR, 'keybindings.conf') - -BOOKMARK_JSON_PATH = os.path.join(DATA_DIR, 'bookmarks.json') -FILEINFO_JSON_PATH = os.path.join(DATA_DIR, 'file.json') - -ZOOM_MODE_BEST, ZOOM_MODE_WIDTH, ZOOM_MODE_HEIGHT, ZOOM_MODE_MANUAL, ZOOM_MODE_SIZE = range(5) - -WIDTH_AXIS, HEIGHT_AXIS = range(2) -DISTRIBUTION_AXIS, ALIGNMENT_AXIS = WIDTH_AXIS, HEIGHT_AXIS -NORMAL_AXES = (0, 1) -SWAPPED_AXES = (1, 0) -WESTERN_ORIENTATION = (1, 1) -MANGA_ORIENTATION = (-1, 1) -SCROLL_TO_CENTER = -2 -SCROLL_TO_START = -3 -SCROLL_TO_END = -4 -FIRST_INDEX = 0 -LAST_INDEX = -1 -UNION_INDEX = -2 -ANIMATION_DISABLED = 0 -ANIMATION_NORMAL = 1 # loop as animation setting -ANIMATION_ONCE = 1<<1 # loop only once -ANIMATION_INF = 1<<2 # loop infinity - -ZIP, RAR, TAR, GZIP, BZIP2, XZ, PDF, SEVENZIP, LHA, ZIP_EXTERNAL, SQUASHFS = range(11) -NORMAL_CURSOR, GRAB_CURSOR, WAIT_CURSOR, NO_CURSOR = range(4) -LIBRARY_DRAG_EXTERNAL_ID, LIBRARY_DRAG_BOOK_ID, LIBRARY_DRAG_COLLECTION_ID = range(3) -AUTOROTATE_NEVER, AUTOROTATE_WIDTH_90, AUTOROTATE_WIDTH_270, \ - AUTOROTATE_HEIGHT_90, AUTOROTATE_HEIGHT_270 = range(5) - -RESPONSE_REVERT_TO_DEFAULT = 3 -RESPONSE_REMOVE = 4 -RESPONSE_IMPORT = 5 -RESPONSE_SAVE_AS = 6 -RESPONSE_REPLACE = 7 -RESPONSE_NEW = 8 - -# These are bit field values, so only use powers of two. -STATUS_PAGE, STATUS_RESOLUTION, STATUS_PATH, STATUS_FILENAME, STATUS_FILENUMBER, STATUS_FILESIZE = \ - 1, 2, 4, 8, 16, 32 -SHOW_DOUBLE_AS_ONE_TITLE, SHOW_DOUBLE_AS_ONE_WIDE = 1, 2 - -MAX_LIBRARY_COVER_SIZE = 500 -SORT_NAME, SORT_PATH, SORT_SIZE, SORT_LAST_MODIFIED, SORT_NAME_LITERAL = 1, 2, 3, 4, 5 -SORT_DESCENDING, SORT_ASCENDING = 1, 2 -SIZE_HUGE, SIZE_LARGE, SIZE_NORMAL, SIZE_SMALL, SIZE_TINY = MAX_LIBRARY_COVER_SIZE, 300, 250, 125, 80 - -ACCEPTED_COMMENT_EXTENSIONS = ['txt', 'nfo', 'xml'] - -# see https://www.freedesktop.org/wiki/Software/shared-mime-info/ -# for mimetypes not registed to IANA - -ZIP_FORMATS = ( - # https://www.iana.org/assignments/media-types/application/zip - ('.zip', 'application/zip'), - # https://www.iana.org/assignments/media-types/application/vnd.comicbook+zip - ('.cbz', 'application/vnd.comicbook+zip'), -) - -RAR_FORMATS = ( - # https://www.iana.org/assignments/media-types/application/vnd.rar - ('.rar', 'application/vnd.rar'), - # https://www.iana.org/assignments/media-types/application/vnd.comicbook-rar - ('.cbr', 'application/vnd.comicbook-rar'), -) - -TAR_FORMATS = ( - # not registed in IANA - ('.tar', 'application/x-tar'), - # not registed in IANA - ('.cbt', 'application/x-cbt'), - - # see https://www.gnu.org/software/tar/manual/html_section/tar_68.html#auto_002dcompress - # and https://git.savannah.gnu.org/cgit/tar.git/commit/?id=2c06a80918019471876956eef4ef22f05c9e0571 - # for compressed tar - - # gzip - ('.tar.gz', 'application/x-compressed-tar'), - ('.tgz', 'application/x-compressed-tar'), - # bzip2 - ('.tar.bz2', 'application/x-bzip-compressed-tar'), - ('.tar.bz', 'application/x-bzip-compressed-tar'), - ('.tbz2', 'application/x-bzip-compressed-tar'), - ('.tbz', 'application/x-bzip-compressed-tar'), - ('.tb2', 'application/x-bzip-compressed-tar'), - # lzma - ('.tar.lzma', 'application/x-lzma-compressed-tar'), - ('.tlz', 'application/x-lzma-compressed-tar'), - # xz - ('.tar.xz', 'application/x-xz-compressed-tar'), - ('.txz', 'application/x-xz-compressed-tar'), -) - -SZIP_FORMATS = ( - # not registed in IANA - ('.7z', 'application/x-7z-compressed'), - # not registed in IANA - ('.cb7', 'application/x-cb7'), -) - -LHA_FORMATS = ( - # not registed in IANA - ('.lha', 'application/x-lha'), - # not registed in IANA - ('.lzh', 'application/x-lha'), -) - -PDF_FORMATS = ( - # https://www.iana.org/assignments/media-types/application/pdf - ('.pdf','application/pdf'), -) - -SQUASHFS_FORMATS = ( - # not registed in IANA - ('.squashfs', 'application/vnd.squashfs'), - ('.sqsh', 'application/vnd.squashfs'), -) - -ARCHIVE_FORMATS = ZIP_FORMATS + RAR_FORMATS + TAR_FORMATS + SQUASHFS_FORMATS -ARCHIVE_FORMATS += SZIP_FORMATS + LHA_FORMATS + PDF_FORMATS - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/cursor_handler.py mcomix-2.1.0/mcomix/mcomix/cursor_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/cursor_handler.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/cursor_handler.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -'''cursor_handler.py - Cursor handler.''' - -from gi.repository import Gdk, GLib - -from mcomix import constants - -class CursorHandler(object): - - def __init__(self, window): - self._window = window - self._timer_id = None - self._auto_hide = False - self._current_cursor = constants.NORMAL_CURSOR - - def set_cursor_type(self, cursor): - '''Set the cursor to type . Supported cursor types are - available as constants in this module. If is not one of the - cursor constants above, it must be a Gdk.Cursor. - ''' - if cursor == constants.NORMAL_CURSOR: - mode = None - elif cursor == constants.GRAB_CURSOR: - mode = Gdk.Cursor.new(Gdk.CursorType.FLEUR) - elif cursor == constants.WAIT_CURSOR: - mode = Gdk.Cursor.new(Gdk.CursorType.WATCH) - elif cursor == constants.NO_CURSOR: - mode = self._get_hidden_cursor() - else: - mode = cursor - - self._window.set_cursor(mode) - - self._current_cursor = cursor - - if self._auto_hide: - - if cursor == constants.NORMAL_CURSOR: - self._set_hide_timer() - else: - self._kill_timer() - - def auto_hide_on(self): - '''Signal that the cursor should auto-hide from now on (e.g. that - we are entering fullscreen). - ''' - self._auto_hide = True - - if self._current_cursor == constants.NORMAL_CURSOR: - self._set_hide_timer() - - def auto_hide_off(self): - '''Signal that the cursor should *not* auto-hide from now on.''' - self._auto_hide = False - self._kill_timer() - - if self._current_cursor == constants.NORMAL_CURSOR: - self.set_cursor_type(constants.NORMAL_CURSOR) - - def refresh(self): - '''Refresh the current cursor (i.e. display it and set a new timer in - fullscreen). Used when we move the cursor. - ''' - if self._auto_hide: - self.set_cursor_type(self._current_cursor) - - def _on_timeout(self): - mode = self._get_hidden_cursor() - self._window.set_cursor(mode) - self._timer_id = None - return False - - def _set_hide_timer(self): - self._kill_timer() - self._timer_id = GLib.timeout_add(2000, self._on_timeout) - - def _kill_timer(self): - if self._timer_id is not None: - GLib.source_remove(self._timer_id) - self._timer_id = None - - def _get_hidden_cursor(self): - return Gdk.Cursor.new(Gdk.CursorType.BLANK_CURSOR) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/dialog_handler.py mcomix-2.1.0/mcomix/mcomix/dialog_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/dialog_handler.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/dialog_handler.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -'''dialog_handler.py - Takes care of opening and closing and destroying of simple dialog windows. - Dialog windows should only be taken care of here if they are windows that need to display - information and then exit with no added functionality inbetween. -''' - -from mcomix import about_dialog -from mcomix import comment_dialog -from mcomix import properties_dialog - -dialog_windows = {} -dialog_windows['about-dialog'] = [None, about_dialog._AboutDialog] -dialog_windows['comments-dialog'] = [None, comment_dialog._CommentsDialog] -dialog_windows['properties-dialog'] = [None, properties_dialog._PropertiesDialog] - -def open_dialog(action, data): - '''Create and display the given dialog.''' - - window, name_of_dialog = data - - _dialog = dialog_windows[name_of_dialog] - - # if the dialog window is not created then create the window - # and connect the _close_dialog action to the dialog window - if _dialog[0] is None: - dialog_windows[name_of_dialog][0] = _dialog[1](window) - dialog_windows[name_of_dialog][0].connect('response', _close_dialog, name_of_dialog) - else: - # if the dialog window already exists bring it to the forefront of the screen - _dialog[0].present() - -def _close_dialog(action, exit_response, name_of_dialog): - - _dialog = dialog_windows[name_of_dialog] - - # if the dialog window exists then destroy it - if _dialog[0] is not None: - _dialog[0].destroy() - _dialog[0] = None - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_comment_area.py mcomix-2.1.0/mcomix/mcomix/edit_comment_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_comment_area.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/edit_comment_area.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -'''edit_comment_area.py - The area in the editing window that displays comments.''' - -import os -from gi.repository import Gdk, Gtk - -from mcomix import tools - -class _CommentArea(Gtk.VBox): - - '''The area used for displaying and handling non-image files.''' - - def __init__(self, edit_dialog): - super(_CommentArea, self).__init__() - self._edit_dialog = edit_dialog - - scrolled = Gtk.ScrolledWindow() - scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self.pack_start(scrolled, True, True, 0) - - info = Gtk.Label(label=_('Please note that the only files that are automatically added to this list are those files in archives that MComix recognizes as comments.')) - info.set_alignment(0.5, 0.5) - info.set_line_wrap(True) - self.pack_start(info, False, False, 10) - - # The ListStore layout is (basename, size, full path). - self._liststore = Gtk.ListStore(str, str, str) - self._treeview = Gtk.TreeView(model=self._liststore) - self._treeview.set_rules_hint(True) - self._treeview.connect('button_press_event', self._button_press) - self._treeview.connect('key_press_event', self._key_press) - - cellrenderer = Gtk.CellRendererText() - column = Gtk.TreeViewColumn(_('Name'), cellrenderer, text=0) - column.set_expand(True) - self._treeview.append_column(column) - - column = Gtk.TreeViewColumn(_('Size'), cellrenderer, text=1) - self._treeview.append_column(column) - scrolled.add(self._treeview) - - self._ui_manager = Gtk.UIManager() - - ui_description = ''' - - - - - - ''' - - self._ui_manager.add_ui_from_string(ui_description) - actiongroup = Gtk.ActionGroup(name='mcomix-edit-archive-comment-area') - actiongroup.add_actions([ - ('remove', Gtk.STOCK_REMOVE, _('Remove from archive'), None, None, - self._remove_file)]) - self._ui_manager.insert_action_group(actiongroup, 0) - - def fetch_comments(self): - '''Load all comments in the archive.''' - - for num in range(1, - self._edit_dialog.file_handler.get_number_of_comments() + 1): - - path = self._edit_dialog.file_handler.get_comment_name(num) - size = tools.format_byte_size(os.stat(path).st_size) - self._liststore.append([os.path.basename(path), size, path]) - - def add_extra_file(self, path): - '''Add an extra imported file (at ) to the list.''' - size = tools.format_byte_size(os.stat(path).st_size) - self._liststore.append([os.path.basename(path), size, path]) - - def get_file_listing(self): - '''Return a list with the full paths to all the files, in order.''' - file_list = [] - - for row in self._liststore: - file_list.append(row[2]) - - return file_list - - def _remove_file(self, *args): - '''Remove the currently selected file from the list.''' - iterator = self._treeview.get_selection().get_selected()[1] - - if iterator is not None: - self._liststore.remove(iterator) - - def _button_press(self, treeview, event): - '''Handle mouse button presses on the area.''' - path = treeview.get_path_at_pos(int(event.x), int(event.y)) - - if path is None: - return - - path = path[0] - - if event.button == 3: - self._ui_manager.get_widget('/Popup').popup(None, None, None, None, - event.button, event.time) - - def _key_press(self, iconview, event): - '''Handle key presses on the area.''' - if event.keyval == Gdk.KEY_Delete: - self._remove_file() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_dialog.py mcomix-2.1.0/mcomix/mcomix/edit_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/edit_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -'''edit_dialog.py - The dialog for the archive editing window.''' - -import os -import tempfile -from gi.repository import Gdk, Gtk, GLib -import re - -from mcomix.preferences import prefs -from mcomix import archive_packer -from mcomix import file_chooser_simple_dialog -from mcomix import image_tools -from mcomix import edit_image_area -from mcomix import edit_comment_area -from mcomix import constants -from mcomix import message_dialog - -_dialog = None - -class _EditArchiveDialog(Gtk.Dialog): - - '''The _EditArchiveDialog lets users edit archives (or directories) by - reordering images and removing and adding images or comment files. The - result can be saved as a ZIP archive. - ''' - - def __init__(self, window): - super(_EditArchiveDialog, self).__init__(title=_('Edit archive'), modal=True) - self.set_transient_for(window) - self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - - self._accept_changes_button = self.add_button(Gtk.STOCK_APPLY, Gtk.ResponseType.APPLY) - - self.kill = False # Dialog is killed. - self.file_handler = window.filehandler - self._window = window - self._imported_files = [] - - self._save_button = self.add_button(Gtk.STOCK_SAVE_AS, constants.RESPONSE_SAVE_AS) - - self._import_button = self.add_button(_('_Import'), constants.RESPONSE_IMPORT) - self._import_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_ADD, - Gtk.IconSize.BUTTON)) - - self.set_border_width(4) - self.resize(min(Gdk.Screen.get_default().get_width() - 50, 750), - min(Gdk.Screen.get_default().get_height() - 50, 600)) - - self.connect('response', self._response) - - self._image_area = edit_image_area._ImageArea(self, window) - self._comment_area = edit_comment_area._CommentArea(self) - - notebook = Gtk.Notebook() - notebook.set_border_width(6) - notebook.append_page(self._image_area, Gtk.Label(label=_('Images'))) - notebook.append_page(self._comment_area, Gtk.Label(label=_('Comment files'))) - self.vbox.pack_start(notebook, True, True, 0) - - self.show_all() - - GLib.idle_add(self._load_original_files) - - def _load_original_files(self): - '''Load the original files from the archive or directory into - the edit dialog. - ''' - self._save_button.set_sensitive(False) - self._import_button.set_sensitive(False) - self._window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) - self._image_area.fetch_images() - - if self.kill: # fetch_images() allows pending events to be handled. - return False - - self._comment_area.fetch_comments() - self._window.set_cursor(None) - self._save_button.set_sensitive(True) - self._import_button.set_sensitive(True) - - return False - - def _pack_archive(self, archive_path): - '''Create a new archive with the chosen files.''' - self.set_sensitive(False) - self._window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) - - while Gtk.events_pending(): - Gtk.main_iteration_do(False) - - image_files = self._image_area.get_file_listing() - comment_files = self._comment_area.get_file_listing() - - try: - fd, tmp_path = tempfile.mkstemp( - suffix='.%s' % os.path.basename(archive_path), - prefix='tmp.', dir=os.path.dirname(archive_path)) - # Close open tempfile handle (writing is handled by the packer) - os.close(fd) - fail = False - - except: - fail = True - - if not fail: - packer = archive_packer.Packer(image_files, comment_files, tmp_path, - os.path.splitext(os.path.basename(archive_path))[0]) - packer.pack() - packing_success = packer.wait() - - if packing_success: - # Preserve permissions if currently edited files come from an archive - if (self._window.filehandler.archive_type is not None and - os.path.exists(self._window.filehandler.get_path_to_base())): - mode = os.stat(self._window.filehandler.get_path_to_base()).st_mode - else: - mode = os.stat(tmp_path).st_mode - - # Remove existing file (Win32 fails on rename otherwise) - if os.path.exists(archive_path): - os.unlink(archive_path) - - os.rename(tmp_path, archive_path) - os.chmod(archive_path, mode) - - _close_dialog() - else: - fail = True - - self._window.set_cursor(None) - if fail: - dialog = message_dialog.MessageDialog( - self._window, - flags=0, - message_type=Gtk.MessageType.ERROR, - buttons=Gtk.ButtonsType.CLOSE) - dialog.set_text( - _('The new archive could not be saved!'), - _('The original files have not been removed.')) - dialog.run() - - self.set_sensitive(True) - - def _response(self, dialog, response): - - if response == constants.RESPONSE_SAVE_AS: - - dialog = file_chooser_simple_dialog.SimpleFileChooserDialog( - self, Gtk.FileChooserAction.SAVE) - - src_path = self.file_handler.get_path_to_base() - - archive_name = os.path.basename(src_path) - if os.path.isfile(src_path): - archive_name = os.path.splitext(archive_name)[0] - - dialog.set_current_directory(os.path.dirname(src_path)) - dialog.set_save_name(archive_name+'.zip') - dialog.filechooser.set_extra_widget(Gtk.Label( - label=_('Archives are stored as ZIP files.'))) - - ffilter = Gtk.FileFilter() - ffilter.set_name(_('ZIP archives')) - dialog.filechooser.add_filter(ffilter) - for ext, mime in constants.ZIP_FORMATS: - ffilter.add_mime_type(mime) - ffilter.add_pattern('*'+ext) - - dialog.run() - - paths = dialog.get_paths() - dialog.destroy() - - if paths: - self._pack_archive(paths[0]) - - elif response == constants.RESPONSE_IMPORT: - - dialog = file_chooser_simple_dialog.SimpleFileChooserDialog(self) - dialog.add_image_filters() - dialog.run() - paths = dialog.get_paths() - dialog.destroy() - - exts = '|'.join(prefs['comment extensions']) - comment_re = re.compile(r'\.(%s)\s*$' % exts, re.I) - - for path in paths: - - if image_tools.is_image_file(path): - self._imported_files.append( path ) - self._image_area.add_extra_image(path) - - elif os.path.isfile(path): - - if comment_re.search( path ): - self._imported_files.append( path ) - self._comment_area.add_extra_file(path) - - elif response == Gtk.ResponseType.APPLY: - - old_image_array = self._window.imagehandler.get_image_files() - - treeiter = self._image_area._liststore.get_iter_first() - - new_image_array = [] - - while treeiter is not None: - path = self._image_area._liststore.get_value(treeiter, 2) - new_image_array.append(path) - treeiter = self._image_area._liststore.iter_next(treeiter) - - new_positions = [] - - end_index = len(old_image_array) - 1 - - for image_path in old_image_array: - - try: - new_position = new_image_array.index(image_path) - new_positions.append(new_position) - except ValueError: - # the path was not found in the new array so that means it was deleted - new_positions.append(end_index) - end_index -= 1 - - self._window.imagehandler.set_image_files(new_image_array) - self._window.imagehandler.clear_raw_pixbufs() - self._window.imagehandler.do_cacheing() - self._window.thumbnailsidebar.clear() - self._window.set_page(1) - self._window.thumbnailsidebar.load_thumbnails() - - else: - _close_dialog() - self.kill = True - - def destroy(self): - self._image_area.cleanup() - Gtk.Dialog.destroy(self) - -def open_dialog(action, window): - global _dialog - - if _dialog is None: - _dialog = _EditArchiveDialog(window) - else: - _dialog.present() - - -def _close_dialog(*args): - global _dialog - - if _dialog is not None: - _dialog.destroy() - _dialog = None - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_image_area.py mcomix-2.1.0/mcomix/mcomix/edit_image_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/edit_image_area.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/edit_image_area.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -'''edit_image_area.py - The area of the editing archive window that displays images.''' - -import os -from gi.repository import Gdk, GdkPixbuf, Gtk - -from mcomix import image_tools -from mcomix import i18n -from mcomix import thumbnail_tools -from mcomix import thumbnail_view -from mcomix.preferences import prefs - -class _ImageArea(Gtk.ScrolledWindow): - - '''The area used for displaying and handling image files.''' - - def __init__(self, edit_dialog, window): - super(_ImageArea, self).__init__() - - self._window = window - self._edit_dialog = edit_dialog - self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - - # The ListStore layout is (thumbnail, basename, full path, thumbnail status). - # Basename is used as image tooltip. - self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, bool) - self._iconview = thumbnail_view.ThumbnailIconView( - self._liststore, - 2, # UID - 0, # pixbuf - 3, # status - ) - self._iconview.generate_thumbnail = self._generate_thumbnail - self._iconview.set_tooltip_column(1) - self._iconview.set_reorderable(True) - self._iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) - self._iconview.connect('button_press_event', self._button_press) - self._iconview.connect('key_press_event', self._key_press) - self._iconview.connect_after('drag_begin', self._drag_begin) - self.add(self._iconview) - - self._thumbnail_size = 128 - self._thumbnailer = thumbnail_tools.Thumbnailer(store_on_disk=False, - size=(self._thumbnail_size, - self._thumbnail_size)) - - self._filler = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=True, bits_per_sample=8, - width=self._thumbnail_size, - height=self._thumbnail_size) - # Make the pixbuf transparent. - self._filler.fill(0) - - self._window.imagehandler.page_available += self._on_page_available - - self._ui_manager = Gtk.UIManager() - ui_description = ''' - - - - - - ''' - - self._ui_manager.add_ui_from_string(ui_description) - - actiongroup = Gtk.ActionGroup(name='mcomix-edit-archive-image-area') - actiongroup.add_actions([ - ('remove', Gtk.STOCK_REMOVE, _('Remove from archive'), None, None, - self._remove_pages)]) - self._ui_manager.insert_action_group(actiongroup, 0) - - def fetch_images(self): - '''Load all the images in the archive or directory.''' - for page in range(1, self._window.imagehandler.get_number_of_pages() + 1): - path = self._window.imagehandler.get_path_to_page(page) - encoded_path = i18n.to_unicode(os.path.basename(path)) - encoded_path = encoded_path.replace('&', '&') - self._liststore.append([self._filler, encoded_path, path, False]) - - def _generate_thumbnail(self, uid): - assert isinstance(uid, str) - path = uid - try: - if not self._window.filehandler.file_is_available(path): - return None - except KeyError: - # Not a page from the current archive, ignore. - pass - pixbuf = self._thumbnailer.thumbnail(path) - if pixbuf is None: - pixbuf = image_tools.MISSING_IMAGE_ICON - return pixbuf - - def add_extra_image(self, path): - '''Add an imported image (at ) to the end of the image list.''' - self._liststore.append([self._filler, os.path.basename(path), path, False]) - - def get_file_listing(self): - '''Return a list with the full paths to all the images, in order.''' - return [row[2] for row in self._liststore] - - def _remove_pages(self, *args): - '''Remove the currently selected pages from the list.''' - paths = self._iconview.get_selected_items() - - for path in paths: - iterator = self._liststore.get_iter(path) - self._liststore.remove(iterator) - - def _button_press(self, iconview, event): - '''Handle mouse button presses on the thumbnail area.''' - path = iconview.get_path_at_pos(int(event.x), int(event.y)) - - if path is None: - return - - if event.button == 3: - - if not iconview.path_is_selected(path): - iconview.unselect_all() - iconview.select_path(path) - - self._ui_manager.get_widget('/Popup').popup(None, None, None, None, - event.button, event.time) - - def _key_press(self, iconview, event): - '''Handle key presses on the thumbnail area.''' - if event.keyval == Gdk.KEY_Delete: - self._remove_pages() - - def _drag_begin(self, iconview, context): - '''We hook up on drag_begin events so that we can set the hotspot - for the cursor at the top left corner of the thumbnail (so that we - might actually see where we are dropping!). - ''' - path = iconview.get_cursor()[1] - surface = iconview.create_drag_icon(path) - width, height = surface.get_width(), surface.get_height() - pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) - Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) - - def cleanup(self): - self._iconview.stop_update() - - def _on_page_available(self, page): - ''' Called whenever a new page is ready for display. ''' - self._iconview.draw_thumbnails_on_screen() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/enhance_backend.py mcomix-2.1.0/mcomix/mcomix/enhance_backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/enhance_backend.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/enhance_backend.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -'''enhance_backend.py - Image enhancement handler and dialog (e.g. contrast, -brightness etc.) -''' - -from mcomix.preferences import prefs -from mcomix import image_tools - -class ImageEnhancer(object): - - '''The ImageEnhancer keeps track of the "enhancement" values and performs - these enhancements on pixbufs. Changes to the ImageEnhancer's values - can be made using an _EnhanceImageDialog. - ''' - - def __init__(self, window): - self._window = window - self.brightness = prefs['brightness'] - self.contrast = prefs['contrast'] - self.saturation = prefs['saturation'] - self.sharpness = prefs['sharpness'] - self.autocontrast = prefs['auto contrast'] - - def enhance(self, pixbuf): - '''Return an "enhanced" version of .''' - - if (self.brightness != 1.0 or self.contrast != 1.0 or - self.saturation != 1.0 or self.sharpness != 1.0 or - self.autocontrast): - - return image_tools.enhance(pixbuf, self.brightness, self.contrast, - self.saturation, self.sharpness, self.autocontrast) - - return pixbuf - - def signal_update(self): - '''Signal to the main window that a change in the enhancement - values has been made. - ''' - self._window.draw_image() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/enhance_dialog.py mcomix-2.1.0/mcomix/mcomix/enhance_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/enhance_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/enhance_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -'''enhance_dialog.py - Image enhancement dialog.''' - -from gi.repository import Gtk - -from mcomix import histogram -from mcomix import image_tools -from mcomix.preferences import prefs - -_dialog = None - -class _EnhanceImageDialog(Gtk.Dialog): - - '''A Gtk.Dialog which allows modification of the values belonging to - an ImageEnhancer. - ''' - - def __init__(self, window): - super(_EnhanceImageDialog, self).__init__(title=_('Enhance image')) - self.set_transient_for(window) - self._window = window - - reset = Gtk.Button.new_from_stock(Gtk.STOCK_REVERT_TO_SAVED) - reset.set_tooltip_text(_('Reset to defaults.')) - self.add_action_widget(reset, Gtk.ResponseType.REJECT) - save = Gtk.Button.new_from_stock(Gtk.STOCK_SAVE) - save.set_tooltip_text(_('Save the selected values as default for future files.')) - self.add_action_widget(save, Gtk.ResponseType.APPLY) - self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) - - self.set_resizable(False) - self.connect('response', self._response) - self.set_default_response(Gtk.ResponseType.OK) - - self._enhancer = window.enhancer - self._block = False - - vbox = Gtk.VBox(homogeneous=False, spacing=10) - self.set_border_width(4) - vbox.set_border_width(6) - self.vbox.add(vbox) - - self._hist_image = Gtk.Image() - self._hist_image.set_size_request(262, 170) - vbox.pack_start(self._hist_image, True, True, 0) - vbox.pack_start(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL), True, True, 0) - - hbox = Gtk.HBox(homogeneous=False, spacing=4) - vbox.pack_start(hbox, False, False, 2) - vbox_left = Gtk.VBox(homogeneous=False, spacing=4) - vbox_right = Gtk.VBox(homogeneous=False, spacing=4) - hbox.pack_start(vbox_left, False, False, 2) - hbox.pack_start(vbox_right, True, True, 2) - - def _create_scale(label_text): - label = Gtk.Label(label=label_text) - label.set_alignment(1, 0.5) - label.set_use_underline(True) - vbox_left.pack_start(label, True, False, 2) - adj = Gtk.Adjustment(value=0.0, lower=-1.0, upper=1.0, step_increment=0.01, page_increment=0.1) - scale = Gtk.HScale.new(adj) - scale.set_digits(2) - scale.set_value_pos(Gtk.PositionType.RIGHT) - scale.connect('value-changed', self._change_values) - # FIXME - # scale.set_update_policy(Gtk.UPDATE_DELAYED) - label.set_mnemonic_widget(scale) - vbox_right.pack_start(scale, True, False, 2) - return scale - - self._brightness_scale = _create_scale(_('_Brightness:')) - self._contrast_scale = _create_scale(_('_Contrast:')) - self._saturation_scale = _create_scale(_('S_aturation:')) - self._sharpness_scale = _create_scale(_('S_harpness:')) - - vbox.pack_start(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL), True, True, 0) - - self._autocontrast_button = \ - Gtk.CheckButton.new_with_mnemonic(_('_Automatically adjust contrast')) - self._autocontrast_button.set_tooltip_text( - _('Automatically adjust contrast (both lightness and darkness), separately for each colour band.')) - vbox.pack_start(self._autocontrast_button, False, False, 2) - self._autocontrast_button.connect('toggled', self._change_values) - - self._block = True - self._brightness_scale.set_value(self._enhancer.brightness - 1) - self._contrast_scale.set_value(self._enhancer.contrast - 1) - self._saturation_scale.set_value(self._enhancer.saturation - 1) - self._sharpness_scale.set_value(self._enhancer.sharpness - 1) - self._autocontrast_button.set_active(self._enhancer.autocontrast) - self._block = False - self._contrast_scale.set_sensitive( - not self._autocontrast_button.get_active()) - - self._window.imagehandler.page_available += self._on_page_available - self._window.filehandler.file_closed += self._on_book_close - self._window.page_changed += self._on_page_change - self._on_page_change() - - self.show_all() - - def _on_book_close(self): - self.clear_histogram() - - def _on_page_change(self): - if not self._window.imagehandler.page_is_available(): - self.clear_histogram() - return - # XXX transitional(double page limitation) - pixbuf = self._window.imagehandler.get_pixbufs(1)[0] - self.draw_histogram(pixbuf) - - def _on_page_available(self, page_number): - current_page_number = self._window.imagehandler.get_current_page() - if current_page_number == page_number: - self._on_page_change() - - def draw_histogram(self, pixbuf): - '''Draw a histogram representing in the dialog.''' - pixbuf = image_tools.static_image(pixbuf) - histogram_pixbuf = histogram.draw_histogram(pixbuf, text=False) - self._hist_image.set_from_pixbuf(histogram_pixbuf) - - def clear_histogram(self): - '''Clear the histogram in the dialog.''' - self._hist_image.clear() - - def _change_values(self, *args): - if self._block: - return - - self._enhancer.brightness = self._brightness_scale.get_value() + 1 - self._enhancer.contrast = self._contrast_scale.get_value() + 1 - self._enhancer.saturation = self._saturation_scale.get_value() + 1 - self._enhancer.sharpness = self._sharpness_scale.get_value() + 1 - self._enhancer.autocontrast = self._autocontrast_button.get_active() - self._contrast_scale.set_sensitive( - not self._autocontrast_button.get_active()) - self._enhancer.signal_update() - - def _response(self, dialog, response): - - if response in [Gtk.ResponseType.OK, Gtk.ResponseType.DELETE_EVENT]: - _close_dialog() - - elif response == Gtk.ResponseType.APPLY: - self._change_values(self) - prefs['brightness'] = self._enhancer.brightness - prefs['contrast'] = self._enhancer.contrast - prefs['saturation'] = self._enhancer.saturation - prefs['sharpness'] = self._enhancer.sharpness - prefs['auto contrast'] = self._enhancer.autocontrast - - elif response == Gtk.ResponseType.REJECT: - self._block = True - self._brightness_scale.set_value(prefs['brightness'] - 1.0) - self._contrast_scale.set_value(prefs['contrast'] - 1.0) - self._saturation_scale.set_value(prefs['saturation'] - 1.0) - self._sharpness_scale.set_value(prefs['sharpness'] - 1.0) - self._autocontrast_button.set_active(prefs['auto contrast']) - self._block = False - self._change_values(self) - - -def open_dialog(action, window): - '''Create and display the (singleton) image enhancement dialog.''' - global _dialog - - if _dialog is None: - _dialog = _EnhanceImageDialog(window) - else: - _dialog.present() - -def _close_dialog(*args): - '''Destroy the image enhancement dialog.''' - global _dialog - - if _dialog is not None: - _dialog.destroy() - _dialog = None - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/event.py mcomix-2.1.0/mcomix/mcomix/event.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/event.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/event.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,681 +0,0 @@ -'''event.py - Event handling (keyboard, mouse, etc.) for the main window. -''' - -import urllib -from gi.repository import Gdk, Gtk - -from mcomix.preferences import prefs -from mcomix import constants -from mcomix import portability -from mcomix import keybindings -from mcomix import openwith - - -class EventHandler(object): - - def __init__(self, window): - self._window = window - - self._last_pointer_pos_x = 0 - self._last_pointer_pos_y = 0 - self._pressed_pointer_pos_x = 0 - self._pressed_pointer_pos_y = 0 - - #: For scrolling "off the page". - self._extra_scroll_events = 0 - #: If True, increment _extra_scroll_events before switchting pages - self._scroll_protection = False - - def resize_event(self, widget, event): - '''Handle events from resizing and moving the main window.''' - size = (event.width, event.height) - if size != self._window.previous_size: - self._window.previous_size = size - self._window.draw_image() - - def window_state_event(self, widget, event): - is_fullscreen = self._window.is_fullscreen - # Some window manager has special methods to set or exit fullscreen. - # (e.g. gesture on touchscreen) - # In this case, toggleaction will not be correctly set. - # So, set the activation of toggleaction again with window-state-event. - # Also see comment in main.MainWindow.change_fullscreen - toggleaction = self._window.actiongroup.get_action('fullscreen') - toggleaction.set_active(is_fullscreen) - if self._window.was_fullscreen != is_fullscreen: - # Fullscreen state changed. - self._window.was_fullscreen = is_fullscreen - if is_fullscreen: - redraw = True - else: - # Only redraw if we don't need to restore geometry. - redraw = not self._window.restore_window_geometry() - self._window._update_toggles_sensitivity() - if redraw: - self._window.previous_size = self._window.get_size() - self._window.draw_image() - - def register_key_events(self): - ''' Registers keyboard events and their default binings, and hooks - them up with their respective callback functions. ''' - - manager = keybindings.keybinding_manager(self._window) - - # Navigation keys - manager.register('previous_page', - self._flip_page, kwargs={'number_of_pages': -1}) - manager.register('next_page', - self._flip_page, kwargs={'number_of_pages': 1}) - manager.register('previous_page_singlestep', - self._flip_page, kwargs={'number_of_pages': -1, 'single_step': True}) - manager.register('next_page_singlestep', - self._flip_page, kwargs={'number_of_pages': 1, 'single_step': True}) - manager.register('previous_page_dynamic', - self._left_right_page_progress, kwargs={'number_of_pages': -1}) - manager.register('next_page_dynamic', - self._left_right_page_progress, kwargs={'number_of_pages': 1}) - - manager.register('previous_page_ff', - self._flip_page, kwargs={'number_of_pages': -10}) - manager.register('next_page_ff', - self._flip_page, kwargs={'number_of_pages': 10}) - - manager.register('first_page', - self._window.first_page) - manager.register('last_page', - self._window.last_page) - manager.register('go_to', - self._window.page_select) - - manager.register('scroll_left_bottom', - self._window.scroll_to_predefined, - kwargs={'destination': (-1, 1), 'index': constants.UNION_INDEX}) - manager.register('scroll_middle_bottom', - self._window.scroll_to_predefined, - kwargs={'destination': (constants.SCROLL_TO_CENTER, 1), - 'index': constants.UNION_INDEX}) - manager.register('scroll_right_bottom', - self._window.scroll_to_predefined, - kwargs={'destination': (1, 1), 'index': constants.UNION_INDEX}) - - manager.register('scroll_left_middle', - self._window.scroll_to_predefined, - kwargs={'destination': (-1, constants.SCROLL_TO_CENTER), - 'index': constants.UNION_INDEX}) - manager.register('scroll_middle', - self._window.scroll_to_predefined, - kwargs={'destination': (constants.SCROLL_TO_CENTER, - constants.SCROLL_TO_CENTER), 'index': constants.UNION_INDEX}) - manager.register('scroll_right_middle', - self._window.scroll_to_predefined, - kwargs={'destination': (1, constants.SCROLL_TO_CENTER), - 'index': constants.UNION_INDEX}) - - manager.register('scroll_left_top', - self._window.scroll_to_predefined, - kwargs={'destination': (-1, -1), 'index': constants.UNION_INDEX}) - manager.register('scroll_middle_top', - self._window.scroll_to_predefined, - kwargs={'destination': (constants.SCROLL_TO_CENTER, -1), - 'index': constants.UNION_INDEX}) - manager.register('scroll_right_top', - self._window.scroll_to_predefined, - kwargs={'destination': (1, -1), 'index': constants.UNION_INDEX}) - - # Enter/exit fullscreen. - manager.register('exit_fullscreen', - self.escape_event) - - # View modes - manager.register('double_page', - self._window.actiongroup.get_action('double_page').activate) - - manager.register('best_fit_mode', - self._window.actiongroup.get_action('best_fit_mode').activate) - manager.register('fit_width_mode', - self._window.actiongroup.get_action('fit_width_mode').activate) - manager.register('fit_height_mode', - self._window.actiongroup.get_action('fit_height_mode').activate) - manager.register('fit_size_mode', - self._window.actiongroup.get_action('fit_size_mode').activate) - manager.register('fit_manual_mode', - self._window.actiongroup.get_action('fit_manual_mode').activate) - - manager.register('manga_mode', - self._window.actiongroup.get_action('manga_mode').activate) - manager.register('invert_scroll', - self._window.actiongroup.get_action('invert_scroll').activate) - manager.register('keep_transformation', - self._window.actiongroup.get_action('keep_transformation').activate) - manager.register('lens', - self._window.actiongroup.get_action('lens').activate) - manager.register('stretch', - self._window.actiongroup.get_action('stretch').activate) - - # Zooming commands for manual zoom mode - manager.register('zoom_in', - self._window.actiongroup.get_action('zoom_in').activate) - manager.register('zoom_out', - self._window.actiongroup.get_action('zoom_out').activate) - manager.register('zoom_original', - self._window.actiongroup.get_action('zoom_original').activate) - - manager.register('rotate_90', - self._window.rotate_90) - manager.register('rotate_270', - self._window.rotate_270) - manager.register('rotate_180', - self._window.rotate_180) - manager.register('flip_horiz', - self._window.flip_horizontally) - manager.register('flip_vert', - self._window.flip_vertically) - manager.register('no_autorotation', - self._window.actiongroup.get_action('no_autorotation').activate) - manager.register('rotate_90_width', - self._window.actiongroup.get_action('rotate_90_width').activate) - manager.register('rotate_270_width', - self._window.actiongroup.get_action('rotate_270_width').activate) - manager.register('rotate_90_height', - self._window.actiongroup.get_action('rotate_90_height').activate) - manager.register('rotate_270_height', - self._window.actiongroup.get_action('rotate_270_height').activate) - - manager.register('scroll_down', - self._scroll_down) - manager.register('scroll_up', - self._scroll_up) - manager.register('scroll_right', - self._scroll_right) - manager.register('scroll_left', - self._scroll_left) - - # File operations - manager.register('close', - self._window.filehandler.close_file) - manager.register('quit', - self._window.close_program) - manager.register('save_and_quit', - self._window.save_and_terminate_program) - manager.register('extract_page', - self._window.extract_page) - manager.register('refresh_archive', - self._window.filehandler.refresh_file) - manager.register('next_archive', - self._window.filehandler._open_next_archive) - manager.register('previous_archive', - self._window.filehandler._open_previous_archive) - manager.register('next_directory', - self._window.filehandler.open_next_directory) - manager.register('previous_directory', - self._window.filehandler.open_previous_directory) - manager.register('comments', - self._window.actiongroup.get_action('comments').activate) - manager.register('properties', - self._window.actiongroup.get_action('properties').activate) - manager.register('preferences', - self._window.actiongroup.get_action('preferences').activate) - manager.register('edit_archive', - self._window.actiongroup.get_action('edit_archive').activate) - manager.register('open', - self._window.actiongroup.get_action('open').activate) - manager.register('enhance_image', - self._window.actiongroup.get_action('enhance_image').activate) - manager.register('library', - self._window.actiongroup.get_action('library').activate) - - manager.register('smart_scroll_down', - self._smart_scroll_down) - manager.register('smart_scroll_up', - self._smart_scroll_up) - - # User interface - manager.register('osd_panel', - self._window.show_info_panel) - manager.register('minimize', - self._window.minimize) - manager.register('fullscreen', - lambda:self._window.actiongroup.get_action('fullscreen').set_active(True)) - manager.register('toggle_fullscreen', - self._window.actiongroup.get_action('fullscreen').activate) - manager.register('toolbar', - self._window.actiongroup.get_action('toolbar').activate) - manager.register('menubar', - self._window.actiongroup.get_action('menubar').activate) - manager.register('statusbar', - self._window.actiongroup.get_action('statusbar').activate) - manager.register('scrollbar', - self._window.actiongroup.get_action('scrollbar').activate) - manager.register('thumbnails', - self._window.actiongroup.get_action('thumbnails').activate) - manager.register('hide_all', - self._window.actiongroup.get_action('hide_all').activate) - manager.register('slideshow', - self._window.actiongroup.get_action('slideshow').activate) - - # Execute external command. Bind keys from 1 to 9 to commands 1 to 9. - for i in range(1, 10): - manager.register('execute_command_%d' % i, - self._execute_command, args=[i - 1]) - - def key_press_event(self, widget, event, *args): - '''Handle key press events on the main window.''' - - # This is set on demand by callback functions - self._scroll_protection = False - - # Dispatch keyboard input handling - manager = keybindings.keybinding_manager(self._window) - # Some keys can only be pressed with certain modifiers that - # are irrelevant to the actual hotkey. Find out and ignore them. - ALL_ACCELS_MASK = (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK | - Gdk.ModifierType.MOD1_MASK) - - keymap = Gdk.Keymap.get_default() - code = keymap.translate_keyboard_state( - event.hardware_keycode, event.get_state(), event.group) - - if code[0]: - keyval = code[1] - consumed = code[4] - - # If the resulting key is upper case (i.e. SHIFT + key), - # convert it to lower case and remove SHIFT from the consumed flags - # to match how keys are registered ( + lowercase) - if (event.get_state() & Gdk.ModifierType.SHIFT_MASK and - keyval != Gdk.keyval_to_lower(keyval)): - keyval = Gdk.keyval_to_lower(keyval) - consumed &= ~Gdk.ModifierType.SHIFT_MASK - - # 'consumed' is the modifier that was necessary to type the key - manager.execute((keyval, event.get_state() & ~consumed & ALL_ACCELS_MASK)) - - # --------------------------------------------------------------- - # Register CTRL for scrolling only one page instead of two - # pages in double page mode. This is mainly for mouse scrolling. - # --------------------------------------------------------------- - if event.keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): - self._window.imagehandler.force_single_step = True - - # ---------------------------------------------------------------- - # We kill the signals here for the Up, Down, Space and Enter keys, - # or they will start fiddling with the thumbnail selector (bad). - # ---------------------------------------------------------------- - if (event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down, - Gdk.KEY_space, Gdk.KEY_KP_Enter, Gdk.KEY_KP_Up, - Gdk.KEY_KP_Down, Gdk.KEY_KP_Home, Gdk.KEY_KP_End, - Gdk.KEY_KP_Page_Up, Gdk.KEY_KP_Page_Down) or - (event.keyval == Gdk.KEY_Return and not - 'GDK_MOD1_MASK' in event.get_state().value_names)): - - self._window.stop_emission_by_name('key_press_event') - return True - - def key_release_event(self, widget, event, *args): - ''' Handle release of keys for the main window. ''' - - # --------------------------------------------------------------- - # Unregister CTRL for scrolling only one page in double page mode - # --------------------------------------------------------------- - if event.keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): - self._window.imagehandler.force_single_step = False - - def escape_event(self): - ''' Determines the behavior of the ESC key. ''' - if prefs['escape quits']: - self._window.close_program() - else: - self._window.actiongroup.get_action('fullscreen').set_active(False) - - def scroll_wheel_event(self, widget, event, *args): - '''Handle scroll wheel events on the main layout area. The scroll - wheel flips pages in best fit mode and scrolls the scrollbars - otherwise. - ''' - if event.get_state() & Gdk.ModifierType.BUTTON2_MASK: - return - - has_direction, direction = event.get_scroll_direction() - if not has_direction: - direction = None - has_delta, delta_x, delta_y = event.get_scroll_deltas() - if has_delta: - if delta_y < 0: - direction = Gdk.ScrollDirection.UP - elif delta_y > 0: - direction = Gdk.ScrollDirection.DOWN - elif delta_x < 0: - direction = Gdk.ScrollDirection.LEFT - elif delta_x > 0: - direction = Gdk.ScrollDirection.RIGHT - - self._scroll_protection = True - - if direction == Gdk.ScrollDirection.UP: - if event.get_state() & Gdk.ModifierType.CONTROL_MASK: - self._window.manual_zoom_in() - elif prefs['smart scroll']: - self._smart_scroll_up(prefs['number of pixels to scroll per mouse wheel event']) - else: - self._scroll_with_flipping(0, -prefs['number of pixels to scroll per mouse wheel event']) - - elif direction == Gdk.ScrollDirection.DOWN: - if event.get_state() & Gdk.ModifierType.CONTROL_MASK: - self._window.manual_zoom_out() - elif prefs['smart scroll']: - self._smart_scroll_down(prefs['number of pixels to scroll per mouse wheel event']) - else: - self._scroll_with_flipping(0, prefs['number of pixels to scroll per mouse wheel event']) - - elif direction == Gdk.ScrollDirection.RIGHT: - if not self._window.is_manga_mode: - self._window.flip_page(+1) - else: - self._previous_page_with_protection() - - elif direction == Gdk.ScrollDirection.LEFT: - if not self._window.is_manga_mode: - self._previous_page_with_protection() - else: - self._window.flip_page(+1) - - def mouse_press_event(self, widget, event): - '''Handle mouse click events on the main layout area.''' - - if self._window.was_out_of_focus: - return - - if event.button == 1: - self._pressed_pointer_pos_x = event.x_root - self._pressed_pointer_pos_y = event.y_root - self._last_pointer_pos_x = event.x_root - self._last_pointer_pos_y = event.y_root - - elif event.button == 2: - self._window.actiongroup.get_action('lens').set_active(True) - - elif (event.button == 3 and - not event.get_state() & Gdk.ModifierType.MOD1_MASK and - not event.get_state() & Gdk.ModifierType.SHIFT_MASK): - self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) - self._window.popup.popup(None, None, None, None, - event.button, event.time) - - elif event.button == 4: - self._window.show_info_panel() - - def mouse_release_event(self, widget, event): - '''Handle mouse button release events on the main layout area.''' - - self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) - - if event.button == 1: - - if event.x_root == self._pressed_pointer_pos_x and \ - event.y_root == self._pressed_pointer_pos_y and \ - not self._window.was_out_of_focus: - - # right to next, left to previous, no matter the double page mode - direction = 1 if event.x > widget.get_property('width') // 2 else -1 - - # if in manga mode, left to next, right to previous - if self._window.is_manga_mode: - direction *= -1 - - # over flip with shift pressed - if event.get_state() & Gdk.ModifierType.SHIFT_MASK: - direction *= 10 - - self._flip_page(direction) - - else: - self._window.was_out_of_focus = False - - elif event.button == 2: - self._window.actiongroup.get_action('lens').set_active(False) - - elif event.button == 3: - if event.get_state() & Gdk.ModifierType.MOD1_MASK: - self._flip_page(-1) - elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: - self._flip_page(-10) - - def mouse_move_event(self, widget, event): - '''Handle mouse pointer movement events.''' - - event = _get_latest_event_of_same_type(event) - - if 'GDK_BUTTON1_MASK' in event.get_state().value_names: - self._window.cursor_handler.set_cursor_type(constants.GRAB_CURSOR) - scrolled = self._window.scroll(self._last_pointer_pos_x - event.x_root, - self._last_pointer_pos_y - event.y_root) - - # Cursor wrapping stuff. See: - # https://sourceforge.net/tracker/?func=detail&aid=2988441&group_id=146377&atid=764987 - if prefs['wrap mouse scroll'] and scrolled: - # FIXME: Problems with multi-screen setups - screen = self._window.get_screen() - warp_x0 = warp_y0 = 0 - warp_x1 = screen.get_width() - warp_y1 = screen.get_height() - - new_x = _valwarp(event.x_root, warp_x1, minval=warp_x0) - new_y = _valwarp(event.y_root, warp_y1, minval=warp_y0) - if (new_x != event.x_root) or (new_y != event.y_root): - display = screen.get_display() - display.warp_pointer(screen, int(new_x), int(new_y)) - ## This might be (or might not be) necessary to avoid - ## doing one warp multiple times. - event = _get_latest_event_of_same_type(event) - - self._last_pointer_pos_x = new_x - self._last_pointer_pos_y = new_y - else: - self._last_pointer_pos_x = event.x_root - self._last_pointer_pos_y = event.y_root - self._drag_timer = event.time - - def drag_n_drop_event(self, widget, context, x, y, selection, drag_id, - eventtime): - '''Handle drag-n-drop events on the main layout area.''' - # The drag source is inside MComix itself, so we ignore. - - if (Gtk.drag_get_source_widget(context) is not None): - return - - uris = selection.get_uris() - - if not uris: - return - - # Normalize URIs - uris = [portability.normalize_uri(uri) for uri in uris] - paths = [urllib.request.url2pathname(uri) for uri in uris] - - if len(paths) > 1: - self._window.filehandler.open_file(paths) - else: - self._window.filehandler.open_file(paths[0]) - - def _scroll_with_flipping(self, x, y): - '''Handle scrolling with the scroll wheel or the arrow keys, for which - the pages might be flipped depending on the preferences. Returns True - if able to scroll without flipping and False if a new page was flipped - to. - ''' - - self._scroll_protection = True - - if self._window.scroll(x, y): - self._extra_scroll_events = 0 - return True - - if y > 0 or \ - (self._window.is_manga_mode and x < 0) or \ - (not self._window.is_manga_mode and x > 0): - page_flipped = self._next_page_with_protection() - else: - page_flipped = self._previous_page_with_protection() - - return not page_flipped - - def _scroll_down(self): - ''' Scrolls down. ''' - self._scroll_with_flipping(0, prefs['number of pixels to scroll per key event']) - - def _scroll_up(self): - ''' Scrolls up. ''' - self._scroll_with_flipping(0, -prefs['number of pixels to scroll per key event']) - - def _scroll_right(self): - ''' Scrolls right. ''' - self._scroll_with_flipping(prefs['number of pixels to scroll per key event'], 0) - - def _scroll_left(self): - ''' Scrolls left. ''' - self._scroll_with_flipping(-prefs['number of pixels to scroll per key event'], 0) - - def _smart_scroll_down(self, small_step=None): - ''' Smart scrolling. ''' - self._smart_scrolling(small_step, False) - - def _smart_scroll_up(self, small_step=None): - ''' Reversed smart scrolling. ''' - self._smart_scrolling(small_step, True) - - def _smart_scrolling(self, small_step, backwards): - # Collect data from the environment - viewport_size = self._window.get_visible_area_size() - distance = prefs['smart scroll percentage'] - if small_step is None: - max_scroll = [distance * viewport_size[0], - distance * viewport_size[1]] # 2D only - else: - max_scroll = [small_step] * 2 # 2D only - swap_axes = constants.SWAPPED_AXES if prefs['invert smart scroll'] \ - else constants.NORMAL_AXES - self._window.update_layout_position() - - # Scroll to the new position - new_index = self._window.layout.scroll_smartly(max_scroll, backwards, swap_axes) - n = 2 if self._window.displayed_double() else 1 # XXX limited to at most 2 pages - - if new_index == -1: - self._previous_page_with_protection() - elif new_index == n: - self._next_page_with_protection() - else: - # Update actual viewport - self._window.update_viewport_position() - - - def _next_page_with_protection(self): - ''' Advances to the next page. If L{_scroll_protection} is enabled, - this method will only advance if enough scrolling attempts have been made. - - @return: True when the page was flipped.''' - - if not prefs['flip with wheel']: - self._extra_scroll_events = 0 - return False - - if (not self._scroll_protection - or self._extra_scroll_events >= prefs['number of key presses before page turn'] - 1 - or not self._window.is_scrollable()): - - self._flip_page(1) - return True - - elif (self._scroll_protection): - self._extra_scroll_events = max(1, self._extra_scroll_events + 1) - return False - - else: - # This path should not be reached. - assert False, 'Programmer is moron, incorrect assertion.' - - def _previous_page_with_protection(self): - ''' Goes back to the previous page. If L{_scroll_protection} is enabled, - this method will only go back if enough scrolling attempts have been made. - - @return: True when the page was flipped.''' - - if not prefs['flip with wheel']: - self._extra_scroll_events = 0 - return False - - if (not self._scroll_protection - or self._extra_scroll_events <= -prefs['number of key presses before page turn'] + 1 - or not self._window.is_scrollable()): - - self._flip_page(-1) - return True - - elif (self._scroll_protection): - self._extra_scroll_events = min(-1, self._extra_scroll_events - 1) - return False - - else: - # This path should not be reached. - assert False, 'Programmer is moron, incorrect assertion.' - - - def _flip_page(self, number_of_pages, single_step=False): - ''' Switches a number of pages forwards/backwards. If C{single_step} is True, - the page count will be advanced by only one page even in double page mode. ''' - self._extra_scroll_events = 0 - self._window.flip_page(number_of_pages, single_step=single_step) - - def _left_right_page_progress(self, number_of_pages=1): - ''' If number_of_pages is positive, this function advances the specified - number of pages in manga mode and goes back the same number of pages in - normal mode. The opposite happens for number_of_pages being negative. ''' - self._flip_page(-number_of_pages if self._window.is_manga_mode else number_of_pages) - - def _execute_command(self, cmdindex): - ''' Execute an external command. cmdindex should be an integer from 0 to 9, - representing the command that should be executed. ''' - manager = openwith.OpenWithManager() - commands = [cmd for cmd in manager.get_commands() if not cmd.is_separator()] - if len(commands) > cmdindex: - commands[cmdindex].execute(self._window) - - -def _get_latest_event_of_same_type(event): - '''Return the latest event in the event queue that is of the same type - as , or itself if no such events are in the queue. All - events of that type will be removed from the event queue. - ''' - return event - events = [] - - while Gdk.events_pending(): - queued_event = Gdk.event_get() - - if queued_event is not None: - - if queued_event.type == event.type: - event = queued_event - else: - events.append(queued_event) - - for queued_event in events: - queued_event.put() - - return event - - -def _valwarp(cur, maxval, minval=0, tolerance=3, extra=2): - ''' Helper function for warping the cursor around the screen when it - comes within `tolerance` to a border (and `extra` more to avoid - jumping back and forth). ''' - if cur < minval + tolerance: - overmove = minval + tolerance - cur - return maxval - tolerance - overmove - extra - if (maxval - cur) < tolerance: - overmove = tolerance - (maxval - cur) - return minval + tolerance + overmove + extra - return cur - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_base_dialog.py mcomix-2.1.0/mcomix/mcomix/file_chooser_base_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_base_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_chooser_base_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -'''filechooser_chooser_base_dialog.py - Custom FileChooserDialog implementations.''' - -import os -import fnmatch -from gi.repository import Gtk, Pango - -from mcomix.preferences import prefs -from mcomix import image_tools -from mcomix import archive_tools -from mcomix import labels -from mcomix import constants -from mcomix import log -from mcomix import thumbnail_tools -from mcomix import message_dialog -from mcomix import mimetypes -from mcomix import file_provider -from mcomix import tools - -class _BaseFileChooserDialog(Gtk.Dialog): - - '''We roll our own FileChooserDialog because the one in GTK seems - buggy with the preview widget. The argument dictates what type - of filechooser dialog we want (i.e. it is Gtk.FileChooserAction.OPEN - or Gtk.FileChooserAction.SAVE). - - This is a base class for the _MainFileChooserDialog, the - _LibraryFileChooserDialog and the SimpleFileChooserDialog. - - Subclasses should implement a method files_chosen(paths) that will be - called once the filechooser has done its job and selected some files. - If the dialog was closed or Cancel was pressed, is the empty list. - ''' - - _last_activated_file = None - - def __init__(self, parent, action=Gtk.FileChooserAction.OPEN): - self._action = action - self._destroyed = False - - if action == Gtk.FileChooserAction.OPEN: - title = _('Open') - buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, Gtk.ResponseType.OK) - - else: - title = _('Save') - buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_SAVE, Gtk.ResponseType.OK) - - super(_BaseFileChooserDialog, self).__init__(title=title) - self.set_transient_for(parent) - self.add_buttons(*buttons) - self.set_default_response(Gtk.ResponseType.OK) - - self.filechooser = Gtk.FileChooserWidget(action=action) - self.filechooser.set_size_request(680, 420) - self.vbox.pack_start(self.filechooser, True, True, 0) - self.set_border_width(4) - self.filechooser.set_border_width(6) - self.connect('response', self._response) - self.filechooser.connect('file_activated', self._response, - Gtk.ResponseType.OK) - - preview_box = Gtk.VBox(homogeneous=False, spacing=10) - preview_box.set_size_request(130, 0) - self._preview_image = Gtk.Image() - self._preview_image.set_size_request(130, 130) - preview_box.pack_start(self._preview_image, False, False, 0) - self.filechooser.set_preview_widget(preview_box) - - pango_scale_small = (1 / 1.2) - - self._namelabel = labels.FormattedLabel(weight=Pango.Weight.BOLD, - scale=pango_scale_small) - self._namelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - preview_box.pack_start(self._namelabel, False, False, 0) - - self._sizelabel = labels.FormattedLabel(scale=pango_scale_small) - self._sizelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - preview_box.pack_start(self._sizelabel, False, False, 0) - self.filechooser.set_use_preview_label(False) - preview_box.show_all() - self.filechooser.connect('update-preview', self._update_preview) - - self._all_files_filter = self.add_filter( _('All files'), [], ['*']) - - try: - current_file = self._current_file() - last_file = self.__class__._last_activated_file - - # If a file is currently open, use its path - if current_file and os.path.exists(current_file): - self.filechooser.set_current_folder(os.path.dirname(current_file)) - # If no file is open, use the last stored file - elif (last_file and os.path.exists(last_file)): - self.filechooser.set_filename(last_file) - # If no file was stored yet, fall back to preferences - elif os.path.isdir(prefs['path of last browsed in filechooser']): - if prefs['store recent file info']: - self.filechooser.set_current_folder( - prefs['path of last browsed in filechooser']) - else: - self.filechooser.set_current_folder( - constants.HOME_DIR) - - except Exception as ex: # E.g. broken prefs values. - log.debug(ex) - - self.show_all() - - def add_filter(self, name, mimes, patterns=[]): - '''Add a filter, called , for each mime type in and - each pattern in to the filechooser. - ''' - ffilter = Gtk.FileFilter() - ffilter.add_custom( - Gtk.FileFilterFlags.FILENAME | Gtk.FileFilterFlags.MIME_TYPE, - self._filter, (patterns, mimes)) - - ffilter.set_name(name) - self.filechooser.add_filter(ffilter) - return ffilter - - def add_archive_filters(self): - '''Add archive filters to the filechooser. - ''' - ffilter = Gtk.FileFilter() - ffilter.set_name(_('All archives')) - self.filechooser.add_filter(ffilter) - supported_formats = archive_tools.get_supported_formats() - for name in sorted(supported_formats): - mime_types, extensions = supported_formats[name] - patterns = ['*'+ext for ext in extensions] - self.add_filter(_('%s archives') % name, mime_types, patterns) - for mime in mime_types: - ffilter.add_mime_type(mime) - for pat in patterns: - ffilter.add_pattern(pat) - - def add_image_filters(self): - '''Add images filters to the filechooser. - ''' - ffilter = Gtk.FileFilter() - ffilter.set_name(_('All images')) - self.filechooser.add_filter(ffilter) - supported_formats = image_tools.get_supported_formats() - for name in sorted(supported_formats): - mime_types, extensions = supported_formats[name] - patterns = ['*'+ext for ext in extensions] - self.add_filter(_('%s images') % name, mime_types, patterns) - for mime in mime_types: - ffilter.add_mime_type(mime) - for pat in patterns: - ffilter.add_pattern(pat) - - def _filter(self, filter_info, data): - ''' Callback function used to determine if a file - should be filtered or not. C{data} is a tuple containing - (patterns, mimes) that should pass the test. Returns True - if the file passed in C{filter_info} should be displayed. ''' - - match_patterns, match_mimes = data - - matches_mime = bool(filter( - lambda match_mime: match_mime == filter_info.mime_type, - match_mimes)) - matches_pattern = bool(filter( - lambda match_pattern: fnmatch.fnmatch(filter_info.filename, match_pattern), - match_patterns)) - - return matches_mime or matches_pattern - - def collect_files_from_subdir(self, path, filter, recursive=False): - ''' Finds archives within C{path} that match the - L{Gtk.FileFilter} passed in C{filter}. ''' - - for root, dirs, files in os.walk(path): - for file in files: - full_path = os.path.join(root, file) - mimetype = mimetypes.guess_type(full_path)[0] or 'application/octet-stream' - filter_info = Gtk.FileFilterInfo() - filter_info.contains = Gtk.FileFilterFlags.FILENAME | Gtk.FileFilterFlags.MIME_TYPE - filter_info.filename = full_path - filter_info.mime_type = mimetype - - if (filter == self._all_files_filter or filter.filter(filter_info)): - yield full_path - - if not recursive: - break - - def set_save_name(self, name): - self.filechooser.set_current_name(name) - - def set_current_directory(self, path): - self.filechooser.set_current_folder(path) - - def should_open_recursive(self): - return False - - def _response(self, widget, response): - '''Return a list of the paths of the chosen files, or None if the - event only changed the current directory. - ''' - if response == Gtk.ResponseType.OK: - if not self.filechooser.get_filenames(): - return - - # Collect files, if necessary also from subdirectories - filter = self.filechooser.get_filter() - paths = [ ] - for path in self.filechooser.get_filenames(): - - if os.path.isdir(path): - subdir_files = list(self.collect_files_from_subdir(path, filter, - self.should_open_recursive())) - file_provider.FileProvider.sort_files(subdir_files) - paths.extend(subdir_files) - else: - paths.append(path) - - # FileChooser.set_do_overwrite_confirmation() doesn't seem to - # work on our custom dialog, so we use a simple alternative. - first_path = self.filechooser.get_filenames()[0] - if (self._action == Gtk.FileChooserAction.SAVE and - not os.path.isdir(first_path) and - os.path.exists(first_path)): - - overwrite_dialog = message_dialog.MessageDialog( - self, - flags=0, - message_type=Gtk.MessageType.QUESTION, - buttons=Gtk.ButtonsType.OK_CANCEL) - overwrite_dialog.set_text( - _('A file named "%s" already exists. Do you want to replace it?') % - os.path.basename(first_path), - _('Replacing it will overwrite its contents.')) - response = overwrite_dialog.run() - - if response != Gtk.ResponseType.OK: - self.stop_emission_by_name('response') - return - - # Do not store path if the user chose not to keep a file history - if prefs['store recent file info']: - prefs['path of last browsed in filechooser'] = \ - self.filechooser.get_current_folder() - else: - prefs['path of last browsed in filechooser'] = \ - constants.HOME_DIR - - self.__class__._last_activated_file = first_path - self.files_chosen(paths) - - else: - self.files_chosen([]) - - self._destroyed = True - - def _update_preview(self, *args): - path = self.filechooser.get_preview_filename() - - if path and os.path.isfile(path): - thumbnailer = thumbnail_tools.Thumbnailer(size=(128, 128), - archive_support=True) - thumbnailer.thumbnail_finished += self._preview_thumbnail_finished - thumbnailer.thumbnail(path, mt=True) - else: - self._preview_image.clear() - self._namelabel.set_text('') - self._sizelabel.set_text('') - - def _preview_thumbnail_finished(self, filepath, pixbuf): - ''' Called when the thumbnailer has finished creating - the thumbnail for . ''' - - if self._destroyed: - return - - current_path = self.filechooser.get_preview_filename() - if current_path and current_path == filepath: - - if pixbuf is None: - self._preview_image.clear() - self._namelabel.set_text('') - self._sizelabel.set_text('') - - else: - pixbuf = image_tools.add_border(pixbuf, 1) - self._preview_image.set_from_pixbuf(pixbuf) - self._namelabel.set_text(os.path.basename(filepath)) - self._sizelabel.set_text(tools.format_byte_size(os.stat(filepath).st_size)) - - def _current_file(self): - # XXX: This method defers the import of main to avoid cyclic imports - # during startup. - - from mcomix import main - return main.main_window().filehandler.get_path_to_base() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_library_dialog.py mcomix-2.1.0/mcomix/mcomix/file_chooser_library_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_library_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_chooser_library_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -'''file_chooser_library_dialog.py - Custom FileChooserDialog implementations.''' - -from gi.repository import Gtk - -from mcomix.preferences import prefs -from mcomix import file_chooser_base_dialog - -_library_filechooser_dialog = None - -class _LibraryFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): - - '''The filechooser dialog used when adding books to the library.''' - - def __init__(self, library): - super(_LibraryFileChooserDialog, self).__init__(library) - self.set_title(_('Add books')) - - self._library = library - - self.filechooser.set_select_multiple(True) - self.add_archive_filters() - - # Remove 'All files' filter from base class - filters = self.filechooser.list_filters() - self.filechooser.remove_filter(filters[0]) - self.filechooser.set_filter(filters[1]) - - try: - # When setting this to the first filter ("All files"), this - # fails on some GTK+ versions and sets the filter to "blank". - # The effect is the same though (i.e. display all files), and - # there is no solution that I know of, so we'll have to live - # with it. It only happens the second time a dialog is created - # though, which is very strange. - self.filechooser.set_filter(filters[ - prefs['last filter in library filechooser']]) - - except Exception: - self.filechooser.set_filter(filters[0]) - - # Remove default buttons and add buttons that make more sense - for widget in self.get_action_area().get_children(): - self.get_action_area().remove(widget) - - self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) - self.add_button(Gtk.STOCK_ADD, Gtk.ResponseType.OK) - self.set_default_response(Gtk.ResponseType.OK) - - def should_open_recursive(self): - return True - - def files_chosen(self, paths): - if paths: - try: # For some reason this fails sometimes (GTK+ bug?) - filter_index = self.filechooser.list_filters().index( - self.filechooser.get_filter()) - prefs['last filter in library filechooser'] = filter_index - - except Exception: - pass - - close_library_filechooser_dialog() - self._library.add_books(paths, None) - - else: - close_library_filechooser_dialog() - -def open_library_filechooser_dialog(library): - '''Open the library filechooser dialog.''' - global _library_filechooser_dialog - - if _library_filechooser_dialog is None: - _library_filechooser_dialog = _LibraryFileChooserDialog(library) - else: - _library_filechooser_dialog.present() - -def close_library_filechooser_dialog(*args): - '''Close the library filechooser dialog.''' - global _library_filechooser_dialog - - if _library_filechooser_dialog is not None: - _library_filechooser_dialog.destroy() - _library_filechooser_dialog = None - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_main_dialog.py mcomix-2.1.0/mcomix/mcomix/file_chooser_main_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_main_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_chooser_main_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -'''file_chooser_main_dialog.py - Custom FileChooserDialog implementations.''' - -from gi.repository import Gtk - -from mcomix.preferences import prefs -from mcomix import file_chooser_base_dialog - -_main_filechooser_dialog = None - -class _MainFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): - - '''The normal filechooser dialog used with the "Open" menu item.''' - - def __init__(self, window): - super(_MainFileChooserDialog, self).__init__(window) - self._window = window - self.filechooser.set_select_multiple(True) - self.add_archive_filters() - self.add_image_filters() - filters = self.filechooser.list_filters() - try: - # When setting this to the first filter ("All files"), this - # fails on some GTK+ versions and sets the filter to "blank". - # The effect is the same though (i.e. display all files), and - # there is no solution that I know of, so we'll have to live - # with it. It only happens the second time a dialog is created - # though, which is very strange. - self.filechooser.set_filter(filters[ - prefs['last filter in main filechooser']]) - except: - self.filechooser.set_filter(filters[0]) - - def files_chosen(self, paths): - if paths: - try: # For some reason this fails sometimes (GTK+ bug?) - filter_index = self.filechooser.list_filters().index( - self.filechooser.get_filter()) - prefs['last filter in main filechooser'] = filter_index - except: - pass - _close_main_filechooser_dialog() - - # If more than one file is selected, restrict opening - # further files to the selection. - if len(paths) > 1: - files = [ path for path in paths ] - else: - files = paths[0] - - self._window.filehandler.open_file(files) - else: - _close_main_filechooser_dialog() - -def open_main_filechooser_dialog(action, window): - '''Open the main filechooser dialog.''' - global _main_filechooser_dialog - if _main_filechooser_dialog is None: - _main_filechooser_dialog = _MainFileChooserDialog(window) - else: - _main_filechooser_dialog.present() - - -def _close_main_filechooser_dialog(*args): - '''Close the main filechooser dialog.''' - global _main_filechooser_dialog - if _main_filechooser_dialog is not None: - _main_filechooser_dialog.destroy() - _main_filechooser_dialog = None - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_simple_dialog.py mcomix-2.1.0/mcomix/mcomix/file_chooser_simple_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_chooser_simple_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_chooser_simple_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -'''file_chooser_simple_dialog.py - Custom FileChooserDialog implementations.''' - -from gi.repository import Gtk - -from mcomix import file_chooser_base_dialog - -class SimpleFileChooserDialog(file_chooser_base_dialog._BaseFileChooserDialog): - - '''A simple filechooser dialog that is designed to be used with the - Gtk.Dialog.run() method. The dictates what type of filechooser - dialog we want (i.e. save or open). If the type is an open-dialog, we - use multiple selection by default. - ''' - - def __init__(self, parent, action=Gtk.FileChooserAction.OPEN): - super(SimpleFileChooserDialog, self).__init__(parent, action=action) - if action == Gtk.FileChooserAction.OPEN: - self.filechooser.set_select_multiple(True) - self._paths = None - - def get_paths(self): - '''Return the selected paths. To be called after run() has returned - a response. - ''' - return self._paths - - def files_chosen(self, paths): - self._paths = paths - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_handler.py mcomix-2.1.0/mcomix/mcomix/file_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_handler.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_handler.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,674 +0,0 @@ -# -*- coding: utf-8 -*- -'''file_handler.py - File handler that takes care of opening archives and images.''' - -import json -import os -import re - -from gi.repository import Gtk - -from mcomix.preferences import prefs -from mcomix import archive_extractor -from mcomix import archive_tools -from mcomix import image_tools -from mcomix import tools -from mcomix import constants -from mcomix import file_provider -from mcomix import callback -from mcomix import log -from mcomix import last_read_page -from mcomix import message_dialog -from mcomix.library import backend - - -class FileHandler(object): - - '''The FileHandler keeps track of the actual files/archives opened. - - While ImageHandler takes care of pages/images, this class provides - the raw file names for archive members and image files, extracts - archives, and lists directories for image files. - ''' - - def __init__(self, window): - #: Indicates if files/archives are currently loaded/loading. - self.file_loaded = False - self.file_loading = False - #: None if current file is not an archive, or unrecognized format. - self.archive_type = None - - #: Either path to the current archive, or first file in image list. - #: This is B{not} the path to the currently open page. - self._current_file = None - #: Reference to L{MainWindow}. - self._window = window - #: Path to opened archive file, or directory containing current images. - self._base_path = None - #: Temporary directory used for extracting archives. - self._tmp_dir = None - #: If C{True}, no longer wait for files to get extracted. - self._stop_waiting = False - #: List of comment files inside of the currently opened archive. - self._comment_files = [] - #: Mapping of absolute paths to archive path names. - self._name_table = {} - #: Archive extractor. - self._extractor = archive_extractor.Extractor() - self._extractor.file_extracted += self._extracted_file - self._extractor.contents_listed += self._listed_contents - #: Condition to wait on when extracting archives and waiting on files. - self._condition = None - #: Provides a list of available files/archives in the open directory. - self._file_provider = None - #: Keeps track of the last read page in archives - self.last_read_page = last_read_page.LastReadPage(backend.LibraryBackend()) - #: Regexp used for determining which archive files are comment files. - self._comment_re = None - self.update_comment_extensions() - - self.last_read_page.set_enabled(bool(prefs['store recent file info'])) - - def refresh_file(self, *args, **kwargs): - ''' Closes the current file(s)/archive and reloads them. ''' - if self.file_loaded: - current_file = os.path.abspath(self._window.imagehandler.get_real_path()) - if self.archive_type is not None: - start_page = self._window.imagehandler.get_current_page() - else: - start_page = 0 - self.open_file(current_file, start_page, keep_fileprovider=True) - - def open_file(self, path, start_page=0, keep_fileprovider=False): - '''Open the file pointed to by . - - If is not set we set the current - page to 1 (first page), if it is set we set the current page to the - value of . If is non-positive it means the - last image. - - Return True if the file is successfully loaded. - ''' - - self._close() - - try: - path = self._initialize_fileprovider(path, keep_fileprovider) - except ValueError as ex: - self._window.statusbar.set_message(str(ex)) - self._window.osd.show(str(ex)) - return False - - error_message = self._check_access(path) - if error_message: - self._window.statusbar.set_message(error_message) - self._window.osd.show(error_message) - self.file_opened() - return False - - self.filelist = self._file_provider.list_files() - self.archive_type = archive_tools.archive_mime_type(path) - self._start_page = start_page - self._current_file = os.path.abspath(path) - self._stop_waiting = False - - image_files = [] - current_image_index = 0 - - # Actually open the file(s)/archive passed in path. - if self.archive_type is not None: - try: - self._open_archive(self._current_file) - except Exception as ex: - self._window.statusbar.set_message(str(ex)) - self._window.osd.show(str(ex)) - self.file_opened() - return False - self.file_loading = True - else: - image_files, current_image_index = \ - self._open_image_files(self.filelist, self._current_file) - self._archive_opened(image_files) - - return True - - def _archive_opened(self, image_files): - ''' Called once the archive has been opened and its contents listed. - ''' - - self._window.imagehandler._base_path = self._base_path - self._window.imagehandler.set_image_files(image_files) - self.file_opened() - - if not image_files: - msg = _('No images in "%s"') % os.path.basename(self._current_file) - self._window.statusbar.set_message(msg) - self._window.osd.show(msg) - - else: - if self.archive_type is None: - # If no extraction is required, mark all files as available. - self.file_available(self.filelist) - # Set current page to current file. - if self._current_file in self.filelist: - current_image_index = self.filelist.index(self._current_file) - else: - current_image_index = 0 - else: - self._extractor.extract() - last_image_index = self._get_index_for_page(self._start_page, - len(image_files), - self._current_file) - if self._start_page or \ - prefs['stored dialog choices'].get('resume-from-last-read-page', False): - current_image_index = last_image_index - else: - # Don't switch to last page yet; since we have not asked - # the user for confirmation yet. - current_image_index = 0 - if last_image_index != current_image_index: - # Bump last page closer to the front of the extractor queue. - self._window.set_page(last_image_index + 1) - - self._window.set_page(current_image_index + 1) - - if self.archive_type is not None: - if last_image_index != current_image_index and \ - self._ask_goto_last_read_page(self._current_file, last_image_index + 1): - self._window.set_page(last_image_index + 1) - - self.write_fileinfo_file() - - self._window.uimanager.recent.add(self._current_file) - - @callback.Callback - def file_opened(self): - ''' Called when a new set of files has successfully been opened. ''' - self.file_loaded = True - - @callback.Callback - def file_closed(self): - ''' Called when the current file has been closed. ''' - pass - - def close_file(self): - '''Close the currently opened file and its provider. ''' - self._close(close_provider=True) - - def _close(self, close_provider=False): - '''Run tasks for "closing" the currently opened file(s).''' - if self.file_loaded or self.file_loading: - if close_provider: - self._file_provider = None - self.update_last_read_page() - if self.archive_type is not None: - self._extractor.close() - self._window.imagehandler.cleanup() - self.file_loaded = False - self.file_loading = False - self.archive_type = None - self._current_file = None - self._base_path = None - self._stop_waiting = True - self._comment_files = [] - self._name_table.clear() - self.file_closed() - # Catch up on UI events, so we don't leave idle callbacks. - while Gtk.events_pending(): - Gtk.main_iteration_do(False) - tools.garbage_collect() - if self._tmp_dir is not None: - self._tmp_dir = None - - def _initialize_fileprovider(self, path, keep_fileprovider): - ''' Creates the L{file_provider.FileProvider} for C{path}. - - If C{path} is a list, assumes that only the files in the list - should be available. If C{path} is a string, assume that it is - either a directory or an image file, and all files in that directory - should be opened. - - @param path: List of file names, or single file/directory as string. - @param keep_fileprovider: If C{True}, no new provider is constructed. - @return: If C{path} was a list, returns the first list element. - Otherwise, C{path} is not modified.''' - - if isinstance(path, list) and len(path) == 0: - # This is a programming error and does not need translation. - assert False, 'Tried to open an empty list of files.' - - elif isinstance(path, list) and len(path) > 0: - # A list of files was passed - open only these files. - if self._file_provider is None or not keep_fileprovider: - self._file_provider = file_provider.get_file_provider(path) - - return path[0] - else: - # A single file was passed - use Comix' classic open mode - # and open all files in its directory. - if self._file_provider is None or not keep_fileprovider: - self._file_provider = file_provider.get_file_provider([path]) - - return path - - def _check_access(self, path): - ''' Checks for various error that could occur when opening C{path}. - - @param path: Path to file that should be opened. - @return: An appropriate error string, or C{None} if no error was found. - ''' - if not os.path.exists(path): - return _('Could not open %s: No such file.') % path - - elif not os.access(path, os.R_OK): - return _('Could not open %s: Permission denied.') % path - - else: - return None - - def _open_archive(self, path): - ''' Opens the archive passed in C{path}. - - Creates an L{archive_extractor.Extractor} and extracts all images - found within the archive. - - @return: A tuple containing C{(image_files, image_index)}. ''' - - self._base_path = path - try: - self._condition = self._extractor.setup( - self._base_path, self.archive_type) - except Exception: - self._condition = None - raise - self._tmp_dir = self._extractor.get_directory() - - def _listed_contents(self, archive, files): - - if not self.file_loading: - return - self.file_loading = False - - files = self._extractor.get_files() - archive_images = [image for image in files - if image_tools.is_image_file(image) - # Remove MacOS meta files from image list - and not '__MACOSX' in os.path.normpath(image).split(os.sep)] - - self._sort_archive_images(archive_images) - image_files = [os.path.join(self._tmp_dir, f) - for f in archive_images] - - comment_files = list(filter(self._comment_re.search, files)) - tools.alphanumeric_sort(comment_files) - self._comment_files = [os.path.join(self._tmp_dir, f) - for f in comment_files] - - self._name_table = dict(zip(image_files, archive_images)) - self._name_table.update(zip(self._comment_files, comment_files)) - - self._extractor.set_files(archive_images + comment_files) - - self._archive_opened(image_files) - - def _sort_archive_images(self, filelist): - ''' Sorts the image list passed in C{filelist} based on the sorting - preference option. ''' - - if prefs['sort archive by'] == constants.SORT_NAME: - tools.alphanumeric_sort(filelist) - elif prefs['sort archive by'] == constants.SORT_NAME_LITERAL: - filelist.sort() - else: - # No sorting - pass - - if prefs['sort archive order'] == constants.SORT_DESCENDING: - filelist.reverse() - - def _get_index_for_page(self, start_page, num_of_pages, path): - ''' Returns the page that should be displayed for an archive. - @param start_page: If -1, show last page. If 0, show either first page - or last read page. If > 0, show C{start_page}. - @param num_of_pages: Page count. - @param path: Archive path. - ''' - if start_page < 0 and prefs['default double page']: - current_image_index = num_of_pages - 2 - elif start_page < 0 and not prefs['default double page']: - current_image_index = num_of_pages - 1 - elif start_page == 0: - current_image_index = (self.last_read_page.get_page(path) or 1) - 1 - else: - current_image_index = start_page - 1 - - return min(max(0, current_image_index), num_of_pages - 1) - - def _ask_goto_last_read_page(self, path, last_read_page): - ''' If the user read an archive previously, ask to continue from - that time, or from page 1. This method returns a page index, that is, - index + 1. ''' - - read_date = self.last_read_page.get_date(path) - - dialog = message_dialog.MessageDialog( - self._window, - flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.YES_NO) - dialog.set_default_response(Gtk.ResponseType.YES) - dialog.set_should_remember_choice('resume-from-last-read-page', - (Gtk.ResponseType.YES, Gtk.ResponseType.NO)) - dialog.set_text( - (_('Continue reading from page %d?') % last_read_page), - _('You stopped reading here on %(date)s, %(time)s. ' - 'If you choose "Yes", reading will resume on page %(page)d. Otherwise, ' - 'the first page will be loaded.') % {'date': read_date.date().strftime("%x"), - 'time': read_date.time().strftime('%X'), 'page': last_read_page}) - result = dialog.run() - - return result == Gtk.ResponseType.YES - - def _open_image_files(self, filelist, image_path): - ''' Opens all files passed in C{filelist}. - - If C{image_path} is found in C{filelist}, the current page will be set - to its index within C{filelist}. - - @return: Tuple of C{(image_files, image_index)} - ''' - - self._base_path = self._file_provider.get_directory() - - if image_path in filelist: - current_image_index = filelist.index(image_path) - else: - current_image_index = 0 - - return filelist, current_image_index - - def get_file_number(self): - if self.archive_type is None: - # No file numbers for images. - return 0, 0 - file_list = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) - if self._current_file in file_list: - current_index = file_list.index(self._current_file) - else: - current_index = 0 - return current_index + 1, len(file_list) - - def get_number_of_comments(self): - '''Return the number of comments in the current archive.''' - return len(self._comment_files) - - def get_comment_text(self, num): - '''Return the text in comment or None if comment is not - readable. - ''' - self._wait_on_comment(num) - text = None - with open(self._comment_files[num - 1], 'r') as fd: - text = fd.read() - return text - - def get_comment_name(self, num): - '''Return the filename of comment .''' - return self._comment_files[num - 1] - - def update_comment_extensions(self): - '''Update the regular expression used to filter out comments in - archives by their filename. - ''' - exts = '|'.join(prefs['comment extensions']) - self._comment_re = re.compile(r'\.(%s)\s*$' % exts, re.I) - - def get_path_to_base(self): - '''Return the full path to the current base (path to archive or - image directory.) - ''' - if self.archive_type is not None: - return self._base_path - - filename = self._window.imagehandler.get_current_path() - if filename: - return os.path.dirname(filename) - return None - - def get_base_filename(self): - '''Return the filename of the current base (archive filename or - directory name). - ''' - return os.path.basename(self.get_path_to_base()) - - def get_pretty_current_filename(self): - '''Return a string with the name of the currently viewed file that is - suitable for printing. - ''' - - return self._window.imagehandler.get_pretty_current_filename() - - def _open_next_archive(self, *args): - '''Open the archive that comes directly after the currently loaded - archive in that archive's directory listing, sorted alphabetically. - Returns True if a new archive was opened, False otherwise. - ''' - if self.archive_type is not None: - - files = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) - absolute_path = os.path.abspath(self._base_path) - if absolute_path not in files: return - current_index = files.index(absolute_path) - - for path in files[current_index + 1:]: - if archive_tools.archive_mime_type(path) is not None: - self._close() - self.open_file(path, keep_fileprovider=True) - return True - - return False - - def _open_previous_archive(self, *args): - '''Open the archive that comes directly before the currently loaded - archive in that archive's directory listing, sorted alphabetically. - Returns True if a new archive was opened, False otherwise. - ''' - if self.archive_type is not None: - - files = self._file_provider.list_files(file_provider.FileProvider.ARCHIVES) - absolute_path = os.path.abspath(self._base_path) - if absolute_path not in files: return - current_index = files.index(absolute_path) - - for path in reversed(files[:current_index]): - if archive_tools.archive_mime_type(path) is not None: - self._close() - self.open_file(path, -1, keep_fileprovider=True) - return True - - return False - - def open_next_directory(self, *args): - ''' Opens the next sibling directory of the current file, as specified by - file provider. Returns True if a new directory was opened and files found. ''' - - if self._file_provider is None: - return - - if self.archive_type is not None: - listmode = file_provider.FileProvider.ARCHIVES - else: - listmode = file_provider.FileProvider.IMAGES - - current_dir = self._file_provider.get_directory() - if not self._file_provider.next_directory(): - # Restore current directory if no files were found - self._file_provider.set_directory(current_dir) - return False - - files = self._file_provider.list_files(listmode) - self._close() - if len(files) > 0: - path = files[0] - else: - path = self._file_provider.get_directory() - self.open_file(path, keep_fileprovider=True) - return True - - def open_previous_directory(self, *args): - ''' Opens the previous sibling directory of the current file, as specified by - file provider. Returns True if a new directory was opened and files found. ''' - - if self._file_provider is None: - return - - if self.archive_type is not None: - listmode = file_provider.FileProvider.ARCHIVES - else: - listmode = file_provider.FileProvider.IMAGES - - current_dir = self._file_provider.get_directory() - if not self._file_provider.previous_directory(): - # Restore current directory if no files were found - self._file_provider.set_directory(current_dir) - return False - - files = self._file_provider.list_files(listmode) - self._close() - if len(files) > 0: - path = files[-1] - else: - path = self._file_provider.get_directory() - self.open_file(path, -1, keep_fileprovider=True) - return True - - def file_is_available(self, filepath): - ''' Returns True if the file specified by "filepath" is available - for reading, i.e. extracted to harddisk. ''' - - if self.archive_type is not None: - with self._condition: - return self._extractor.is_ready(self._name_table[filepath]) - - elif filepath is None: - return False - - elif os.path.isfile(filepath): - return True - - else: - return False - - @callback.Callback - def file_available(self, filepaths): - ''' Called every time a new file from the Filehandler's opened - files becomes available. C{filepaths} is a list of now available files. - ''' - pass - - def _extracted_file(self, extractor, name): - ''' Called when the extractor finishes extracting the file at - . This name is relative to the temporary directory - the files were extracted to. ''' - if not self.file_loaded: - return - filepath = os.path.join(extractor.get_directory(), name) - self.file_available([filepath]) - - def _wait_on_comment(self, num): - '''Block the running (main) thread until the file corresponding to - comment has been fully extracted. - ''' - path = self._comment_files[num - 1] - self._wait_on_file(path) - - def _wait_on_file(self, path): - '''Block the running (main) thread if the file is from an - archive and has not yet been extracted. Return when the file is - ready. - ''' - if self.archive_type == None or path == None: - return - - try: - name = self._name_table[path] - with self._condition: - while not self._extractor.is_ready(name) and not self._stop_waiting: - self._condition.wait() - except Exception as ex: - log.error('Waiting on extraction of "%s" failed: %s', path, ex) - return - - def _ask_for_files(self, files): - '''Ask for to be given priority for extraction. - ''' - if self.archive_type == None: - return - - with self._condition: - extractor_files = self._extractor.get_files() - for path in reversed(files): - name = self._name_table[path] - if not self._extractor.is_ready(name): - extractor_files.remove(name) - extractor_files.insert(0, name) - self._extractor.set_files(extractor_files) - - def write_fileinfo_file(self): - '''Write current open file information.''' - - if self.file_loaded: - path = self._window.imagehandler.get_real_path() - if not path: - # no file is loaded - return - path = tools.relpath2root(path,abs_fallback=prefs['portable allow abspath']) - - if not path: - # path is None, means running in portable mode - # and currect image is out of same mount point - # so do not create bookmarks - return - - page_index = self._window.imagehandler.get_current_page() - 1 - current_file_info = [path, page_index] - - with open(constants.FILEINFO_JSON_PATH, mode='wt', encoding='utf8') as config: - json.dump(current_file_info, config, ensure_ascii=False, indent=2) - - def read_fileinfo_file(self): - '''Read last loaded file info from disk.''' - - fileinfo = None - - if os.path.isfile(constants.FILEINFO_JSON_PATH): - try: - with open(constants.FILEINFO_JSON_PATH, mode='rt', encoding='utf8') as config: - fileinfo = json.load(config) - except Exception as ex: - log.error(_('! Corrupt preferences file "%s", deleting...'), - constants.FILEINFO_JSON_PATH ) - log.info('Error was: %s', ex) - os.remove(constants.FILEINFO_JSON_PATH) - - return fileinfo - - def update_last_read_page(self): - ''' Stores the currently viewed page. ''' - if self.archive_type is None or not self.file_loaded: - return - - archive_path = self.get_path_to_base() - page = self._window.imagehandler.get_current_page() - # Do not store first page (first page is default - # behaviour and would waste space unnecessarily) - try: - if page == 1: - self.last_read_page.clear_page(archive_path) - else: - self.last_read_page.set_page(archive_path, page) - except ValueError: - # The book no longer exists in the library and has been deleted - pass - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_provider.py mcomix-2.1.0/mcomix/mcomix/file_provider.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/file_provider.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/file_provider.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ -# -*- coding: utf-8 -*- -''' file_provider.py - Handles listing files for the current directory and - switching to the next/previous directory. ''' - -import functools -import os -import re - -from mcomix import image_tools -from mcomix import archive_tools -from mcomix import tools -from mcomix import constants -from mcomix import i18n -from mcomix import log -from mcomix.preferences import prefs - -def get_file_provider(filelist): - ''' Initialize a FileProvider with the files in . - If len(filelist) is 1, a OrderedFileProvider will be constructed, which - will simply open all files in the passed directory. - If len(filelist) is greater 1, a PreDefinedFileProvider will be created, - which will only ever list the files that were passed into it. - If len(filelist) is zero, FileProvider will look at the last file opened, - if "Auto Open last file" is set. Otherwise, no provider is constructed. ''' - - if len(filelist) > 0: - if len(filelist) == 1: - if os.path.exists(filelist[0]): - provider = OrderedFileProvider(filelist[0]) - else: - provider = None - else: - provider = PreDefinedFileProvider(filelist) - - - elif (prefs['auto load last file'] - and os.path.isfile(prefs['path to last file'])): - provider = OrderedFileProvider(prefs['path to last file']) - - else: - provider = None - - return provider - -class FileProvider(object): - ''' Base class for various file listing strategies. ''' - - # Constants for determining which files to list. - IMAGES, ARCHIVES = 1, 2 - - def set_directory(self, file_or_directory): - pass - - def get_directory(self): - return os.path.abspath(os.getcwd()) - - def list_files(self, mode=IMAGES): - return [] - - def next_directory(self): - return False - - def previous_directory(self): - return False - - @staticmethod - def listdir(root=None): - if prefs['dive into subdir']: - yield from (os.path.join(*path) for path in tools.walkpath(root=root)) - else: - yield from os.listdir(root) - - @staticmethod - def sort_files(files): - ''' Sorts a list of C{files} depending on the current preferences. - The list is sorted in-place. ''' - if prefs['sort by'] == constants.SORT_NAME: - tools.alphanumeric_sort(files) - elif prefs['sort by'] == constants.SORT_LAST_MODIFIED: - # Most recently modified file first - files.sort(key=lambda filename: os.path.getmtime(filename)*-1) - elif prefs['sort by'] == constants.SORT_SIZE: - # Smallest file first - files.sort(key=lambda filename: os.stat(filename).st_size) - # else: don't sort at all: use OS ordering. - - # Default is ascending. - if prefs['sort order'] == constants.SORT_DESCENDING: - files.reverse() - - -class OrderedFileProvider(FileProvider): - ''' This provider will list all files in the same directory as the - one passed to the constructor. ''' - - def __init__(self, file_or_directory): - ''' Initializes the file listing. If is a file, - directory will be used as base path. If it is a directory, that - will be used as base file. ''' - - self.set_directory(file_or_directory) - - def set_directory(self, file_or_directory): - ''' Sets the base directory. ''' - - if os.path.isdir(file_or_directory): - dir = file_or_directory - elif os.path.isfile(file_or_directory): - dir = os.path.dirname(file_or_directory) - else: - # Passed file doesn't exist - raise ValueError(_('Invalid path: "%s"') % file_or_directory) - - self.base_dir = os.path.abspath(dir) - - def get_directory(self): - return self.base_dir - - def list_files(self, mode=FileProvider.IMAGES): - ''' Lists all files in the current directory. - Returns a list of absolute paths, already sorted. ''' - - if mode == FileProvider.IMAGES: - should_accept = functools.partial( - image_tools.is_image_file, check_mimetype=True) - elif mode == FileProvider.ARCHIVES: - should_accept = archive_tools.is_archive_file - else: - should_accept = lambda file: True - - files = [] - fname_map = {} - try: - # listdir() return list of bytes only if path is bytes - for fn in self.listdir(self.base_dir): - filename = i18n.to_unicode(fn) - fpath = os.path.join(self.base_dir, filename) - if should_accept(fpath): - files.append(fpath) - fname_map[fpath] = os.path.join(self.base_dir, fn) - except OSError: - log.warning('! ' + _('Could not open %s: Permission denied.'), - self.base_dir) - return [] - - FileProvider.sort_files(files) - return [fname_map[fpath] for fpath in files] - - def next_directory(self): - ''' Switches to the next sibling directory. Next call to - list_file() returns files in the new directory. - Returns True if the directory was changed, otherwise False. ''' - - directories = self.__get_sibling_directories(self.base_dir) - current_index = directories.index(self.base_dir) - if current_index < len(directories) - 1: - self.base_dir = directories[current_index + 1] - return True - else: - return False - - - def previous_directory(self): - ''' Switches to the previous sibling directory. Next call to - list_file() returns files in the new directory. - Returns True if the directory was changed, otherwise False. ''' - - directories = self.__get_sibling_directories(self.base_dir) - current_index = directories.index(self.base_dir) - if current_index > 0: - self.base_dir = directories[current_index - 1] - return True - else: - return False - - def __get_sibling_directories(self, dir): - ''' Returns a list of all sibling directories of , - already sorted. ''' - - parent_dir = os.path.dirname(dir) - directories = [os.path.join(parent_dir, directory) - for directory in os.listdir(parent_dir) - if os.path.isdir(os.path.join(parent_dir, directory))] - - tools.alphanumeric_sort(directories) - return directories - - -class PreDefinedFileProvider(FileProvider): - ''' Returns only a list of files as passed to the constructor. ''' - - def __init__(self, files): - ''' is a list of files that should be shown. The list is filtered - to contain either only images, or only archives, depending on what the first - file is, since FileHandler will probably have problems of archives and images - are mixed in a file list. ''' - - should_accept = self.__get_file_filter(files) - - self.__files = [] - - for file in files: - if os.path.isdir(file): - provider = OrderedFileProvider(file) - self.__files.extend(provider.list_files()) - - elif should_accept(file): - self.__files.append(os.path.abspath(file)) - - - def list_files(self, mode=FileProvider.IMAGES): - ''' Returns the files as passed to the constructor. ''' - - return self.__files - - def __get_file_filter(self, files): - ''' Determines what kind of files should be filtered in the given list - of . Returns either a filter accepting only images, or only archives, - depending on what type of file is found first in the list. ''' - - for file in files: - if os.path.isfile(file): - if image_tools.is_image_file(file): - return image_tools.is_image_file - if archive_tools.is_archive_file(file): - return archive_tools.is_archive_file - - # Default filter only accepts images. - return image_tools.is_image_file - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/histogram.py mcomix-2.1.0/mcomix/mcomix/histogram.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/histogram.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/histogram.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -'''histogram.py - Draw histograms (RGB) from pixbufs.''' - -import PIL.Image as Image -import PIL.ImageDraw as ImageDraw -import PIL.ImageOps as ImageOps - -from mcomix import image_tools - -def draw_histogram(pixbuf, height=170, fill=170, text=True): - '''Draw a histogram from and return it as another pixbuf. - - The returned prixbuf will be 262x px. - - The value of determines the colour intensity of the filled graphs, - valid values are between 0 and 255. - - If is True a label with the maximum pixel value will be added to - one corner. - ''' - im = Image.new('RGB', (258, height - 4), (30, 30, 30)) - hist_data = image_tools.pixbuf_to_pil(pixbuf).histogram() - maximum = max(hist_data[:768] + [1]) - y_scale = float(height - 6) / maximum - r = [int(hist_data[n] * y_scale) for n in range(256)] - g = [int(hist_data[n] * y_scale) for n in range(256, 512)] - b = [int(hist_data[n] * y_scale) for n in range(512, 768)] - im_data = im.getdata() - # Draw the filling colours - for x in range(256): - for y in range(1, max(r[x], g[x], b[x]) + 1): - r_px = y <= r[x] and fill or 0 - g_px = y <= g[x] and fill or 0 - b_px = y <= b[x] and fill or 0 - im_data.putpixel((x + 1, height - 5 - y), (r_px, g_px, b_px)) - # Draw the outlines - for x in range(1, 256): - for y in list(range(r[x-1] + 1, r[x] + 1)) + [r[x]] * (r[x] != 0): - r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) - im_data.putpixel((x + 1, height - 5 - y), (255, g_px, b_px)) - for y in range(r[x] + 1, r[x-1] + 1): - r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) - im_data.putpixel((x, height - 5 - y), (255, g_px, b_px)) - for y in list(range(g[x-1] + 1, g[x] + 1)) + [g[x]] * (g[x] != 0): - r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) - im_data.putpixel((x + 1, height - 5 - y), (r_px, 255, b_px)) - for y in range(g[x] + 1, g[x-1] + 1): - r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) - im_data.putpixel((x, height - 5 - y), (r_px, 255, b_px)) - for y in list(range(b[x-1] + 1, b[x] + 1)) + [b[x]] * (b[x] != 0): - r_px, g_px, b_px = im_data.getpixel((x + 1, height - 5 - y)) - im_data.putpixel((x + 1, height - 5 - y), (r_px, g_px, 255)) - for y in list(range(b[x] + 1, b[x-1] + 1)): - r_px, g_px, b_px = im_data.getpixel((x, height - 5 - y)) - im_data.putpixel((x, height - 5 - y), (r_px, g_px, 255)) - if text: - maxstr = 'max: ' + str(maximum) - draw = ImageDraw.Draw(im) - draw.rectangle((0, 0, len(maxstr) * 6 + 2, 10), fill=(30, 30, 30)) - draw.text((2, 0), maxstr, fill=(255, 255, 255)) - im = ImageOps.expand(im, 1, (80, 80, 80)) - im = ImageOps.expand(im, 1, (0, 0, 0)) - return image_tools.pil_to_pixbuf(im) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/i18n.py mcomix-2.1.0/mcomix/mcomix/i18n.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/i18n.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/i18n.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -''' i18n.py - Encoding and translation handler.''' - -import gettext -import locale -import os -import sys -import threading - -try: - import chardet -except ImportError: - chardet = None - -from mcomix import preferences -from mcomix import portability -from mcomix import constants -from mcomix import tools -from mcomix import log - -# Translation instance to enable other modules to use -# functions other than the global _() if necessary -_translation = None -_unicode_cache = {} -_lock = threading.Lock() - -def to_unicode(s): - with _lock: - return os.path.join(*map(_to_unicode, tools.splitpath(s))) - -def _to_unicode(string): - '''Convert to unicode. First try the default filesystem - encoding, and then fall back on some common encodings. - ''' - fsencoding = sys.getfilesystemencoding() - if not isinstance(string, (bytes, bytearray)): - string = string.encode(fsencoding, 'surrogateescape') - if string in _unicode_cache: - return _unicode_cache[string] - - probable_encoding = None - if chardet: - # Try chardet heuristic - result = chardet.detect(string) - if result['confidence'] > 0.9: - # only accept detection with enough confidence - probable_encoding = result['encoding'] - if not probable_encoding: - probable_encoding = locale.getpreferredencoding() - - newstr = None - for encoding in (probable_encoding, fsencoding, - 'utf-8', 'latin-1'): - try: - newstr = string.decode(encoding) - break - except (UnicodeError, LookupError): - pass - if newstr is None: - newstr = string.decode('utf-8', 'replace') - - _unicode_cache[string]=newstr - return newstr - -def to_utf8(string): - ''' Helper function that converts unicode objects to UTF-8 encoded - strings. Non-unicode strings are assumed to be already encoded - and returned as-is. ''' - - if isinstance(string, str): - return string.encode('utf-8') - else: - return string - -def install_gettext(): - ''' Initialize gettext with the correct directory that contains - MComix translations. This has to be done before any calls to gettext.gettext - have been made to ensure all strings are actually translated. ''' - - # Add the sources' base directory to PATH to allow development without - # explicitly installing the package. - sys.path.append(constants.BASE_PATH) - - # Initialize default locale - locale.setlocale(locale.LC_ALL, '') - - lang_identifiers = [] - if preferences.prefs['language'] != 'auto': - lang = preferences.prefs['language'] - if lang not in ('en', 'en_US'): - # .mo is not needed for english - lang_identifiers.append(lang) - else: - # Get the user's current locale - lang = portability.get_default_locale() - for s in gettext._expand_lang(lang): - lang = s.split('.')[0] - if lang in ('en', 'en_US'): - # .mo is not needed for english - continue - if lang not in lang_identifiers: - lang_identifiers.append(lang) - - # Make sure GTK uses the correct language. - os.environ['LANGUAGE'] = lang - - domain = constants.APPNAME.lower() - - for lang in lang_identifiers: - resource_path = tools.pkg_path('messages', lang, - 'LC_MESSAGES', '%s.mo' % domain) - try: - with open(resource_path, mode = 'rb') as fp: - translation = gettext.GNUTranslations(fp) - break - except IOError: - log.error('locale file: %s not found.', resource_path) - else: - translation = gettext.NullTranslations() - - translation.install() - - global _translation - _translation = translation - -def get_translation(): - ''' Returns the gettext.Translation instance that has been initialized with - install_gettext(). ''' - - return _translation or gettext.NullTranslations() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/icons.py mcomix-2.1.0/mcomix/mcomix/icons.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/icons.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/icons.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -'''icons.py - Load MComix specific icons.''' - -from gi.repository import Gtk - -from mcomix import image_tools -from mcomix import log -from mcomix import tools - -def mcomix_icons(): - ''' Returns a list of differently sized pixbufs for the - application icon. ''' - - sizes = ('16x16', '32x32', '48x48') - pixbufs = [ - image_tools.load_pixbuf_data( - tools.read_binary('images', size, 'mcomix.png') - ) for size in sizes - ] - - return pixbufs - -def load_icons(): - _icons = (('gimp-flip-horizontal.png', 'mcomix-flip-horizontal'), - ('gimp-flip-vertical.png', 'mcomix-flip-vertical'), - ('gimp-rotate-180.png', 'mcomix-rotate-180'), - ('gimp-rotate-270.png', 'mcomix-rotate-270'), - ('gimp-rotate-90.png', 'mcomix-rotate-90'), - ('gimp-thumbnails.png', 'mcomix-thumbnails'), - ('gimp-transform.png', 'mcomix-transform'), - ('tango-enhance-image.png', 'mcomix-enhance-image'), - ('tango-add-bookmark.png', 'mcomix-add-bookmark'), - ('tango-archive.png', 'mcomix-archive'), - ('tango-image.png', 'mcomix-image'), - ('library.png', 'mcomix-library'), - ('comments.png', 'mcomix-comments'), - ('zoom.png', 'mcomix-zoom'), - ('lens.png', 'mcomix-lens'), - ('double-page.png', 'mcomix-double-page'), - ('manga.png', 'mcomix-manga'), - ('fitbest.png', 'mcomix-fitbest'), - ('fitwidth.png', 'mcomix-fitwidth'), - ('fitheight.png', 'mcomix-fitheight'), - ('fitmanual.png', 'mcomix-fitmanual'), - ('fitsize.png', 'mcomix-fitsize')) - - # Load window title icons. - pixbufs = mcomix_icons() - Gtk.Window.set_default_icon_list(pixbufs) - # Load application icons. - factory = Gtk.IconFactory() - for filename, stockid in _icons: - try: - icon_data = tools.read_binary('images', filename) - pixbuf = image_tools.load_pixbuf_data(icon_data) - iconset = Gtk.IconSet.new_from_pixbuf(pixbuf) - factory.add(stockid, iconset) - except Exception: - log.warning(_('! Could not load icon "%s"'), filename) - factory.add_default() - - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/image_handler.py mcomix-2.1.0/mcomix/mcomix/image_handler.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/image_handler.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/image_handler.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,481 +0,0 @@ -'''image_handler.py - Image handler that takes care of cacheing and giving out images.''' - -import os -import traceback - -from mcomix.preferences import prefs -from mcomix import i18n -from mcomix import tools -from mcomix import image_tools -from mcomix import thumbnail_tools -from mcomix import constants -from mcomix import callback -from mcomix import log -from mcomix.lib import mt - -class ImageHandler(object): - - '''The FileHandler keeps track of images, pages, caches and reads files. - - When the Filehandler's methods refer to pages, they are indexed from 1, - i.e. the first page is page 1 etc. - - Other modules should *never* read directly from the files pointed to by - paths given by the FileHandler's methods. The files are not even - guaranteed to exist at all times since the extraction of archives is - threaded. - ''' - - def __init__(self, window): - - #: Reference to main window - self._window = window - - #: Caching thread - self._thread = mt.ThreadPool(name=self.__class__.__name__) - self._lock = mt.Lock() - self._cache_lock = {} - - #: Archive path, if currently opened file is archive - self._base_path = None - #: List of image file names, either from extraction or directory - self._image_files = [] - #: Index of current page - self._current_image_index = None - #: Set of images reading for decoding (i.e. already extracted) - self._available_images = set() - #: List of pixbufs we want to cache - self._wanted_pixbufs = [] - #: Pixbuf map from page > Pixbuf - self._raw_pixbufs = {} - #: How many pages to keep in cache - self._cache_pages = prefs['max pages to cache'] - - self._window.filehandler.file_available += self._file_available - - def _get_pixbuf(self, index): - '''Return the pixbuf indexed by from cache. - Pixbufs not found in cache are fetched from disk first. - ''' - self._cache_pixbuf(index) - return self._raw_pixbufs[index] - - def get_pixbufs(self, number_of_bufs): - '''Returns number_of_bufs pixbufs for the image(s) that should be - currently displayed. This method might fetch images from disk, so make - sure that number_of_bufs is as small as possible. - ''' - result = [] - for i in range(number_of_bufs): - result.append(self._get_pixbuf(self._current_image_index + i)) - return result - - def get_pixbuf_auto_background(self, number_of_bufs): # XXX limited to at most 2 pages - ''' Returns an automatically calculated background color - for the current page(s). ''' - - pixbufs = self.get_pixbufs(number_of_bufs) - - if len(pixbufs) == 1: - auto_bg = image_tools.get_most_common_edge_color(pixbufs[0]) - elif len(pixbufs) == 2: - left, right = pixbufs - if self._window.is_manga_mode: - left, right = right, left - - auto_bg = image_tools.get_most_common_edge_color((left, right)) - else: - assert False, 'Unexpected pixbuf count' - - return auto_bg - - def do_cacheing(self): - '''Make sure that the correct pixbufs are stored in cache. These - are (in the current implementation) the current image(s), and - if cacheing is enabled, also the one or two pixbufs before and - after the current page. All other pixbufs are deleted and garbage - collected directly in order to save memory. - ''' - - if not self._lock.acquire(blocking=False): - return - try: - if not self._window.filehandler.file_loaded: - return - - # Get list of wanted pixbufs. - wanted_pixbufs = self._ask_for_pages(self.get_current_page()) - if -1 != self._cache_pages: - # We're not caching everything, remove old pixbufs. - for index in set(self._raw_pixbufs) - set(wanted_pixbufs): - del self._raw_pixbufs[index] - log.debug('Caching page(s) %s', - ' '.join([str(index + 1) for index in wanted_pixbufs])) - self._wanted_pixbufs[:] = wanted_pixbufs - # Start caching available images not already in cache. - wanted_pixbufs = [index for index in wanted_pixbufs - if index in self._available_images] - self._thread.map_async(self._cache_pixbuf, wanted_pixbufs) - finally: - self._lock.release() - - def _cache_pixbuf(self, index): - self._wait_on_page(index + 1) - with self._cache_lock[index]: - if index in self._raw_pixbufs: - return - with self._lock: - if index not in self._wanted_pixbufs: - return - log.debug('Caching page %u', index + 1) - try: - pixbuf = image_tools.load_pixbuf(self._image_files[index]) - tools.garbage_collect() - except Exception as e: - log.error('Could not load pixbuf for page %u: %r', index + 1, e) - pixbuf = image_tools.MISSING_IMAGE_ICON - self._raw_pixbufs[index] = pixbuf - - def set_page(self, page_num): - '''Set up filehandler to the page . - ''' - assert 0 < page_num <= self.get_number_of_pages() - self._current_image_index = page_num - 1 - self.do_cacheing() - - def set_image_files(self, files): - # Set list of image file names - self._image_files[:] = files - - def get_image_files(self): - # Get list of image file names - return self._image_files.copy() - - def clear_image_files(self): - # Clear list of image file names - self._image_files.clear() - - def clear_raw_pixbufs(self): - # Clear map of page > Pixbuf - self._raw_pixbufs.clear() - - def get_current_path(self): - # Get current image path - try: - return self._image_files[self._current_image_index] - except IndexError: - return '' - - def get_virtual_double_page(self, page=None): - '''Return True if the current state warrants use of virtual - double page mode (i.e. if double page mode is on, the corresponding - preference is set, and one of the two images that should normally - be displayed has a width that exceeds its height), or if currently - on the first page. - ''' - if page == None: - page = self.get_current_page() - - if (page == 1 and - prefs['virtual double page for fitting images'] & constants.SHOW_DOUBLE_AS_ONE_TITLE and - self._window.filehandler.archive_type is not None): - return True - - if (not prefs['default double page'] or - not prefs['virtual double page for fitting images'] & constants.SHOW_DOUBLE_AS_ONE_WIDE or - page == self.get_number_of_pages()): - return False - - for page in (page, page + 1): - if not self.page_is_available(page): - return False - pixbuf = self._get_pixbuf(page - 1) - width, height = pixbuf.get_width(), pixbuf.get_height() - if prefs['auto rotate from exif']: - rotation = image_tools.get_implied_rotation(pixbuf) - assert rotation in (0, 90, 180, 270) - if rotation in (90, 270): - width, height = height, width - if width > height: - return True - - return False - - def get_real_path(self): - '''Return the "real" path to the currently viewed file, i.e. the - full path to the archive or the full path to the currently - viewed image. - ''' - if self._window.filehandler.archive_type is not None: - return self._window.filehandler.get_path_to_base() - return self.get_path_to_page() - - def cleanup(self): - '''Run clean-up tasks. Should be called prior to exit.''' - - self.first_wanted = 0 - self.last_wanted = 1 - - self._thread.renew() - self._wanted_pixbufs.clear() - while self._cache_lock: - index, lock = self._cache_lock.popitem() - with lock:pass - self._base_path = None - self._image_files.clear() - self._current_image_index = None - self._available_images.clear() - self._raw_pixbufs.clear() - - def page_is_available(self, page=None): - ''' Returns True if is available and calls to get_pixbufs - would not block. If is None, the current page(s) are assumed. ''' - - if page is None: - current_page = self.get_current_page() - if not current_page: - # Current 'book' has no page. - return False - index_list = [ current_page - 1 ] - if self._window.displayed_double() and current_page < len(self._image_files): - index_list.append(current_page) - else: - index_list = [ page - 1 ] - - for index in index_list: - if not index in self._available_images: - return False - - return True - - @callback.Callback - def page_available(self, page): - ''' Called whenever a new page becomes available, i.e. the corresponding - file has been extracted. ''' - log.debug('Page %u is available', page) - index = page - 1 - assert index not in self._available_images - self._cache_lock[index]=mt.Lock() - self._available_images.add(index) - # Check if we need to cache it. - if index in self._wanted_pixbufs or -1 == self._cache_pages: - self._thread.apply_async( - self._cache_pixbuf,(index,)) - - def _file_available(self, filepaths): - ''' Called by the filehandler when a new file becomes available. ''' - # Find the page that corresponds to - if not self._image_files: - return - - available = sorted(filepaths) - for i, imgpath in enumerate(self._image_files): - if tools.bin_search(available, imgpath) >= 0: - self.page_available(i + 1) - - def get_number_of_pages(self): - '''Return the number of pages in the current archive/directory.''' - return len(self._image_files) - - def get_current_page(self): - '''Return the current page number (starting from 1), or 0 if no file is loaded.''' - if self._current_image_index is not None: - return self._current_image_index + 1 - else: - return 0 - - def get_path_to_page(self, page=None): - '''Return the full path to the image file for , or the current - page if is None. - ''' - if page is None: - index = self._current_image_index - else: - index = page - 1 - - if isinstance(index, int) and 0 <= index < len(self._image_files): - return self._image_files[index] - else: - return None - - def get_page_filename(self, page=None, double=False, manga=False): - '''Return the filename of the , or the filename of the - currently viewed page if is None. If is True, return - a tuple (p, p') where p is the filename of (or the current - page) and p' is the filename of the page after. - ''' - if not self.page_is_available(): - return ('', '') if double else '' - - def get_fname(page): - path = self.get_path_to_page(page) - return '' if path is None else os.path.basename(path) - - if page is None: - page = self.get_current_page() - - first = get_fname(page) - - if double: - second = get_fname(page + 1) - return (second, first) if manga else (first, second) - - return first - - def get_page_filesize(self, page=None, double=False, manga=False): - '''Return the filesize of the , or the filesize of the - currently viewed page if is None. If is True, return - a tuple (s, s') where s is the filesize of (or the current - page) and s' is the filesize of the page after. - ''' - if not self.page_is_available(): - return ('-1','-1') if double else '-1' - - def get_fsize(page): - path = self.get_path_to_page(page) - try: - fsize = 0 if path is None else os.stat(path).st_size - except OSError: - fsize = 0 - return tools.format_byte_size(fsize) - - if page is None: - page = self.get_current_page() - - first = get_fsize(page) - - if double: - second = get_fsize(page + 1) - return (second, first) if manga else (first, second) - - return first - - def get_pretty_current_filename(self): - '''Return a string with the name of the currently viewed file that is - suitable for printing. - ''' - if self._window.filehandler.archive_type is not None: - return i18n.to_unicode(os.path.basename(self._base_path)) - - img_file = os.path.abspath(self.get_current_path()) - if not img_file: - return '' - - name = os.path.join(*tools.splitpath(img_file)[-2:]) - return i18n.to_unicode(name) - - def get_size(self, page=None): - '''Return a tuple (width, height) with the size of . If - is None, return the size of the current page. - ''' - self._wait_on_page(page) - - page_path = self.get_path_to_page(page) - if page_path is None: - return (0, 0) - - format, width, height = image_tools.get_image_info(page_path) - return (width, height) - - def get_mime_name(self, page=None): - '''Return a string with the name of the mime type of . If - is None, return the mime type name of the current page. - ''' - self._wait_on_page(page) - - page_path = self.get_path_to_page(page) - if page_path is None: - return None - - format, width, height = image_tools.get_image_info(page_path) - return format - - def get_thumbnail(self, page=None, width=128, height=128, create=False, - nowait=False): - '''Return a thumbnail pixbuf of that fit in a box with - dimensions x. Return a thumbnail for the current - page if is None. - - If is True, and x <= 128x128, the - thumbnail is also stored on disk. - - If is True, don't wait for to be available. - ''' - if not self._wait_on_page(page, check_only=nowait): - # Page is not available! - return None - path = self.get_path_to_page(page) - - if path == None: - return None - - try: - thumbnailer = thumbnail_tools.Thumbnailer(store_on_disk=create, - size=(width, height)) - return thumbnailer.thumbnail(path) - except Exception: - log.debug('Failed to create thumbnail for image "%s":\n%s', - path, traceback.format_exc()) - return image_tools.MISSING_IMAGE_ICON - - def _wait_on_page(self, page, check_only=False): - '''Block the running (main) thread until the file corresponding to - image has been fully extracted. - - If is True, only check (and return status), don't wait. - ''' - if page is None: - index = self._current_image_index - else: - index = page - 1 - if index in self._available_images: - # Already extracted! - return True - if check_only: - # Asked for check only... - return False - - log.debug('Waiting for page %u', page) - path = self.get_path_to_page(page) - self._window.filehandler._wait_on_file(path) - return True - - def _ask_for_pages(self, page): - '''Ask for pages around to be given priority extraction. - ''' - total_pages=range(self.get_number_of_pages()) - - num_pages = self._cache_pages - if num_pages < 0: - # default to 10 pages - num_pages = min(10, len(total_pages)) - - page -= 1 - harf = num_pages // 2 - 1 - start = max(0, page - harf) - end = start + num_pages - page_list = list(total_pages[start:end]) - if end > len(total_pages): - start = page_list[0] - (num_pages - len(page_list)) - page_list.extend(range(max(0, start), page_list[0])) - page_list.sort() - - # move page before now to the end - pos = page_list.index(page) - head = page_list[:pos] - page_list[:] = page_list[pos:] - page_list.extend(reversed(head)) - - log.debug('Ask for priority extraction around page %u: %s', - page + 1, ' '.join([str(n + 1) for n in page_list])) - - files = [self._image_files[index] - for index in page_list - if index not in self._available_images] - - if files: - self._window.filehandler._ask_for_files(files) - - return page_list - -# vim: expandtab:sw=4:ts=4 Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/16x16/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/16x16/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/22x22/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/22x22/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/24x24/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/24x24/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/32x32/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/32x32/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/48x48/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/48x48/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/comments.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/comments.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/double-page.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/double-page.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/encrypted-book.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/encrypted-book.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/fitbest.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/fitbest.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/fitheight.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/fitheight.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/fitmanual.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/fitmanual.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/fitsize.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/fitsize.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/fitwidth.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/fitwidth.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-flip-horizontal.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-flip-horizontal.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-flip-vertical.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-flip-vertical.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-rotate-180.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-rotate-180.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-rotate-270.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-rotate-270.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-rotate-90.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-rotate-90.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-thumbnails.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-thumbnails.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/gimp-transform.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/gimp-transform.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/lens.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/lens.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/library.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/library.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/manga.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/manga.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/mcomix.ico and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/mcomix.ico differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/mcomix-large.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/mcomix-large.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/mcomix.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/mcomix.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/tango-add-bookmark.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/tango-add-bookmark.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/tango-archive.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/tango-archive.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/tango-enhance-image.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/tango-enhance-image.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/tango-image.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/tango-image.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/images/zoom.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/mcomix/images/zoom.png differ diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/image_tools.py mcomix-2.1.0/mcomix/mcomix/image_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/image_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/image_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,649 +0,0 @@ -'''image_tools.py - Various image manipulations.''' - -import binascii -from functools import reduce -from io import BytesIO -import os -import re -import sys -import operator - -from gi.repository import GdkPixbuf, Gdk, Gio, GLib, Gtk -from PIL import Image -from PIL import ImageEnhance -from PIL import ImageOps -from PIL import ImageSequence - -from mcomix import anime_tools -from mcomix import constants -from mcomix import log -from mcomix.lib import reader -from mcomix.lib import FlifImagePlugin -from mcomix.preferences import prefs - -# Fallback pixbuf for missing images. -MISSING_IMAGE_ICON = None - -_missing_icon_dialog = Gtk.Dialog() -_missing_icon_pixbuf = _missing_icon_dialog.render_icon( - Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.LARGE_TOOLBAR -) -MISSING_IMAGE_ICON = _missing_icon_pixbuf -assert MISSING_IMAGE_ICON - -GTK_GDK_COLOR_BLACK = Gdk.color_parse('black') -GTK_GDK_COLOR_WHITE = Gdk.color_parse('white') - -if prefs['try FLIF support']: - FlifImagePlugin._init_plugin() - -def _getexif(im): - exif={} - try: - exif.update(im.getexif()) - except AttributeError: - pass - if exif: - return exif - - # Exif of PNG is still buggy in Pillow 6.0.0 - try: - l1,l2,size,*lines=im.info.get('Raw profile type exif').splitlines() - if l2!='exif': - # Not valid Exif data. - return {} - size=int(size) - data=binascii.unhexlify(''.join(lines)) - if len(data)!=size: - # Size not match. - return {} - im.info['exif']=data - except: - # Not valid Exif data. - return {} - - # load Exif again - try: - exif.update(im.getexif()) - except AttributeError: - pass - return exif - -def rotate_pixbuf(src, rotation): - rotation %= 360 - if 0 == rotation: - return src - if 90 == rotation: - return src.rotate_simple(GdkPixbuf.PixbufRotation.CLOCKWISE) - if 180 == rotation: - return src.rotate_simple(GdkPixbuf.PixbufRotation.UPSIDEDOWN) - if 270 == rotation: - return src.rotate_simple(GdkPixbuf.PixbufRotation.COUNTERCLOCKWISE) - raise ValueError('unsupported rotation: %s' % rotation) - -def get_fitting_size(source_size, target_size, - keep_ratio=True, scale_up=False): - ''' Return a scaled version of - small enough to fit in . - - Both and - must be (width, height) tuples. - - If is True, aspect ratio is kept. - - If is True, is scaled up - when smaller than . - ''' - width, height = target_size - src_width, src_height = source_size - if not scale_up and src_width <= width and src_height <= height: - width, height = src_width, src_height - else: - if keep_ratio: - if float(src_width) / width > float(src_height) / height: - height = int(max(src_height * width / src_width, 1)) - else: - width = int(max(src_width * height / src_height, 1)) - return (width, height) - -def trans_pixbuf(src,flip=False,flop=False): - if is_animation(src): - return anime_tools.frame_executor( - src, trans_pixbuf, - kwargs=dict(flip=flip, flop=flop) - ) - if flip: src = src.flip(horizontal=False) - if flop: src = src.flip(horizontal=True) - return src - -def fit_pixbuf_to_rectangle(src, rect, rotation): - if is_animation(src): - return anime_tools.frame_executor( - src, fit_pixbuf_to_rectangle, - args=(rect, rotation) - ) - return fit_in_rectangle(src, rect[0], rect[1], - rotation=rotation, - keep_ratio=False, - scale_up=True) - -def fit_in_rectangle(src, width, height, keep_ratio=True, scale_up=False, - rotation=0, scaling_quality=None): - '''Scale (and return) a pixbuf so that it fits in a rectangle with - dimensions x . A negative or - means an unbounded dimension - both cannot be negative. - - If is 90, 180 or 270 we rotate first so that the - rotated pixbuf is fitted in the rectangle. - - Unless is True we don't stretch images smaller than the - given rectangle. - - If is True, the image ratio is kept, and the result - dimensions may be smaller than the target dimensions. - - If has an alpha channel it gets a checkboard background. - ''' - # "Unbounded" really means "bounded to 10000 px" - for simplicity. - # MComix would probably choke on larger images anyway. - if width < 0: - width = 100000 - elif height < 0: - height = 100000 - width = max(width, 1) - height = max(height, 1) - - rotation %= 360 - if rotation not in (0, 90, 180, 270): - raise ValueError('unsupported rotation: %s' % rotation) - if rotation in (90, 270): - width, height = height, width - - if scaling_quality is None: - scaling_quality = prefs['scaling quality'] - - src_width = src.get_width() - src_height = src.get_height() - - width, height = get_fitting_size((src_width, src_height), - (width, height), - keep_ratio=keep_ratio, - scale_up=scale_up) - - if src.get_has_alpha(): - if prefs['checkered bg for transparent images']: - check_size, color1, color2 = 8, 0x777777, 0x999999 - else: - check_size, color1, color2 = 1024, 0xFFFFFF, 0xFFFFFF - if width == src_width and height == src_height: - # Using anything other than nearest interpolation will result in a - # modified image if no resizing takes place (even if it's opaque). - scaling_quality = GdkPixbuf.InterpType.NEAREST - src = src.composite_color_simple(width, height, scaling_quality, - 255, check_size, color1, color2) - elif width != src_width or height != src_height: - src = src.scale_simple(width, height, scaling_quality) - - src = rotate_pixbuf(src, rotation) - - return src - -def add_border(pixbuf, thickness, colour=0x000000FF): - '''Return a pixbuf from with a px border of - added. - ''' - canvas = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, - pixbuf.get_width() + thickness * 2, - pixbuf.get_height() + thickness * 2) - canvas.fill(colour) - pixbuf.copy_area(0, 0, pixbuf.get_width(), pixbuf.get_height(), - canvas, thickness, thickness) - return canvas - - -def get_most_common_edge_color(pixbufs, edge=2): - '''Return the most commonly occurring pixel value along the four edges - of . The return value is a sequence, (r, g, b), with 16 bit - values. If is a tuple, the edges will be computed from - both the left and the right image. - - Note: This could be done more cleanly with subpixbuf(), but that - doesn't work as expected together with get_pixels(). - ''' - - def group_colors(colors, steps=10): - ''' This rounds a list of colors in C{colors} to the next nearest value, - i.e. 128, 83, 10 becomes 130, 85, 10 with C{steps}=5. This compensates for - dirty colors where no clear dominating color can be made out. - - @return: The color that appears most often in the prominent group.''' - - # Start group - group = (0, 0, 0) - # List of (count, color) pairs, group contains most colors - colors_in_prominent_group = [] - color_count_in_prominent_group = 0 - # List of (count, color) pairs, current color group - colors_in_group = [] - color_count_in_group = 0 - - for count, color in colors: - - # Round color - rounded = [0] * len(color) - for i, color_value in enumerate(color): - if steps % 2 == 0: - middle = steps // 2 - else: - middle = steps // 2 + 1 - - remainder = color_value % steps - if remainder >= middle: - color_value = color_value + (steps - remainder) - else: - color_value = color_value - remainder - - rounded[i] = min(255, max(0, color_value)) - - # Change prominent group if necessary - if rounded == group: - # Color still fits in the previous color group - colors_in_group.append((count, color)) - color_count_in_group += count - else: - # Color group changed, check if current group has more colors - # than last group - if color_count_in_group > color_count_in_prominent_group: - colors_in_prominent_group = colors_in_group - color_count_in_prominent_group = color_count_in_group - - group = rounded - colors_in_group = [ (count, color) ] - color_count_in_group = count - - # Cleanup if only one edge color group was found - if color_count_in_group > color_count_in_prominent_group: - colors_in_prominent_group = colors_in_group - - colors_in_prominent_group.sort(key=operator.itemgetter(0), reverse=True) - # List is now sorted by color count, first color appears most often - return colors_in_prominent_group[0][1] - - def get_edge_pixbuf(pixbuf, side, edge): - ''' Returns a pixbuf corresponding to the side passed in . - Valid sides are 'left', 'right', 'top', 'bottom'. ''' - pixbuf = static_image(pixbuf) - width = pixbuf.get_width() - height = pixbuf.get_height() - edge = min(edge, width, height) - - subpix = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, - pixbuf.get_has_alpha(), 8, edge, height) - if side == 'left': - pixbuf.copy_area(0, 0, edge, height, subpix, 0, 0) - elif side == 'right': - pixbuf.copy_area(width - edge, 0, edge, height, subpix, 0, 0) - elif side == 'top': - pixbuf.copy_area(0, 0, width, edge, subpix, 0, 0) - elif side == 'bottom': - pixbuf.copy_area(0, height - edge, width, edge, subpix, 0, 0) - else: - assert False, 'Invalid edge side' - - return subpix - - if not pixbufs: - return (0, 0, 0) - - if not isinstance(pixbufs, (tuple, list)): - left_edge = get_edge_pixbuf(pixbufs, 'left', edge) - right_edge = get_edge_pixbuf(pixbufs, 'right', edge) - else: - assert len(pixbufs) == 2, 'Expected two pages in list' - left_edge = get_edge_pixbuf(pixbufs[0], 'left', edge) - right_edge = get_edge_pixbuf(pixbufs[1], 'right', edge) - - # Find all edge colors. Color count is separate for all four edges - ungrouped_colors = [] - for edge in (left_edge, right_edge): - im = pixbuf_to_pil(edge) - ungrouped_colors.extend(im.getcolors(im.size[0] * im.size[1])) - - # Sum up colors from all edges - ungrouped_colors.sort(key=operator.itemgetter(1)) - most_used = group_colors(ungrouped_colors) - return [color/255 for color in most_used] - -def pil_to_pixbuf(im, keep_orientation=False): - '''Return a pixbuf created from the PIL .''' - if im.mode.startswith('RGB'): - has_alpha = im.mode == 'RGBA' - elif im.mode in ('LA', 'P'): - has_alpha = True - else: - has_alpha = False - target_mode = 'RGBA' if has_alpha else 'RGB' - if im.mode != target_mode: - im = im.convert(target_mode) - pixbuf = GdkPixbuf.Pixbuf.new_from_bytes( - GLib.Bytes.new(im.tobytes()), GdkPixbuf.Colorspace.RGB, - has_alpha, 8, - im.size[0], im.size[1], - (4 if has_alpha else 3) * im.size[0] - ) - if keep_orientation: - # Keep orientation metadata. - orientation = _getexif(im).get(274, None) - if orientation is not None: - setattr(pixbuf, 'orientation', str(orientation)) - return pixbuf - -def pixbuf_to_pil(pixbuf): - '''Return a PIL image created from .''' - dimensions = pixbuf.get_width(), pixbuf.get_height() - stride = pixbuf.get_rowstride() - pixels = pixbuf.get_pixels() - mode = 'RGBA' if pixbuf.get_has_alpha() else 'RGB' - im = Image.frombuffer(mode, dimensions, pixels, 'raw', mode, stride, 1) - return im - -def is_animation(pixbuf): - return isinstance(pixbuf, GdkPixbuf.PixbufAnimation) - -def disable_transform(pixbuf): - if is_animation(pixbuf): - if not hasattr(pixbuf,'_framebuffer'): - return True - if not prefs['animation transform']: - return True - return False - -def static_image(pixbuf): - ''' Returns a non-animated version of the specified pixbuf. ''' - if is_animation(pixbuf): - return pixbuf.get_static_image() - return pixbuf - -def unwrap_image(image): - ''' Returns an object that contains the image data based on - gtk.Image.get_storage_type or None if image is None or image.get_storage_type - returns Gtk.ImageType.EMPTY. ''' - if image is None: - return None - t = image.get_storage_type() - if t == Gtk.ImageType.EMPTY: - return None - if t == Gtk.ImageType.PIXBUF: - return image.get_pixbuf() - if t == Gtk.ImageType.ANIMATION: - return image.get_animation() - if t == Gtk.ImageType.PIXMAP: - return image.get_pixmap() - if t == Gtk.ImageType.IMAGE: - return image.get_image() - if t == Gtk.ImageType.STOCK: - return image.get_stock() - if t == Gtk.ImageType.ICON_SET: - return image.get_icon_set() - raise ValueError() - -def set_from_pixbuf(image, pixbuf): - if is_animation(pixbuf): - return image.set_from_animation(pixbuf) - else: - return image.set_from_pixbuf(pixbuf) - -def load_animation(im): - if im.format=='GIF' and im.mode=='P': - # TODO: Pillow has bug with gif animation - # https://github.com/python-pillow/Pillow/labels/GIF - raise NotImplementedError('Pillow has bug with gif animation, ' - 'fallback to GdkPixbuf') - anime=anime_tools.AnimeFrameBuffer(im.n_frames,loop=im.info['loop']) - background=im.info.get('background',None) - if isinstance(background,tuple): - color=0 - for n,c in enumerate(background): - color|=c<. ''' - try: - with Image.open(BytesIO(imgdata)) as im: - return pil_to_pixbuf(im, keep_orientation=True) - except: - pass - loader = GdkPixbuf.PixbufLoader() - loader.write(imgdata) - loader.close() - return loader.get_pixbuf() - -def enhance(pixbuf, brightness=1.0, contrast=1.0, saturation=1.0, - sharpness=1.0, autocontrast=False): - '''Return a modified pixbuf from where the enhancement operations - corresponding to each argument has been performed. A value of 1.0 means - no change. If is True it overrides the value, - but only if the image mode is supported by ImageOps.autocontrast (i.e. - it is L or RGB.) - ''' - if is_animation(pixbuf): - return anime_tools.frame_executor( - pixbuf, enhance, - kwargs=dict( - brightness=brightness, contrast=contrast, - saturation=saturation, sharpness=1.0, - autocontrast=False - ) - ) - im = pixbuf_to_pil(pixbuf) - if brightness != 1.0: - im = ImageEnhance.Brightness(im).enhance(brightness) - if autocontrast and im.mode in ('L', 'RGB'): - im = ImageOps.autocontrast(im, cutoff=0.1) - elif contrast != 1.0: - im = ImageEnhance.Contrast(im).enhance(contrast) - if saturation != 1.0: - im = ImageEnhance.Color(im).enhance(saturation) - if sharpness != 1.0: - im = ImageEnhance.Sharpness(im).enhance(sharpness) - return pil_to_pixbuf(im) - -def get_implied_rotation(pixbuf): - '''Return the implied rotation in degrees: 0, 90, 180, or 270. - - The implied rotation is the angle (in degrees) that the raw pixbuf should - be rotated in order to be displayed "correctly". E.g. a photograph taken - by a camera that is held sideways might store this fact in its Exif data, - and the pixbuf loader will set the orientation option correspondingly. - ''' - pixbuf = static_image(pixbuf) - orientation = getattr(pixbuf, 'orientation', None) - if orientation is None: - orientation = pixbuf.get_option('orientation') - if orientation == '3': - return 180 - elif orientation == '6': - return 90 - elif orientation == '8': - return 270 - return 0 - -def combine_pixbufs( pixbuf1, pixbuf2, are_in_manga_mode ): - if are_in_manga_mode: - r_source_pixbuf = pixbuf1 - l_source_pixbuf = pixbuf2 - else: - l_source_pixbuf = pixbuf1 - r_source_pixbuf = pixbuf2 - - has_alpha = False - - if l_source_pixbuf.get_property('has-alpha') or \ - r_source_pixbuf.get_property('has-alpha'): - has_alpha = True - - bits_per_sample = 8 - - l_source_pixbuf_width = l_source_pixbuf.get_property('width') - r_source_pixbuf_width = r_source_pixbuf.get_property('width') - - l_source_pixbuf_height = l_source_pixbuf.get_property('height') - r_source_pixbuf_height = r_source_pixbuf.get_property('height') - - new_width = l_source_pixbuf_width + r_source_pixbuf_width - - new_height = max(l_source_pixbuf_height, r_source_pixbuf_height) - - new_pix_buf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=has_alpha, - bits_per_sample=bits_per_sample, - width=new_width, height=new_height) - - l_source_pixbuf.copy_area(0, 0, l_source_pixbuf_width, - l_source_pixbuf_height, - new_pix_buf, 0, 0) - - r_source_pixbuf.copy_area(0, 0, r_source_pixbuf_width, - r_source_pixbuf_height, - new_pix_buf, l_source_pixbuf_width, 0) - - return new_pix_buf - -def convert_rgb16list_to_rgba8int(c): - return 0x000000FF | (c[0] >> 8 << 24) | (c[1] >> 8 << 16) | (c[2] >> 8 << 8) - -def rgb_to_y_601(color): - return color[0] * 0.299 + color[1] * 0.587 + color[2] * 0.114 - -def text_color_for_background_color(bgcolor): - return GTK_GDK_COLOR_BLACK if rgb_to_y_601(bgcolor) >= \ - 65535.0 / 2.0 else GTK_GDK_COLOR_WHITE - -def get_image_info(path): - '''Return image informations: - (format, width, height) - ''' - info = None - try: - with reader.LockedFileIO(path) as fio: - with Image.open(fio) as im: - return (im.format,) + im.size - except: - info = GdkPixbuf.Pixbuf.get_file_info(path) - if info[0] is None: - info = None - else: - info = info[0].get_name().upper(), info[1], info[2] - if info is None: - info = (_('Unknown filetype'), 0, 0) - return info - -SUPPORTED_IMAGE_EXTS=set() -SUPPORTED_IMAGE_MIMES=set() -SUPPORTED_IMAGE_FORMATS={} - -def init_supported_formats(): - # formats supported by PIL - # Make sure all supported formats are registered. - Image.init() - for ext,name in Image.EXTENSION.items(): - fmt=SUPPORTED_IMAGE_FORMATS.setdefault(name,(set(),set())) - fmt[1].add(ext.lower()) - mime=Image.MIME.get( - name, Gio.content_type_guess(filename='file'+ext)[0]).lower() - if mime and mime != 'application/octet-stream': - fmt[0].add(mime) - - # formats supported by gdk-pixbuf - for gdkfmt in GdkPixbuf.Pixbuf.get_formats(): - fmt=SUPPORTED_IMAGE_FORMATS.setdefault( - gdkfmt.get_name().upper(),(set(),set())) - for m in map(lambda s:s.lower(),gdkfmt.get_mime_types()): - fmt[0].add(m) - # get_extensions() return extensions without '.' - for e in map(lambda s:'.'+s.lower(),gdkfmt.get_extensions()): - fmt[1].add(e) - m = Gio.content_type_guess(filename='file'+e)[0].lower() - if m and m != 'application/octet-stream': - fmt[0].add(m) - - # cache a supported extensions list - for mimes,exts in SUPPORTED_IMAGE_FORMATS.values(): - SUPPORTED_IMAGE_EXTS.update(exts) - SUPPORTED_IMAGE_MIMES.update(mimes) - -def get_supported_formats(): - if not SUPPORTED_IMAGE_FORMATS: - init_supported_formats() - return SUPPORTED_IMAGE_FORMATS - -def is_image_file(path, check_mimetype=False): - # if check_mimetype is True, - # read starting bytes and using Gio.content_type_guess - # to guess if path is supported, ignoring file extension. - if not SUPPORTED_IMAGE_FORMATS: - init_supported_formats() - if prefs['check image mimetype'] and check_mimetype and os.path.isfile(path): - with open(path, mode='rb') as fd: - magic = fd.read(10) - mime, uncertain = Gio.content_type_guess(data=magic) - return mime.lower() in SUPPORTED_IMAGE_MIMES - return path.lower().endswith(tuple(SUPPORTED_IMAGE_EXTS)) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings_editor.py mcomix-2.1.0/mcomix/mcomix/keybindings_editor.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings_editor.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/keybindings_editor.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Configuration tree view for the preferences dialog to edit keybindings. ''' - -from gi.repository import Gtk - -from mcomix import keybindings_map - - -class KeybindingEditorWindow(Gtk.ScrolledWindow): - - def __init__(self, keymanager): - ''' @param keymanager: KeybindingManager instance. ''' - super(KeybindingEditorWindow, self).__init__() - self.set_border_width(5) - self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) - - self.keymanager = keymanager - - accel_column_num = max([ - len(self.keymanager.get_bindings_for_action(action)) - for action in keybindings_map.BINDING_INFO.keys() - ]) - accel_column_num = self.accel_column_num = max([3, accel_column_num]) - - # Human name, action name, true value, shortcut 1, shortcut 2, ... - model = [str, str, 'gboolean'] - model.extend([str, ] * accel_column_num) - - treestore = self.treestore = Gtk.TreeStore(*model) - self.refresh_model() - - treeview = Gtk.TreeView(model=treestore) - - tvcol1 = Gtk.TreeViewColumn(_('Name')) - treeview.append_column(tvcol1) - cell1 = Gtk.CellRendererText() - tvcol1.pack_start(cell1, True) - tvcol1.set_attributes(cell1, text=0, editable=2) - - for idx in range(0, self.accel_column_num): - tvc = Gtk.TreeViewColumn(_('Key %d') % (idx +1)) - treeview.append_column(tvc) - accel_cell = Gtk.CellRendererAccel() - accel_cell.connect('accel-edited', self.get_on_accel_edited(idx)) - accel_cell.connect('accel-cleared', self.get_on_accel_cleared(idx)) - tvc.pack_start(accel_cell, True) - tvc.add_attribute(accel_cell, 'text', 3 + idx) - tvc.add_attribute(accel_cell, 'editable', 2) - - # Allow sorting on the column - tvcol1.set_sort_column_id(0) - - self.add_with_viewport(treeview) - - def refresh_model(self): - ''' Initializes the model from data provided by the keybinding - manager. ''' - self.treestore.clear() - section_order = list(set( - d['group'] for d in keybindings_map.BINDING_INFO.values() - )) - section_order.sort() - section_parent_map = {} - for section_name in section_order: - row = [section_name, None, False] - row.extend([None,] * self.accel_column_num) - section_parent_map[section_name] = self.treestore.append( - None, row - ) - - action_treeiter_map = self.action_treeiter_map = {} - # Sort actions by action name - actions = sorted(keybindings_map.BINDING_INFO.items(), - key=lambda item: item[1]['title']) - for action_name, action_data in actions: - title = action_data['title'] - group_name = action_data['group'] - old_bindings = self.keymanager.get_bindings_for_action(action_name) - acc_list = [''] * self.accel_column_num - for idx in range(0, self.accel_column_num): - if len(old_bindings) > idx: - acc_list[idx] = Gtk.accelerator_name(*old_bindings[idx]) - - row = [title, action_name, True] - row.extend(acc_list) - treeiter = self.treestore.append( - section_parent_map[group_name], - row - ) - action_treeiter_map[action_name] = treeiter - - def get_on_accel_edited(self, column): - def on_accel_edited(renderer, path, accel_key, accel_mods, hardware_keycode): - iter = self.treestore.get_iter(path) - col = column + 3 # accel cells start from 3 position - old_accel = self.treestore.get(iter, col)[0] - new_accel = Gtk.accelerator_name(accel_key, accel_mods) - self.treestore.set_value(iter, col, new_accel) - action_name = self.treestore.get_value(iter, 1) - affected_action = self.keymanager.edit_accel(action_name, new_accel, old_accel) - - # Find affected row and cell - if affected_action == action_name: - for idx in range(0, self.accel_column_num): - if idx != column and self.treestore.get(iter, idx + 3)[0] == new_accel: - self.treestore.set_value(iter, idx + 3, '') - elif affected_action is not None: - titer = self.action_treeiter_map[affected_action] - for idx in range(0, self.accel_column_num): - if self.treestore.get(titer, idx + 3)[0] == new_accel: - self.treestore.set_value(titer, idx + 3, '') - - # updating gtk accelerator for label in menu - if self.keymanager.get_bindings_for_action(action_name)[0] == (accel_key, accel_mods): - Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, - accel_key, accel_mods, True) - - return on_accel_edited - - def get_on_accel_cleared(self, column): - def on_accel_cleared(renderer, path, *args): - iter = self.treestore.get_iter(path) - col = column + 3 - accel = self.treestore.get(iter, col)[0] - action_name = self.treestore.get_value(iter, 1) - if accel != '': - self.keymanager.clear_accel(action_name, accel) - - # updating gtk accelerator for label in menu - if len(self.keymanager.get_bindings_for_action(action_name)) == 0: - Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, 0, 0, True) - else: - key, mods = self.keymanager.get_bindings_for_action(action_name)[0] - Gtk.AccelMap.change_entry('/mcomix-main/%s' % action_name, key, mods, True) - - self.treestore.set_value(iter, col, '') - return on_accel_cleared - - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings_map.py mcomix-2.1.0/mcomix/mcomix/keybindings_map.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings_map.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/keybindings_map.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# Bindings defined in this dictionary will appear in the configuration dialog. -# If 'group' is None, the binding cannot be modified from the preferences dialog. -BINDING_INFO = { - # Navigation between pages, archives, directories - 'previous_page': {'title': _('Previous page'), - 'group': _('Navigation')}, - 'next_page': {'title': _('Next page'), - 'group': _('Navigation')}, - 'previous_page_ff': {'title': _('Back ten pages'), - 'group': _('Navigation')}, - 'next_page_ff': {'title': _('Forward ten pages'), - 'group': _('Navigation')}, - 'previous_page_dynamic': {'title': _('Previous page (dynamic)'), - 'group': _('Navigation')}, - 'next_page_dynamic': {'title': _('Next page (dynamic)'), - 'group': _('Navigation')}, - 'previous_page_singlestep': {'title': _('Previous page (always one page)'), - 'group': _('Navigation')}, - 'next_page_singlestep': {'title': _('Next page (always one page)'), - 'group': _('Navigation')}, - - 'first_page': {'title': _('First page'), - 'group': _('Navigation')}, - 'last_page': {'title': _('Last page'), - 'group': _('Navigation')}, - 'go_to': {'title': _('Go to page'), - 'group': _('Navigation')}, - - 'next_archive': {'title': _('Next archive'), - 'group': _('Navigation')}, - 'previous_archive': {'title': _('Previous archive'), - 'group': _('Navigation')}, - 'next_directory': {'title': _('Next directory'), - 'group': _('Navigation')}, - 'previous_directory': {'title': _('Previous directory'), - 'group': _('Navigation')}, - - # Scrolling - 'scroll_left_bottom': {'title': _('Scroll to bottom left'), - 'group': _('Scroll')}, - 'scroll_middle_bottom': {'title': _('Scroll to bottom center'), - 'group': _('Scroll')}, - 'scroll_right_bottom': {'title': _('Scroll to bottom right'), - 'group': _('Scroll')}, - - 'scroll_left_middle': {'title': _('Scroll to middle left'), - 'group': _('Scroll')}, - 'scroll_middle': {'title': _('Scroll to center'), - 'group': _('Scroll')}, - 'scroll_right_middle': {'title': _('Scroll to middle right'), - 'group': _('Scroll')}, - - 'scroll_left_top': {'title': _('Scroll to top left'), - 'group': _('Scroll')}, - 'scroll_middle_top': {'title': _('Scroll to top center'), - 'group': _('Scroll')}, - 'scroll_right_top': {'title': _('Scroll to top right'), - 'group': _('Scroll')}, - - 'scroll_down': {'title': _('Scroll down'), - 'group': _('Scroll')}, - 'scroll_up': {'title': _('Scroll up'), - 'group': _('Scroll')}, - 'scroll_right': {'title': _('Scroll right'), - 'group': _('Scroll')}, - 'scroll_left': {'title': _('Scroll left'), - 'group': _('Scroll')}, - - 'smart_scroll_up': {'title': _('Smart scroll up'), - 'group': _('Scroll')}, - 'smart_scroll_down': {'title': _('Smart scroll down'), - 'group': _('Scroll')}, - - # View - 'zoom_in': {'title': _('Zoom in'), - 'group': _('Zoom')}, - 'zoom_out': {'title': _('Zoom out'), - 'group': _('Zoom')}, - 'zoom_original': {'title': _('Normal size'), - 'group': _('Zoom')}, - - 'keep_transformation': {'title': _('Keep transformation'), - 'group': _('Transformation')}, - 'rotate_90': {'title': _('Rotate 90 degrees CW'), - 'group': _('Transformation')}, - 'rotate_180': {'title': _('Rotate 180 degrees'), - 'group': _('Transformation')}, - 'rotate_270': {'title': _('Rotate 90 degrees CCW'), - 'group': _('Transformation')}, - 'flip_horiz': {'title': _('Flip horizontally'), - 'group': _('Transformation')}, - 'flip_vert': {'title': _('Flip vertically'), - 'group': _('Transformation')}, - 'no_autorotation': {'title': _('Never autorotate'), - 'group': _('Transformation')}, - - 'rotate_90_width': {'title': _('Rotate 90 degrees CW'), - 'group': _('Autorotate by width')}, - 'rotate_270_width': {'title': _('Rotate 90 degrees CCW'), - 'group': _('Autorotate by width')}, - 'rotate_90_height': {'title': _('Rotate 90 degrees CW'), - 'group': _('Autorotate by height')}, - 'rotate_270_height': {'title': _('Rotate 90 degrees CCW'), - 'group': _('Autorotate by height')}, - - 'double_page': {'title': _('Double page mode'), - 'group': _('View mode')}, - 'manga_mode': {'title': _('Manga mode'), - 'group': _('View mode')}, - 'invert_scroll': {'title': _('Invert smart scroll'), - 'group': _('View mode')}, - - 'lens': {'title': _('Magnifying lens'), - 'group': _('View mode')}, - 'stretch': {'title': _('Stretch small images'), - 'group': _('View mode')}, - - 'best_fit_mode': {'title': _('Best fit mode'), - 'group': _('View mode')}, - 'fit_width_mode': {'title': _('Fit width mode'), - 'group': _('View mode')}, - 'fit_height_mode': {'title': _('Fit height mode'), - 'group': _('View mode')}, - 'fit_size_mode': {'title': _('Fit size mode'), - 'group': _('View mode')}, - 'fit_manual_mode': {'title': _('Manual zoom mode'), - 'group': _('View mode')}, - - # General UI - 'exit_fullscreen': {'title': _('Exit from fullscreen'), - 'group': _('User interface')}, - - 'osd_panel': {'title': _('Show OSD panel'), - 'group': _('User interface')}, - 'minimize': {'title': _('Minimize'), - 'group': _('User interface')}, - 'fullscreen': {'title': _('Fullscreen'), - 'group': _('User interface')}, - 'toggle_fullscreen': {'title': _('Toggle fullscreen'), - 'group': _('User interface')}, - 'toolbar': {'title': _('Show/hide toolbar'), - 'group': _('User interface')}, - 'menubar': {'title': _('Show/hide menubar'), - 'group': _('User interface')}, - 'statusbar': {'title': _('Show/hide statusbar'), - 'group': _('User interface')}, - 'scrollbar': {'title': _('Show/hide scrollbars'), - 'group': _('User interface')}, - 'thumbnails': {'title': _('Thumbnails'), - 'group': _('User interface')}, - 'hide_all': {'title': _('Show/hide all'), - 'group': _('User interface')}, - 'slideshow': {'title': _('Start slideshow'), - 'group': _('User interface')}, - - # File operations - 'refresh_archive': {'title': _('Refresh'), - 'group': _('File')}, - 'close': {'title': _('Close'), - 'group': _('File')}, - 'quit': {'title': _('Quit'), - 'group': _('File')}, - 'save_and_quit': {'title': _('Save and quit'), - 'group': _('File')}, - 'extract_page': {'title': _('Save As'), - 'group': _('File')}, - - 'comments': {'title': _('Archive comments'), - 'group': _('File')}, - 'properties': {'title': _('Properties'), - 'group': _('File')}, - 'preferences': {'title': _('Preferences'), - 'group': _('File')}, - - 'edit_archive': {'title': _('Edit archive'), - 'group': _('File')}, - 'open': {'title': _('Open'), - 'group': _('File')}, - 'enhance_image': {'title': _('Enhance image'), - 'group': _('File')}, - 'library': {'title': _('Library'), - 'group': _('File')}, -} - -# Generate 9 entries for executing command 1 to 9 -for i in range(1, 10): - BINDING_INFO['execute_command_%d' %i] = { - 'title' : _('Execute external command') + ' (%d)' % i, - 'group' : _('External commands') - } - -DEFAULT_BINDINGS = { - # Navigation between pages, archives, directories - 'previous_page':['Page_Up','KP_Page_Up','BackSpace'], - 'next_page':['Page_Down','KP_Page_Down'], - 'previous_page_singlestep':['Page_Up','KP_Page_Up','BackSpace'], - 'next_page_singlestep':['Page_Down','KP_Page_Down'], - 'previous_page_dynamic':['Left'], - 'next_page_dynamic':['Right'], - 'previous_page_ff':['Page_Up','KP_Page_Up','BackSpace','Left'], - 'next_page_ff':['Page_Down','KP_Page_Down','Right'], - - 'first_page':['Home','KP_Home'], - 'last_page':['End','KP_End'], - 'go_to':['G'], - - 'next_archive':['N'], - 'previous_archive':['P'], - 'next_directory':['N'], - 'previous_directory':['P'], - - # Scrolling - # Numpad (without numlock) aligns the image depending on the key. - 'scroll_left_bottom':['KP_1'], - 'scroll_middle_bottom':['KP_2'], - 'scroll_right_bottom':['KP_3'], - - 'scroll_left_middle':['KP_4'], - 'scroll_middle':['KP_5'], - 'scroll_right_middle':['KP_6'], - - 'scroll_left_top':['KP_7'], - 'scroll_middle_top':['KP_8'], - 'scroll_right_top':['KP_9'], - - # Arrow keys scroll the image - 'scroll_down':['Down','KP_Down'], - 'scroll_up':['Up','KP_Up'], - 'scroll_right':['Right','KP_Right'], - 'scroll_left':['Left','KP_Left'], - - # Space key scrolls down a percentage of the window height or the - # image height at a time. When at the bottom it flips to the next - # page. - # - # It also has a "smart scrolling mode" in which we try to follow - # the flow of the comic. - # - # If Shift is pressed we should backtrack instead. - 'smart_scroll_up':['space'], - 'smart_scroll_down':['space'], - - # View - 'zoom_in':['plus','KP_Add','equal'], - 'zoom_out':['minus','KP_Subtract'], - # Zoom out is already defined as GTK menu hotkey - 'zoom_original':['0','KP_0'], - - 'keep_transformation':['k'], - 'rotate_90':['r'], - 'rotate_270':['r'], - 'rotate_180':[], - 'flip_horiz':[], - 'flip_vert':[], - 'no_autorotation':[], - - 'rotate_90_width':[], - 'rotate_270_width':[], - 'rotate_90_height':[], - 'rotate_270_height':[], - - 'double_page':['d'], - 'manga_mode':['m'], - 'invert_scroll':['x'], - - 'lens':['l'], - 'stretch':['y'], - - 'best_fit_mode':['b'], - 'fit_width_mode':['w'], - 'fit_height_mode':['h'], - 'fit_size_mode':['s'], - 'fit_manual_mode':['a'], - - # General UI - 'exit_fullscreen':['Escape'], - - 'osd_panel':['Tab'], - 'minimize':['n'], - 'fullscreen':['f','F11'], - 'toggle_fullscreen':[], - 'toolbar':[], - 'menubar':['M'], - 'statusbar':[], - 'scrollbar':[], - 'thumbnails':['F9'], - 'hide_all':['i'], - 'slideshow':['S'], - - # File operations - 'refresh_archive':['R'], - 'close':['W'], - 'quit':['Q'], - 'save_and_quit':['q'], - 'extract_page':['s'], - - 'comments':['c'], - 'properties':['Return'], - 'preferences':['F12'], - - 'edit_archive':[], - 'open':['O'], - 'enhance_image':['e'], - 'library':['L'], -} - -# Execute external command. Bind keys from 1 to 9 to commands 1 to 9. -for i in range(1, 10): - DEFAULT_BINDINGS['execute_command_%d' % i] = [str(i)] diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings.py mcomix-2.1.0/mcomix/mcomix/keybindings.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/keybindings.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/keybindings.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,208 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Dynamic hotkey management - -This module handles global hotkeys that were previously hardcoded in events.py. -All menu accelerators are handled using GTK's built-in accelerator map. The map -doesn't seem to support multiple keybindings for one action, though, so this -module takes care of the problem. - -At runtime, other modules can register a callback for a specific action name. -This action name has to be registered in keybindings_map.BINDING_INFO, or an Exception will be -thrown. The module can pass a list of default keybindings. If the user hasn't -configured different bindings, the default ones will be used. - -Afterwards, the action will be stored together with its keycode/modifier in a -dictionary: -(keycode: int, modifier: GdkModifierType) => - (action: string, callback: func, args: list, kwargs: dict) - -Default keybindings will be stored here at initialization: -action-name: string => [keycodes: list] - - -Each action_name can have multiple keybindings. -''' - -import os -import shutil -import json -from collections import defaultdict - -from gi.repository import Gtk - -from mcomix import constants -from mcomix import log -from mcomix import keybindings_map - -class _KeybindingManager(object): - def __init__(self, window): - #: Main window instance - self._window = window - - self._action_to_callback = {} # action name => (func, args, kwargs) - self._action_to_bindings = defaultdict(list) # action name => [ (key code, key modifier), ] - self._binding_to_action = {} # (key code, key modifier) => action name - - self._initialize() - - def register(self, name, callback, args=[], kwargs={}, bindings=[]): - ''' Registers an action for a predefined keybinding name. - @param name: Action name, defined in L{keybindings_map.BINDING_INFO}. - @param bindings: List of keybinding strings, as understood - by L{Gtk.accelerator_parse}. Only used if no - bindings were loaded for this action. - @param callback: Function callback - @param args: List of arguments to pass to the callback - @param kwargs: List of keyword arguments to pass to the callback. - ''' - assert name in keybindings_map.BINDING_INFO, '"%s" isn\'t a valid keyboard action.' % name - - # Load stored keybindings, or fall back to passed arguments - keycodes = self._action_to_bindings[name] - if keycodes == []: - keycodes = [Gtk.accelerator_parse(binding) for binding in bindings] - - for keycode in keycodes: - if keycode in self._binding_to_action.keys(): - if self._binding_to_action[keycode] != name: - log.warning(_('Keybinding for "%(action)s" overrides hotkey for another action.'), - {'action': name}) - log.warning('Binding %s overrides %r', keycode, self._binding_to_action[keycode]) - else: - self._binding_to_action[keycode] = name - self._action_to_bindings[name].append(keycode) - - # Add gtk accelerator for labels in menu - if len(self._action_to_bindings[name]) > 0: - key, mod = self._action_to_bindings[name][0] - Gtk.AccelMap.change_entry('/mcomix-main/%s' % name, key, mod, True) - - self._action_to_callback[name] = (callback, args, kwargs) - - - def edit_accel(self, name, new_binding, old_binding): - ''' Changes binding for an action - @param name: Action name - @param new_binding: Binding to be assigned to action - @param old_binding: Binding to be removed from action [ can be empty: "" ] - - @return None: new_binding wasn't in any action - action name: where new_binding was before - ''' - assert name in keybindings_map.BINDING_INFO, '"%s" isn\'t a valid keyboard action.' % name - - nb = Gtk.accelerator_parse(new_binding) - old_action_with_nb = self._binding_to_action.get(nb) - if old_action_with_nb is not None: - # The new key is already bound to an action, erase the action - self._binding_to_action.pop(nb) - self._action_to_bindings[old_action_with_nb].remove(nb) - - if old_binding and name != old_action_with_nb: - # The action already had a key that is now being replaced - ob = Gtk.accelerator_parse(old_binding) - self._binding_to_action[nb] = name - - # Remove action bound to the key. - if ob in self._binding_to_action: - self._binding_to_action.pop(ob) - - if ob in self._action_to_bindings[name]: - idx = self._action_to_bindings[name].index(ob) - self._action_to_bindings[name].pop(idx) - self._action_to_bindings[name].insert(idx, nb) - else: - self._binding_to_action[nb] = name - self._action_to_bindings[name].append(nb) - - self.save() - return old_action_with_nb - - def clear_accel(self, name, binding): - ''' Remove binding for an action ''' - assert name in keybindings_map.BINDING_INFO, '"%s" isn\'t a valid keyboard action.' % name - - ob = Gtk.accelerator_parse(binding) - self._action_to_bindings[name].remove(ob) - self._binding_to_action.pop(ob) - - self.save() - - def clear_all(self): - ''' Removes all keybindings. The changes are only persisted if - save() is called afterwards. ''' - self._action_to_callback = {} - self._action_to_bindings = defaultdict(list) - self._binding_to_action = {} - - def execute(self, keybinding): - ''' Executes an action that has been registered for the - passed keyboard event. If no action is bound to the passed key, this - method is a no-op. ''' - if keybinding in self._binding_to_action: - action = self._binding_to_action[keybinding] - func, args, kwargs = self._action_to_callback[action] - self._window.stop_emission_by_name('key_press_event') - return func(*args, **kwargs) - - # Some keys enable additional modifiers (NumLock enables GDK_MOD2_MASK), - # which prevent direct lookup simply by being pressed. - # XXX: Looking up by key/modifier probably isn't the best implementation, - # so limit possible states to begin with? - for stored_binding, action in self._binding_to_action.items(): - stored_keycode, stored_flags = stored_binding - if stored_keycode == keybinding[0] and stored_flags & keybinding[1]: - func, args, kwargs = self._action_to_callback[action] - self._window.stop_emission_by_name('key_press_event') - return func(*args, **kwargs) - - def save(self): - ''' Stores the keybindings that have been set to disk. ''' - # Collect keybindings for all registered actions - action_to_keys = {} - for action, bindings in self._action_to_bindings.items(): - if bindings is not None: - action_to_keys[action] = [ - Gtk.accelerator_name(keyval, modifiers) for - (keyval, modifiers) in bindings - ] - with open(constants.KEYBINDINGS_CONF_PATH, 'w') as fp: - json.dump(action_to_keys, fp, indent=2) - - def _initialize(self): - ''' Restore keybindings from disk. ''' - try: - with open(constants.KEYBINDINGS_CONF_PATH, 'r') as fp: - stored_action_bindings = json.load(fp) - except: - stored_action_bindings = keybindings_map.DEFAULT_BINDINGS.copy() - - for action in keybindings_map.BINDING_INFO.keys(): - if action in stored_action_bindings: - bindings = [ - Gtk.accelerator_parse(keyname) - for keyname in stored_action_bindings[action] ] - self._action_to_bindings[action] = bindings - for binding in bindings: - self._binding_to_action[binding] = action - else: - self._action_to_bindings[action] = [] - - def get_bindings_for_action(self, name): - ''' Returns a list of (keycode, modifier) for the action C{name}. ''' - return self._action_to_bindings[name] - -_manager = None - - -def keybinding_manager(window): - ''' Returns a singleton instance of the keybinding manager. ''' - global _manager - if _manager: - return _manager - else: - _manager = _KeybindingManager(window) - return _manager - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/labels.py mcomix-2.1.0/mcomix/mcomix/labels.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/labels.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/labels.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -'''labels.py - Gtk.Label convenience classes.''' - -from gi.repository import GLib, Gtk, Pango - -class FormattedLabel(Gtk.Label): - - '''FormattedLabel keeps a label always formatted with some pango weight, - style and scale, even when new text is set using set_text(). - ''' - - _STYLES = { - Pango.Style.NORMAL : 'normal', - Pango.Style.OBLIQUE: 'oblique', - Pango.Style.ITALIC : 'italic', - } - - def __init__(self, text='', weight=Pango.Weight.NORMAL, - style=Pango.Style.NORMAL, scale=1.0): - super(FormattedLabel, self).__init__() - self._weight = weight - self._style = style - self._scale = scale - self.set_text(text) - - def set_text(self, text): - markup = '%s' % ( - int(self._scale * 10 * 1024), - self._weight, - self._STYLES[self._style], - GLib.markup_escape_text(text) - ) - self.set_markup(markup) - -class BoldLabel(FormattedLabel): - - '''A FormattedLabel that is always bold and otherwise normal.''' - - def __init__(self, text=''): - super(BoldLabel, self).__init__(text=text, weight=Pango.Weight.BOLD) - -class ItalicLabel(FormattedLabel): - - '''A FormattedLabel that is always italic and otherwise normal.''' - - def __init__(self, text=''): - super(ItalicLabel, self).__init__(text=text, style=Pango.Style.ITALIC) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/languages.py mcomix-2.1.0/mcomix/mcomix/languages.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/languages.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/languages.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -import operator - -# For new language, add ('language name in this language', 'language code') -# to the languages list. - -# Source: -# https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes -# https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 - -languages = sorted([ - ('Català', 'ca'), # Catalan - ('čeština', 'cs'), # Czech - ('Deutsch', 'de'), # German - ('ελληνικά', 'el'), # Greek - ('English', 'en'), # English - ('Español', 'es'), # Spanish - ('فارسی', 'fa'), # Persian - ('Français', 'fr'), # French - ('Galego', 'gl'), # Galician - ('עברית', 'he'), # Hebrew - ('Hrvatski jezik', 'hr'), # Croatian - ('Magyar', 'hu'), # Hungarian - ('Bahasa Indonesia', 'id'), # Indonesian - ('Italiano', 'it'), # Italian - ('日本語', 'ja'), # Japanese - ('한국어', 'ko'), # Korean - ('Nederlands', 'nl'), # Dutch - ('Język polski', 'pl'), # Polish - ('Português', 'pt_BR'), # Portuguese - ('pусский язык', 'ru'), # Russian - ('Svenska', 'sv'), # Swedish - ('українська мова', 'uk'), # Ukrainian - ('简体中文', 'zh_CN'), # Chinese (simplified) - ('正體中文', 'zh_TW'), # Chinese (traditional) -], key=operator.itemgetter(1)) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/last_read_page.py mcomix-2.1.0/mcomix/mcomix/last_read_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/last_read_page.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/last_read_page.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -# -*- coding: utf-8 -*- - -import os - -from mcomix import log -from mcomix import constants - -# This import is only used for legacy data that is imported -# into the library at upgrade. -try: - import sqlite3 - log.debug('SQLite: {0.sqlite_version} sqlite3 version: {0.version}'.format(sqlite3)) -except ImportError: - log.warning( _('! Could find sqlite3.') ) - sqlite3 = None - - -class LastReadPage(object): - ''' Automatically stores the last page the user read for all book files, - and restores the page the next time the archive is opened. When the book - is finished, the page will be cleared. - - If L{enabled} is set to C{false}, all methods will do nothing. This - simplifies code in other places, as it does not have to check each time - if the preference option to store pages automatically is enabled. - ''' - - def __init__(self, backend): - ''' Constructor. - @param backend: Library backend instance. - ''' - #: If disabled, all methods will be no-ops. - self.enabled = False - #: Library backend. - self.backend = backend - - def set_enabled(self, enabled): - ''' Enables (or disables) all functionality of this module. - @type enabled: bool - ''' - if self.backend.enabled: - self.enabled = enabled - else: - self.enabled = False - - def count(self): - ''' Number of stored book/page combinations. This method is - not affected by setting L{enabled} to false. - @return: The number of entries stored by this module. ''' - - if not self.backend.enabled: - return 0 - - cursor = self.backend.execute('''SELECT COUNT(*) FROM recent''') - count = cursor.fetchone() - cursor.close() - - return count - - def set_page(self, path, page): - ''' Sets C{page} as last read page for the book at C{path}. - @param path: Path to book. Raises ValueError if file doesn't exist. - @param page: Page number. - ''' - if not self.enabled: - return - - full_path = os.path.abspath(path) - book = self.backend.get_book_by_path(full_path) - - if not book: - self.backend.add_book( - full_path, self.backend.get_recent_collection().id) - book = self.backend.get_book_by_path(full_path) - - if not book: - raise ValueError('Book doesn\'t exist') - else: - self.backend.add_book_to_collection( - book.id, self.backend.get_recent_collection().id) - - book.set_last_read_page(page) - - def clear_page(self, path): - ''' Removes stored page for book at C{path}. - @param path: Path to book. - ''' - if not self.enabled: - return - - full_path = os.path.abspath(path) - book = self.backend.get_book_by_path(full_path) - - if book: - book.set_last_read_page(None) - - def clear_all(self): - ''' Removes all stored books from the library's 'Recent' collection, - and removes all information from the recent table. This method is - not affected by setting L{enabled} to false. ''' - - if not self.backend.enabled: - return - - # Collect books that are only present in "Recent" collection - # and have an entry in table "recent". Those must be removed. - sql = '''SELECT c.book FROM contain c - JOIN (SELECT book FROM contain - GROUP BY book HAVING COUNT(*) = 1 - ) t ON t.book = c.book - JOIN recent r ON r.book = c.book - WHERE c.collection = ?''' - cursor = self.backend.execute(sql, - (self.backend.get_recent_collection().id,)) - for book in cursor.fetchall(): - self.backend.remove_book(book) - cursor.execute('''DELETE FROM recent''') - cursor.execute('''DELETE FROM contain WHERE collection = ?''', - (self.backend.get_recent_collection().id,)) - cursor.close() - - def get_page(self, path): - ''' Gets the last read page for book at C{path}. - - @param path: Path to book. - @return: Page that was last read, or C{None} if the book - wasn't opened before. - ''' - if not self.enabled: - return None - - full_path = os.path.abspath(path) - book = self.backend.get_book_by_path(full_path) - if book: - page = book.get_last_read_page() - if page is not None and page < book.pages: - return page - else: - # If the last read page was the last in the book, - # start from scratch. - return None - else: - return None - - def get_date(self, path): - ''' Gets the date at which the page for path was set. - - @param path: Path to book. - @return: C{datetime} object, or C{None} if no page was set. - ''' - if not self.enabled: - return None - - full_path = os.path.abspath(path) - book = self.backend.get_book_by_path(full_path) - if book: - return book.get_last_read_date() - else: - return None - - def _init_database(self, dbfile): - ''' Creates or opens new SQLite database at C{dbfile}, and initalizes - the required table(s). - - @param dbfile: Database file name. This file needn't exist. - @return: Open SQLite database connection. - ''' - if not sqlite3: - return None - - db = sqlite3.connect(dbfile, isolation_level=None) - sql = '''CREATE TABLE IF NOT EXISTS lastread ( - path TEXT PRIMARY KEY, - page INTEGER, - time_set DATETIME - )''' - cursor = db.execute(sql) - cursor.close() - - return db - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/layout.py mcomix-2.1.0/mcomix/mcomix/layout.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/layout.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/layout.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ -''' Layout. ''' - -from mcomix import constants -from mcomix import scrolling -from mcomix import tools -from mcomix import box - - -class FiniteLayout(object): # 2D only - - def __init__(self, content_sizes, viewport_size, orientation, spacing, - wrap_individually, distribution_axis, alignment_axis): - ''' Lays out a finite number of Boxes along the first axis. - @param content_sizes: The sizes of the Boxes to lay out. - @param viewport_size: The size of the viewport. - @param orientation: The orientation to use. - @param spacing: Number of additional pixels between Boxes. - @param wrap_individually: True if each content box should get its own - wrapper box, False if the only wrapper box should be the union of all - content boxes. - @param distribution_axis: the axis along which the Boxes are distributed. - @param alignment_axis: the axis to center. ''' - self.scroller = scrolling.Scrolling() - self.current_index = -1 - self.wrap_individually = wrap_individually - self._reset(content_sizes, viewport_size, orientation, spacing, - wrap_individually, distribution_axis, alignment_axis) - - - def set_viewport_position(self, viewport_position): - ''' Moves the viewport to the specified position. - @param viewport_position: The new viewport position. ''' - self.viewport_box = self.viewport_box.set_position(viewport_position) - self.dirty_current_index = True - - - def scroll_smartly(self, max_scroll, backwards, axis_map, index=None): - ''' Applies a "smart scrolling" step to the current viewport position. - If there are not enough Boxes to scroll to, the viewport is not moved - and an appropriate value is returned. - @param max_scroll: The maximum numbers of pixels to scroll in one step. - @param backwards: True for backwards scrolling, False otherwise. - @param axis_map: The index of the dimension to modify. - @param index: The index of the Box the scrolling step is related to, - or None to use the index of the current Box. - @return: The index of the current Box after scrolling, or -1 if there - were not enough Boxes to scroll backwards, or the number of Boxes if - there were not enough Boxes to scroll forwards. ''' - # TODO reconsider interface - if (index == None) or (not self.wrap_individually): - index = self.get_current_index() - if not self.wrap_individually: - wrapper_index = 0 - else: - wrapper_index = index - o = tools.vector_opposite(self.orientation) if backwards \ - else self.orientation - new_pos = self.scroller.scroll_smartly(self.wrapper_boxes[wrapper_index], - self.viewport_box, o, max_scroll, axis_map) - if new_pos == []: - if self.wrap_individually: - index += -1 if backwards else 1 - n = len(self.get_content_boxes()) - if (index < n) and (index >= 0): - self.scroll_to_predefined(tools.vector_opposite(o), index) - return index - else: - index = -1 if backwards else len(self.get_content_boxes()) - return index - self.set_viewport_position(new_pos) - return index - - - def scroll_to_predefined(self, destination, index=None): - ''' Scrolls the viewport to a predefined destination. - @param destination: An integer representing a predefined destination. - Either 1 (towards the greatest possible values in this dimension), - -1 (towards the smallest value in this dimension), 0 (keep position), - SCROLL_TO_CENTER (scroll to the center of the content in this - dimension), SCROLL_TO_START (scroll to where the content starts in this - dimension) or SCROLL_TO_END (scroll to where the content ends in this - dimension). - @param index: The index of the Box the scrolling is related to, None to - use the index of the current Box, or UNION_INDEX to use the union box - instead. Note that the current implementation always uses the union box - if self.wrap_individually is False. ''' - if index == None: - index = self.get_current_index() - if not self.wrap_individually: - index = constants.UNION_INDEX - if index == constants.UNION_INDEX: - current_box = self.union_box - else: - if index == constants.LAST_INDEX: - index = len(self.content_boxes) - 1 - current_box = self.wrapper_boxes[index] - self.set_viewport_position(self.scroller.scroll_to_predefined( - current_box, self.viewport_box, self.orientation, destination)) - - - def get_content_boxes(self): - ''' Returns the Boxes as they are arranged in this layout. - @return: The Boxes as they are arranged in this layout. ''' - return self.content_boxes - - - def get_wrapper_boxes(self): - ''' Returns the wrapper Boxes as they are arranged in this layout. - @return: The wrapper Boxes as they are arranged in this layout. ''' - return self.wrapper_boxes - - - def get_union_box(self): - ''' Returns the union Box for this layout. - @return: The union Box for this layout. ''' - return self.union_box - - - def get_current_index(self): - ''' Returns the index of the Box that is said to be the current Box. - @return: The index of the Box that is said to be the current Box. ''' - if self.dirty_current_index: - self.current_index = self.viewport_box.current_box_index( - self.orientation, self.content_boxes) - self.dirty_current_index = False - return self.current_index - - - def get_viewport_box(self): - ''' Returns the current viewport Box. - @return: The current viewport Box. ''' - return self.viewport_box - - - def get_orientation(self): - ''' Returns the orientation for this layout. - @return: The orientation for this layout. ''' - return self.orientation - - - def set_orientation(self, orientation): - self.orientation = orientation - - - def _reset(self, content_sizes, viewport_size, orientation, spacing, - wrap_individually, distribution_axis, alignment_axis): - # reverse order if necessary - if orientation[distribution_axis] == -1: - content_sizes = tuple(reversed(content_sizes)) - temp_cb_list = tuple(map(box.Box, content_sizes)) - # align to center - temp_cb_list = box.Box.align_center(temp_cb_list, alignment_axis, 0, - orientation[alignment_axis]) - # distribute - temp_cb_list = box.Box.distribute(temp_cb_list, distribution_axis, 0, - spacing) - if wrap_individually: - temp_wb_list, temp_bb = FiniteLayout._wrap_individually(temp_cb_list, - viewport_size, orientation) - else: - temp_wb_list, temp_bb = FiniteLayout._wrap_union(temp_cb_list, - viewport_size, orientation) - # move to global origin - bbp = temp_bb.get_position() - for i in range(len(temp_cb_list)): - temp_cb_list[i] = temp_cb_list[i].translate_opposite(bbp) - for i in range(len(temp_wb_list)): - temp_wb_list[i] = temp_wb_list[i].translate_opposite(bbp) - temp_bb = temp_bb.translate_opposite(bbp) - # reverse order again, if necessary - if orientation[distribution_axis] == -1: - temp_cb_list = tuple(reversed(temp_cb_list)) - temp_wb_list = tuple(reversed(temp_wb_list)) - # done - self.content_boxes = temp_cb_list - self.wrapper_boxes = temp_wb_list - self.union_box = temp_bb - self.viewport_box = box.Box(viewport_size) - self.orientation = orientation - self.dirty_current_index = True - - - @staticmethod - def _wrap_individually(temp_cb_list, viewport_size, orientation): - # calculate (potentially oversized) wrapper Boxes - temp_wb_list = [None] * len(temp_cb_list) - for i in range(len(temp_cb_list)): - temp_wb_list[i] = temp_cb_list[i].wrapper_box(viewport_size, - orientation) - # calculate bounding Box - temp_bb = box.Box.bounding_box(temp_wb_list) - return (temp_wb_list, temp_bb) - - - @staticmethod - def _wrap_union(temp_cb_list, viewport_size, orientation): - # calculate bounding Box - temp_wb_list = [box.Box.bounding_box(temp_cb_list).wrapper_box( - viewport_size, orientation)] - return (temp_wb_list, temp_wb_list[0]) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lens.py mcomix-2.1.0/mcomix/mcomix/lens.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lens.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/lens.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -'''lens.py - Magnifying lens.''' - -import math - -from gi.repository import Gdk, GdkPixbuf, Gtk - -from mcomix.preferences import prefs -from mcomix import image_tools -from mcomix import constants - - -class MagnifyingLens(object): - - '''The MagnifyingLens creates cursors from the raw pixbufs containing - the unscaled data for the currently displayed images. It does this by - looking at the cursor position and calculating what image data to put - in the "lens" cursor. - - Note: The mapping is highly dependent on the exact layout of the main - window images, thus this module isn't really independent from the main - module as it uses implementation details not in the interface. - ''' - - def __init__(self, window): - self._window = window - self._area = self._window._main_layout - self._area.connect('motion-notify-event', self._motion_event) - - #: Stores lens state - self._enabled = False - #: Stores a tuple of the last mouse coordinates - self._point = None - #: Stores the last rectangle that was used to render the lens - self._last_lens_rect = None - - def get_enabled(self): - return self._enabled - - def set_enabled(self, enabled): - self._enabled = enabled - - if enabled: - # FIXME: If no file is currently loaded, the cursor will still be hidden. - self._window.cursor_handler.set_cursor_type(constants.NO_CURSOR) - self._window.osd.clear() - - if self._point: - self._draw_lens(*self._point) - else: - self._window.cursor_handler.set_cursor_type(constants.NORMAL_CURSOR) - self._clear_lens() - self._last_lens_rect = None - - enabled = property(get_enabled, set_enabled) - - def _draw_lens(self, x, y): - '''Calculate what image data to put in the lens and update the cursor - with it; and are the positions of the cursor within the - main window layout area. - ''' - if self._window.images[0].get_storage_type() not in (Gtk.ImageType.PIXBUF, Gtk.ImageType.ANIMATION): - return - - rectangle = self._calculate_lens_rect(x, y, prefs['lens size'], prefs['lens size']) - pixbuf = self._get_lens_pixbuf(x, y) - - draw_region = Gdk.Rectangle() - draw_region.x, draw_region.y, draw_region.width, draw_region.height = rectangle - if self._last_lens_rect: - last_region = Gdk.Rectangle() - last_region.x, last_region.y, last_region.width, last_region.height = self._last_lens_rect - draw_region = Gdk.rectangle_union(draw_region, last_region) - - window = self._window._main_layout.get_bin_window() - window.begin_paint_rect(draw_region) - - self._clear_lens() - - cr = window.cairo_create() - surface = Gdk.cairo_surface_create_from_pixbuf(pixbuf, 0, window) - cr.set_source_surface(surface, rectangle[0], rectangle[1]) - cr.paint() - - window.end_paint() - - self._last_lens_rect = rectangle - - def _calculate_lens_rect(self, x, y, width, height): - ''' Calculates the area where the lens will be drawn on screen. This method takes - screen space into calculation and moves the rectangle accordingly when the the rectangle - would otherwise flow over the allocated area. ''' - - lens_x = max(x - width // 2, 0) - lens_y = max(y - height // 2, 0) - - max_width, max_height = self._window.get_visible_area_size() - max_width += int(self._window._hadjust.get_value()) - max_height += int(self._window._vadjust.get_value()) - lens_x = min(lens_x, max_width - width) - lens_y = min(lens_y, max_height - height) - - # Don't forget 1 pixel border... - return lens_x, lens_y, width + 2, height + 2 - - def _clear_lens(self, current_lens_region=None): - ''' Invalidates the area that was damaged by the last call to draw_lens. ''' - - if not self._last_lens_rect: - return - - window = self._window._main_layout.get_bin_window() - crect = Gdk.Rectangle() - crect.x, crect.y, crect.width, crect.height = self._last_lens_rect - window.invalidate_rect(crect, True) - window.process_updates(True) - self._last_lens_rect = None - - def toggle(self, action): - '''Toggle on or off the lens depending on the state of .''' - self.enabled = action.get_active() - - def _motion_event(self, widget, event): - ''' Called whenever the mouse moves over the image area. ''' - self._point = (int(event.x), int(event.y)) - if self.enabled: - self._draw_lens(*self._point) - - def _get_lens_pixbuf(self, x, y): - '''Get a pixbuf containing the appropiate image data for the lens - where and are the positions of the cursor. - ''' - canvas = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=True, bits_per_sample=8, - width=prefs['lens size'], - height=prefs['lens size']) - r,g,b,a = [int(p*255) for p in self._window.get_bg_color()] - canvas.fill(image_tools.convert_rgb16list_to_rgba8int([r,g,b])) - cb = self._window.layout.get_content_boxes() - source_pixbufs = self._window.imagehandler.get_pixbufs(len(cb)) - for i in range(len(cb)): - if image_tools.is_animation(source_pixbufs[i]): - continue - cpos = cb[i].get_position() - self._add_subpixbuf(canvas, x - cpos[0], y - cpos[1], - cb[i].get_size(), source_pixbufs[i]) - - return image_tools.add_border(canvas, 1) - - def _add_subpixbuf(self, canvas, x, y, image_size, source_pixbuf): - '''Copy a subpixbuf from to as it should - be in the lens if the coordinates , are the mouse pointer - position on the main window layout area. - - The displayed image (scaled from the ) must have - size . - ''' - # Prevent division by zero exceptions further down - if not image_size[0]: - return - - # FIXME This merely prevents Errors being raised if source_pixbuf is an - # animation. The result might be broken, though, since animation, - # rotation etc. might not match or will be ignored: - source_pixbuf = image_tools.static_image(source_pixbuf) - - rotation = prefs['rotation'] - if prefs['auto rotate from exif']: - rotation += image_tools.get_implied_rotation(source_pixbuf) - rotation = rotation % 360 - - if rotation in [90, 270]: - scale = float(source_pixbuf.get_height()) / image_size[0] - else: - scale = float(source_pixbuf.get_width()) / image_size[0] - - x *= scale - y *= scale - - source_mag = prefs['lens magnification'] / scale - width = height = prefs['lens size'] / source_mag - - paste_left = x > width / 2 - paste_top = y > height / 2 - dest_x = max(0, int(math.ceil((width / 2 - x) * source_mag))) - dest_y = max(0, int(math.ceil((height / 2 - y) * source_mag))) - - if rotation == 90: - x, y = y, source_pixbuf.get_height() - x - elif rotation == 180: - x = source_pixbuf.get_width() - x - y = source_pixbuf.get_height() - y - elif rotation == 270: - x, y = source_pixbuf.get_width() - y, x - if prefs['horizontal flip']: - if rotation in (90, 270): - y = source_pixbuf.get_height() - y - else: - x = source_pixbuf.get_width() - x - if prefs['vertical flip']: - if rotation in (90, 270): - x = source_pixbuf.get_width() - x - else: - y = source_pixbuf.get_height() - y - - src_x = x - width / 2 - src_y = y - height / 2 - if src_x < 0: - width += src_x - src_x = 0 - if src_y < 0: - height += src_y - src_y = 0 - width = max(0, min(source_pixbuf.get_width() - src_x, width)) - height = max(0, min(source_pixbuf.get_height() - src_y, height)) - if width < 1 or height < 1: - return - - subpixbuf = source_pixbuf.new_subpixbuf(int(src_x), int(src_y), - int(width), int(height)) - subpixbuf = subpixbuf.scale_simple( - int(math.ceil(source_mag * subpixbuf.get_width())), - int(math.ceil(source_mag * subpixbuf.get_height())), - prefs['scaling quality']) - - if rotation == 90: - subpixbuf = subpixbuf.rotate_simple( - Gdk.PIXBUF_ROTATE_CLOCKWISE) - elif rotation == 180: - subpixbuf = subpixbuf.rotate_simple( - Gdk.PIXBUF_ROTATE_UPSIDEDOWN) - elif rotation == 270: - subpixbuf = subpixbuf.rotate_simple( - Gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE) - if prefs['horizontal flip']: - subpixbuf = subpixbuf.flip(horizontal=True) - if prefs['vertical flip']: - subpixbuf = subpixbuf.flip(horizontal=False) - - subpixbuf = self._window.enhancer.enhance(subpixbuf) - - if paste_left: - dest_x = 0 - else: - dest_x = min(canvas.get_width() - subpixbuf.get_width(), dest_x) - if paste_top: - dest_y = 0 - else: - dest_y = min(canvas.get_height() - subpixbuf.get_height(), dest_y) - - if subpixbuf.get_has_alpha() and prefs['checkered bg for transparent images']: - subpixbuf = subpixbuf.composite_color_simple(subpixbuf.get_width(), subpixbuf.get_height(), - GdkPixbuf.InterpType.NEAREST, 255, 8, 0x777777, 0x999999) - - subpixbuf.copy_area(0, 0, subpixbuf.get_width(), - subpixbuf.get_height(), canvas, dest_x, dest_y) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/FlifImagePlugin.py mcomix-2.1.0/mcomix/mcomix/lib/FlifImagePlugin.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/FlifImagePlugin.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/lib/FlifImagePlugin.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,382 +0,0 @@ -# Copyright (c) 2019, multiSnow -# -# Permission to use, copy, modify, and/or distribute this software for -# any purpose with or without fee is hereby granted, provided that the -# above copyright notice and this permission notice appear in all -# copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -# PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - - -# NOTE -# Currently, flif encode/decode library provided by official reference -# is still not stable enough. -# -# One of the most problem is that it is not thread-safe, -# caused by global variables of the library, which is already reported in -# https://github.com/FLIF-hub/FLIF/issues/517 -# -# Usually there are two ways to easily deal with a not thread-safe library, -# one is lock and the other is child process. -# Here meets another problem. -# -# If a shared library is opened in a process (by using ctypes, of cource), -# and some code of the library crashed, e.g. segfault, -# the process also dead without any cleanup by python. -# -# TL;DR -# Load libflif_dec/libflif in a child process to avoid main process crashed. - -# 注意 -# (这篇中文注意是为了避免我糟糕的英语可能产生的歧义) -# -# FLIF的官方编解码库尚不稳定。 -# 一个主要的问题是线程不安全,这是由编解码库中使用了全局变量而导致的。 -# 官方的代码库已经有人报告了这个问题。 -# 而由于ctypes调用外部函数时并没有被GIL锁定,调用时应当采取额外的措施。 -# 例如使用线程锁,或在子进程中调用。 -# 这里就牵涉到另一个问题。 -# -# 理所当然地,如果一个进程调用的外部函数执行了错误的行为, -# 这将导致系统对其发出立即中止的信号,例如段错误,那么该进程将立即中止。 -# 这不是python的try语句或会话管理能够处理的情况。 -# 这很危险,会造成无法预料的后果。 -# -# 简而言之,就是: -# 把ctypes的调用全部隔离到子进程。 - - -import io -import multiprocessing as mp -import sys - -from PIL import Image,ImageFile,ImagePalette - -_LIBFLIF={ - 'path':None, - 'failed':False, -} - -_COLORS_MODE={ - 1:'L', - 3:'RGBX', - 4:'RGBA', -} - -FLIF_NOT_FOUND,DECODE_ERROR,UNSUPPORTED_FORMAT=range(3) - - -class ImageNS: - def __init__(self,mode,width,height,depth,delay,exif,palette,raw): - self.mode=mode - self.width=width - self.height=height - self.depth=depth - self.delay=delay - self.exif=exif - self.palette=palette - self.raw=raw - self.size=width,height - - -def getflifinfo(const,flifinfo): - data,path=const - if not path: - exit(FLIF_NOT_FOUND) - - import ctypes - class FLIF_INFO(ctypes.Structure):pass - - flif=ctypes.CDLL(path) - flif.flif_read_info_from_memory.restype=ctypes.POINTER(FLIF_INFO) - - info=flif.flif_read_info_from_memory(data[:32],32) - - width=flif.flif_info_get_width(info) - height=flif.flif_info_get_height(info) - nb_channels=flif.flif_info_get_nb_channels(info) - num_images=flif.flif_info_num_images(info) - mode=_COLORS_MODE[nb_channels] - mode='RGB' if mode=='RGBX' else mode - - try: - flifinfo.width=width - flifinfo.height=height - flifinfo.n_frames=num_images - flifinfo.mode=mode - except: - flif.flif_destroy_info(info) - exit(DECODE_ERROR) - - flif.flif_destroy_info(info) - exit(0) - - -def decodeflif(const,loop, - modelist,widthlist,heightlist,depthlist,delaylist, - exiflist,palettelist,rawlist): - data,path,draft_width,draft_height=const - if not path: - exit(FLIF_NOT_FOUND) - - import ctypes - class FLIF_DECODER(ctypes.Structure):pass - class FLIF_IMAGE(ctypes.Structure):pass - - flif=ctypes.CDLL(path) - flif.flif_create_decoder.restype=ctypes.POINTER(FLIF_DECODER) - flif.flif_decoder_get_image.restype=ctypes.POINTER(FLIF_IMAGE) - decoder=flif.flif_create_decoder() - flif.flif_decoder_set_crc_check(decoder,1) - if draft_width and draft_height: - # TODO: flif_decoder_set_fit should be used, which caused segfault - flif.flif_decoder_set_resize(decoder,draft_width,draft_height) - if not flif.flif_decoder_decode_memory(decoder,data,len(data)): - flif.flif_destroy_decoder(decoder) - exit(DECODE_ERROR) - _read_func_map={8:{ - 'RGBA':flif.flif_image_read_row_RGBA8, - 'RGBX':flif.flif_image_read_row_RGBA8, - 'L': flif.flif_image_read_row_GRAY8, - 'P': flif.flif_image_read_row_PALETTE8, - },16:{ - 'RGBA':flif.flif_image_read_row_RGBA16, - 'RGBX':flif.flif_image_read_row_RGBA16, - 'L': flif.flif_image_read_row_GRAY16, - 'P': None, - },} - - num_images=flif.flif_decoder_num_images(decoder) - try: - loop.value=flif.flif_decoder_num_loops(decoder) - except: - flif.flif_destroy_decoder(decoder) - exit(DECODE_ERROR) - - for n in range(num_images): - image=flif.flif_decoder_get_image(decoder,n) - palette_size=flif.flif_image_get_palette_size(image) - nb_channels=flif.flif_image_get_nb_channels(image) - - mode='P' if palette_size else _COLORS_MODE[nb_channels] - width=flif.flif_image_get_width(image) - height=flif.flif_image_get_height(image) - depth=flif.flif_image_get_depth(image) - delay=flif.flif_image_get_frame_delay(image) - - palette=None - if palette_size: - d=ctypes.create_string_buffer(palette_size*4) # RGBA colors - flif.flif_image_get_palette(image,ctypes.byref(d)) - palette=d.raw - - reader=_read_func_map[depth][mode] - if reader is None: - flif.flif_destroy_decoder(decoder) - exit(UNSUPPORTED_FORMAT) - rowsize=len(mode)*width - d=ctypes.create_string_buffer(rowsize) - buf=io.BytesIO() - for r in range(height): - reader(image,r,ctypes.byref(d),rowsize) - buf.write(d.raw) - raw=buf.getvalue() - buf.close() - - exif=None - metalen=ctypes.c_uint() - metaptr=ctypes.POINTER(ctypes.c_ubyte)() - if flif.flif_image_get_metadata( - image,b'eXif',ctypes.byref(metaptr),ctypes.byref(metalen)): - exif=bytes(bytearray(metaptr[:metalen.value])) - - try: - modelist.append(mode) - widthlist.append(width) - heightlist.append(height) - depthlist.append(depth) - delaylist.append(delay) - exiflist.append(exif) - palettelist.append(palette) - rawlist.append(raw) - except: - flif.flif_destroy_decoder(decoder) - exit(DECODE_ERROR) - - flif.flif_destroy_decoder(decoder) - exit(0) - - -def testlibrary(path): - - import ctypes - import ctypes.util as cutil - libname=cutil.find_library('flif_dec') or cutil.find_library('flif') - rc=hasattr(ctypes.CDLL(libname),'flif_create_decoder') - if rc: - path.name=libname - exit(0 if rc else 1) - - -def _getloader(): - if _LIBFLIF['failed']: - return - if _LIBFLIF['path'] is None: - with mp.Manager() as manager: - path=manager.Namespace() - proc=mp.Process(target=testlibrary,args=(path,)) - proc.start() - proc.join() - if proc.exitcode: - _LIBFLIF['failed']=True - return - _LIBFLIF['path']=path.name - - return _LIBFLIF['path'] - - -def _accept(head): - if _getloader() is None: - return False - return head[:4]==b'FLIF' - - -class FlifImageFile(ImageFile.ImageFile): - format='FLIF' - format_description='Free Lossless Image Format' - - def _open(self): - data=self.fp.read() - self.fp.close() - self.fp=None - self._data=data - self._draft_width=0 - self._draft_height=0 - - self._images=[] # list of FlifImage - self._pos=0 # position of currect frame - - with mp.Manager() as manager: - flifinfo=manager.Namespace() - const=manager.list([self._data[:32],_getloader()]) - proc=mp.Process( - target=getflifinfo,args=(const,flifinfo)) - proc.start() - proc.join() - if proc.exitcode: - raise RuntimeError('failed to decode, {}.',proc.exitcode) - self._size=flifinfo.width,flifinfo.height - self._n_frames=flifinfo.n_frames - self.mode=flifinfo.mode - - self.tile=[] - - def load(self): - if self._images: - return super().load() - with mp.Manager() as manager: - modelist=manager.list() - widthlist=manager.list() - heightlist=manager.list() - depthlist=manager.list() - delaylist=manager.list() - exiflist=manager.list() - palettelist=manager.list() - rawlist=manager.list() - - const=manager.list([self._data,_getloader(), - self._draft_width,self._draft_height]) - - loop=manager.Value('b',-1) - proc=mp.Process( - target=decodeflif, - args=(const,loop, - modelist,widthlist,heightlist,depthlist,delaylist, - exiflist,palettelist,rawlist)) - proc.start() - proc.join() - - if proc.exitcode: - raise RuntimeError('failed to decode, {}.',proc.exitcode) - self.info['loop']=loop.value - for attrs in zip(modelist,widthlist,heightlist,depthlist,delaylist, - exiflist,palettelist,rawlist): - self._images.append(ImageNS(*attrs)) - - return self.seek(self._pos) - - def draft(self,mode,size): - if mode: - print('W: setting mode in draft is not supported.',file=sys.stderr) - # TODO: - # pass twice of the size to decoder and load, then let PIL to resize it, - # so only first draft has effect. - # it is because flif_decoder_set_resize typically causes a smaller image. - # also see TODO in decodeflif - w,h=size - w_,h_=self._size - size=min(w*2,w_),min(h*2,h_) - self._draft_width,self._draft_height=size - self._size=size - self.load() - - def tobytes(self): - self.load() - return super().tobytes() - - def seek(self,pos): - if pos>=self._n_frames: - raise EOFError('seek beyond the end of the sequence') - if pos<0: - raise EOFError("negative frame index is not valid") - self._pos=pos - curimg=self._images[self._pos] - - mode=curimg.mode - self.mode='RGB' if mode=='RGBX' else mode - self._size=curimg.width,curimg.height - self.rawmode=mode - self.info['timestamp']=curimg.delay - self.info['duration']=0 - if self._pos: - self.info['duration']=self.info['timestamp']-self._images[self._pos-1].delay - self.info['depth']=curimg.depth - if self.fp is not None: - self.fp.close() - self.fp=io.BytesIO(curimg.raw) - if self.mode=='P': - # TODO: alpha is lost here. - self.palette=ImagePalette.raw('RGBX',curimg.palette) - self.tile.clear() - self.tile.append(('raw',(0,0,*self.size),0,self.rawmode)) - if curimg.exif is None: - self.info.pop('exif',None) - else: - self.info['exif']=curimg.exif - - return self.load() - - def tell(self): - return self._pos - - @property - def n_frames(self): - return self._n_frames - - @property - def is_animated(self): - return self._n_frames>1 - - -def _init_plugin(): - if _getloader() is None:return - Image.register_open(FlifImageFile.format,FlifImageFile,_accept) - Image.register_extension(FlifImageFile.format,'.flif') - Image.register_mime(FlifImageFile.format,'image/flif') diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/mountmanager.py mcomix-2.1.0/mcomix/mcomix/lib/mountmanager.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/mountmanager.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/lib/mountmanager.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -import os -import shutil -import subprocess -import tempfile -import threading - -class MountManager: - ''' - Example: - - manager=MountManager('mount') # or other command - manager.mount('/dev/sdaX',mountpoint='/media/cdrom', - options=['noatime','noexec']) - for name in listdir(manager.mountpoint): - print(name) - manager.umount() - - Initialized MountManager is supported as context manager: - on exit, umount() is called. - - ''' - - - class CommandNotFound(Exception): - ''' Exception if command is not found. ''' - pass - - class AlreadyMounted(Exception): - ''' Exception if MountManager is already mounted. ''' - pass - - class NotMounted(Exception): - ''' Exception if MountManager is not monted ''' - pass - - class NotEmptyMountPoint(Exception): - ''' Exception if mountpoint is not empty. ''' - pass - - class MountFailed(Exception): - ''' Exception if mount failed. ''' - pass - - class UmountFailed(Exception): - ''' Exception if umount failed. ''' - pass - - def __init__(self,cmd): - self._cmd=shutil.which(cmd) - self._fusermount=shutil.which('fusermount') - - if not self._cmd: - raise self.CommandNotFound('{} not found.'.format(cmd)) - if not self._fusermount: - raise self.CommandNotFound('{} not found.'.format('fusermount')) - - self._mounted=False - self._lock=threading.Lock() - self._cmdthread=None - self._errno=0 - - self._tmpdir=None - self.mountpoint=None - self.sourcepath=None - - def _mountcmd(self,*cmd): - self._mounted=True - - self._errno=subprocess.run(cmd).returncode - - if self._tmpdir: - self._tmpdir.cleanup() - self._tmpdir=None - self.mountpoint=None - self.sourcepath=None - self._mounted=False - - def mount(self,source,options=[],mountpoint=None): - ''' - Mount with as option. - if is None, use a new temporary directory as mountpoint. - return manager itself. - ''' - with self._lock: - - if self._mounted or self._cmdthread: - raise self.AlreadyMounted - if not os.path.exists(source): - raise FileNotFoundError - - self.sourcepath=source - - if mountpoint is None: - self._tmpdir=tempfile.TemporaryDirectory(prefix='mountpoint') - self.mountpoint=self._tmpdir.name - elif not os.path.exists(mountpoint): - raise FileNotFoundError(mountpoint) - elif not os.path.isdir(mountpoint): - raise NotADirectoryError(mountpoint) - elif os.listdir(mountpoint): - raise self.NotEmptyMountPoint(mountpoint) - else: - self._tmpdir=None - self.mountpoint=mountpoint - - self._errno=0 - # foreground mount - cmd=[self._cmd,'-f'] - option=','.join(options) - if option: - cmd.append('-o') - cmd.append(option) - cmd.append(source) - cmd.append(self.mountpoint) - - self._cmdthread=threading.Thread( - target=self._mountcmd,args=cmd,daemon=True) - self._cmdthread.start() - - while not os.path.ismount(self.mountpoint): - if self._errno: - raise self.MountFailed(source,option,self._errno) - self._cmdthread.join(.5) - if not self._cmdthread.is_alive(): - break - - return self - - def umount(self): - ''' - Umount if manager is mounted, or raise Exception. - ''' - with self._lock: - if self._errno: - raise self.MountFailed(self._errno) - if not self._mounted: - raise self.NotMounted - if not os.path.ismount(self.mountpoint): - raise self.NotMounted(self.mountpoint) - - if subprocess.run((self._fusermount,'-u',self.mountpoint)).returncode: - raise self.UmountFailed(self.mountpoint) - self._cmdthread.join() - self._cmdthread=None - - def is_mounted(self): - ''' - return True if manager has a mounted mountpoint - ''' - return self._mounted - - def __call__(self,source,options=[],mountpoint=None): - return self.mount(source,options=options, - mountpoint=mountpoint) - - def __enter__(self): - return self - - def __exit__(self,etype,value,tb): - self.umount() - -if __name__=='__main__': - exit(0) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/mt.py mcomix-2.1.0/mcomix/mcomix/lib/mt.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/mt.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/lib/mt.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,239 +0,0 @@ -from multiprocessing.pool import ThreadPool as mpThreadPool -from multiprocessing.dummy import Pool -import sys -from threading import Event,Lock,Semaphore,Thread,Timer - -class Interval: - # Call function every delay milliseconds with optional args and kwargs. - def __init__(self,delay,function,args=(),kwargs={}): - if not callable(function): - raise ValueError('{} is not callable'.format(function)) - - self.delay=delay - self.function=function - self.args=args - self.kwargs=kwargs - self.timer=None - - self._lock=Lock() - self._calling=False - - def _caller(self): - # Call function with optional args and kwargs, then set a new Timer - self._calling=True - try: - self.function(*self.args,**self.kwargs) - except Exception as e: - pass - self._calling=False - self.reset() - - def _settimer(self): - # Set and start Timer - # this function should be always called in lock - if self.is_running(): - return - self.timer=Timer(self.delay/1000,self._caller) - self.timer.start() - - def start(self): - # Start or restart intervaller. - with self._lock: - if self.is_running(): - return - self._settimer() - - def stop(self): - # Stop intervaller. - with self._lock: - if not self.is_running(): - return - self.timer.cancel() - self.timer=None - - def reset(self): - # Reset Timer - with self._lock: - if not self.is_running(): - return - if self._calling: - return - self.timer.cancel() - self.timer=None - self._settimer() - - def is_running(self): - return self.timer is not None - - -class NamedPool(mpThreadPool): - def __init__(self,*args,name=None,**kwargs): - self._name=name - super(NamedPool,self).__init__(*args,**kwargs) - - def Process(self,*args,**kwargs): - if self._name: - kwargs.update(name=self._name) - return mpThreadPool.Process(*args,**kwargs) - - -class ThreadPool: - # multiprocessing.dummy.Pool with exc_info in error_callback - def __init__(self,name=None,processes=None): - - self._processes=processes - self._pool=NamedPool(self._processes,name=name) - self._lock=Lock() # lock for self - self._cblock=Lock() # lock for callback - self._errcblock=Lock() # lock for error_callback - self._closed=False - - self.name=name - - def apply(self,*args,**kwargs): - return self._pool.apply(*args,**kwargs) - - def map(self,*args,**kwargs): - return self._pool.map(*args,**kwargs) - - def map_async(self,*args,**kwargs): - return self._pool.map_async(*args,**kwargs) - - def imap(self,*args,**kwargs): - return self._pool.imap(*args,**kwargs) - - def imap_unordered(self,*args,**kwargs): - return self._pool.imap_unordered(*args,**kwargs) - - def starmap(self,*args,**kwargs): - return self._pool.starmap(*args,**kwargs) - - def starmap_async(self,*args,**kwargs): - return self._pool.starmap_async(*args,**kwargs) - - def join(self): - return self._pool.join() - - def _uiter(self,iterable): - buf=[] - for item in iterable: - if item in buf: - continue - yield item - buf.append(item) - buf.clear() - - def _trycall(self,func,args=(),kwargs={},lock=None): - if not callable(func): - return - with lock: - try: - return func(*args,**kwargs) - except: - pass - - def _caller(self,func,args,kwargs,callback,error_callback,exc_raise): - try: - result=func(*args,**kwargs) - except: - etype,value,tb=sys.exc_info() - self._trycall(error_callback,args=(self.name,etype,value,tb), - lock=self._errcblock) - if exc_raise: - raise etype(value) - else: - self._trycall(callback,args=(result,), - lock=self._cblock) - return result - - def apply_async(self,func,args=(),kwargs={}, - callback=None,error_callback=None): - # run error_callback with ThreadPool.name and exc_info if func failed, - # callback and error_callback will *not* run in multi thread. - # other arguments is same as Pool.apply_async - return self._pool.apply_async( - self._caller,(func,args,kwargs,None,error_callback,True), - callback=callback) - - def cbmap(self,func,iterable,chunksize=None, - callback=None,error_callback=None,block=False): - # shortcut of: - # - # for item in iterable: - # apply_async(func,args=(items,),kwargs={}, - # callback=callback,error_callback=error_callback) - # - # always return None - # block if block set to True - (self.starmap if block else self.starmap_async)( - self._caller, - ((func,(item,),{},callback,error_callback,not block) - for item in iterable), - chunksize=chunksize) - - def ucbmap(self,func,iterable,chunksize=None, - callback=None,error_callback=None,block=False): - # unique version of ThreadPool.cbmap - return self.cbmap(func,self._uiter(iterable),chunksize, - callback,error_callback,block) - - def umap(self,func,iterable,chunksize=None): - # unique version of ThreadPool.map - return self.map(func,self._uiter(iterable),chunksize=chunksize) - - def umap_async(self,func,iterable,chunksize=None, - callback=None,error_callback=None): - # unique version of ThreadPool.map_async - return self.map_async( - func,self._uiter(iterable),chunksize, - callback,error_callback) - - def uimap(self,func,iterable,chunksize=None): - # unique version of ThreadPool.imap - return self.imap(func,self._uiter(iterable),chunksize) - - def uimap_unordered(self,func,iterable,chunksize=None): - # unique version of ThreadPool.imap_unordered - return self.imap_unordered(func,self._uiter(iterable),chunksize) - - def ustarmap(self,func,iterable,chunksize=None): - # unique version of ThreadPool.starmap - return self.starmap(func,self._uiter(iterable),chunksize) - - def ustarmap_async(self,func,iterable,chunksize=None, - callback=None,error_callback=None): - # unique version of ThreadPool.starmap_async - return self.starmap_async( - func,self._uiter(iterable),chunksize, - callback,error_callback) - - def close(self): - # same as Pool.close - self._closed=True - return self._pool.close() - - def terminate(self): - # same as Pool.terminate - self._closed=True - return self._pool.terminate() - - def renew(self): - # terminate all process and start a new clean pool - with self._lock: - self.terminate() - self._pool=Pool(self._processes) - self._closed=False - - @property - def closed(self): - # True if ThreadPool closed - return self._closed - - def __enter__(self): - return self - - def __exit__(self,etype,value,tb): - self.terminate() - -if __name__=='__main__': - exit(0) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/reader.py mcomix-2.1.0/mcomix/mcomix/lib/reader.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/lib/reader.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/lib/reader.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -import io -from threading import Lock - -_IOLock=Lock() - -class LockedFileIO(io.BytesIO): - def __init__(self,path): - with _IOLock: - with open(path,mode='rb') as f: - super().__init__(f.read()) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/add_progress_dialog.py mcomix-2.1.0/mcomix/mcomix/library/add_progress_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/add_progress_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/add_progress_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -'''library_add_progress_dialog.py - Progress bar for the library.''' - -from gi.repository import Gtk -from gi.repository import Pango - -from mcomix import labels - -_dialog = None -# The "All books" collection is not a real collection stored in the library, -# but is represented by this ID in the library's TreeModels. -_COLLECTION_ALL = -1 - -class _AddLibraryProgressDialog(Gtk.Dialog): - - '''Dialog with a ProgressBar that adds books to the library.''' - - def __init__(self, library, window, paths, collection): - '''Adds the books at to the library, and also to the - , unless it is None. - ''' - super(_AddLibraryProgressDialog, self).__init__(title=_('Adding books'), - modal=True) - self.set_transient_for(library) - self.add_buttons(Gtk.STOCK_STOP, Gtk.ResponseType.CLOSE) - - self._window = window - self._destroy = False - self.set_size_request(400, -1) - self.set_resizable(False) - self.set_border_width(4) - self.connect('response', self._response) - self.set_default_response(Gtk.ResponseType.CLOSE) - - main_box = Gtk.VBox(homogeneous=False, spacing=5) - main_box.set_border_width(6) - self.vbox.pack_start(main_box, False, False, 0) - hbox = Gtk.HBox(homogeneous=False, spacing=10) - main_box.pack_start(hbox, False, False, 5) - left_box = Gtk.VBox(homogeneous=True, spacing=5) - right_box = Gtk.VBox(homogeneous=True, spacing=5) - hbox.pack_start(left_box, False, False, 0) - hbox.pack_start(right_box, False, False, 0) - - label = labels.BoldLabel(_('Added books:')) - label.set_alignment(1.0, 1.0) - left_box.pack_start(label, True, True, 0) - number_label = Gtk.Label(label='0') - number_label.set_alignment(0, 1.0) - right_box.pack_start(number_label, True, True, 0) - - bar = Gtk.ProgressBar() - main_box.pack_start(bar, False, False, 0) - - added_label = labels.ItalicLabel() - added_label.set_alignment(0, 0.5) - added_label.set_width_chars(64) - added_label.set_max_width_chars(64) - added_label.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - main_box.pack_start(added_label, False, False, 0) - self.show_all() - - total_paths_int = len(paths) - total_paths_float = float(len(paths)) - total_added = 0 - - for path in paths: - - if library.backend.add_book(path, collection): - total_added += 1 - - number_label.set_text('%d / %d' % (total_added, total_paths_int)) - - added_label.set_text(_('Adding "%s"...') % path) - bar.set_fraction(total_added / total_paths_float) - - while Gtk.events_pending(): - Gtk.main_iteration_do(False) - - if self._destroy: - return - - self._response() - - def _response(self, *args): - self._destroy = True - self.destroy() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/backend.py mcomix-2.1.0/mcomix/mcomix/library/backend.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/backend.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/backend.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,653 +0,0 @@ -'''library_backend.py - Comic book library backend using sqlite.''' - -import os -import datetime - -from mcomix import archive_tools -from mcomix import constants -from mcomix import thumbnail_tools -from mcomix import log -from mcomix import callback -from mcomix import tools -from mcomix.preferences import prefs -from mcomix.library import backend_types -# Only for importing legacy data from last-read module -from mcomix import last_read_page - -try: - import sqlite3 - log.debug('SQLite: {0.sqlite_version} sqlite3 version: {0.version}'.format(sqlite3)) -except ImportError: - log.warning( _('! Could find sqlite3.') ) - sqlite3 = None - - -#: Identifies the 'Recent' collection that stores recently read books. -COLLECTION_RECENT = -2 - - -class _LibraryBackend(object): - - '''The LibraryBackend handles the storing and retrieval of library - data to and from disk. - ''' - - #: Current version of the library database structure. - # See method _upgrade_database() for changes between versions. - DB_VERSION = 6 - - def __init__(self): - - def row_factory(cursor, row): - '''Return rows as sequences only when they have more than - one element. - ''' - if len(row) == 1: - return row[0] - return row - - if sqlite3 is not None: - self._con = sqlite3.connect(constants.LIBRARY_DATABASE_PATH, - check_same_thread=False, isolation_level=None) - self._con.row_factory = row_factory - self.enabled = True - - self.watchlist = backend_types._WatchList(self) - - version = self._library_version() - self._upgrade_database(version, _LibraryBackend.DB_VERSION) - else: - self._con = None - self.watchlist = None - self.enabled = False - - def get_books_in_collection(self, collection=None, filter_string=None): - '''Return a sequence with all the books in , or *ALL* - books if is None. If is not None, we - only return books where the occurs in the path. - ''' - if collection is None: - if filter_string is None: - cur = self._con.execute('''select id from Book''') - else: - cur = self._con.execute('''select id from Book - where path like ?''', ('%%%s%%' % filter_string, )) - - return cur.fetchall() - else: - books = [] - subcollections = self.get_all_collections_in_collection(collection) - for coll in [ collection ] + subcollections: - if filter_string is None: - cur = self._con.execute('''select id from Book - where id in (select book from Contain where collection = ?) - ''', (coll,)) - else: - cur = self._con.execute('''select id from Book - where id in (select book from Contain where collection = ?) - and path like ?''', (coll, '%%%s%%' % filter_string)) - books.extend(cur.fetchall()) - return books - - def get_book_by_path(self, path): - ''' Retrieves a book from the library, specified by C{path}. - If the book doesn't exist, None is returned. Otherwise, a - L{backend_types._Book} instance is returned. ''' - - path = tools.relpath2root(path,abs_fallback=prefs['portable allow abspath']) - if not path: - # path is None, means running in portable mode - # and currect path is out of same mount point - # so book should not exist in library - return - - cur = self.execute('''select id, name, path, pages, format, - size, added - from book where path = ?''', (path,)) - book = cur.fetchone() - cur.close() - - if book: - return backend_types._Book(*book) - else: - return None - - def get_book_by_id(self, id): - ''' Retrieves a book from the library, specified by C{id}. - If the book doesn't exist, C{None} is returned. Otherwise, a - L{backend_types._Book} instance is returned. ''' - - cur = self.execute('''select id, name, path, pages, format, - size, added - from book where id = ?''', (id,)) - book = cur.fetchone() - cur.close() - - if book: - return backend_types._Book(*book) - else: - return None - - def get_book_cover(self, book): - '''Return a pixbuf with a thumbnail of the cover of , or - None if the cover can not be fetched. - ''' - try: - path = self._con.execute('''select path from Book - where id = ?''', (book,)).fetchone() - except Exception: - log.error( _('! Non-existant book #%i'), book ) - return None - - return self.get_book_thumbnail(path) - - def get_book_path(self, book): - '''Return the filesystem path to , or None if isn't - in the library. - ''' - try: - path = self._con.execute('''select path from Book - where id = ?''', (book,)).fetchone() - except Exception: - log.error( _('! Non-existant book #%i'), book ) - return None - - return path - - def get_book_thumbnail(self, path): - ''' Returns a pixbuf with a thumbnail of the cover of the book at , - or None, if no thumbnail could be generated. ''' - - # Use the maximum image size allowed by the library, so that thumbnails - # might be downscaled, but never need to be upscaled (and look ugly). - thumbnailer = thumbnail_tools.Thumbnailer(dst_dir=constants.LIBRARY_COVERS_PATH, - store_on_disk=True, - archive_support=True, - size=(constants.MAX_LIBRARY_COVER_SIZE, - constants.MAX_LIBRARY_COVER_SIZE)) - thumb = thumbnailer.thumbnail(path) - - if thumb is None: log.warning( _('! Could not get cover for book "%s"'), path ) - return thumb - - def get_book_name(self, book): - '''Return the name of , or None if isn't in the - library. - ''' - cur = self._con.execute('''select name from Book - where id = ?''', (book,)) - name = cur.fetchone() - if name is not None: - return name - else: - return None - - def get_book_pages(self, book): - '''Return the number of pages in , or None if isn't - in the library. - ''' - cur = self._con.execute('''select pages from Book - where id = ?''', (book,)) - return cur.fetchone() - - def get_book_format(self, book): - '''Return the archive format of , or None if isn't - in the library. - ''' - cur = self._con.execute('''select format from Book - where id = ?''', (book,)) - return cur.fetchone() - - def get_book_size(self, book): - '''Return the size of in bytes, or None if isn't - in the library. - ''' - cur = self._con.execute('''select size from Book - where id = ?''', (book,)) - return cur.fetchone() - - def get_collections_in_collection(self, collection=None): - '''Return a sequence with all the subcollections in , - or all top-level collections if is None. - ''' - if collection is None: - cur = self._con.execute('''select id from Collection - where supercollection isnull - order by name''') - else: - cur = self._con.execute('''select id from Collection - where supercollection = ? - order by name''', (collection,)) - return cur.fetchall() - - def get_all_collections_in_collection(self, collection): - ''' Returns a sequence of subcollections in , - that is, even subcollections that are again a subcollection of one - of the previous subcollections. ''' - - if collection is None: raise ValueError('Collection must not be ') - - to_search = [ collection ] - collections = [ ] - # This assumes that the library is built like a tree, so no circular references. - while len(to_search) > 0: - collection = to_search.pop() - subcollections = self.get_collections_in_collection(collection) - collections.extend(subcollections) - to_search.extend(subcollections) - - return collections - - def get_all_collections(self): - '''Return a sequence with all collections (flattened hierarchy). - The sequence is sorted alphabetically by collection name. - ''' - cur = self._con.execute('''select id from Collection - order by name''') - return cur.fetchall() - - def get_collection_name(self, collection): - '''Return the name field of the , or None if the - collection does not exist. - ''' - cur = self._con.execute('''select name from Collection - where id = ?''', (collection,)) - name = cur.fetchone() - if name is not None: - return name - else: - return None - - def get_collection_by_name(self, name): - '''Return the collection called , or None if no such - collection exists. Names are unique, so at most one such collection - can exist. - ''' - cur = self._con.execute('''select id, name, supercollection - from collection - where name = ?''', (name,)) - result = cur.fetchone() - cur.close() - if result: - return backend_types._Collection(*result) - else: - return None - - def get_collection_by_id(self, id): - ''' Returns the collection with ID C{id}. - @param id: Integer value. May be C{-1} or C{None} for default collection. - @return: L{_Collection} if found, None otherwise. - ''' - if id is None or id == -1: - return backend_types.DefaultCollection - else: - cur = self._con.execute('''select id, name, supercollection - from collection - where id = ?''', (id,)) - result = cur.fetchone() - cur.close() - - if result: - return backend_types._Collection(*result) - else: - return None - - def get_recent_collection(self): - ''' Returns the "Recent" collection, especially created for - storing recently opened files. ''' - return self.get_collection_by_id(COLLECTION_RECENT) - - def get_supercollection(self, collection): - '''Return the supercollection of .''' - cur = self._con.execute('''select supercollection from Collection - where id = ?''', (collection,)) - return cur.fetchone() - - def add_book(self, path, collection=None): - '''Add the archive at to the library. If is - not None, it is the collection that the books should be put in. - Return True if the book was successfully added (or was already - added). - ''' - path = tools.relpath2root(path,abs_fallback=prefs['portable allow abspath']) - if not path: - # path is None, means running in portable mode - # and currect path is out of same mount point - # so do not add book to library - return - name = os.path.basename(path) - info = archive_tools.get_archive_info(path) - if info is None: - return False - format, pages, size = info - - # Thumbnail for the newly added book will be generated once it - # is actually needed with get_book_thumbnail(). - old = self._con.execute('''select id from Book - where path = ?''', (path,)).fetchone() - try: - cursor = self._con.cursor() - if old is not None: - cursor.execute('''update Book set - name = ?, pages = ?, format = ?, size = ? - where path = ?''', (name, pages, format, size, path)) - book_id = old - else: - cursor.execute('''insert into Book - (name, path, pages, format, size) - values (?, ?, ?, ?, ?)''', - (name, path, pages, format, size)) - book_id = cursor.lastrowid - - book = backend_types._Book(book_id, name, path, pages, - format, size, datetime.datetime.now().isoformat()) - self.book_added(book) - - cursor.close() - - if collection is not None: - self.add_book_to_collection(book_id, collection) - - return True - except sqlite3.Error: - log.error( _('! Could not add book "%s" to the library'), path ) - return False - - @callback.Callback - def book_added(self, book): - ''' Event that triggers when a new book is successfully added to the - library. - @param book: L{_Book} instance of the newly added book. - ''' - pass - - @callback.Callback - def book_added_to_collection(self, book, collection_id): - ''' Event that triggers when a book is added to the - specified collection. - @param book: L{_Book} instance of the added book. - @param collection_id: ID of the collection. - ''' - pass - - - def add_collection(self, name): - '''Add a new collection with to the library. Return True - if the collection was successfully added. - ''' - try: - # The Recent pseudo collection initializes the lowest rowid - # with -2, meaning that instead of starting from 1, - # auto-incremental will start from -1. Avoid this. - cur = self._con.execute('''select max(id) from collection''') - maxid = cur.fetchone() - if maxid is not None and maxid < 1: - self._con.execute('''insert into collection - (id, name) values (?, ?)''', (1, name)) - else: - self._con.execute('''insert into Collection - (name) values (?)''', (name,)) - return True - except sqlite3.Error: - log.error( _('! Could not add collection "%s"'), name ) - return False - - def add_book_to_collection(self, book, collection): - '''Put into .''' - try: - self._con.execute('''insert into Contain - (collection, book) values (?, ?)''', (collection, book)) - self.book_added_to_collection(self.get_book_by_id(book), - collection) - except sqlite3.DatabaseError: # E.g. book already in collection. - pass - except sqlite3.Error: - log.error( _('! Could not add book %(book)s to collection %(collection)s'), - {'book' : book, 'collection' : collection} ) - - def add_collection_to_collection(self, subcollection, supercollection): - '''Put into , or put - in the root if is None. - ''' - if supercollection is None: - self._con.execute('''update Collection - set supercollection = NULL - where id = ?''', (subcollection,)) - else: - self._con.execute('''update Collection - set supercollection = ? - where id = ?''', (supercollection, subcollection)) - - def rename_collection(self, collection, name): - '''Rename the to . Return True if the renaming - was successful. - ''' - try: - self._con.execute('''update Collection set name = ? - where id = ?''', (name, collection)) - return True - except sqlite3.DatabaseError: # E.g. name taken. - pass - except sqlite3.Error: - log.error( _('! Could not rename collection to "%s"'), name ) - return False - - def duplicate_collection(self, collection): - '''Duplicate the by creating a new collection - containing the same books. Return True if the duplication was - successful. - ''' - name = self.get_collection_name(collection) - if name is None: # Original collection does not exist. - return False - copy_name = name + ' ' + _('(Copy)') - while self.get_collection_by_name(copy_name): - copy_name = copy_name + ' ' + _('(Copy)') - if self.add_collection(copy_name) is None: # Could not create the new. - return False - copy_collection = self._con.execute('''select id from Collection - where name = ?''', (copy_name,)).fetchone() - self._con.execute('''insert or ignore into Contain (collection, book) - select ?, book from Contain - where collection = ?''', (copy_collection, collection)) - return True - - def clean_collection(self, collection=None): - ''' Removes files from that no longer exist. If - is None, all collections are cleaned. Returns the number of deleted books. ''' - book_ids = self.get_books_in_collection(collection) - deleted = 0 - for id in book_ids: - path = self.get_book_path(id) - if path and not os.path.isfile(path): - self.remove_book(id) - deleted += 1 - - return deleted - - def remove_book(self, book): - '''Remove the from the library.''' - path = self.get_book_path(book) - if path is not None: - thumbnailer = thumbnail_tools.Thumbnailer(dst_dir=constants.LIBRARY_COVERS_PATH) - thumbnailer.delete(path) - self._con.execute('delete from Book where id = ?', (book,)) - self._con.execute('delete from Contain where book = ?', (book,)) - - def remove_collection(self, collection): - '''Remove the (sans books) from the library.''' - self._con.execute('''update watchlist set collection = NULL - where collection = ?''', (collection,)) - self._con.execute('delete from Collection where id = ?', (collection,)) - self._con.execute('delete from Contain where collection = ?', - (collection,)) - self._con.execute('''update Collection set supercollection = NULL - where supercollection = ?''', (collection,)) - - def remove_book_from_collection(self, book, collection): - '''Remove from .''' - self._con.execute('''delete from Contain - where book = ? and collection = ?''', (book, collection)) - - def execute(self, *args): - ''' Passes C{args} directly to the C{execute} method of the SQL - connection. ''' - return self._con.execute(*args) - - def begin_transaction(self): - ''' Normally, the connection is in auto-commit mode. Calling - this method will switch to transactional mode, automatically - starting a transaction when a DML statement is used. ''' - self._con.isolation_level = 'IMMEDIATE' - - def end_transaction(self): - ''' Commits any changes to the database and switches back - to auto-commit mode. ''' - self._con.commit() - self._con.isolation_level = None - - def close(self): - '''Commit changes and close cleanly.''' - if self._con is not None: - self._con.commit() - self._con.close() - - global _backend - _backend = None - - def _table_exists(self, table): - ''' Checks if C{table} exists in the database. ''' - cursor = self._con.cursor() - exists = cursor.execute('pragma table_info(%s)' % table).fetchone() is not None - cursor.close() - return exists - - def _library_version(self): - ''' Examines the library database structure to determine - which version of MComix created it. - - @return C{version} from the table C{Info} if available, - C{0} otherwise. C{-1} if the database has not been created yet.''' - - # Check if Comix' tables exist - tables = ('book', 'collection', 'contain') - for table in tables: - if not self._table_exists(table): - return -1 - - if self._table_exists('info'): - cursor = self._con.cursor() - version = cursor.execute('''select value from info - where key = 'version' ''').fetchone() - cursor.close() - - if not version: - log.warning(_('Could not determine library database version!')) - return -1 - else: - return int(version) - else: - # Comix database format - return 0 - - def _create_tables(self): - ''' Creates all required tables in the database. ''' - self._create_table_book() - self._create_table_collection() - self._create_table_contain() - self._create_table_info() - self._create_table_watchlist() - self._create_table_recent() - - def _upgrade_database(self, from_version, to_version): - ''' Performs sequential upgrades to the database, bringing - it from C{from_version} to C{to_version}. If C{from_version} - is -1, the database structure will simply be re-created at the - current version. ''' - - if from_version < 5: - self._create_tables() - return - - if from_version != to_version: - upgrades = range(from_version, to_version) - log.info(_('Upgrading library database version from %(from)d to %(to)d.'), - { 'from' : from_version, 'to' : to_version }) - - if 5 in upgrades: - # Changed all 'string' columns into 'text' columns - self._con.execute('''alter table book rename to book_old''') - self._create_table_book() - self._con.execute('''insert into book - (id, name, path, pages, format, size, added) - select id, name, path, pages, format, size, added from book_old''') - self._con.execute('''drop table book_old''') - - self._con.execute('''alter table collection rename to collection_old''') - self._create_table_collection() - self._con.execute('''insert into collection - (id, name, supercollection) - select id, name, supercollection from collection_old''') - self._con.execute('''drop table collection_old''') - - self._con.execute('''update info set value = ? where key = 'version' ''', - (str(_LibraryBackend.DB_VERSION),)) - - def _create_table_book(self): - self._con.execute('''create table if not exists book ( - id integer primary key, - name text, - path text unique, - pages integer, - format integer, - size integer, - added datetime default current_timestamp)''') - - def _create_table_collection(self): - self._con.execute('''create table if not exists collection ( - id integer primary key, - name text unique, - supercollection integer)''') - - def _create_table_contain(self): - self._con.execute('''create table if not exists contain ( - collection integer not null, - book integer not null, - primary key (collection, book))''') - - def _create_table_info(self): - self._con.execute('''create table if not exists info ( - key text primary key, - value text)''') - self._con.execute('''insert into info - (key, value) values ('version', ?)''', - (str(_LibraryBackend.DB_VERSION),)) - - def _create_table_watchlist(self): - self._con.execute('''create table if not exists watchlist ( - path text primary key, - collection integer references collection (id) on delete set null, - recursive boolean not null)''') - - def _create_table_recent(self): - self._con.execute('''create table if not exists recent ( - book integer primary key, - page integer, - time_set datetime)''') - self._con.execute('''insert or ignore into collection (id, name) - values (?, ?)''', (COLLECTION_RECENT, _('Recent'))) - - -_backend = None - - -def LibraryBackend(): - ''' Returns the singleton instance of the library backend. ''' - global _backend - if _backend is not None: - return _backend - else: - _backend = _LibraryBackend() - return _backend - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/backend_types.py mcomix-2.1.0/mcomix/mcomix/library/backend_types.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/backend_types.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/backend_types.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,401 +0,0 @@ -''' Data class for library books and collections. ''' - -import os -import threading -import datetime - -from mcomix import callback -from mcomix import archive_tools -from mcomix import tools - - -class _BackendObject(object): - - def get_backend(self): - # XXX: Delayed import to avoid circular import - from mcomix.library.backend import LibraryBackend - return LibraryBackend() - - -class _Book(_BackendObject): - ''' Library book instance. ''' - - def __init__(self, id, name, path, pages, format, size, added): - ''' Creates a book instance. - @param id: Book id - @param name: Base name of the book - @param path: Full path to the book - @param pages: Number of pages - @param format: One of the archive formats in L{constants} - @param size: File size in bytes - @param added: Datetime when book was added to library ''' - - self.id = id - self.name = name - self.path = path - self.pages = pages - self.format = format - self.size = size - self.added = added - - def get_collections(self): - ''' Gets a list of collections this book is part of. If it - belongs to no collections, [DefaultCollection] is returned. ''' - cursor = self.get_backend().execute( - '''SELECT id, name, supercollection FROM collection - JOIN contain on contain.collection = collection.id - WHERE contain.book = ?''', (self.id,)) - rows = cursor.fetchall() - if rows: - return [_Collection(*row) for row in rows] - else: - return [DefaultCollection] - - def get_last_read_page(self): - ''' Gets the page of this book that was last read when the book was - closed. Returns C{None} if no such page exists. ''' - cursor = self.get_backend().execute( - '''SELECT page FROM recent WHERE book = ?''', (self.id,)) - row = cursor.fetchone() - cursor.close() - return row - - def get_last_read_date(self): - ''' Gets the datetime the book was most recently read. Returns - C{None} if no information was set, or a datetime object otherwise. ''' - cursor = self.get_backend().execute( - '''SELECT time_set FROM recent WHERE book = ?''', (self.id,)) - date = cursor.fetchone() - cursor.close() - - if date: - try: - return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S.%f') - except ValueError: - # Certain operating systems do not store fractions - return datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S') - else: - return None - - def set_last_read_page(self, page, time=None): - ''' Sets the page that was last read when the book was closed. - Passing C{None} as argument clears the recent information. - - @param page: Page number, starting from 1 (page 1 throws ValueError) - @param time: Time of reading. If None, current time is used. ''' - - if page is not None and page < 1: - # Avoid wasting memory by creating a recently viewed entry when - # an archive was opened on page 1. - raise ValueError('Invalid page (must start from 1)') - - # Remove any old recent row for this book - cursor = self.get_backend().execute( - '''DELETE FROM recent WHERE book = ?''', (self.id,)) - # If a new page was passed, set it as recently read - if page is not None: - if not time: - time = datetime.datetime.now() - cursor.execute('''INSERT INTO recent (book, page, time_set) - VALUES (?, ?, ?)''', - (self.id, page, time)) - - cursor.close() - - -class _Collection(_BackendObject): - ''' Library collection instance. - This class should NOT be instianted directly, but only with methods from - L{LibraryBackend} instead. ''' - - def __init__(self, id, name, supercollection=None): - ''' Creates a collection instance. - @param id: Collection id - @param name: Name of the collection - @param supercollection: Parent collection, or C{None} ''' - - self.id = id - self.name = name - self.supercollection = supercollection - - def __eq__(self, other): - if isinstance(other, _Collection): - return self.id == other.id - elif isinstance(other, (int, int)): - return self.id == other - else: - return False - - def get_books(self, filter_string=None): - ''' Returns all books that are part of this collection, - including subcollections. ''' - - books = [] - for collection in [ self ] + self.get_all_collections(): - sql = '''SELECT book.id, book.name, book.path, book.pages, book.format, - book.size, book.added - FROM book - JOIN contain ON contain.book = book.id - AND contain.collection = ? - ''' - - sql_args = [collection.id] - if filter_string: - sql += ''' WHERE book.name LIKE '%' || ? || '%' ''' - sql_args.append(filter_string) - - cursor = self.get_backend().execute(sql, sql_args) - rows = cursor.fetchall() - cursor.close() - - books.extend([ _Book(*cols) for cols in rows ]) - - return books - - def get_collections(self): - ''' Returns a list of all direct subcollections of this instance. ''' - - cursor = self.get_backend().execute('''SELECT id, name, supercollection - FROM collection - WHERE supercollection = ? - ORDER by name''', [self.id]) - result = cursor.fetchall() - cursor.close() - - return [ _Collection(*row) for row in result ] - - def get_all_collections(self): - ''' Returns all collections that are subcollections of this instance, - or subcollections of a subcollection of this instance. ''' - - to_search = [ self ] - collections = [ ] - # This assumes that the library is built like a tree, so no circular references. - while len(to_search) > 0: - collection = to_search.pop() - subcollections = collection.get_collections() - collections.extend(subcollections) - to_search.extend(subcollections) - - return collections - - def add_collection(self, subcollection): - ''' Sets C{subcollection} as child of this collection. ''' - - self.get_backend().execute('''UPDATE collection - SET supercollection = ? - WHERE id = ?''', (self.id, subcollection.id)) - subcollection.supercollection = self.id - - -class _DefaultCollection(_Collection): - ''' Represents the default collection that books belong to if - no explicit collection was specified. ''' - - def __init__(self): - - self.id = None - self.name = _('All books') - self.supercollection = None - - def get_books(self, filter_string=None): - ''' Returns all books in the library ''' - sql = '''SELECT book.id, book.name, book.path, book.pages, book.format, - book.size, book.added - FROM book - ''' - - sql_args = [] - if filter_string: - sql += ''' WHERE book.name LIKE '%' || ? || '%' ''' - sql_args.append(filter_string) - - cursor = self.get_backend().execute(sql, sql_args) - rows = cursor.fetchall() - cursor.close() - - return [ _Book(*cols) for cols in rows ] - - def add_collection(self, subcollection): - ''' Removes C{subcollection} from any supercollections and moves - it to the root level of the tree. ''' - - assert subcollection is not DefaultCollection, 'Cannot change DefaultCollection' - - self.get_backend().execute('''UPDATE collection - SET supercollection = NULL - WHERE id = ?''', (subcollection.id,)) - subcollection.supercollection = None - - def get_collections(self): - ''' Returns a list of all root collections. ''' - - cursor = self.get_backend().execute('''SELECT id, name, supercollection - FROM collection - WHERE supercollection IS NULL - ORDER by name''') - result = cursor.fetchall() - cursor.close() - - return [ _Collection(*row) for row in result ] - - -DefaultCollection = _DefaultCollection() - - -class _WatchList(object): - ''' Scans watched directories and updates the database when new books have - been added. This object is part of the library backend, i.e. - C{library.backend.watchlist}. ''' - - def __init__(self, backend): - self.backend = backend - - def add_directory(self, path, collection=DefaultCollection, recursive=False): - ''' Adds a new watched directory. ''' - - sql = '''INSERT OR IGNORE INTO watchlist (path, collection, recursive) - VALUES (?, ?, ?)''' - cursor = self.backend.execute(sql, [path, collection.id, recursive]) - cursor.close() - - def get_watchlist(self): - ''' Returns a list of watched directories. - @return: List of L{_WatchListEntry} objects. ''' - - sql = '''SELECT watchlist.path, - watchlist.recursive, - collection.id, collection.name, - collection.supercollection - FROM watchlist - LEFT JOIN collection ON watchlist.collection = collection.id''' - - cursor = self.backend.execute(sql) - entries = [self._result_row_to_watchlist_entry(row) for row in cursor.fetchall()] - cursor.close() - - return entries - - def get_watchlist_entry(self, path): - ''' Returns a single watchlist entry, specified by C{path} ''' - sql = '''SELECT watchlist.path, - watchlist.recursive, - collection.id, collection.name, - collection.supercollection - FROM watchlist - LEFT JOIN collection ON watchlist.collection = collection.id - WHERE watchlist.path = ?''' - - cursor = self.backend.execute(sql, (path, )) - result = cursor.fetchone() - cursor.close() - - if result: - return self._result_row_to_watchlist_entry(result) - else: - raise ValueError('Watchlist entry doesn\'t exist') - - def scan_for_new_files(self): - ''' Begins scanning for new files in the watched directories. - When the scan finishes, L{new_files_found} will be called - asynchronously. ''' - thread = threading.Thread(target=self._scan_for_new_files_thread) - thread.name += '-scan_for_new_files' - thread.start() - - def _scan_for_new_files_thread(self): - ''' Executes the actual scanning operation in a new thread. ''' - existing_books = [book.path for book in DefaultCollection.get_books() - # Also add book if it was only found in Recent collection - if book.get_collections() != [-2]] - for entry in self.get_watchlist(): - new_files = entry.get_new_files(existing_books) - self.new_files_found(new_files, entry) - - def _result_row_to_watchlist_entry(self, row): - ''' Converts the result of a SELECT statement to a WatchListEntry. ''' - collection_id = row[2] - if collection_id: - collection = _Collection(*row[2:]) - else: - collection = DefaultCollection - - return _WatchListEntry(row[0], row[1], collection) - - - @callback.Callback - def new_files_found(self, paths, watchentry): - ''' Called after scan_for_new_files finishes. - @param paths: List of filenames for newly added files. This list - may be empty if no new files were found during the scan. - @param watchentry: Watchentry for files/directory. - ''' - pass - - -class _WatchListEntry(_BackendObject): - ''' A watched directory. ''' - - def __init__(self, directory, recursive, collection): - self.directory = directory - self.recursive = bool(recursive) - self.collection = collection - - def get_new_files(self, filelist): - ''' Returns a list of files that are present in the watched directory, - but not in the list of files passed in C{filelist}. ''' - - if not self.is_valid(): - return [] - - old_files = frozenset([os.path.abspath(path) for path in filelist]) - - if not self.recursive: - available_files = frozenset([os.path.join(self.directory, filename) - for filename in os.listdir(self.directory) - if archive_tools.is_archive_file(filename)]) - else: - available_files = [] - for dirpath, dirnames, filenames in os.walk(self.directory): - for filename in filter(archive_tools.is_archive_file, filenames): - path = os.path.join(dirpath, filename) - available_files.append(path) - - available_files = frozenset(available_files) - - return list(available_files.difference(old_files)) - - def is_valid(self): - ''' Check if the watched directory is a valid directory and exists. ''' - return os.path.isdir(self.directory) - - def remove(self): - ''' Removes this entry from the watchlist, deleting its associated - path from the database. ''' - sql = '''DELETE FROM watchlist WHERE path = ?''' - cursor = self.get_backend().execute(sql, (self.directory,)) - cursor.close() - - self.directory = '' - self.collection = None - - def set_collection(self, new_collection): - ''' Updates the collection associated with this watchlist entry. ''' - if new_collection != self.collection: - sql = '''UPDATE watchlist SET collection = ? WHERE path = ?''' - cursor = self.get_backend().execute(sql, - (new_collection.id, self.directory)) - cursor.close() - self.collection = new_collection - - def set_recursive(self, recursive): - ''' Enables or disables recursive scanning. ''' - if recursive != self.recursive: - sql = '''UPDATE watchlist SET recursive = ? WHERE path = ?''' - cursor = self.get_backend().execute(sql, - (recursive, self.directory)) - cursor.close() - self.recursive = recursive - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/book_area.py mcomix-2.1.0/mcomix/mcomix/library/book_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/book_area.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/book_area.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,707 +0,0 @@ -'''library_book_area.py - The window of the library that displays the covers of books.''' - -import os -import urllib -from gi.repository import Gdk, GdkPixbuf, Gtk, GLib, GObject -import PIL.Image as Image -import PIL.ImageDraw as ImageDraw - -from mcomix.preferences import prefs -from mcomix import thumbnail_view -from mcomix import file_chooser_library_dialog -from mcomix import image_tools -from mcomix import constants -from mcomix import portability -from mcomix import i18n -from mcomix import status -from mcomix import log -from mcomix import message_dialog -from mcomix import tools -from mcomix.library.pixbuf_cache import get_pixbuf_cache - -_dialog = None - -# The "All books" collection is not a real collection stored in the library, but is represented by this ID in the -# library's TreeModels. -_COLLECTION_ALL = -1 - - -class _BookArea(Gtk.ScrolledWindow): - - '''The _BookArea is the central area in the library where the book - covers are displayed. - ''' - - # Thumbnail border width in pixels. - _BORDER_SIZE = 1 - - def __init__(self, library): - super(_BookArea, self).__init__() - - self._library = library - self._cache = get_pixbuf_cache() - - self._library.backend.book_added_to_collection += self._new_book_added - - self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - - # Store Cover, book ID, book path, book size, date added to library, - # is thumbnail loaded? - - # The SORT_ constants must correspond to the correct column here, - # i.e. SORT_SIZE must be 3, since 3 is the size column in the ListStore. - self._liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, - GObject.TYPE_INT, GObject.TYPE_STRING, GObject.TYPE_INT64, - GObject.TYPE_STRING, GObject.TYPE_BOOLEAN) - self._liststore.set_sort_func(constants.SORT_NAME, self._sort_by_name, None) - self._liststore.set_sort_func(constants.SORT_PATH, self._sort_by_path, None) - self.set_sort_order() - self._iconview = thumbnail_view.ThumbnailIconView( - self._liststore, - 1, # UID - 0, # pixbuf - 5, # status - ) - self._iconview.generate_thumbnail = self._get_pixbuf - self._iconview.connect('item_activated', self._book_activated) - self._iconview.connect('selection_changed', self._selection_changed) - self._iconview.connect_after('drag_begin', self._drag_begin) - self._iconview.connect('drag_data_get', self._drag_data_get) - self._iconview.connect('drag_data_received', self._drag_data_received) - self._iconview.connect('button_press_event', self._button_press) - self._iconview.connect('key_press_event', self._key_press) - self._iconview.connect('popup_menu', self._popup_menu) - self._iconview.enable_model_drag_source( - Gdk.ModifierType.BUTTON1_MASK, - [Gtk.TargetEntry.new('book', Gtk.TargetFlags.SAME_APP, - constants.LIBRARY_DRAG_EXTERNAL_ID)], - Gdk.DragAction.MOVE) - self._iconview.drag_dest_set( - Gtk.DestDefaults.ALL, - [Gtk.TargetEntry.new('text/uri-list', 0, - constants.LIBRARY_DRAG_EXTERNAL_ID)], - Gdk.DragAction.COPY | Gdk.DragAction.MOVE) - self._iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) - self.add(self._iconview) - - self._iconview.set_margin(0) - self._iconview.set_row_spacing(0) - self._iconview.set_column_spacing(0) - - self._ui_manager = Gtk.UIManager() - self._tooltipstatus = status.TooltipStatusHelper(self._ui_manager, - self._library.get_status_bar()) - - ui_description = ''' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ''' - - self._ui_manager.add_ui_from_string(ui_description) - actiongroup = Gtk.ActionGroup(name='mcomix-library-book-area') - # General book actions - actiongroup.add_actions([ - ('_title', None, _('Library books'), None, None, None), - ('open', Gtk.STOCK_OPEN, _('_Open'), None, - _('Opens the selected books for viewing.'), - self.open_selected_book), - ('open keep library', Gtk.STOCK_OPEN, - _('Open _without closing library'), None, - _('Opens the selected books, but keeps the library window open.'), - self.open_selected_book_noclose), - ('add', Gtk.STOCK_ADD, _('_Add...'), 'a', - _('Add more books to the library.'), - lambda *args: file_chooser_library_dialog.open_library_filechooser_dialog(self._library)), - ('remove from collection', Gtk.STOCK_REMOVE, - _('Remove from this _collection'), None, - _('Removes the selected books from the current collection.'), - self._remove_books_from_collection), - ('remove from library', Gtk.STOCK_REMOVE, - _('Remove from the _library'), None, - _('Removes the selected books from the library.'), - self._remove_books_from_library), - ('copy path to clipboard', Gtk.STOCK_COPY, - _('_Copy'), None, - _('Copies the selected book\'s path to clipboard.'), - self._copy_selected_path), - ('copy cover to clipboard', '', - _('_Copy Cover'), None, - _('Copies the selected book\'s cover to clipboard.'), - self._copy_selected_cover), - ('sort', None, _('_Sort'), None, - _('Changes the sort order of the library.'), None), - ('cover size', None, _('Cover si_ze'), None, - _('Changes the book cover size.'), None) - ]) - # Sorting the view - actiongroup.add_radio_actions([ - ('by name', None, _('Book name'), None, None, constants.SORT_NAME), - ('by path', None, _('Full path'), None, None, constants.SORT_PATH), - ('by size', None, _('File size'), None, None, constants.SORT_SIZE), - ('by date added', None, _('Date added'), None, None, constants.SORT_LAST_MODIFIED) - ], - prefs['lib sort key'], self._sort_changed - ) - actiongroup.add_radio_actions([ - ('ascending', Gtk.STOCK_SORT_ASCENDING, _('Ascending'), None, None, - constants.SORT_ASCENDING), - ('descending', Gtk.STOCK_SORT_DESCENDING, _('Descending'), None, None, - constants.SORT_DESCENDING) - ], - prefs['lib sort order'], self._sort_changed - ) - - # Library cover size - actiongroup.add_radio_actions([ - ('huge', None, _('Huge') + ' (%dpx)' % constants.SIZE_HUGE, - None, None, constants.SIZE_HUGE), - ('large', None, _('Large') + ' (%dpx)' % constants.SIZE_LARGE, - None, None, constants.SIZE_LARGE), - ('normal', None, _('Normal') + ' (%dpx)' % constants.SIZE_NORMAL, - None, None, constants.SIZE_NORMAL), - ('small', None, _('Small') + ' (%dpx)' % constants.SIZE_SMALL, - None, None, constants.SIZE_SMALL), - ('tiny', None, _('Tiny') + ' (%dpx)' % constants.SIZE_TINY, - None, None, constants.SIZE_TINY), - ('custom', None, _('Custom...'), None, None, 0) - ], - prefs['library cover size'] - if prefs['library cover size'] in ( - constants.SIZE_HUGE, - constants.SIZE_LARGE, constants.SIZE_NORMAL, - constants.SIZE_SMALL, constants.SIZE_TINY - ) - else 0, - self._book_size_changed - ) - - self._ui_manager.insert_action_group(actiongroup, 0) - library.add_accel_group(self._ui_manager.get_accel_group()) - - def close(self): - '''Run clean-up tasks for the _BookArea prior to closing.''' - - self.stop_update() - - # We must unselect all or we will trigger selection_changed events - # when closing with multiple books selected. - self._iconview.unselect_all() - # We must (for some reason) explicitly clear the ListStore in - # order to not leak memory. - self._liststore.clear() - - def display_covers(self, collection_id): - '''Display the books in in the IconView.''' - - adjustment = self.get_vadjustment() - if adjustment: - adjustment.set_value(0) - - self.stop_update() - # Temporarily detach model to speed up updates - self._iconview.set_model(None) - self._liststore.clear() - - collection = self._library.backend.get_collection_by_id(collection_id) - books = collection.get_books(self._library.filter_string) - self.add_books(books) - - # Re-attach model here - self._iconview.set_model(self._liststore) - - def stop_update(self): - '''Signal that the updating of book covers should stop.''' - self._iconview.stop_update() - - def add_books(self, books): - ''' Adds new book covers to the icon view. - @param books: List of L{_Book} instances. ''' - filler = self._get_empty_thumbnail() - - for book in books: - # Fill the liststore with a filler pixbuf. - self._liststore.append([filler, book.id, - book.path, - book.size, book.added, False]) - - def _new_book_added(self, book, collection): - ''' Callback function for L{LibraryBackend.book_added}. ''' - if collection is None: - collection = _COLLECTION_ALL - - if (collection == self._library.collection_area.get_current_collection() or - self._library.collection_area.get_current_collection() == _COLLECTION_ALL): - # Make sure not to show a book twice when COLLECTION_ALL is selected - # and the book is added to another collection, triggering this event. - if self.is_book_displayed(book): - return - - # If the current view is filtered, only draw new books that match the filter - if not (self._library.filter_string and - self._library.filter_string.lower() not in book.name.lower()): - self.add_books([book]) - - def is_book_displayed(self, book): - ''' Returns True when the current view contains the book passed. - @param book: L{_Book} instance. ''' - if not book: - return False - - for row in self._liststore: - if row[1] == book.id: - return True - - return False - - def remove_book_at_path(self, path): - '''Remove the book at from the ListStore (and thus from - the _BookArea). - ''' - iterator = self._liststore.get_iter(path) - filepath = self._liststore.get_value(iterator, 2) - self._liststore.remove(iterator) - self._cache.pop(filepath) - - def get_book_at_path(self, path): - '''Return the book ID corresponding to the IconView .''' - iterator = self._liststore.get_iter(path) - return self._liststore.get_value(iterator, 1) - - def get_book_path(self, book): - '''Return the to the book from the ListStore. - ''' - return self._liststore.get_iter(book) - - def open_selected_book(self, *args): - '''Open the currently selected book.''' - selected = self._iconview.get_selected_items() - if not selected: - return - self._book_activated(self._iconview, selected, False) - - def open_selected_book_noclose(self, *args): - '''Open the currently selected book, keeping the library open.''' - selected = self._iconview.get_selected_items() - if not selected: - return - self._book_activated(self._iconview, selected, True) - - def set_sort_order(self): - ''' Orders the list store based on the key passed in C{sort_key}. - Should be one of the C{SORT_} constants from L{constants}. - ''' - if prefs['lib sort order'] == constants.SORT_ASCENDING: - sortorder = Gtk.SortType.ASCENDING - else: - sortorder = Gtk.SortType.DESCENDING - - self._liststore.set_sort_column_id(prefs['lib sort key'], sortorder) - - def _sort_changed(self, old, current): - ''' Called whenever the sorting options changed. ''' - name = current.get_name() - if name == 'by name': - prefs['lib sort key'] = constants.SORT_NAME - elif name == 'by path': - prefs['lib sort key'] = constants.SORT_PATH - elif name == 'by size': - prefs['lib sort key'] = constants.SORT_SIZE - elif name == 'by date added': - prefs['lib sort key'] = constants.SORT_LAST_MODIFIED - - if name == 'ascending': - prefs['lib sort order'] = constants.SORT_ASCENDING - elif name == 'descending': - prefs['lib sort order'] = constants.SORT_DESCENDING - - self.set_sort_order() - - def _sort_by_name(self, treemodel, iter1, iter2, user_data): - ''' Compares two books based on their file name without the - path component. ''' - path1 = self._liststore.get_value(iter1, 2) - path2 = self._liststore.get_value(iter2, 2) - - # Catch None values from liststore - if path1 is None: - return 1 - elif path2 is None: - return -1 - - name1 = os.path.split(path1)[1].lower() - name2 = os.path.split(path2)[1].lower() - - return tools.alphanumeric_compare(name1, name2) - - def _sort_by_path(self, treemodel, iter1, iter2, user_data): - ''' Compares two books based on their full path, in natural order. ''' - path1 = self._liststore.get_value(iter1, 2) - path2 = self._liststore.get_value(iter2, 2) - return tools.alphanumeric_compare(path1, path2) - - def _book_size_changed(self, old, current): - ''' Called when library cover size changes. ''' - old_size = prefs['library cover size'] - name = current.get_name() - if name == 'huge': - prefs['library cover size'] = constants.SIZE_HUGE - elif name == 'large': - prefs['library cover size'] = constants.SIZE_LARGE - elif name == 'normal': - prefs['library cover size'] = constants.SIZE_NORMAL - elif name == 'small': - prefs['library cover size'] = constants.SIZE_SMALL - elif name == 'tiny': - prefs['library cover size'] = constants.SIZE_TINY - elif name == 'custom': - dialog = message_dialog.MessageDialog( - self._library, - flags=Gtk.DialogFlags.DESTROY_WITH_PARENT, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.OK) - dialog.set_auto_destroy(False) - dialog.set_text(_('Set library cover size')) - - # Add adjustment scale - adjustment = Gtk.Adjustment(value=prefs['library cover size'], lower=20, - upper=constants.MAX_LIBRARY_COVER_SIZE, - step_increment=10, page_increment=25) - cover_size_scale = Gtk.HScale(adjustment=adjustment) - cover_size_scale.set_size_request(200, -1) - cover_size_scale.set_digits(0) - cover_size_scale.set_draw_value(True) - cover_size_scale.set_value_pos(Gtk.PositionType.LEFT) - for mark in (constants.SIZE_HUGE, constants.SIZE_LARGE, - constants.SIZE_NORMAL, constants.SIZE_SMALL, - constants.SIZE_TINY): - cover_size_scale.add_mark(mark, Gtk.PositionType.TOP, None) - - dialog.get_message_area().pack_end(cover_size_scale, True, True, 0) - response = dialog.run() - size = int(adjustment.get_value()) - dialog.destroy() - - if response == Gtk.ResponseType.OK: - prefs['library cover size'] = size - - if prefs['library cover size'] != old_size: - self._cache.clear() - collection = self._library.collection_area.get_current_collection() - GLib.idle_add(self.display_covers, collection) - - def _pixbuf_size(self, border_size=_BORDER_SIZE): - # Don't forget the extra pixels for the border! - # The ratio (0.67) is just above the normal aspect ratio for books. - return (int(0.67 * prefs['library cover size']) + 2 * border_size, - prefs['library cover size'] + 2 * border_size) - - def _get_pixbuf(self, uid): - ''' Get or create the thumbnail for the selected book . ''' - assert isinstance(uid, int) - book = self._library.backend.get_book_by_id(uid) - pixbuf = self._cache.get(book.path) - if pixbuf is None: - width, height = self._pixbuf_size(border_size=0) - # cover thumbnail of book - cover = self._library.backend.get_book_thumbnail(book.path) - if not cover: - cover = image_tools.MISSING_IMAGE_ICON - cover = image_tools.fit_in_rectangle( - cover, width - 2, height - 2, scale_up=True) - cover = image_tools.add_border(cover, 1, 0xFFFFFFFF) - src_width, src_height = cover.get_width(), cover.get_height() - # icon background of book - pixbuf = GdkPixbuf.Pixbuf.new( - GdkPixbuf.Colorspace.RGB, True, 8, width, height) - pixbuf.fill(0x00000000) # full transparency - offset_x = (width - src_width) // 2 - offset_y = (height - src_height) // 2 - cover.copy_area(0, 0, src_width, src_height, - pixbuf, offset_x, offset_y) - self._cache.add(book.path, pixbuf) - - # Display indicator of having finished reading the book. - # This information isn't cached in the pixbuf cache - # as it changes frequently. - - # Anything smaller than 50px means that the status icon will not fit - if prefs['library cover size'] < 50: - return pixbuf - - last_read_page = book.get_last_read_page() - if last_read_page is None or last_read_page != book.pages: - return pixbuf - - # Composite icon on the lower right corner of the book cover pixbuf. - book_pixbuf = self.render_icon(Gtk.STOCK_APPLY, Gtk.IconSize.LARGE_TOOLBAR) - translation_x = pixbuf.get_width() - book_pixbuf.get_width() - 1 - translation_y = pixbuf.get_height() - book_pixbuf.get_height() - 1 - book_pixbuf.composite(pixbuf, translation_x, translation_y, - book_pixbuf.get_width(), book_pixbuf.get_height(), - translation_x, translation_y, - 1.0, 1.0, GdkPixbuf.InterpType.NEAREST, 0xFF) - - return pixbuf - - def _get_empty_thumbnail(self): - ''' Create an empty filler pixmap. ''' - width, height = self._pixbuf_size() - pixbuf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=True, - bits_per_sample=8, - width=width, height=height) - - # Make the pixbuf transparent. - pixbuf.fill(0) - - return pixbuf - - def _book_activated(self, iconview, paths, keep_library_open=False): - '''Open the book at the (liststore) .''' - if not isinstance(paths, list): - paths = [paths] - - if not keep_library_open: - # Necessary to prevent a deadlock at exit when trying to "join" the - # worker thread. - self.stop_update() - books = [self.get_book_at_path(path) for path in paths] - self._library.open_book(books, keep_library_open=keep_library_open) - - def _selection_changed(self, iconview): - '''Update the displayed info in the _ControlArea when a new book - is selected. - ''' - selected = iconview.get_selected_items() - self._library.control_area.update_info(selected) - - def _remove_books_from_collection(self, *args): - '''Remove the currently selected books from the current collection, - and thus also from the _BookArea. - ''' - collection = self._library.collection_area.get_current_collection() - if collection == _COLLECTION_ALL: - return - selected = self._iconview.get_selected_items() - self._library.backend.begin_transaction() - for path in selected: - book = self.get_book_at_path(path) - self._library.backend.remove_book_from_collection(book, collection) - self.remove_book_at_path(path) - self._library.backend.end_transaction() - - coll_name = self._library.backend.get_collection_name(collection) - message = i18n.get_translation().ngettext( - 'Removed %(num)d book from "%(collection)s".', - 'Removed %(num)d books from "%(collection)s".', - len(selected)) - self._library.set_status_message( - message % {'num': len(selected), 'collection': coll_name}) - - def _remove_books_from_library(self, *args): - '''Remove the currently selected books from the library, and thus - also from the _BookArea. - ''' - - selected = self._iconview.get_selected_items() - self._library.backend.begin_transaction() - - for path in selected: - book = self.get_book_at_path(path) - self._library.backend.remove_book(book) - self.remove_book_at_path(path) - - self._library.backend.end_transaction() - - msg = i18n.get_translation().ngettext( - 'Removed %d book from the library.', - 'Removed %d books from the library.', - len(selected)) - self._library.set_status_message(msg % len(selected)) - - def _copy_selected_cover(self, *args): - ''' Copies the currently selected item's path to clipboard. ''' - paths = self._iconview.get_selected_items() - if len(paths) == 1: - model = self._iconview.get_model() - iter = model.get_iter(paths[0]) - cover_pixbuf = model.get_value(iter, 0) - - self._library._window.clipboard.copy_cover(cover_pixbuf) - - def _copy_selected_path(self, *args): - ''' Copies the currently selected item to clipboard. ''' - model = self._iconview.get_model() - - self._library._window.clipboard.copy_book_path( - '\n'.join(os.path.abspath(model.get_value(model.get_iter(item), 2)) - for item in self._iconview.get_selected_items())) - - def _button_press(self, iconview, event): - '''Handle mouse button presses on the _BookArea.''' - path = iconview.get_path_at_pos(int(event.x), int(event.y)) - - if event.button == 3: - if path and not iconview.path_is_selected(path): - iconview.unselect_all() - iconview.select_path(path) - - self._popup_book_menu() - - def _popup_book_menu(self): - ''' Shows the book panel popup menu. ''' - - selected = self._iconview.get_selected_items() - books_selected = len(selected) > 0 - collection = self._library.collection_area.get_current_collection() - is_collection_all = collection == _COLLECTION_ALL - - for action in ('open', 'open keep library', 'remove from library'): - self._set_sensitive(action, books_selected) - - self._set_sensitive('_title', False) - self._set_sensitive('add', collection is not None) - self._set_sensitive('remove from collection', books_selected and not is_collection_all) - self._set_sensitive('copy path to clipboard', books_selected) - self._set_sensitive('copy cover to clipboard', len(selected) == 1) - - menu = self._ui_manager.get_widget('/library books') - menu.popup(None, None, None, None, 3, Gtk.get_current_event_time()) - - def _set_sensitive(self, action, sensitive): - ''' Enables the popup menu action based on . ''' - - control = self._ui_manager.get_action('/library books/' + action) - control.set_sensitive(sensitive) - - def _key_press(self, iconview, event): - '''Handle key presses on the _BookArea.''' - if event.keyval == Gdk.KEY_Delete: - self._remove_books_from_collection() - - def _popup_menu(self, iconview): - ''' Called when the menu key is pressed to open the popup menu. ''' - self._popup_book_menu() - return True - - def _drag_begin(self, iconview, context): - '''Create a cursor image for drag-n-drop from the library. - - This method relies on implementation details regarding PIL's - drawing functions and default font to produce good looking results. - If those are changed in a future release of PIL, this method might - produce bad looking output (e.g. non-centered text). - - It's also used with connect_after() to overwrite the cursor - automatically created when using enable_model_drag_source(), so in - essence it's a hack, but at least it works. - ''' - icon_path = iconview.get_cursor()[1] - num_books = len(iconview.get_selected_items()) - book = self.get_book_at_path(icon_path) - - cover = self._library.backend.get_book_cover(book) - if cover is None: - cover = image_tools.MISSING_IMAGE_ICON - - cover = cover.scale_simple(max(0, cover.get_width() // 2), - max(0, cover.get_height() // 2), prefs['scaling quality']) - cover = image_tools.add_border(cover, 1, 0xFFFFFFFF) - cover = image_tools.add_border(cover, 1) - - if num_books > 1: - cover_width = cover.get_width() - cover_height = cover.get_height() - pointer = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=True, bits_per_sample=8, - width=max(30, cover_width + 15), - height=max(30, cover_height + 10)) - pointer.fill(0x00000000) - cover.composite(pointer, 0, 0, cover_width, cover_height, 0, 0, - 1, 1, prefs['scaling quality'], 255) - im = Image.new('RGBA', (30, 30), 0x00000000) - draw = ImageDraw.Draw(im) - draw.polygon( - (8, 0, 20, 0, 28, 8, 28, 20, 20, 28, 8, 28, 0, 20, 0, 8), - fill=(0, 0, 0), outline=(0, 0, 0)) - draw.polygon( - (8, 1, 20, 1, 27, 8, 27, 20, 20, 27, 8, 27, 1, 20, 1, 8), - fill=(128, 0, 0), outline=(255, 255, 255)) - text = str(num_books) - draw.text((15 - (6 * len(text) // 2), 9), text, - fill=(255, 255, 255)) - circle = image_tools.pil_to_pixbuf(im) - circle.composite( - pointer, max(0, cover_width - 15), - max(0, cover_height - 20), 30, 30, max(0, cover_width - 15), - max(0, cover_height - 20), 1, 1, prefs['scaling quality'], 255) - else: - pointer = cover - - Gtk.drag_set_icon_pixbuf(context, pointer, -5, -5) - - def _drag_data_get(self, iconview, context, selection, *args): - '''Fill the SelectionData with (iconview) paths for the dragged books - formatted as a string with each path separated by a comma. - ''' - paths = iconview.get_selected_items() - text = ','.join([str(path[0]) for path in paths]) - - #FIXME - #tmp workaround for GTK bug, 2018 - #sending as bytearray instead of text - #see also _drag_data_received in collection_area - - selection.set(selection.get_target(), -1, text.encode()) - #selection.set_text(text, -1) - - def _drag_data_received(self, widget, context, x, y, data, *args): - '''Handle drag-n-drop events ending on the book area (i.e. from - external apps like the file manager). - ''' - uris = data.get_uris() - if not uris: - return - - uris = [portability.normalize_uri(uri) for uri in uris] - paths = [urllib.request.url2pathname(uri) for uri in uris] - - collection = self._library.collection_area.get_current_collection() - collection_name = self._library.backend.get_collection_name(collection) - self._library.add_books(paths, collection_name) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/collection_area.py mcomix-2.1.0/mcomix/mcomix/library/collection_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/collection_area.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/collection_area.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,476 +0,0 @@ -'''library_collection_area.py - Comic book library window that displays the collections.''' - -from xml.sax.saxutils import escape as xmlescape -from gi.repository import Gdk, GdkPixbuf, Gtk, GLib - -from mcomix.preferences import prefs -from mcomix import constants -from mcomix import i18n -from mcomix import status -from mcomix import file_chooser_library_dialog -from mcomix import message_dialog - -_dialog = None -# The "All books" collection is not a real collection stored in the library, -# but is represented by this ID in the library's TreeModels. -_COLLECTION_ALL = -1 -_COLLECTION_RECENT = -2 - -class _CollectionArea(Gtk.ScrolledWindow): - - '''The _CollectionArea is the sidebar area in the library where - different collections are displayed in a tree. - ''' - - def __init__(self, library): - super(_CollectionArea, self).__init__() - self._library = library - self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - - self._treestore = Gtk.TreeStore(str, int) # (Name, ID) of collections. - self._treeview = Gtk.TreeView(model=self._treestore) - self._treeview.connect('cursor_changed', self._collection_selected) - self._treeview.connect('drag_data_received', self._drag_data_received) - self._treeview.connect('drag_motion', self._drag_motion) - self._treeview.connect_after('drag_begin', self._drag_begin) - self._treeview.connect('button_press_event', self._button_press) - self._treeview.connect('key_press_event', self._key_press) - self._treeview.connect('popup_menu', self._popup_menu) - self._treeview.connect('row_activated', self._expand_or_collapse_row) - self._treeview.set_headers_visible(False) - self._set_acceptable_drop(True) - self._treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, - [('collection', Gtk.TargetFlags.SAME_WIDGET, - constants.LIBRARY_DRAG_COLLECTION_ID)], - Gdk.DragAction.MOVE) - - cellrenderer = Gtk.CellRendererText() - column = Gtk.TreeViewColumn(None, cellrenderer, markup=0) - self._treeview.append_column(column) - self.add(self._treeview) - - self._ui_manager = Gtk.UIManager() - self._tooltipstatus = status.TooltipStatusHelper(self._ui_manager, - self._library.get_status_bar()) - ui_description = ''' - - - - - - - - - - - - - - - ''' - self._ui_manager.add_ui_from_string(ui_description) - actiongroup = Gtk.ActionGroup(name='mcomix-library-collection-area') - actiongroup.add_actions([ - ('_title', None, _('Library collections'), None, None, - lambda *args: False), - ('add', Gtk.STOCK_ADD, _('_Add...'), None, - _('Add more books to the library.'), - lambda *args: file_chooser_library_dialog.open_library_filechooser_dialog(self._library)), - ('new', Gtk.STOCK_NEW, _('New'), None, - _('Add a new empty collection.'), - self.add_collection), - ('rename', Gtk.STOCK_EDIT, _('Re_name'), None, - _('Renames the selected collection.'), - self._rename_collection), - ('duplicate', Gtk.STOCK_COPY, _('_Duplicate'), None, - _('Creates a duplicate of the selected collection.'), - self._duplicate_collection), - ('cleanup', Gtk.STOCK_CLEAR, _('_Clean up'), None, - _('Removes no longer existant books from the collection.'), - self._clean_collection), - ('remove', Gtk.STOCK_REMOVE, _('_Remove'), None, - _('Deletes the selected collection.'), - self._remove_collection)]) - self._ui_manager.insert_action_group(actiongroup, 0) - - self.display_collections() - - def get_current_collection(self): - '''Return the collection ID for the currently selected collection, - or None if no collection is selected. - ''' - treepath, focuspath = self._treeview.get_cursor() - if treepath is not None: - return self._get_collection_at_path(treepath) - else: - return None - - def display_collections(self): - '''Display the library collections by redrawing them from the - backend data. Should be called on startup or when the collections - hierarchy has been changed (e.g. after moving, adding, renaming). - Any row that was expanded before the call will have it's - corresponding new row also expanded after the call. - ''' - - def _recursive_add(parent_iter, supercoll): - for coll in self._library.backend.get_collections_in_collection( - supercoll): - name = self._library.backend.get_collection_name(coll) - child_iter = self._treestore.append(parent_iter, - [xmlescape(name), coll]) - _recursive_add(child_iter, coll) - - def _expand_and_select(treestore, path, iterator): - collection = treestore.get_value(iterator, 1) - if collection == prefs['last library collection']: - # Reset to trigger update of book area. - prefs['last library collection'] = None - self._treeview.expand_to_path(path) - self._treeview.set_cursor(path) - elif collection in expanded_collections: - self._treeview.expand_to_path(path) - - def _expanded_rows_accumulator(treeview, path): - collection = self._get_collection_at_path(path) - expanded_collections.append(collection) - - expanded_collections = [] - self._treeview.map_expanded_rows(_expanded_rows_accumulator) - self._treestore.clear() - self._treestore.append(None, ['%s' % xmlescape(_('All books')), - _COLLECTION_ALL]) - _recursive_add(None, None) - self._treestore.foreach(_expand_and_select) - - def add_collection(self, *args): - '''Add a new collection to the library, through a dialog.''' - add_dialog = message_dialog.MessageDialog( - self._library, - flags=0, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.OK_CANCEL) - add_dialog.set_auto_destroy(False) - add_dialog.set_default_response(Gtk.ResponseType.OK) - add_dialog.set_text( - _('Add new collection?'), - _('Please enter a name for the new collection.') - ) - - box = Gtk.HBox() # To get nice line-ups with the padding. - add_dialog.vbox.pack_start(box, True, True, 0) - entry = Gtk.Entry() - entry.set_activates_default(True) - box.pack_start(entry, True, True, 6) - box.show_all() - - response = add_dialog.run() - name = entry.get_text() - add_dialog.destroy() - if response == Gtk.ResponseType.OK and name: - if self._library.backend.add_collection(name): - collection = self._library.backend.get_collection_by_name(name) - prefs['last library collection'] = collection.id - self._library.collection_area.display_collections() - else: - message = _('Could not add a new collection called "%s".') % (name) - if (self._library.backend.get_collection_by_name(name) - is not None): - message = '%s %s' % (message, - _('A collection by that name already exists.')) - self._library.set_status_message(message) - - def clean_collection(self, collection): - ''' Check all books in the collection, removing those that - no longer exist. If C{collection} is None, the whole library - will be cleaned. ''' - - removed = self._library.backend.clean_collection(collection) - - msg = i18n.get_translation().ngettext( - 'Removed %d book from the library.', - 'Removed %d books from the library.', - removed) - self._library.set_status_message(msg % removed) - - if removed > 0: - collection = self._library.collection_area.get_current_collection() - GLib.idle_add(self._library.book_area.display_covers, collection) - - def _get_collection_at_path(self, path): - '''Return the collection ID of the collection at the (TreeView) - . - ''' - iterator = self._treestore.get_iter(path) - return self._treestore.get_value(iterator, 1) - - def _collection_selected(self, treeview): - '''Change the viewed collection (in the _BookArea) to the - currently selected one in the sidebar, if it has been changed. - ''' - collection = self.get_current_collection() - if (collection is None or - collection == prefs['last library collection']): - return - prefs['last library collection'] = collection - GLib.idle_add(self._library.book_area.display_covers, collection) - - def _clean_collection(self, *args): - ''' Menu item hook to clean a collection. ''' - - collection = self.get_current_collection() - - # The backend expects _COLLECTION_ALL to be passed as None - if collection == _COLLECTION_ALL: - collection = None - - self.clean_collection(collection) - - def _remove_collection(self, action=None): - '''Remove the currently selected collection from the library.''' - collection = self.get_current_collection() - - if collection not in (_COLLECTION_ALL, _COLLECTION_RECENT): - self._library.backend.remove_collection(collection) - prefs['last library collection'] = _COLLECTION_ALL - self.display_collections() - - def _rename_collection(self, action): - '''Rename the currently selected collection, using a dialog.''' - collection = self.get_current_collection() - try: - old_name = self._library.backend.get_collection_name(collection) - except Exception: - return - rename_dialog = message_dialog.MessageDialog( - self._library, - flags=0, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.OK_CANCEL) - rename_dialog.set_auto_destroy(False) - rename_dialog.set_text( - _('Rename collection?'), - _('Please enter a new name for the selected collection.') - ) - rename_dialog.set_default_response(Gtk.ResponseType.OK) - - box = Gtk.HBox() # To get nice line-ups with the padding. - rename_dialog.vbox.pack_start(box, True, True, 0) - entry = Gtk.Entry() - entry.set_text(old_name) - entry.set_activates_default(True) - box.pack_start(entry, True, True, 6) - box.show_all() - - response = rename_dialog.run() - new_name = entry.get_text() - rename_dialog.destroy() - if response == Gtk.ResponseType.OK and new_name: - if self._library.backend.rename_collection(collection, new_name): - self.display_collections() - else: - message = _('Could not change the name to "%s".') % new_name - if (self._library.backend.get_collection_by_name(new_name) - is not None): - message = '%s %s' % (message, - _('A collection by that name already exists.')) - self._library.set_status_message(message) - - def _duplicate_collection(self, action): - '''Duplicate the currently selected collection.''' - collection = self.get_current_collection() - if self._library.backend.duplicate_collection(collection): - self.display_collections() - else: - self._library.set_status_message( - _('Could not duplicate collection.')) - - def _button_press(self, treeview, event): - '''Handle mouse button presses on the _CollectionArea.''' - - if event.button == 3: - row = treeview.get_path_at_pos(int(event.x), int(event.y)) - if row: - path, column, x, y = row - collection = self._get_collection_at_path(path) - else: - collection = None - - self._popup_collection_menu(collection) - - def _popup_menu(self, treeview): - ''' Called to open the control's popup menu via - keyboard controls. ''' - - model, iter = treeview.get_selection().get_selected() - if iter is not None: - book_path = model.get_path(iter)[0] - collection = self._get_collection_at_path(book_path) - else: - collection = None - - self._popup_collection_menu(collection) - return True - - def _popup_collection_menu(self, collection): - ''' Show the library collection popup. Depending on the - value of C{collection}, menu items will be disabled or enabled. ''' - - is_collection_all = collection in (_COLLECTION_ALL, _COLLECTION_RECENT) - - for path in ('rename', 'duplicate', 'remove'): - control = self._ui_manager.get_action( - '/library collections/' + path) - control.set_sensitive(collection is not None and - not is_collection_all) - - self._ui_manager.get_action('/library collections/add').set_sensitive(collection is not None) - self._ui_manager.get_action('/library collections/cleanup').set_sensitive(collection is not None) - self._ui_manager.get_action('/library collections/_title').set_sensitive(False) - - menu = self._ui_manager.get_widget('/library collections') - menu.popup(None, None, None, None, 3, Gtk.get_current_event_time()) - - def _key_press(self, treeview, event): - '''Handle key presses on the _CollectionArea.''' - if event.keyval == Gdk.KEY_Delete: - self._remove_collection() - - def _expand_or_collapse_row(self, treeview, path, column): - '''Expand or collapse the activated row.''' - if treeview.row_expanded(path): - treeview.collapse_row(path) - else: - treeview.expand_to_path(path) - - def _drag_data_received(self, treeview, context, x, y, selection, drag_id, - eventtime): - '''Move books dragged from the _BookArea to the target collection, - or move some collection into another collection. - ''' - self._library.set_status_message('') - drop_row = treeview.get_dest_row_at_pos(x, y) - if drop_row is None: # Drop "after" the last row. - dest_path, pos = ((len(self._treestore) - 1,), - Gtk.TreeViewDropPosition.AFTER) - else: - dest_path, pos = drop_row - src_collection = self.get_current_collection() - dest_collection = self._get_collection_at_path(dest_path) - if drag_id == constants.LIBRARY_DRAG_COLLECTION_ID: - if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): - dest_collection = self._library.backend.get_supercollection( - dest_collection) - self._library.backend.add_collection_to_collection( - src_collection, dest_collection) - self.display_collections() - elif drag_id == constants.LIBRARY_DRAG_BOOK_ID: - - #FIXME - #tmp workaround for GTK bug, 2018 - #see also _drag_data_get in book_area - #receaving as bytearray instead of text - for path_str in selection.get_data().decode().split(','): # IconView path - #for path_str in selection.get_text().split(','): # IconView path - book = self._library.book_area.get_book_at_path(int(path_str)) - self._library.backend.add_book_to_collection(book, - dest_collection) - if src_collection != _COLLECTION_ALL: - self._library.backend.remove_book_from_collection(book, - src_collection) - self._library.book_area.remove_book_at_path(int(path_str)) - - def _drag_motion(self, treeview, context, x, y, *args): - '''Set the library statusbar text when hovering a drag-n-drop over - a collection (either books or from the collection area itself). - Also set the TreeView to accept drops only when we are hovering over - a valid drop position for the current drop type. - - This isn't pretty, but the details of treeviews and drag-n-drops - are not pretty to begin with. - ''' - drop_row = treeview.get_dest_row_at_pos(x, y) - src_collection = self.get_current_collection() - # Why isn't the drag ID passed along with drag-motion events? - if Gtk.drag_get_source_widget(context) is self._treeview: # Moving collection. - model, src_iter = treeview.get_selection().get_selected() - if drop_row is None: # Drop "after" the last row. - dest_path, pos = (len(model) - 1,), Gtk.TreeViewDropPosition.AFTER - else: - dest_path, pos = drop_row - dest_iter = model.get_iter(dest_path) - if model.is_ancestor(src_iter, dest_iter): # No cycles! - self._set_acceptable_drop(False) - self._library.set_status_message('') - return - dest_collection = self._get_collection_at_path(dest_path) - if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): - dest_collection = self._library.backend.get_supercollection( - dest_collection) - if (_COLLECTION_ALL in (src_collection, dest_collection) or - _COLLECTION_RECENT in (src_collection, dest_collection) or - src_collection == dest_collection): - self._set_acceptable_drop(False) - self._library.set_status_message('') - return - src_name = self._library.backend.get_collection_name( - src_collection) - if dest_collection is None: - dest_name = _('Root') - else: - dest_name = self._library.backend.get_collection_name( - dest_collection) - message = (_('Put the collection "%(subcollection)s" in the collection "%(supercollection)s".') % - {'subcollection': src_name, 'supercollection': dest_name}) - else: # Moving book(s). - if drop_row is None: - self._set_acceptable_drop(False) - self._library.set_status_message('') - return - dest_path, pos = drop_row - if pos in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER): - self._set_acceptable_drop(False) - self._library.set_status_message('') - return - dest_collection = self._get_collection_at_path(dest_path) - if (src_collection == dest_collection or - dest_collection == _COLLECTION_ALL): - self._set_acceptable_drop(False) - self._library.set_status_message('') - return - dest_name = self._library.backend.get_collection_name( - dest_collection) - if src_collection == _COLLECTION_ALL: - message = _('Add books to "%s".') % dest_name - else: - src_name = self._library.backend.get_collection_name( - src_collection) - message = (_('Move books from "%(source collection)s" to "%(destination collection)s".') % - {'source collection': src_name, - 'destination collection': dest_name}) - self._set_acceptable_drop(True) - self._library.set_status_message(message) - - def _set_acceptable_drop(self, acceptable): - '''Set the TreeView to accept drops if is True.''' - if acceptable: - self._treeview.enable_model_drag_dest( - [('book', Gtk.TargetFlags.SAME_APP, constants.LIBRARY_DRAG_BOOK_ID), - ('collection', Gtk.TargetFlags.SAME_WIDGET, constants.LIBRARY_DRAG_COLLECTION_ID)], - Gdk.DragAction.MOVE) - else: - self._treeview.enable_model_drag_dest([], Gdk.DragAction.MOVE) - - def _drag_begin(self, treeview, context): - '''Create a cursor image for drag-n-drop of collections. We use the - default one (i.e. the row with text), but put the hotspot in the - top left corner so that one can actually see where one is dropping, - which unfortunately isn't the default case. - ''' - path = treeview.get_cursor()[0] - surface = treeview.create_row_drag_icon(path) - width, height = surface.get_width(), surface.get_height() - pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) - Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/control_area.py mcomix-2.1.0/mcomix/mcomix/library/control_area.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/control_area.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/control_area.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,172 +0,0 @@ -'''library_control_area.py - The window in the library that contains buttons -and displays info.''' - -import os -from gi.repository import Gtk -from gi.repository import GLib -from gi.repository import Pango - -from mcomix import i18n -from mcomix import labels -from mcomix.library.watchlist import WatchListDialog - -# The "All books" collection is not a real collection stored in the library, -# but is represented by this ID in the library's TreeModels. -_COLLECTION_ALL = -1 - - -class _ControlArea(Gtk.HBox): - - '''The _ControlArea is the bottom area of the library window where - information is displayed and controls such as buttons reside. - ''' - - def __init__(self, library): - super(_ControlArea, self).__init__(homogeneous=False, spacing=12) - - self._library = library - self.set_border_width(10) - - borderbox = Gtk.Frame() - borderbox.set_shadow_type(Gtk.ShadowType.ETCHED_IN) - borderbox.set_size_request(350, -1) - - insidebox = Gtk.EventBox() - insidebox.set_border_width(1) - insidebox.set_state(Gtk.StateType.ACTIVE) - - infobox = Gtk.VBox(homogeneous=False, spacing=5) - infobox.set_border_width(10) - self.pack_start(borderbox, True, True, 0) - borderbox.add(insidebox) - insidebox.add(infobox) - - self._namelabel = labels.BoldLabel() - self._namelabel.set_alignment(0, 0.5) - self._namelabel.set_selectable(True) - self._namelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - infobox.pack_start(self._namelabel, False, False, 0) - - self._filelabel = Gtk.Label() - self._filelabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - self._filelabel.set_alignment(0, 0.5) - infobox.pack_start(self._filelabel, False, False, 0) - - self._dirlabel = Gtk.Label() - self._dirlabel.set_ellipsize(Pango.EllipsizeMode.MIDDLE) - self._dirlabel.set_alignment(0, 0.5) - self._dirlabel.set_selectable(True) - infobox.pack_start(self._dirlabel, False, False, 0) - - vbox = Gtk.VBox(homogeneous=False, spacing=10) - vbox.set_size_request(350, -1) - self.pack_start(vbox, False, False, 0) - - # First line of controls, containing the search box - hbox = Gtk.HBox(homogeneous=False) - vbox.pack_start(hbox, True, True, 0) - - label = Gtk.Label(label=_('_Search:')) - label.set_use_underline(True) - hbox.pack_start(label, False, False, 0) - search_entry = Gtk.Entry() - search_entry.connect('activate', self._filter_books) - search_entry.set_tooltip_text( - _('Display only those books that have the specified text string ' - 'in their full path. The search is not case sensitive.')) - hbox.pack_start(search_entry, True, True, 6) - label.set_mnemonic_widget(search_entry) - - # Last line of controls, containing buttons like 'Open' - hbox = Gtk.HBox(homogeneous=False, spacing=10) - vbox.pack_end(hbox, True, True, 0) - - watchlist_button = Gtk.Button(label=_('_Watch list'), use_underline=True) - watchlist_button.set_always_show_image(True) - watchlist_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.BUTTON)) - watchlist_button.set_image_position(Gtk.PositionType.LEFT) - watchlist_button.connect('clicked', - lambda *args: WatchListDialog(self._library)) - watchlist_button.set_tooltip_text( - _('Open the watchlist management dialog.')) - hbox.pack_start(watchlist_button, True, True, 0) - - self._open_button = Gtk.Button(label=_('_Open list'), use_underline=True) - self._open_button.set_always_show_image(True) - self._open_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON)) - self._open_button.set_image_position(Gtk.PositionType.LEFT) - self._open_button.connect('clicked', - self._library.book_area.open_selected_book) - self._open_button.set_tooltip_text(_('Open the selected book.')) - self._open_button.set_sensitive(False) - hbox.pack_end(self._open_button, True, True, 0) - - def update_info(self, selected): - '''Update the info box using the currently books from - the _BookArea. - ''' - - if selected: - book_id = self._library.book_area.get_book_at_path(selected[0]) - book = self._library.backend.get_book_by_id(book_id) - else: - book = None - - if book: - name = book.name - dir_path = os.path.dirname(book.path) - pages = book.pages - size = book.size - last_page = book.get_last_read_page() - last_date = book.get_last_read_date() - else: - name = dir_path = pages = size = last_page = last_date = None - - if len(selected) > 0: - self._open_button.set_sensitive(True) - else: - self._open_button.set_sensitive(False) - - if name is not None: - self._namelabel.set_text(i18n.to_unicode(name)) - self._namelabel.set_tooltip_text(i18n.to_unicode(name)) - else: - self._namelabel.set_text('') - self._namelabel.set_has_tooltip(False) - - infotext = [] - - if last_page is not None and pages is not None and last_page != pages: - infotext.append('%s %d/%d' % (_('Page'), last_page, pages)) - elif pages is not None: - infotext.append(_('%d pages') % pages) - - if size is not None: - infotext.append('%.1f MiB' % (size / 1048576.0)) - - if (pages is not None and last_page is not None and - last_date is not None and last_page == pages): - infotext.append(_('Finished reading on %(date)s, %(time)s') % { - 'date': last_date.strftime('%x'), - 'time': last_date.strftime('%X'), - }) - - self._filelabel.set_text(', '.join(infotext)) - - if dir_path is not None: - self._dirlabel.set_text(i18n.to_unicode(dir_path)) - else: - self._dirlabel.set_text('') - - def _filter_books(self, entry, *args): - '''Display only the books in the current collection whose paths - contain the string in the Gtk.Entry. The string is not - case-sensitive. - ''' - self._library.filter_string = entry.get_text() - if not self._library.filter_string: - self._library.filter_string = None - collection = self._library.collection_area.get_current_collection() - GLib.idle_add(self._library.book_area.display_covers, collection) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/main_dialog.py mcomix-2.1.0/mcomix/mcomix/library/main_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/main_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/main_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -'''library_main_dialog.py - The library dialog window.''' - -import os -from gi.repository import Gdk, Gtk - -from mcomix.preferences import prefs -from mcomix import i18n -from mcomix import tools -from mcomix import log -from mcomix import file_chooser_library_dialog -from mcomix import status -from mcomix.library import backend as library_backend -from mcomix.library import book_area as library_book_area -from mcomix.library import collection_area as library_collection_area -from mcomix.library import control_area as library_control_area -from mcomix.library import add_progress_dialog as library_add_progress_dialog - -_dialog = None -# The "All books" collection is not a real collection stored in the library, -# but is represented by this ID in the library's TreeModels. -_COLLECTION_ALL = -1 - -class _LibraryDialog(Gtk.Window): - - '''The library window. Automatically creates and uses a new - library_backend.LibraryBackend when opened. - ''' - - def __init__(self, window, file_handler): - super(_LibraryDialog, self).__init__(type=Gtk.WindowType.TOPLEVEL) - - self._window = window - - self.resize(prefs['lib window width'], prefs['lib window height']) - self.set_title(_('Library')) - self.connect('delete_event', self.close) - self.connect('key-press-event', self._key_press_event) - - self.filter_string = None - self._file_handler = file_handler - self._statusbar = Gtk.Statusbar() - self.backend = library_backend.LibraryBackend() - self.book_area = library_book_area._BookArea(self) - self.control_area = library_control_area._ControlArea(self) - self.collection_area = library_collection_area._CollectionArea(self) - - self.backend.watchlist.new_files_found += self._new_files_found - - table = Gtk.Table(n_rows=2, n_columns=2, homogeneous=False) - table.attach(self.collection_area, 0, 1, 0, 1, Gtk.AttachOptions.FILL, - Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL) - table.attach(self.book_area, 1, 2, 0, 1, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, - Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL) - table.attach(self.control_area, 0, 2, 1, 2, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, - Gtk.AttachOptions.FILL) - - if prefs['show statusbar']: - table.attach(self._statusbar, 0, 2, 2, 3, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL) - - self.add(table) - self.show_all() - self.present() - - def open_book(self, books, keep_library_open=False): - '''Open the book with ID .''' - - paths = [ self.backend.get_book_path(book) for book in books ] - - if not keep_library_open: - self.hide() - - self._window.present() - - if len(paths) > 1: - self._file_handler.open_file(paths) - elif len(paths) == 1: - self._file_handler.open_file(paths[0]) - - def scan_for_new_files(self): - ''' Start scanning for new files from the watch list. ''' - - if len(self.backend.watchlist.get_watchlist()) > 0: - self.set_status_message(_('Scanning for new books...')) - self.backend.watchlist.scan_for_new_files() - - def _new_files_found(self, filelist, watchentry): - ''' Called after the scan for new files finished. ''' - - if len(filelist) > 0: - if watchentry.collection.id is not None: - collection_name = watchentry.collection.name - else: - collection_name = None - - self.add_books(filelist, collection_name) - - if len(filelist) == 1: - message = _('Added new book "%(bookname)s" ' - 'from directory "%(directory)s".') - else: - message = _('Added %(count)d new books ' - 'from directory "%(directory)s".') - - self.set_status_message(message % { - 'directory': watchentry.directory, - 'count': len(filelist), - 'bookname': os.path.basename(filelist[0]), - }) - else: - self.set_status_message( - _('No new books found in directory "%s".') % watchentry.directory) - - def get_status_bar(self): - ''' Returns the window's status bar. ''' - return self._statusbar - - def set_status_message(self, message): - '''Set a specific message on the statusbar, replacing whatever was - there earlier. - ''' - self._statusbar.pop(0) - self._statusbar.push( - 0, - ' ' * status.Statusbar.SPACING + '%s' % i18n.to_unicode(message)) - - def close(self, *args): - '''Close the library and do required cleanup tasks.''' - prefs['lib window width'], prefs['lib window height'] = self.get_size() - self.backend.watchlist.new_files_found -= self._new_files_found - self.book_area.stop_update() - self.book_area.close() - file_chooser_library_dialog.close_library_filechooser_dialog() - _close_dialog() - - def add_books(self, paths, collection_name=None): - '''Add the books at to the library. If - is not None, it is the name of a (new or existing) collection the - books should be put in. - ''' - if collection_name is None: - collection_id = self.collection_area.get_current_collection() - else: - collection = self.backend.get_collection_by_name(collection_name) - - if collection is None: # Collection by that name doesn't exist. - self.backend.add_collection(collection_name) - collection = self.backend.get_collection_by_name( - collection_name) - - collection_id = collection.id - - library_add_progress_dialog._AddLibraryProgressDialog(self, self._window, paths, collection_id) - - if collection_id is not None: - prefs['last library collection'] = collection_id - - def _key_press_event(self, widget, event, *args): - ''' Handle key press events for closing the library on Escape press. ''' - - if event.keyval == Gdk.KEY_Escape: - self.hide() - - -def open_dialog(action, window): - ''' Shows the library window. If sqlite is not available, this method - does nothing and returns False. Otherwise, True is returned. ''' - global _dialog - - if _dialog is None: - - if library_backend.sqlite3 is None: - text = _('! python need sqlite support to use the library.') - window.osd.show(text) - log.error(text) - return False - - else: - _dialog = _LibraryDialog(window, window.filehandler) - - else: - _dialog.present() - - if prefs['scan for new books on library startup']: - _dialog.scan_for_new_files() - - return True - - -def _close_dialog(*args): - global _dialog - - if _dialog is not None: - _dialog.destroy() - _dialog = None - tools.garbage_collect() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/pixbuf_cache.py mcomix-2.1.0/mcomix/mcomix/library/pixbuf_cache.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/pixbuf_cache.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/pixbuf_cache.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -''' pixbuf_cache.py - Caches book covers for the library display.''' - -from collections import OrderedDict -from threading import Lock - -__all__ = ['get_pixbuf_cache'] - -class _PixbufCache(object): - - ''' Pixbuf cache for the library window. Instead of loading book covers - from disk again after switching collection or using filtering, this class - stores a pre-defined amount of pixbufs in memory, evicting older pixbufs - as necessary. - ''' - - def __init__(self, size): - #: Cache size, in images - assert size > 0 - self.cachesize = size - #: Store book id => pixbuf - self._cache = OrderedDict() - #: Ensure thread safety - self._lock = Lock() - - def add(self, path, pixbuf): - ''' Add a pixbuf to cache with path as key. ''' - with self._lock: - if path in self._cache: - return - while len(self._cache) > self.cachesize: - self._cache.popitem(last=False) - self._cache[path] = pixbuf - - def get(self, path): - ''' Return the pixbuf for the given cache path, or None if not exists. ''' - with self._lock: - return self._cache.get(path, None) - - def pop(self, path): - ''' Remove the object with the given cache path. ''' - with self._lock: - self._cache.pop(path, None) - - def clear(self): - ''' Clear all cached objects. ''' - with self._lock: - self._cache.clear() - - -_cache = None - -def get_pixbuf_cache(): - global _cache - - if _cache is None: - # 500 items is about 130 MB of RAM with 500px thumbnails, - # and about 35 MB at 250px. - _cache = _PixbufCache(500) - return _cache - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/watchlist.py mcomix-2.1.0/mcomix/mcomix/library/watchlist.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/library/watchlist.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/library/watchlist.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ -''' Library watch list dialog and backend classes. ''' - -import os -from gi.repository import Gtk -from gi.repository import GLib, GObject - -from mcomix import tools -from mcomix.library import backend_types -from mcomix.preferences import prefs - - -COL_DIRECTORY = 0 -COL_COLLECTION = 0 -COL_COLLECTION_ID = 1 -COL_RECURSIVE = 2 - -class WatchListDialog(Gtk.Dialog): - ''' Dialog for managing watched directories. ''' - - RESPONSE_SCANNOW = 1000 - - def __init__(self, library): - ''' Dialog constructor. - @param library: Dialog parent window, should be library window. - ''' - super(WatchListDialog, self).__init__( - title=_('Library watch list'), modal=True, destroy_with_parent=True - ) - - self.add_buttons( - _('_Scan now'), WatchListDialog.RESPONSE_SCANNOW, - Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE - ) - - #: Stores a reference to the library - self.library = library - #: True if changes were made to the watchlist. Not 100% accurate. - self._changed = False - - self.set_default_response(Gtk.ResponseType.CLOSE) - - # Initialize treeview control showing existing watch directories - self._treeview = Gtk.TreeView(model=self._create_model()) - self._treeview.set_headers_visible(True) - self._treeview.get_selection().connect('changed', self._item_selected_cb) - - dir_renderer = Gtk.CellRendererText() - dir_column = Gtk.TreeViewColumn(_('Directory'), dir_renderer) - dir_column.set_attributes(dir_renderer, text=COL_DIRECTORY) - dir_column.set_expand(True) - self._treeview.append_column(dir_column) - - collection_model = self._create_collection_model() - collection_renderer = Gtk.CellRendererCombo() - collection_renderer.set_property('model', collection_model) - collection_renderer.set_property('text-column', COL_COLLECTION) - collection_renderer.set_property('editable', True) - collection_renderer.set_property('has-entry', False) - collection_renderer.connect('changed', self._collection_changed_cb, collection_model) - collection_column = Gtk.TreeViewColumn(_('Collection'), collection_renderer) - collection_column.set_cell_data_func(collection_renderer, - self._treeview_collection_id_to_name) - self._treeview.append_column(collection_column) - - recursive_renderer = Gtk.CellRendererToggle() - recursive_renderer.set_activatable(True) - recursive_renderer.connect('toggled', self._recursive_changed_cb) - recursive_column = Gtk.TreeViewColumn(_('With subdirectories'), - recursive_renderer) - recursive_column.add_attribute(recursive_renderer, 'active', COL_RECURSIVE) - self._treeview.append_column(recursive_column) - - add_button = Gtk.Button.new_from_stock(Gtk.STOCK_ADD) - add_button.connect('clicked', self._add_cb) - remove_button = Gtk.Button.new_from_stock(Gtk.STOCK_REMOVE) - remove_button.set_sensitive(False) - remove_button.connect('clicked', self._remove_cb) - self._remove_button = remove_button - - button_box = Gtk.VBox() - button_box.pack_start(add_button, False, True, 0) - button_box.pack_start(remove_button, False, True, 2) - - main_box = Gtk.HBox() - scroll_window = Gtk.ScrolledWindow() - scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - scroll_window.add(self._treeview) - main_box.pack_start(scroll_window, True, True, 2) - main_box.pack_end(button_box, False, True, 0) - self.vbox.pack_start(main_box, True, True, 0) - - auto_checkbox = Gtk.CheckButton( - label=_('Automatically scan for new books when library is _opened'), use_underline=True) - auto_checkbox.set_active(prefs['scan for new books on library startup']) - auto_checkbox.connect('toggled', self._auto_scan_toggled_cb) - self.vbox.pack_end(auto_checkbox, False, False, 5) - - self.resize(475, 350) - self.connect('response', self._close_cb) - self.show_all() - - def get_selected_watchlist_entry(self): - ''' Returns the selected watchlist entry, or C{None} if no - item is selected. ''' - selection = self._treeview.get_selection() - - model, iter = selection.get_selected() - if iter is not None: - path = str(model.get_value(iter, COL_DIRECTORY)) - return self.library.backend.watchlist.get_watchlist_entry(path) - else: - return None - - def get_watchlist_entry_for_treepath(self, treepath): - ''' Converts a tree path to WatchlistEntry object. ''' - model = self._treeview.get_model() - iter = model.get_iter(treepath) - dirpath = str(model.get_value(iter, COL_DIRECTORY)) - return self.library.backend.watchlist.get_watchlist_entry(dirpath) - - def _create_model(self): - ''' Creates a model containing all watched directories. ''' - # Watched directory, associated library collection ID - model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT, GObject.TYPE_BOOLEAN) - self._fill_model(model) - return model - - def _fill_model(self, model): - ''' Empties the model's data and updates it from the database. ''' - model.clear() - for entry in self.library.backend.watchlist.get_watchlist(): - if entry.collection.id is None: - id = -1 - else: - id = entry.collection.id - - model.append((entry.directory, id, entry.recursive)) - - def _create_collection_model(self): - ''' Creates a model containing all available collections. ''' - # Collection ID, collection name - model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_INT) - - ids = self.library.backend.get_all_collections() - model.append((backend_types.DefaultCollection.name, -1)) - for id in ids: - model.append((self.library.backend.get_collection_name(id), id)) - - return model - - def _collection_changed_cb(self, column, path, - collection_iter, collection_model, *args): - ''' A new collection was set for a watched directory. ''' - # Get new collection ID from collection model - new_id = collection_model.get_value(collection_iter, COL_COLLECTION_ID) - collection = self.library.backend.get_collection_by_id(new_id) - - # Update database - self.get_watchlist_entry_for_treepath(path).set_collection(collection) - - # Update collection ID in watchlist model - model = self._treeview.get_model() - iter = model.get_iter(path) - # Editing the model in the CellRendererCombo callback stops the editing - # operation, causing GTK warnings. Delay until callback is finished. - GLib.idle_add(model.set_value, iter, COL_COLLECTION_ID, new_id) - - self._changed = True - - def _recursive_changed_cb(self, toggle_renderer, path, *args): - ''' Recursive reading was enabled or disabled. ''' - status = not toggle_renderer.get_active() - self.get_watchlist_entry_for_treepath(path).set_recursive(status) - - # Update recursive status in watchlist model - model = self._treeview.get_model() - iter = model.get_iter(path) - model.set_value(iter, COL_RECURSIVE, status) - - self._changed = True - - def _add_cb(self, button, *args): - ''' Called when a new watch list entry should be added. ''' - filechooser = Gtk.FileChooserDialog( - action=Gtk.FileChooserAction.SELECT_FOLDER - ) - filechooser.set_transient_for(self) - filechooser.add_buttons( - Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, - Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT - ) - result = filechooser.run() - if filechooser.get_filename() is not None: - directory = filechooser.get_filename() - else: - directory = u'' - filechooser.destroy() - directory = tools.relpath2root(directory,abs_fallback=prefs['portable allow abspath']) - if not directory: - # directory is None, means running in portable mode - # and currect path is out of same mount point - # so do not add directory to watchlist - return - - if result == Gtk.ResponseType.ACCEPT \ - and os.path.isdir(directory): - - self.library.backend.watchlist.add_directory(directory) - self._fill_model(self._treeview.get_model()) - - self._changed = True - - def _remove_cb(self, button, *args): - ''' Called when a watch list entry should be removed. ''' - entry = self.get_selected_watchlist_entry() - if entry: - entry.remove() - - # Remove selection from list - selection = self._treeview.get_selection() - model, iter = selection.get_selected() - model.remove(iter) - - def _item_selected_cb(self, selection, *args): - ''' Called when an item is selected. Enables or disables the 'Remove' - button. ''' - self._remove_button.set_sensitive(selection.count_selected_rows() > 0) - - def _auto_scan_toggled_cb(self, checkbox, *args): - ''' Toggles automatic library book scanning. ''' - prefs['scan for new books on library startup'] = checkbox.get_active() - - def _treeview_collection_id_to_name(self, column, cell, model, iter, *args): - ''' Maps a collection ID to the corresponding collection name. ''' - id = model.get_value(iter, COL_COLLECTION_ID) - if id != -1: - text = self.library.backend.get_collection_name(id) - else: - text = backend_types.DefaultCollection.name - - cell.set_property('text', text) - - def _close_cb(self, dialog, response, *args): - ''' Trigger scan for new files after watch dialog closes. ''' - self.destroy() - if response == Gtk.ResponseType.CLOSE and self._changed: - self.library.scan_for_new_files() - elif response == WatchListDialog.RESPONSE_SCANNOW: - self.library.scan_for_new_files() - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/log.py mcomix-2.1.0/mcomix/mcomix/log.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/log.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/log.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- - -''' Logging module for MComix. Provides a logger 'mcomix' with a few -pre-configured settings. Functions in this module are redirected to -this default logger. ''' - -import logging -import sys -import locale -from logging import DEBUG, INFO, WARNING, ERROR - -from mcomix import i18n - -__all__ = ['debug', 'info', 'warning', 'error', 'setLevel', - 'DEBUG', 'INFO', 'WARNING', 'ERROR'] - -levels={ - 'all': DEBUG, - 'debug': DEBUG, - 'info': INFO, - 'warn': WARNING, - 'error': ERROR, -} - -def print_old(*args, **options): - # keep this function for reference only - ''' This function is supposed to replace the standard print statement. - Its prototype follows that of the print() function introduced in Python 2.6: - Prints , with each argument separeted by sep=' ' and ending with - end='\n'. - - It converts any text to the encoding used by STDOUT, and replaces problematic - characters with underscore. Prevents UnicodeEncodeErrors and similar when - using print on non-ASCII strings, on systems not using UTF-8 as default encoding. - ''' - - args = [i18n.to_unicode(val) for val in args] - - if 'sep' in options: sep = options['sep'] - else: sep = ' ' - if 'end' in options: end = options['end'] - else: end = '\n' - - def print_generic(text): - if text: - if (sys.stdout and - hasattr(sys.stdout, 'encoding') and - sys.stdout.encoding is not None): - encoding = sys.stdout.encoding - else: - encoding = locale.getpreferredencoding() or sys.getfilesystemencoding() - - sys.stdout.write(text) - - def print_win32(text): - if not text: return - - import ctypes - INVALID_HANDLE_VALUE, STD_OUTPUT_HANDLE = -1, -11 - outhandle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) - if outhandle != INVALID_HANDLE_VALUE and outhandle: - chars_written = ctypes.c_int(0) - ctypes.windll.kernel32.WriteConsoleW(outhandle, - text, len(text), ctypes.byref(chars_written), None) - else: - print_generic(text) - - print_function = sys.platform == 'win32' and print_win32 or print_generic - if len(args) > 0: - print_function(args[0]) - - for text in args[1:]: - print_function(sep) - print_function(text) - - print_function(end) - -def print_(*args,**kwargs): - return print(*map(i18n.to_unicode,args),**kwargs) - -class PrintHandler(logging.Handler): - ''' Handler using L{print_} to output messages. ''' - - def __init__(self): - super(PrintHandler, self).__init__() - - def emit(self, record): - print_(self.format(record)) - -# Set up default logger. -__logger = logging.getLogger('mcomix') -__logger.setLevel(WARNING) -if not __logger.hasHandlers(): - __handler = PrintHandler() - __handler.setFormatter(logging.Formatter( - '%(asctime)s [%(threadName)s] %(levelname)s: %(message)s', - '%H:%M:%S')) - __logger.addHandler(__handler) - -# The following functions direct all input to __logger. - -debug = __logger.debug -info = __logger.info -warning = __logger.warning -error = __logger.error -setLevel = __logger.setLevel - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/main.py mcomix-2.1.0/mcomix/mcomix/main.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/main.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/main.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,1169 +0,0 @@ -'''main.py - Main window.''' - -import os -import shutil -import threading - -from gi.repository import GLib, Gdk, Gtk - -from mcomix import constants -from mcomix import cursor_handler -from mcomix import i18n -from mcomix import icons -from mcomix import enhance_backend -from mcomix import event -from mcomix import file_handler -from mcomix import image_handler -from mcomix import image_tools -from mcomix import lens -from mcomix import preferences -from mcomix.preferences import prefs -from mcomix import ui -from mcomix import slideshow -from mcomix import status -from mcomix import thumbbar -from mcomix import clipboard -from mcomix import pageselect -from mcomix import osd -from mcomix import keybindings -from mcomix import zoom -from mcomix import bookmark_backend -from mcomix import message_dialog -from mcomix import callback -from mcomix.library import backend, main_dialog -from mcomix import tools -from mcomix import layout -from mcomix import log - - -class MainWindow(Gtk.Window): - - '''The main window, is created at start and terminates the - program when closed. - ''' - - def __init__(self, fullscreen=False, is_slideshow=slideshow, - show_library=False, manga_mode=False, double_page=False, - zoom_mode=None, open_path=None, open_page=1): - super(MainWindow, self).__init__(type=Gtk.WindowType.TOPLEVEL) - - # ---------------------------------------------------------------- - # Attributes - # ---------------------------------------------------------------- - # Used to detect window fullscreen state transitions. - self.was_fullscreen = False - self.is_manga_mode = False - self.previous_size = (None, None) - self.was_out_of_focus = False - #: Used to remember if changing to fullscreen enabled 'Hide all' - self.hide_all_forced = False - # Remember last scroll destination. - self._last_scroll_destination = constants.SCROLL_TO_START - - self.layout = _dummy_layout() - self._spacing = 2 - self._waiting_for_redraw = False - - self._image_box = Gtk.HBox(homogeneous=False, spacing=2) # XXX transitional(kept for osd.py) - self._main_layout = Gtk.Layout() - # Wrap main layout into an event box so - # we can change its background color. - self._event_box = Gtk.EventBox() - self._event_box.add(self._main_layout) - self._event_handler = event.EventHandler(self) - self._vadjust = self._main_layout.get_vadjustment() - self._hadjust = self._main_layout.get_hadjustment() - self._scroll = ( - Gtk.Scrollbar.new(Gtk.Orientation.HORIZONTAL, self._hadjust), - Gtk.Scrollbar.new(Gtk.Orientation.VERTICAL, self._vadjust), - ) - - self.filehandler = file_handler.FileHandler(self) - self.filehandler.file_closed += self._on_file_closed - self.filehandler.file_opened += self._on_file_opened - self.imagehandler = image_handler.ImageHandler(self) - self.imagehandler.page_available += self._page_available - self.thumbnailsidebar = thumbbar.ThumbnailSidebar(self) - - self.statusbar = status.Statusbar() - self.clipboard = clipboard.Clipboard(self) - self.slideshow = slideshow.Slideshow(self) - self.cursor_handler = cursor_handler.CursorHandler(self) - self.enhancer = enhance_backend.ImageEnhancer(self) - self.lens = lens.MagnifyingLens(self) - self.osd = osd.OnScreenDisplay(self) - self.zoom = zoom.ZoomModel() - self.uimanager = ui.MainUI(self) - self.menubar = self.uimanager.get_widget('/Menu') - self.toolbar = self.uimanager.get_widget('/Tool') - self.popup = self.uimanager.get_widget('/Popup') - self.actiongroup = self.uimanager.get_action_groups()[0] - - self.images = [Gtk.Image(), Gtk.Image()] # XXX limited to at most 2 pages - - # ---------------------------------------------------------------- - # Setup - # ---------------------------------------------------------------- - self.set_title(constants.APPNAME) - self.set_size_request(300, 300) # Avoid making the window *too* small - self.restore_window_geometry() - - # Hook up keyboard shortcuts - self._event_handler.register_key_events() - - # This is a hack to get the focus away from the toolbar so that - # we don't activate it with space or some other key (alternative?) - self.toolbar.set_focus_child( - self.uimanager.get_widget('/Tool/expander')) - self.toolbar.set_style(Gtk.ToolbarStyle.ICONS) - self.toolbar.set_icon_size(Gtk.IconSize.LARGE_TOOLBAR) - - for img in self.images: - self._main_layout.put(img, 0, 0) - self.set_bg_color(prefs['bg colour']) - - self._vadjust.step_increment = 15 - self._vadjust.page_increment = 1 - self._hadjust.step_increment = 15 - self._hadjust.page_increment = 1 - - table = Gtk.Table(n_rows=2, n_columns=2, homogeneous=False) - table.attach(self.thumbnailsidebar, 0, 1, 2, 5, Gtk.AttachOptions.FILL, - Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, 0, 0) - - table.attach(self._event_box, 1, 2, 2, 3, Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, - Gtk.AttachOptions.FILL|Gtk.AttachOptions.EXPAND, 0, 0) - table.attach(self._scroll[constants.HEIGHT_AXIS], 2, 3, 2, 3, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, - Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, 0, 0) - table.attach(self._scroll[constants.WIDTH_AXIS], 1, 2, 4, 5, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, - Gtk.AttachOptions.FILL, 0, 0) - table.attach(self.menubar, 0, 3, 0, 1, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, - Gtk.AttachOptions.FILL, 0, 0) - table.attach(self.toolbar, 0, 3, 1, 2, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, - Gtk.AttachOptions.FILL, 0, 0) - table.attach(self.statusbar, 0, 3, 5, 6, Gtk.AttachOptions.FILL|Gtk.AttachOptions.SHRINK, - Gtk.AttachOptions.FILL, 0, 0) - - if prefs['default double page'] or double_page: - self.actiongroup.get_action('double_page').activate() - - if prefs['default manga mode'] or manga_mode: - self.actiongroup.get_action('manga_mode').activate() - - # Determine zoom mode. If zoom_mode is passed, it overrides - # the zoom mode preference. - zoom_actions = { constants.ZOOM_MODE_BEST : 'best_fit_mode', - constants.ZOOM_MODE_WIDTH : 'fit_width_mode', - constants.ZOOM_MODE_HEIGHT : 'fit_height_mode', - constants.ZOOM_MODE_SIZE : 'fit_size_mode', - constants.ZOOM_MODE_MANUAL : 'fit_manual_mode' } - - if zoom_mode is not None: - zoom_action = zoom_actions[zoom_mode] - else: - zoom_action = zoom_actions[prefs['zoom mode']] - - if zoom_action == 'fit_manual_mode': - # This little ugly hack is to get the activate call on - # 'fit_manual_mode' to actually create an event (and callback). - # Since manual mode is the default selected radio button action - # it won't send an event if we activate it when it is already - # the selected one. - self.actiongroup.get_action('best_fit_mode').activate() - - self.actiongroup.get_action(zoom_action).activate() - - if prefs['stretch']: - self.actiongroup.get_action('stretch').activate() - - if prefs['invert smart scroll']: - self.actiongroup.get_action('invert_scroll').activate() - - if prefs['keep transformation']: - prefs['keep transformation'] = False - self.actiongroup.get_action('keep_transformation').activate() - else: - prefs['rotation'] = 0 - prefs['vertical flip'] = False - prefs['horizontal flip'] = False - - # List of "toggles" than can be shown/hidden by the user. - self._toggle_list = ( - # Preference Action Widget(s) - ('show menubar' , 'menubar' , (self.menubar,) ), - ('show scrollbar' , 'scrollbar' , self._scroll ), - ('show statusbar' , 'statusbar' , (self.statusbar,) ), - ('show thumbnails', 'thumbnails', (self.thumbnailsidebar,)), - ('show toolbar' , 'toolbar' , (self.toolbar,) ), - ) - - # Each "toggle" widget "eats" part of the main layout visible area. - self._toggle_axis = { - self.thumbnailsidebar : constants.WIDTH_AXIS , - self._scroll[constants.HEIGHT_AXIS]: constants.WIDTH_AXIS , - self._scroll[constants.WIDTH_AXIS] : constants.HEIGHT_AXIS, - self.statusbar : constants.HEIGHT_AXIS, - self.toolbar : constants.HEIGHT_AXIS, - self.menubar : constants.HEIGHT_AXIS, - } - - # Start with all "toggle" widgets hidden to avoid ugly transitions. - for preference, action, widget_list in self._toggle_list: - for widget in widget_list: - widget.hide() - - toggleaction = self.actiongroup.get_action('hide_all') - toggleaction.set_active(prefs['hide all']) - - # Sync each "toggle" widget active state with its preference. - for preference, action, widget_list in self._toggle_list: - self.actiongroup.get_action(action).set_active(prefs[preference]) - - self.actiongroup.get_action('menu_autorotate_width').set_sensitive(False) - self.actiongroup.get_action('menu_autorotate_height').set_sensitive(False) - - self.add(table) - table.show() - self._event_box.show_all() - - self._main_layout.set_events(Gdk.EventMask.BUTTON1_MOTION_MASK | - Gdk.EventMask.BUTTON2_MOTION_MASK | - Gdk.EventMask.BUTTON_PRESS_MASK | - Gdk.EventMask.BUTTON_RELEASE_MASK | - Gdk.EventMask.POINTER_MOTION_MASK) - - self._main_layout.drag_dest_set(Gtk.DestDefaults.ALL, - [Gtk.TargetEntry.new('text/uri-list', 0, 0)], - Gdk.DragAction.COPY | - Gdk.DragAction.MOVE) - - self.connect('focus-in-event', self.gained_focus) - self.connect('focus-out-event', self.lost_focus) - self.connect('delete_event', self.close_program) - self.connect('key_press_event', self._event_handler.key_press_event) - self.connect('key_release_event', self._event_handler.key_release_event) - self.connect('configure_event', self._event_handler.resize_event) - self.connect('window-state-event', self._event_handler.window_state_event) - - self._main_layout.connect('button_release_event', - self._event_handler.mouse_release_event) - self._main_layout.connect('scroll_event', - self._event_handler.scroll_wheel_event) - self._main_layout.connect('button_press_event', - self._event_handler.mouse_press_event) - self._main_layout.connect('motion_notify_event', - self._event_handler.mouse_move_event) - self._main_layout.connect('drag_data_received', - self._event_handler.drag_n_drop_event) - - self.uimanager.set_sensitivities() - self.show() - - if prefs['default fullscreen'] or fullscreen: - toggleaction = self.actiongroup.get_action('fullscreen') - toggleaction.set_active(True) - - if prefs['previous quit was quit and save']: - fileinfo = self.filehandler.read_fileinfo_file() - - if fileinfo != None: - - open_path = fileinfo[0] - open_page = fileinfo[1] + 1 - - prefs['previous quit was quit and save'] = False - - if open_path is not None: - self.filehandler.open_file(open_path) - - if is_slideshow: - self.actiongroup.get_action('slideshow').activate() - - if show_library: - self.actiongroup.get_action('library').activate() - - self.cursor_handler.auto_hide_on() - # Make sure we receive *all* mouse motion events, - # even if a modal dialog is being shown. - def _on_event(event): - if Gdk.EventType.MOTION_NOTIFY == event.type: - self.cursor_handler.refresh() - Gtk.main_do_event(event) - Gdk.event_handler_set(_on_event) - - self.styleprovider = None - self.load_style(prefs['userstyle']) - - def load_style(self, path=None): - if not path: - return self.reset_style() - # load userstyle from path - provider=None - try: - csspath=tools.relpath2root(path) - if not csspath: - raise Exception('userstyle out of mount point is not allowed.') - provider=Gtk.CssProvider.new() - provider.load_from_path(csspath) - except Exception as e: - provider=None - text=_('Failed to load userstyle: "{}", {}').format(path,e) - log.warning(text) - self.osd.show(text) - finally: - # always reset before setting userstyle - self.reset_style() - - if not provider: - # failed to load userstyle, stop - return - self.styleprovider=provider - Gtk.StyleContext.add_provider_for_screen( - self.get_screen(), - self.styleprovider, - Gtk.STYLE_PROVIDER_PRIORITY_USER - ) - - def reset_style(self): - # reset to system style - if self.styleprovider: - Gtk.StyleContext.remove_provider_for_screen( - self.get_screen(), - self.styleprovider - ) - self.styleprovider=None - - def gained_focus(self, *args): - self.was_out_of_focus = False - - def lost_focus(self, *args): - self.was_out_of_focus = True - - # If the user presses CTRL for a keyboard shortcut, e.g. to - # open the library, key_release_event isn't fired and force_single_step - # isn't properly unset. - self.imagehandler.force_single_step = False - - def draw_image(self, scroll_to=None): - '''Draw the current pages and update the titlebar and statusbar. - ''' - # FIXME: what if scroll_to is different? - if not self._waiting_for_redraw: # Don't stack up redraws. - self._waiting_for_redraw = True - GLib.idle_add(self._draw_image, scroll_to, - priority=GLib.PRIORITY_HIGH_IDLE) - - def _update_toggle_preference(self, preference, toggleaction): - ''' Update "toggle" widget corresponding . - - Note: the widget visibily itself is left unchanged. ''' - prefs[preference] = toggleaction.get_active() - if 'hide all' == preference: - self._update_toggles_sensitivity() - # Since the size of the drawing area is dependent - # on the visible "toggles", redraw the page. - self.draw_image() - - def _should_toggle_be_visible(self, preference): - ''' Return if "toggle" widget for should be visible. ''' - if self.is_fullscreen: - visible = not prefs['hide all in fullscreen'] and not prefs['hide all'] - else: - visible = not prefs['hide all'] - visible &= prefs[preference] - if 'show thumbnails' == preference: - visible &= self.filehandler.file_loaded - visible &= self.imagehandler.get_number_of_pages() > 0 - return visible - - def _update_toggles_sensitivity(self): - ''' Update each "toggle" widget sensitivity. ''' - sensitive = True - if prefs['hide all']: - sensitive = False - elif prefs['hide all in fullscreen'] and self.is_fullscreen: - sensitive = False - for preference, action, widget_list in self._toggle_list: - self.actiongroup.get_action(action).set_sensitive(sensitive) - - def _update_toggles_visibility(self): - ''' Update each "toggle" widget visibility. ''' - for preference, action, widget_list in self._toggle_list: - should_be_visible = self._should_toggle_be_visible(preference) - for widget in widget_list: - # No change in visibility? - if should_be_visible != widget.get_visible(): - (widget.show if should_be_visible else widget.hide)() - - def _draw_image(self, scroll_to): - - self._update_toggles_visibility() - - self.osd.clear() - - if not self.filehandler.file_loaded: - self._clear_main_area() - self._waiting_for_redraw = False - return False - - if self.imagehandler.page_is_available(): - distribution_axis = constants.DISTRIBUTION_AXIS - alignment_axis = constants.ALIGNMENT_AXIS - pixbuf_count = 2 if self.displayed_double() else 1 # XXX limited to at most 2 pages - pixbuf_list = list(self.imagehandler.get_pixbufs(pixbuf_count)) - do_not_transform = [image_tools.disable_transform(x) for x in pixbuf_list] - size_list = [[pixbuf.get_width(), pixbuf.get_height()] - for pixbuf in pixbuf_list] - - if self.is_manga_mode: - orientation = constants.MANGA_ORIENTATION - else: - orientation = constants.WESTERN_ORIENTATION - - # Rotation handling: - # - apply Exif rotation on individual images - # - apply automatic rotation (size based) on whole page - # - apply manual rotation on whole page - if prefs['auto rotate from exif']: - rotation_list = [image_tools.get_implied_rotation(pixbuf) - for pixbuf in pixbuf_list] - else: - rotation_list = [0] * len(pixbuf_list) - virtual_size = [0, 0] - for i in range(pixbuf_count): - if rotation_list[i] in (90, 270): - size_list[i].reverse() - size = size_list[i] - virtual_size[distribution_axis] += size[distribution_axis] - virtual_size[alignment_axis] = max(virtual_size[alignment_axis], - size[alignment_axis]) - rotation = self._get_size_rotation(*virtual_size) - rotation = (rotation + prefs['rotation']) % 360 - if rotation in (90, 270): - distribution_axis, alignment_axis = alignment_axis, distribution_axis - orientation = list(orientation) - orientation.reverse() - for i in range(pixbuf_count): - size_list[i].reverse() - if rotation in (180, 270): - orientation = tools.vector_opposite(orientation) - for i in range(pixbuf_count): - rotation_list[i] = (rotation_list[i] + rotation) % 360 - if prefs['vertical flip'] and rotation in (90, 270): - orientation = tools.vector_opposite(orientation) - if prefs['horizontal flip'] and rotation in (0, 180): - orientation = tools.vector_opposite(orientation) - - viewport_size = () # dummy - expand_area = False - scrollbar_requests = [False] * len(self._scroll) - # Visible area size is recomputed depending on scrollbar visibility - while True: - self._show_scrollbars(scrollbar_requests) - new_viewport_size = self.get_visible_area_size() - if new_viewport_size == viewport_size: - break - viewport_size = new_viewport_size - zoom_dummy_size = list(viewport_size) - dasize = zoom_dummy_size[distribution_axis] - \ - self._spacing * (pixbuf_count - 1) - if dasize <= 0: - dasize = 1 - zoom_dummy_size[distribution_axis] = dasize - scaled_sizes = self.zoom.get_zoomed_size( - size_list, zoom_dummy_size, - distribution_axis, do_not_transform) - self.layout = layout.FiniteLayout( - scaled_sizes, viewport_size, orientation, self._spacing, - expand_area, distribution_axis, alignment_axis) - union_scaled_size = self.layout.get_union_box().get_size() - scrollbar_requests = [(old or new) for old, new in zip( - scrollbar_requests, - tools.smaller(viewport_size, union_scaled_size) - )] - if len(tuple(filter(None, scrollbar_requests))) > 1 and not expand_area: - expand_area = True - viewport_size = () # start anew - - for i in range(pixbuf_count): - pixbuf_list[i] = image_tools.fit_pixbuf_to_rectangle( - pixbuf_list[i], scaled_sizes[i], rotation_list[i]) - - for i in range(pixbuf_count): - pixbuf_list[i] = image_tools.trans_pixbuf( - pixbuf_list[i], - flip=prefs['vertical flip'], - flop=prefs['horizontal flip'] - ) - pixbuf_list[i] = self.enhancer.enhance(pixbuf_list[i]) - - for i in range(pixbuf_count): - image_tools.set_from_pixbuf(self.images[i], pixbuf_list[i]) - - resolutions = [(*size, scaled_size[0] / size[0]) - for scaled_size, size in zip(scaled_sizes, size_list)] - - if self.is_manga_mode: - resolutions.reverse() - self.statusbar.set_resolution(resolutions) - self.statusbar.update() - - smartbg = prefs['smart bg'] - smartthumbbg = prefs['show thumbnails'] and prefs['smart thumb bg'] - if smartbg or smartthumbbg: - bg_color = self.imagehandler.get_pixbuf_auto_background(pixbuf_count) - if smartbg: - self.set_bg_color(bg_color) - if smartthumbbg: - self.thumbnailsidebar.change_thumbnail_background_color(bg_color) - - self._main_layout.get_bin_window().freeze_updates() - - self._main_layout.set_size(*union_scaled_size) - content_boxes = self.layout.get_content_boxes() - for i in range(pixbuf_count): - self._main_layout.move(self.images[i], - *content_boxes[i].get_position()) - - for i in range(pixbuf_count): - self.images[i].show() - for i in range(pixbuf_count, len(self.images)): - self.images[i].hide() - - # Reset orientation so scrolling behaviour is sane. - if self.is_manga_mode: - self.layout.set_orientation(constants.MANGA_ORIENTATION) - else: - self.layout.set_orientation(constants.WESTERN_ORIENTATION) - - if scroll_to is not None: - destination = (scroll_to,) * 2 - if constants.SCROLL_TO_START == scroll_to: - index = constants.FIRST_INDEX - elif constants.SCROLL_TO_END == scroll_to: - index = constants.LAST_INDEX - else: - index = None - self.scroll_to_predefined(destination, index) - - self._main_layout.get_bin_window().thaw_updates() - else: - # Save scroll destination for when the page becomes available. - self._last_scroll_destination = scroll_to - # If the pixbuf for the current page(s) isn't available, - # hide all images to clear any old pixbufs. - # XXX How about calling self._clear_main_area? - for i in range(len(self.images)): - self.images[i].hide() - self._show_scrollbars([False] * len(self._scroll)) - - self._waiting_for_redraw = False - - return False - - def _update_page_information(self): - ''' Updates the window with information that can be gathered - even when the page pixbuf(s) aren't ready yet. ''' - - page_number = self.imagehandler.get_current_page() - if not page_number: - return - if self.displayed_double(): - number_of_pages = 2 - filenames = self.imagehandler.get_page_filename( - double=True, manga=self.is_manga_mode) - filesizes = self.imagehandler.get_page_filesize( - double=True, manga=self.is_manga_mode) - filename = ', '.join(filenames) - filesize = ', '.join(filesizes) - else: - number_of_pages = 1 - filename = self.imagehandler.get_page_filename() - filesize = self.imagehandler.get_page_filesize() - self.statusbar.set_page_number(page_number, - self.imagehandler.get_number_of_pages(), - number_of_pages) - self.statusbar.set_filename(filename) - self.statusbar.set_root(self.filehandler.get_base_filename()) - self.statusbar.set_filesize(filesize) - self.statusbar.update() - self.update_title() - - def _get_size_rotation(self, width, height): - ''' Determines the rotation to be applied. - Returns the degree of rotation (0, 90, 180, 270). ''' - - size_rotation = 0 - - if (height > width and - prefs['auto rotate depending on size'] in - (constants.AUTOROTATE_HEIGHT_90, constants.AUTOROTATE_HEIGHT_270)): - - if prefs['auto rotate depending on size'] == constants.AUTOROTATE_HEIGHT_90: - size_rotation = 90 - else: - size_rotation = 270 - elif (width > height and - prefs['auto rotate depending on size'] in - (constants.AUTOROTATE_WIDTH_90, constants.AUTOROTATE_WIDTH_270)): - - if prefs['auto rotate depending on size'] == constants.AUTOROTATE_WIDTH_90: - size_rotation = 90 - else: - size_rotation = 270 - - return size_rotation - - def _page_available(self, page): - ''' Called whenever a new page is ready for displaying. ''' - # Refresh display when currently opened page becomes available. - current_page = self.imagehandler.get_current_page() - nb_pages = 2 if self.displayed_double() else 1 - if current_page <= page < (current_page + nb_pages): - self.draw_image(scroll_to=self._last_scroll_destination) - self._update_page_information() - - # Use first page as application icon when opening archives. - if (page == 1 - and self.filehandler.archive_type is not None - and prefs['archive thumbnail as icon']): - pixbuf = self.imagehandler.get_thumbnail(page, 48, 48) - self.set_icon(pixbuf) - - def _on_file_opened(self): - self.uimanager.set_sensitivities() - number, count = self.filehandler.get_file_number() - self.statusbar.set_file_number(number, count) - self.statusbar.update() - - def _on_file_closed(self): - self.clear() - self.thumbnailsidebar.hide() - self.thumbnailsidebar.clear() - self.uimanager.set_sensitivities() - self.set_icon_list(icons.mcomix_icons()) - - def new_page(self, at_bottom=False): - '''Draw a *new* page correctly (as opposed to redrawing the same - image with a new size or whatever). - ''' - if not prefs['keep transformation']: - prefs['rotation'] = 0 - prefs['horizontal flip'] = False - prefs['vertical flip'] = False - - if at_bottom: - scroll_to = constants.SCROLL_TO_END - else: - scroll_to = constants.SCROLL_TO_START - - self.draw_image(scroll_to=scroll_to) - - @callback.Callback - def page_changed(self): - ''' Called on page change. ''' - self.thumbnailsidebar.load_thumbnails() - self._update_page_information() - - def set_page(self, num, at_bottom=False): - if num == self.imagehandler.get_current_page(): - return - self.imagehandler.set_page(num) - self.page_changed() - self.new_page(at_bottom=at_bottom) - self.slideshow.update_delay() - - def next_book(self): - archive_open = self.filehandler.archive_type is not None - next_archive_opened = False - if (self.slideshow.is_running() and \ - prefs['slideshow can go to next archive']) or \ - prefs['auto open next archive']: - next_archive_opened = self.filehandler._open_next_archive() - - # If "Auto open next archive" is disabled, do not go to the next - # directory if current file was an archive. - if not next_archive_opened and \ - prefs['auto open next directory'] and \ - (not archive_open or prefs['auto open next archive']): - self.filehandler.open_next_directory() - - def previous_book(self): - archive_open = self.filehandler.archive_type is not None - previous_archive_opened = False - if (self.slideshow.is_running() and \ - prefs['slideshow can go to next archive']) or \ - prefs['auto open next archive']: - previous_archive_opened = self.filehandler._open_previous_archive() - - # If "Auto open next archive" is disabled, do not go to the previous - # directory if current file was an archive. - if not previous_archive_opened and \ - prefs['auto open next directory'] and \ - (not archive_open or prefs['auto open next archive']): - self.filehandler.open_previous_directory() - - def flip_page(self, step, single_step=False): - - if not self.filehandler.file_loaded: - return - - current_page = self.imagehandler.get_current_page() - number_of_pages = self.imagehandler.get_number_of_pages() - - new_page = current_page + step - if (1 == abs(step) and - not single_step and - prefs['default double page'] and - prefs['double step in double page mode']): - if +1 == step and not self.imagehandler.get_virtual_double_page(): - new_page += 1 - elif -1 == step and not self.imagehandler.get_virtual_double_page(new_page - 1): - new_page -= 1 - - if new_page <= 0: - # Only switch to previous page when flipping one page before the - # first one. (Note: check for (page number <= 1) to handle empty - # archive case). - if -1 == step and current_page <= 1: - return self.previous_book() - # Handle empty archive case. - new_page = min(1, number_of_pages) - elif new_page > number_of_pages: - if 1 == step: - return self.next_book() - new_page = number_of_pages - - if new_page != current_page: - self.set_page(new_page, at_bottom=(-1 == step)) - - def first_page(self): - number_of_pages = self.imagehandler.get_number_of_pages() - if number_of_pages: - self.set_page(1) - - def last_page(self): - number_of_pages = self.imagehandler.get_number_of_pages() - if number_of_pages: - self.set_page(number_of_pages) - - def page_select(self, *args): - pageselect.Pageselector(self) - - def rotate_90(self, *args): - prefs['rotation'] = (prefs['rotation'] + 90) % 360 - self.draw_image() - - def rotate_180(self, *args): - prefs['rotation'] = (prefs['rotation'] + 180) % 360 - self.draw_image() - - def rotate_270(self, *args): - prefs['rotation'] = (prefs['rotation'] + 270) % 360 - self.draw_image() - - def flip_horizontally(self, *args): - prefs['horizontal flip'] = not prefs['horizontal flip'] - self.draw_image() - - def flip_vertically(self, *args): - prefs['vertical flip'] = not prefs['vertical flip'] - self.draw_image() - - def change_double_page(self, toggleaction): - prefs['default double page'] = toggleaction.get_active() - self._update_page_information() - self.draw_image() - - def change_manga_mode(self, toggleaction): - prefs['default manga mode'] = toggleaction.get_active() - self.is_manga_mode = toggleaction.get_active() - self._update_page_information() - self.draw_image() - - def change_invert_scroll(self, toggleaction): - prefs['invert smart scroll'] = toggleaction.get_active() - - @property - def is_fullscreen(self): - window_state = self.get_window().get_state() - return 0 != (window_state & Gdk.WindowState.FULLSCREEN) - - def change_fullscreen(self, toggleaction): - is_fullscreen = self.is_fullscreen - # Set fullscreen only if window is not fillscreen, - # and exit fullscreen only if window is fullscreen. - # Also see comment in event.EventHandler.window_state_event - if toggleaction.get_active() and not is_fullscreen: - self.save_window_geometry() - self.fullscreen() - elif is_fullscreen and not toggleaction.get_active(): - self.unfullscreen() - # No need to call draw_image explicitely, - # as we'll be receiving a window state - # change or resize event. - - def change_zoom_mode(self, radioaction=None, *args): - if radioaction: - prefs['zoom mode'] = radioaction.get_current_value() - self.zoom.set_fit_mode(prefs['zoom mode']) - self.zoom.set_scale_up(prefs['stretch']) - self.zoom.reset_user_zoom() - self.draw_image() - - def change_autorotation(self, radioaction=None, *args): - ''' Switches between automatic rotation modes, depending on which - radiobutton is currently activated. ''' - if radioaction: - prefs['auto rotate depending on size'] = radioaction.get_current_value() - self.draw_image() - - def change_stretch(self, toggleaction, *args): - ''' Toggles stretching small images. ''' - prefs['stretch'] = toggleaction.get_active() - self.zoom.set_scale_up(prefs['stretch']) - self.draw_image() - - def change_toolbar_visibility(self, toggleaction): - self._update_toggle_preference('show toolbar', toggleaction) - - def change_menubar_visibility(self, toggleaction): - self._update_toggle_preference('show menubar', toggleaction) - - def change_statusbar_visibility(self, toggleaction): - self._update_toggle_preference('show statusbar', toggleaction) - - def change_scrollbar_visibility(self, toggleaction): - self._update_toggle_preference('show scrollbar', toggleaction) - - def change_thumbnails_visibility(self, toggleaction): - self._update_toggle_preference('show thumbnails', toggleaction) - - def change_hide_all(self, toggleaction): - self._update_toggle_preference('hide all', toggleaction) - - def change_keep_transformation(self, *args): - prefs['keep transformation'] = not prefs['keep transformation'] - - def manual_zoom_in(self, *args): - self.zoom.zoom_in() - self.draw_image() - - def manual_zoom_out(self, *args): - self.zoom.zoom_out() - self.draw_image() - - def manual_zoom_original(self, *args): - self.zoom.reset_user_zoom() - self.draw_image() - - def _show_scrollbars(self, request): - ''' Enables scroll bars depending on requests and preferences. ''' - - limit = self._should_toggle_be_visible('show scrollbar') - for i in range(len(self._scroll)): - if limit and request[i]: - self._scroll[i].show() - else: - self._scroll[i].hide() - - def is_scrollable(self): - ''' Returns True if the current images do not fit into the viewport. ''' - if self.layout is None: - return False - return not all(tools.smaller_or_equal(self.layout.get_union_box().get_size(), - self.get_visible_area_size())) - - def scroll_with_flipping(self, x, y): - '''Returns true if able to scroll without flipping to - a new page and False otherwise.''' - return self._event_handler._scroll_with_flipping(x, y) - - def scroll(self, x, y, bound=None): - '''Scroll px horizontally and px vertically. If is - 'first' or 'second', we will not scroll out of the first or second - page respectively (dependent on manga mode). The argument - only makes sense in double page mode. - - Return True if call resulted in new adjustment values, False - otherwise. - ''' - old_hadjust = self._hadjust.get_value() - old_vadjust = self._vadjust.get_value() - - visible_width, visible_height = self.get_visible_area_size() - - hadjust_upper = max(0, self._hadjust.get_upper() - visible_width) - vadjust_upper = max(0, self._vadjust.get_upper() - visible_height) - hadjust_lower = 0 - - if bound is not None and self.is_manga_mode: - bound = {'first': 'second', 'second': 'first'}[bound] - - if bound == 'first': - hadjust_upper = max(0, hadjust_upper - - self.images[1].size_request().width - 2) # XXX transitional(double page limitation) - - elif bound == 'second': - hadjust_lower = self.images[0].size_request().width + 2 # XXX transitional(double page limitation) - - new_hadjust = old_hadjust + x - new_vadjust = old_vadjust + y - - new_hadjust = max(hadjust_lower, new_hadjust) - new_vadjust = max(0, new_vadjust) - - new_hadjust = min(hadjust_upper, new_hadjust) - new_vadjust = min(vadjust_upper, new_vadjust) - - self._vadjust.set_value(new_vadjust) - self._hadjust.set_value(new_hadjust) - self._scroll[0].queue_resize_no_redraw() - self._scroll[1].queue_resize_no_redraw() - - return old_vadjust != new_vadjust or old_hadjust != new_hadjust - - def scroll_to_predefined(self, destination, index=None): - self.layout.scroll_to_predefined(destination, index) - self.update_viewport_position() - - def update_viewport_position(self): - viewport_position = self.layout.get_viewport_box().get_position() - self._hadjust.set_value(viewport_position[0]) # 2D only - self._vadjust.set_value(viewport_position[1]) # 2D only - self._scroll[0].queue_resize_no_redraw() - self._scroll[1].queue_resize_no_redraw() - - def update_layout_position(self): - self.layout.set_viewport_position( - (int(round(self._hadjust.get_value())), int(round(self._vadjust.get_value())))) - - def clear(self): - '''Clear the currently displayed data (i.e. "close" the file).''' - self.set_title(constants.APPNAME) - self.statusbar.set_message('') - self.draw_image() - - def _clear_main_area(self): - for i in self.images: - i.hide() - for i in self.images: - i.clear() - self._show_scrollbars([False] * len(self._scroll)) - self.layout = _dummy_layout() - self._main_layout.set_size(*self.layout.get_union_box().get_size()) - self.set_bg_color(prefs['bg colour']) - - def displayed_double(self): - '''Return True if two pages are currently displayed.''' - return (self.imagehandler.get_current_page() and - prefs['default double page'] and - not self.imagehandler.get_virtual_double_page() and - self.imagehandler.get_current_page() != self.imagehandler.get_number_of_pages()) - - def get_visible_area_size(self): - '''Return a 2-tuple with the width and height of the visible part - of the main layout area. - ''' - dimensions = list(self.get_size()) - - for preference, action, widget_list in self._toggle_list: - for widget in widget_list: - if widget.get_visible(): - axis = self._toggle_axis[widget] - requisition = widget.size_request() - if constants.WIDTH_AXIS == axis: - size = requisition.width - elif constants.HEIGHT_AXIS == axis: - size = requisition.height - dimensions[axis] -= size - - return tuple(dimensions) - - def get_layout_pointer_position(self): - '''Return a 2-tuple with the x and y coordinates of the pointer - on the main layout area, relative to the layout. - ''' - x, y = self._main_layout.get_pointer() - x += self._hadjust.get_value() - y += self._vadjust.get_value() - - return (x, y) - - def set_cursor(self, mode): - '''Set the cursor on the main layout area to . You should - probably use the cursor_handler instead of using this method - directly. - ''' - self._main_layout.get_bin_window().set_cursor(mode) - - def update_title(self): - '''Set the title acording to current state.''' - strings = ['[{}]'.format(self.statusbar.get_page_number()), - self.imagehandler.get_pretty_current_filename()] - - if self.slideshow.is_running(): - strings.insert(0,'[{}]'.format(_('SLIDESHOW'))) - - self.set_title(' '.join(strings)) - - def set_bg_color(self, colour): - '''Set the background colour to . Colour is a sequence in the - format (r, g, b). Values are 16-bit. - ''' - self._event_box.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(*colour)) - if prefs['thumbnail bg uses main colour']: - self.thumbnailsidebar.change_thumbnail_background_color(prefs['bg colour']) - self._bg_color = colour - - def get_bg_color(self): - return self._bg_color - - def extract_page(self, *args): - ''' Derive some sensible filename (archive name + _ + filename should do) and offer - the user the choice to save the current page with the selected name. ''' - if self.filehandler.archive_type is not None: - archive_name = self.filehandler.get_pretty_current_filename() - file_name = self.imagehandler.get_path_to_page() - suggested_name = os.path.splitext(archive_name)[0] + \ - '_' + os.path.split(file_name)[-1] - else: - suggested_name = os.path.split(self.imagehandler.get_path_to_page())[-1] - - save_dialog = Gtk.FileChooserDialog(title=_('Save page as'), - action=Gtk.FileChooserAction.SAVE) - save_dialog.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, - Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT) - save_dialog.set_transient_for(self) - save_dialog.set_do_overwrite_confirmation(True) - save_dialog.set_current_name(suggested_name.encode('utf-8')) - - if save_dialog.run() == Gtk.ResponseType.ACCEPT and save_dialog.get_filename(): - shutil.copy(self.imagehandler.get_path_to_page(), - save_dialog.get_filename()) - - save_dialog.destroy() - - def show_info_panel(self): - ''' Shows an OSD displaying information about the current page. ''' - - if not self.filehandler.file_loaded: - return - - text = '' - filename = self.imagehandler.get_pretty_current_filename() - if filename: - text += '%s\n' % filename - file_number, file_count = self.filehandler.get_file_number() - if file_count: - text += '(%d / %d)\n' % (file_number, file_count) - else: - text += '\n' - page_number = self.imagehandler.get_current_page() - if page_number: - text += '%s %s' % (_('Page'), page_number) - text = text.strip('\n') - if text: - self.osd.show(text) - - def minimize(self, *args): - ''' Minimizes the MComix window. ''' - self.iconify() - - def write_config_files(self): - - self.filehandler.write_fileinfo_file() - preferences.write_preferences_file() - bookmark_backend.BookmarksStore.write_bookmarks_file() - - # Write keyboard accelerator map - keybindings.keybinding_manager(self).save() - - def save_and_terminate_program(self, *args): - prefs['previous quit was quit and save'] = True - - self.terminate_program() - - def get_window_geometry(self): - return self.get_position() + self.get_size() - - def save_window_geometry(self): - ( - prefs['window x'], - prefs['window y'], - prefs['window width'], - prefs['window height'], - - ) = self.get_window_geometry() - - def restore_window_geometry(self): - if self.get_window_geometry() == (prefs['window x'], - prefs['window y'], - prefs['window width'], - prefs['window height']): - return False - self.resize(prefs['window width'], prefs['window height']) - self.move(prefs['window x'], prefs['window y']) - return True - - def close_program(self, *args): - if not self.is_fullscreen: - self.save_window_geometry() - self.terminate_program() - - def terminate_program(self): - '''Run clean-up tasks and exit the program.''' - - self.hide() - - if Gtk.main_level() > 0: - Gtk.main_quit() - - if prefs['auto load last file'] and self.filehandler.file_loaded: - path = self.imagehandler.get_real_path() - path = tools.relpath2root(path,abs_fallback=prefs['portable allow abspath']) - - if not path: - # path is None, means running in portable mode - # and currect image is out of same mount point - # so do not save as last file - prefs['path to last file'] = '' - prefs['page of last file'] = 1 - else: - prefs['path to last file'] = self.imagehandler.get_real_path() - prefs['page of last file'] = self.imagehandler.get_current_page() - - else: - prefs['path to last file'] = '' - prefs['page of last file'] = 1 - - if prefs['hide all'] and self.hide_all_forced and self.fullscreen: - prefs['hide all'] = False - - self.write_config_files() - - self.filehandler.close_file() - if main_dialog._dialog is not None: - main_dialog._dialog.close() - backend.LibraryBackend().close() - self.slideshow.stop() - -#: Main window instance -__main_window = None - - -def main_window(): - ''' Returns the global main window instance. ''' - return __main_window - - -def set_main_window(window): - global __main_window - __main_window = window - - -def _dummy_layout(): - return layout.FiniteLayout(((1,1),), (1,1), (1,1), 0, False, 0, 0) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/message_dialog.py mcomix-2.1.0/mcomix/mcomix/message_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/message_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/message_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -''' Simple extension of Gtk.MessageDialog for consistent formating. Also - supports remembering the dialog result. -''' - -from gi.repository import Gtk - -from mcomix.preferences import prefs - - -class MessageDialog(Gtk.MessageDialog): - - def __init__(self, parent, flags=0, message_type=0, buttons=0): - ''' Creates a dialog window. - @param parent: Parent window - @param flags: Dialog flags - @param type: Dialog icon/type - @param buttons: Dialog buttons. Can only be a predefined BUTTONS_XXX constant. - ''' - super(MessageDialog, self).__init__( - message_type=message_type, buttons=buttons, - modal=flags & Gtk.DialogFlags.MODAL, - destroy_with_parent=flags & Gtk.DialogFlags.DESTROY_WITH_PARENT, - ) - self.set_transient_for(parent) - - #: Unique dialog identifier (for storing 'Do not ask again') - self.dialog_id = None - #: List of response IDs that should be remembered - self.choices = [] - #: Automatically destroy dialog after run? - self.auto_destroy = True - - self.remember_checkbox = Gtk.CheckButton(label=_('Do not ask again.')) - self.remember_checkbox.set_no_show_all(True) - self.remember_checkbox.set_can_focus(False) - self.get_message_area().pack_end(self.remember_checkbox, True, True, 6) - - def set_text(self, primary, secondary=None): - ''' Formats the dialog's text fields. - @param primary: Main text. - @param secondary: Descriptive text. - ''' - if primary: - self.set_markup('' + - primary + '') - if secondary: - self.format_secondary_markup(secondary) - - def should_remember_choice(self): - ''' Returns True when the dialog choice should be remembered. ''' - return self.remember_checkbox.get_active() - - def set_should_remember_choice(self, dialog_id, choices): - ''' This method enables the 'Do not ask again' checkbox. - @param dialog_id: Unique identifier for the dialog (a string). - @param choices: List of response IDs that should be remembered - ''' - self.remember_checkbox.show() - self.dialog_id = dialog_id - self.choices = [int(choice) for choice in choices] - - def set_auto_destroy(self, auto_destroy): - ''' Determines if the dialog should automatically destroy itself - after run(). ''' - self.auto_destroy = auto_destroy - - def run(self): - ''' Makes the dialog visible and waits for a result. Also destroys - the dialog after the result has been returned. ''' - - if self.dialog_id in prefs['stored dialog choices']: - self.destroy() - return prefs['stored dialog choices'][self.dialog_id] - else: - self.show_all() - # Prevent checkbox from grabbing focus by only enabling it after show - self.remember_checkbox.set_can_focus(True) - result = super(MessageDialog, self).run() - - if (self.should_remember_choice() and int(result) in self.choices): - prefs['stored dialog choices'][self.dialog_id] = int(result) - - if self.auto_destroy: - self.destroy() - return result - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ca/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/ca/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ca/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/ca/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3613 +0,0 @@ -# Catalan/Valencian translaton of comix. -# -msgid "" -msgstr "" -"Project-Id-Version: Comix 3.2\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-01-25 22:33+0100\n" -"Last-Translator: Carles Escrig i Royo \n" -"Language-Team: CA \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Poedit-Language: Catalan\n" -"X-Poedit-Country: SPAIN\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Llegeix arxius ZIP, RAR i tar, així com fitxers d'imatge." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nom" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Pàgina" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Ubicació" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Comentaris" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "No s'ha pogut llegir %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Teniu en compte que només s'afegeixen automàticament a la llista els fitxers " -"que hi ha als arxius que Comix reconeix com a comentaris." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Mida" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Suprimeix del fitxer" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Edita l'arxiu" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Imatges" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Comentaris" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "No s'ha pogut desar l'arxiu nou!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "No s'han eliminat els fitxers originals." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Els arxius es desen en format ZIP." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Millora la imatge" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Brillantor" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Contrast" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Saturació" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Agudesa" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Ajusta automàticament el contrast." - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Ajusta automàticament el contrast (tant la claror com la foscor), de manera " -"independent per a cada banda de color." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Obre" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Desa" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Tots els fitxers" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Tots els arxius" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Arxius %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Totes les imatges" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Imatges %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Ja existeix un fitxer anomenat '%s'. Voleu substituir-lo?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Substituint-lo hi sobreescriureu els continguts." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Afegeix llibres" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "No hi ha imatges a '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "No s'ha pogut obrir %s: No existeix el fitxer." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "No s'ha pogut obrir %s: S'ha denegat el permís." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipus de fitxer desconegut" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Pàgina anterior" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Pàgina següent" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Última pàgina" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Pàgina anterior" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Pàgina següent" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Pàgina anterior" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Pàgina següent" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Primera pàgina" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Última pàgina" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Pàgina següent" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Edita l'arxiu" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Pàgina anterior" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Desplaçament" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "Apr_opa" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Manté la transformació" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Manté la transformació" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Rota 90 graus a la dreta" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Rota 180 _graus" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Rota 90 graus a l'_esquerra" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Inverteix _horitzontalment" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Inverteix _verticalment" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Mode de doble pàgina" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Ajusta a l'amplada" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Mode manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lupa" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Millor encaix" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Ajusta a l'amplada" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Ajusta a l'alçada" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "A_justa a l'amplada" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Zoom manual" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Pantalla completa" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "B_arra d'estat" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Barres de _desplaçament" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniatures" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Amaga-ho _tot" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Projecció de diapositives" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Fitxers" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Altres fitxers" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "Tan_ca" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "I_x" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Desa" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Arxiu" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Propietats" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferències" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteca" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Edita els marcadors" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "No s'ha pogut llegir %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "PRESENTACIÓ" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Els arxius es desen en format ZIP." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Els arxius es desen en format ZIP." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Comentaris" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Comentaris" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Pàgina anterior" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Comentaris" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Directori de les miniatures" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Arxius tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Edita els marcadors" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "Vé_s" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Memòria cau" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Aspecte" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportament" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Visualització" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Fons" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Usa aquest color com a fons" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Usa sempre aquest color per al fons." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Color de fons dinàmic." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Selecciona automàticament un color per al fons que combine amb la imatge." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Usa sempre aquest color per al fons." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Selecciona automàticament un color per al fons que combine amb la imatge." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Mostra el número de la pàgina a la miniatura." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Mida de les miniatures (en píxels)" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparència" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Usa un fons a quadrats per a les imatges transparents." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Usa un fons a quadrats gris per a les imatges transparents. Si aquesta opció " -"està inhabilitada, el fons serà completament blanc." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Usa el desplaçament intel·ligent." - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Usa el desplaçament intel·ligent amb la barra espaiadora. Normalment la " -"barra espaiadora desplaça cap avall (o cap amunt si es prem Majúscules), " -"però amb aquesta opció habilitada també desplaçarà lateralment i per tant " -"intenta seguir el curs natural de lectura del còmic." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Passa de pàgina quan ens desplacem fora dels límits de la pàgina." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Passa de pàgina quan ens desplacem \"fora de la pàgina\" amb la roda del " -"ratolí o amb les tecles de cursor. Girar la pàgina costa tres \"passos\" " -"consecutius amb la roda de desplaçament o amb les tecles de cursor." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Obre automàticament el següent arxiu." - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Obre automàticament el següent arxiu del directori quan passem de l'última " -"pàgina, o l'arxiu anterior si girem la primera pàgina." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Obre automàticament el següent arxiu." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Gira dues pàgines en el mode de doble pàgina." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Gira dues pàgines, en lloc de una, cada cop que canviem de pàgina en el mode " -"de doble pàgina." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Fitxers" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Obre automàticament a l'inici l'últim arxiu vist." - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Obre automàticament, a l'inici, l'arxiu que era obert quan Comix es va " -"tancar per últim cop." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Desa informació dels últims fitxers oberts." - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Usa per defecte el mode de pantalla completa." - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Oculta automàticament totes les barres d'eines." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Ajusta a l'amplada" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Ajusta a l'amplada" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "A_justa a l'amplada" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Projecció de diapositives" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Retard (en segons)" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Retard (en segons)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Obre automàticament el següent arxiu." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotació" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "Rotar automàticament les imatges d'acord amb les metadades." - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Rota automàticament les imatges quan s'hi especifique una orientació a les " -"metadades de la imatge, com per exemple a les etiquetes Exif." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Escalat" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Mode manga" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Arxius tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Desa les miniatures dels fitxers oberts." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Desa les miniatures dels fitxers oberts d'acord amb l'especificació " -"freedesktop.org. Aquestes miniatures es comparteixen amb moltes altres " -"aplicacions, com ara bé la majoria de gestors de fitxers." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lupa" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Mida de la lupa (en píxels)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Configura la mida de la lupa. Es tracta d'un quadrat d'aquest nombre de " -"píxels." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Factor d'augment" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Configura el factor d'augment de la lupa." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Extensions dels comentaris" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Millora la imatge" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Ajusta a l'amplada" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Ajusta a l'alçada" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Afegeix la informació de tots els fitxers oberts des de Comix a la llista " -"compartida de fitxers recents." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Desa informació dels últims fitxers oberts." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Tracta tots els fitxers que hi ha dintre dels arxius, que tinguen una " -"d'aquestes extensions, com a comentaris." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arxiu" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Imatge" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d pàgines" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d comentaris" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Accedit" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modificat" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permisos" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Propietari" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Projecció de diapositives" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Arxiu ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Arxiu RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Arxiu tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Arxiu tar comprimit amb gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Arxiu tar comprimit amb bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Arxiu tar comprimit amb gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Traducció al xinès simplificat" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Traducció al castellà" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Traducció al portuguès brasiler" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Traducció a l'alemany i generador de miniatures" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Traducció al persa" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Traducció a l'italià" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Traducció a l'holandès" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Traducció al francès" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Traducció al polonès" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Traducció al polonès" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Traducció al grec" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Traducció al català" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traducció al xinès tradicional" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Traducció al japonès" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Traducció a l'hongarès" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Traducció al rus" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Traducció al croat" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Traducció al coreà" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Traducció al persa" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Traducció a l'indonesi" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Traducció al xec" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Traducció a l'italià" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Traducció al grec" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Traducció a l'italià" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Disseny d'icones" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Copia)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Pàgi_na següent" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Pàgina anterior" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "Pr_imera pàgina" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "Ú_ltima pàgina" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "Tan_ca" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "I_x" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Rota 90 graus a la dreta" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rota 180 _graus" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Rota 90 graus a l'_esquerra" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Inverteix _horitzontalment" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Inverteix _verticalment" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Marcadors" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Barres d'_eines" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Edita" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Obre els _recents" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Fitxer" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Visualitza" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Barra d'eines" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Ajuda" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Pantalla completa" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Doble pàgina" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Barra d'eines" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barra de m_enú" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "B_arra d'estat" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barres de _desplaçament" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniat_ures" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Amaga-ho _tot" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Mode manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Manté la transformació" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Projecció de _diapositives" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lupa" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Millor ajus_t" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "A_justa a l'amplada" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Ajusta a l'al_çada" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "A_justa a l'amplada" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Zoom m_anual" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "Qu_ant a" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Pr_eferències" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Edita l'arxiu..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Obre..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Biblioteca..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Afegint llibres" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Llibres afegits" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Afegint '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Tots els llibres" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Afegeix més llibres a la biblioteca." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Obre el llibre seleccionat." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "S'han esborrat %(num)d llibres de '%(collection)s'." -msgstr[1] "S'han esborrat %(num)d llibres de '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Voleu esborrar els llibres de la biblioteca?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"S'esborraran de la biblioteca els llibres seleccionats (però els fitxers " -"originals romandran intactes). Esteu segur que voleu continuar?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Afegeix una col·lecció nova buida." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Voleu afegir una nova col·lecció?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Introduïu un nom per a la nova col·lecció." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "No s'ha pogut afegir una nova col·lecció amb el nom '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Ja existeix una col·lecció amb aquest nom." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Voleu reanomenar la col·lecció?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Introduïu un nom nou per a la col·lecció seleccionada." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "No s'ha pogut canviar el nom a '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "No s'ha pogut duplicar la col·lecció." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Arrel" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Col·loca la col·lecció '%(subcollection)s' en la col·lecció " -"'%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Afegeix llibres a '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Mou els llibres de '%(source collection)s' a '%(destination collection)s'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Cerca" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Mostra només els llibres que tenen la cadena de text especificada en el nom " -"complet. Les majúscules i minúscules no es tindran en compte." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Obre els _recents" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Obre el llibre seleccionat." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "S'han esborrat %(num)d llibres de '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nova col·lecció" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Afegeix automàticament els llibres a aquesta colecció" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Directori de les miniatures" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Arxius tar" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "Arxius RAR" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "Imatges JPEG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "Imatges PNG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Imatges PNG" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Imatges" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Imatges PNG" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "No s'ha pogut obrir %s: Tipus de fitxer desconegut." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Usa aquest color com a fons" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Memòria cau" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Afegeix una col·lecció" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Directori de les miniatures" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Directori de les miniatures" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Els arxius es desen en format ZIP." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arxiu" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arxiu" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arxiu" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Pàgina anterior" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Mostra una única imatge ampla en el mode de doble pàgina." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Mostra una única imatge en el mode de doble pàgina, si l'amplada de la " -#~ "imatge sobrepassa l'alçada. Com a resultat, les pàgines escannejades " -#~ "juntes es veuen bé (es a dir, soles) també en el mode de doble pàgina." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Color de fons dinàmic." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Modes per defecte" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Usa per defecte el mode de doble pàgina." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Usa per defecte el mode manga." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Expandeix les imatges a una mida més gran que l'original si la modalitat " -#~ "de zoom ho requereix. Si aquesta opció està inhabilitada, les imatges mai " -#~ "es mostraran a una mida més gran que l'original." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "S'esborraran de la biblioteca els llibres seleccionats (però els fitxers " -#~ "originals romandran intactes). Esteu segur que voleu continuar?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Voleu eliminar la col·lecció de la biblioteca?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "La col·lecció seleccionada s'esborrarà de la biblioteca (però els llibres " -#~ "i les subcol·leccions hi romandran). Esteu segur que voleu continuar?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "S'han esborrat %d llibres de la biblioteca." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Reanomena..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Duplica la col·lecció" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Elimina la col·lecció..." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Quant a" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix és un visualitzador d'imatges especialment dissenyat per a " -#~ "manipular còmics." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix està llicenciat sota la Llicència Pública General GNU." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Crèdits" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "No s'ha pogut trobar el descompressor RAR!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "No s'ha pogut trobar el descompressor RAR!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Necessiteu tenir instal·lada l'aplicació rar o unrar per a " -#~ "poder llegir fitxers RAR (.cbr)." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "No s'ha pogut canviar el nom a '%s'." - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Afegeix un marcador" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Edita els marcadors..." - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Esborra els marcadors..." - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Voleu esborrar tots els marcadors?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "S'esborraran tots els marcadors desats. Esteu segur que voleu continuar?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Hi han fitxers antics a l'ordinador." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "S'han trobat alguns fitxers antics (que s'usaven en versions antigues de " -#~ "Comix per a desar les preferències, la biblioteca, els marcadors, etc.). " -#~ "Si no preteneu tornar a usar les versions antigues de Comix, hauríeu " -#~ "d'esborrar-los per tal d'estalviar espai. Voleu esborrar aquests fitxers " -#~ "ara?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "No s'ha pogut llegir %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Importa" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Predeterminats" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "No s'ha pogut obrir %s: És un directori." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "No s'ha pogut llegir %s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "No s'ha pogut canviar el nom a '%s'." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "No s'ha pogut llegir %s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Elimina de la biblioteca..." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "No s'ha pogut duplicar la col·lecció." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "No s'ha pogut duplicar la col·lecció." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Elimina d'aquesta col·lecció" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Elimina de la biblioteca..." - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Mida de la portada" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Pàgina" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Expandeix les imatges menudes." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Mode de zoom per defecte" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Mostra el número de la pàgina a la miniatura." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Edita l'arxiu" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Pàgina anterior" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "_Allunya" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "Mida o_riginal" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "_Zoom manual" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Transforma" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "Mostra els _comentaris..." - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Propietats" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "Millora la _imatge..." - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Desenvolupador" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Usa una memòria cau per a accelerar la navegació." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Llegeix per avançat les imatges anterior i posterior a l'actual per tal " -#~ "d'accelerar-ne la navegació. Com que la millora en la velocitat és prou " -#~ "gran, es recomana habilitar aquesta opció, a no ser que aneu curts de " -#~ "memòria RAM." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Manteniment " - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Neteja" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Neteja de miniatures" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Les miniatures dels fitxers (com ara bé imatges o arxius de còmics) es " -#~ "desen al directori d'usuari. Moltes aplicacions diferents creen i usen " -#~ "aquestes miniatures, en ocasions tot i haver esborrat els fitxers " -#~ "originals, les miniatures hi romanen, malbaratant espai. Aquest diàleg " -#~ "permet netejar les miniatures esborrant-ne les òrfenes o antigues." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Nombre total de miniatures" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Calculant..." - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Mida total de les miniatures" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Voleu esborrar ara les miniatures òrfenes o antigues?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Esborrant les miniatures" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Nombre de miniatures esborrades" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Mida total de les miniatures esborrades" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "S'ha esborrat la miniatura de '%s'" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Manteniment de les miniatures..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/cs/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/cs/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/cs/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/cs/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3603 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-01-25 21:54+0100\n" -"Last-Translator: Jan Nekvasil \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Čte ZIP, RAR a tar archivy, stejně jako prosté obrázkové soubory." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Jméno" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Strana" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Umístění" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Komentáře" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "%s nelze načíst" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Vezměte prosím v úvahu, že na tento seznam jsou automaticky přidány pouze ty " -"soubory, které Comix v archivech rozpozná jako komentáře." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Velikost" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Odstranit z archivu" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Upravit archiv" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Obrázky" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Komentáře" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Nelze uložit nový archiv!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Původní soubory nebyly odstraněny." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Archivy jsou uchovávány jako ZIP soubory." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Vylepšit obrázek" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Jas" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Kontrast" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Sytost" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Ostrost" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Automaticky upravit kontrast." - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Automaticky upravit kontrast (světlost i tmavost) odděleně pro každý rozsah " -"barev." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Otevřít" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Uložit" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Všechny soubory" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Všechny archivy" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Archivy %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Všechny obrázky" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Obrázky %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Soubor jménem „%s“ již existuje. Přejete si jej nahradit?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Nahrazením bude přepsán původní obsah." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Přidat knihy" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "„%s“ neobsahuje žádné obrázky" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Nelze otevřít %s: Soubor neexistuje." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Nelze otevřít %s: Přístup odmítnut." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Neznámý typ souboru" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Předchozí strana" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Následující strana" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Poslední strana" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Předchozí strana" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Následující strana" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Předchozí strana" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Následující strana" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "První strana" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Poslední strana" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Následující strana" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Upravit archiv" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Předchozí strana" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Posun" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Přiblížit" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Zachovat transformaci" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Zachovat transformaci" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "Pootočit o 90° _ve směru hodinových ručiček" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Pootočit _o 180°" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Pootočit o 90° _proti směru hodinových ručiček" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Převrátit _vodorovně" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Převrátit _svisle" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Dvoustránkový režim" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Přizpůsobit na šířku" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Manga režim" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lupa" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Optimální přizpůsobení" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Přizpůsobit na šířku" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Přizpůsobit na výšku" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Přizpůsobit na _šířku" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Ruční přiblížení" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Celá obrazovka" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "_Stavová lišta" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "_Posuvníky" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Náhledy" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "_Skrýt vše" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Promítání snímků" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Soubory" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Ostatní soubory" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Zavřít" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Ukončit" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Uložit" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Archiv" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Vlastnosti" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Nastavení" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Knihovna" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Upravit záložky" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "%s nelze načíst" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "PROMÍTÁNÍ OBRÁZKŮ" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Archivy jsou uchovávány jako ZIP soubory." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Archivy jsou uchovávány jako ZIP soubory." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Komentáře" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Komentáře" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Předchozí strana" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Komentáře" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Složka náhledů" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Archivy TAR" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Upravit záložky" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Přejít" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Přednačítání" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Vzhled" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Chování" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Zobrazit" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Pozadí" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Používat tuto barvu jako pozadí" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Vždy používat vybranou barvu jako barvu pozadí." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Používat dynamickou barvu pozadí." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "Automaticky vybírat barvu hodící se k prohlíženému obrázku." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Vždy používat vybranou barvu jako barvu pozadí." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "Automaticky vybírat barvu hodící se k prohlíženému obrázku." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Zobrazit čísla stran v náhledech." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Velikost náhledu (v pixelech)" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Průhlednost" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Používat šachovnicové pozadí pro průhledné obrázky." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Používat šedé šachovnicové pozadí pro průhledné obrázky. Není-li tato volba " -"nastavena, je použito prosté bílé pozadí." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Používat chytré posouvání mezerníkem." - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Používat chytré posouvání mezerníkem. Běžně mezerník posouvá stranu pouze " -"přímo dolů (nebo nahoru, je-li přidržen Shift), s tímto nastavením je však " -"strana posouvána i do stran ve snaze následovat přirozený způsob čtení " -"komiksu." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Obracet strany při posunu přes okraj strany." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Obracet strany při posunu „mimo stranu“ šipkami nebo kolečkem myši. Obrácení " -"vyžaduje tři sousledné „kroky“ stejnou klávesou nebo kolečkem ve stejném " -"směru." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Automaticky otvírat následující archiv." - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Automaticky otevírat následující archiv ve složce po otočení poslední " -"strany, či naopak archiv předchozí při nalistování před první stranu." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Automaticky otvírat následující archiv." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Obracet po dvou stranách ve dvoustránkovém režimu." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "Obracet dvě strany místo jedné při listování ve dvoustránkovém režimu." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Soubory" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Při startu automaticky otevírat poslední prohlížený soubor." - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Automaticky otevírat při spuštění soubor otevřený při posledním ukončení " -"Comixu." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Ukládat informace o nedávno otevřených souborech." - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Použít zobrazení přes celou obrazovku jako výchozí." - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Automaticky schovávat lištu nástrojů při zobrazení přes celou obrazovku." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Přizpůsobit na šířku" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Přizpůsobit na šířku" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Přizpůsobit na _šířku" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Promítání snímků" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Prodleva při promítání obrázků (ve vteřinách)" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Prodleva při promítání obrázků (ve vteřinách)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Automaticky otvírat následující archiv." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Orientace" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "Automaticky upravovat orientaci obrázků podle jejich metadat." - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Automaticky pootáčet obrázky pokud jejich metadata obsahují údaj o " -"orientaci, jako např. značku Exif." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Škálování obrázku." - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Manga režim" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Archivy TAR" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Ukládat náhledy otevřených souborů." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Ukládat náhledy pro otevírané soubory v souladu se specifikací freedesktop." -"org. Tyto náhledy jsou používány mnoha jinými aplikacemi, jako například " -"většinou správců souborů." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lupa" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Velikost lupy (v pixelech)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Nastavit velikost lupy, čtverce o velikosti strany daného počtu pixelů." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Úroveň zvětšení" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Nastavit úroveň zvětšení lupy." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Přípony komentářů" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Vylepšit obrázek" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Přizpůsobit na šířku" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Přizpůsobit na výšku" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Přidávat údaje o všech souborech otevíraných v Comixu na obecný seznam " -"nedávno používaných souborů." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Ukládat informace o nedávno otevřených souborech." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "Zacházet se soubory s jednou z těchto přípon v názvu jako s komentáři." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archiv" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Obrázek" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d stránek" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d komentářů" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Použitý" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Změněný" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Oprávnění" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Vlastník" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Promítání snímků" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Archiv ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Archiv RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Archiv tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Archiv tar komprimovaný pomocí gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Archiv tar komprimovaný pomocí bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Archiv tar komprimovaný pomocí gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Překlad do zjednodušené čínštiny" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Překlad do španělštiny" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Překlad do brazilské portugalštiny" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Překlad do němčiny a vytvářeč náhledů pro Nautilus" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Překlad do perštiny" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Překlad do italštiny" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Překlad do holandštiny" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Překlad do francouzštiny" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Překlad do polštiny" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Překlad do polštiny" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Překlad do řečtiny" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Překlad do katalánštiny" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Překlad do tradiční čínštiny" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Překlad do japonštiny" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Překlad do maďarštiny" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Překlad do maďarštiny" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Překlad do chorvatštiny" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Překlad do korejštiny" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Překlad do perštiny" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Překlad do indonéštiny" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Překlad do češtiny" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Překlad do italštiny" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Překlad do řečtiny" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Překlad do italštiny" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Ikony" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Kopie)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Následující strana" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Předchozí strana" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_rvní strana" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "P_oslední strana" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Zavřít" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Ukončit" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Pootočit o 90° _ve směru hodinových ručiček" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Pootočit _o 180°" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Pootočit o 90° _proti směru hodinových ručiček" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Převrátit _vodorovně" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Převrátit _svisle" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Záložky" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Lišty nástrojů" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Upravit" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Ot_evřít nedávný" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Soubor" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Zobrazit" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Lišta nástrojů" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Nápověda" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Celá obrazovka" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Dvoustránkový režim" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Lišta nástrojů" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Lišta _nabídky" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "_Stavová lišta" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "_Posuvníky" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Náhledy" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Skrýt vše" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga režim" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Zachovat transformaci" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "_Spustit promítání obrázků" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lupa" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Optimální přiblížení" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Přizpůsobit na _šířku" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Přizpůsobit na _výšku" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Přizpůsobit na _šířku" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Režim ručního _přiblížení" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_O programu" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Nastavení" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "Upravit _archiv" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Otevřít…" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Knihovna" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Přidávají se knihy" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Přidané knihy" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Přidává se „%s“…" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Kopie)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Všechny knihy" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Přidat další knihy do knihovny." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Otevřít vybranou knihu." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Odstraněno %(num)d knih ze sbírky „%(collection)s“." -msgstr[1] "Odstraněno %(num)d knih ze sbírky „%(collection)s“." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Odstranit knihy z knihovny?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Vybrané knihy budou tímto odstraněny z knihovny (přičemž původní soubory " -"zůstanou netknuty). Jste si jisti, že chcete pokračovat?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Přidat novou prázdnou sbírku." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Přidat novou sbírku?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Prosím vložte jméno nové sbírky." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Nelze přidat novou sbírku jménem „%s“." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Sbírka tohoto jména již existuje." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Přejmenovat sbírku?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Prosím vložte nové jméno vybrané sbírky." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Nelze změnit jméno na „%s“." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Sbírku nelze zduplikovat." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Kořen" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "Vložit sbírku „%(subcollection)s“ do sbírky „%(supercollection)s“." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Přidat knihy do „%s“." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Přesunout knihy z „%(source collection)s“ do „%(destination collection)s“." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Hledat" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Zobrazit pouze ty knihy, jejichž celá cesta obsahuje daný výraz. Vyhledávání " -"nerozlišuje velká a malá písmena." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Ot_evřít nedávný" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Otevřít vybranou knihu." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Odstraněno %(num)d knih ze sbírky „%(collection)s“." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nová sbírka" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Automaticky přidat knihy do této sbírky" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Složka náhledů" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Archivy TAR" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "Archivy RAR" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "Obrázky JPEG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "Obrázky PNG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Obrázky PNG" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Obrázky" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Obrázky PNG" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Nelze otevřít %s: Neznámý typ souboru." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Používat tuto barvu jako pozadí" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Přednačítání" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Přidat sbírku" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Složka náhledů" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Složka náhledů" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Archivy jsou uchovávány jako ZIP soubory." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Archiv" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Archiv" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Archiv" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Předchozí strana" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Zobrazovat pouze jeden široký obrázek ve dvoustránkovém režimu." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Zobrazit pouze jeden obrázek ve dvoustránkovém režimu, přesáhne-li šířka " -#~ "obrázku jeho výšku. Ve výsledku jsou takto zobrazovány vcelku naskenované " -#~ "dvoustrany správně (t.j. jako jediný obrázek) i ve dvoustránkovém režimu." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Používat dynamickou barvu pozadí." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Výchozí režimy" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Použít dvoustránkový režim jako výchozí." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Použít manga režim jako výchozí." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Roztáhnout obrázky na větší než původní velikost, pokud to daný režim " -#~ "přiblížení vyžaduje. Není-li tato volba nastavena, obrázky nejsou nikdy " -#~ "zvětšovány přes svou původní velikost." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Vybrané knihy budou tímto odstraněny z knihovny (přičemž původní soubory " -#~ "zůstanou netknuty). Jste si jisti, že chcete pokračovat?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Odstranit sbírku z knihovny?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Vybraná sbírka bude tímto odstraněna z knihovny (přičemž knihy a " -#~ "podsbírky v ní zůstanou zachovány). Jste si jisti, že chcete pokračovat?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Odstraněno %d knih z knihovny." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Přejmenovat…" - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Zduplikovat sbírku" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Odstranit sbírku…" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "O programu" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "Comix je prohlížeč obrázků obzvláště uzpůsobený k práci s komiksy." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix je licencován pod GNU obecnou veřejnou licencí." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Poděkování" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Nelze nalézt rozbalovač souborů RAR!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Nelze nalézt rozbalovač souborů RAR!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Ke čtení RAR (.cbr) souborů je třeba mít nejprve nainstalovaný program " -#~ "rar nebo unrar." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Nelze změnit jméno na „%s“." - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Přidat záložku" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Upravit záložky…" - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Vymazat záložky…" - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Vymazat všechny záložky?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Všechny uložené záložky budou tímto odstraněny. Jste si jisti, že chcete " -#~ "pokračovat?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Na vašem počítači byly nalezeny zastaralé soubory." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Na vašem počítači byly nalezeny soubory vytvořené starší verzí Comixu " -#~ "(uživatelské nastavení, knihovna, záložky atd.). Pokud neplánujete další " -#~ "používání některé ze starších verzí, je možno odstraněním těchto souborů " -#~ "uvolnit trochu místa na disku. Přejete si tyto soubory nyní odstranit?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "%s nelze načíst" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Importovat" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Výchozí hodnoty" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Nelze otevřít %s: Je to složka" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "%s nelze načíst" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Nelze změnit jméno na „%s“." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "%s nelze načíst" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Odstranit z knihovny…" - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Sbírku nelze zduplikovat." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Sbírku nelze zduplikovat." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Odstranit z této sbírky" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Odstranit z knihovny…" - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Velikost přebalu" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Strana" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Roztáhnout malé obrázky." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Výchozí úroveň přiblížení" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Zobrazit čísla stran v náhledech." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Upravit archiv" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Předchozí strana" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "_Oddálit" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "Původní _velikost" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "_Ruční přiblížení" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Transformace" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "_Prohlédnout komentáře…" - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Vlastnosti" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "_Vylepšit obrázek" - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Vývojář" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Používat přednačítání pro zrychlení prohlížení." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Přednačítat následující obrázky pro urychlení prohlížení. Vzhledem k " -#~ "výraznému zlepšení rychlosti je doporučeno povolit tuto volbu pokud " -#~ "nehrozí nedostatek volné operační paměti." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Správa náhledů" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Pročištění" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Pročistit náhledy" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Náhledy pro soubory (jako jsou třeba obrázky a archivy komiksů) jsou " -#~ "ukládány do vaší domovské složky. Mnoho různých aplikací používá a " -#~ "vytváří tyto náhledy, občas však náhledy zůstanou na disku i po " -#~ "odstranění původních souborů, čím zbytečně zabírají místo. Tento nástroj " -#~ "umožňuje pročistit vaše uložené náhledy odstraněním těch osiřelých a " -#~ "zastaralých." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Celkový počet náhledů" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Přepočítává se…" - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Celková velikost náhledů" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Přejete si nyní pročistit osiřelé a zastaralé náhledy?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Odstraňují se náhledy" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Počet odstraněných náhledů" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Celková velikost odstraněných náhledů" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Odstraněn náhled pro „%s“" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Správa náhledů" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/de/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/de/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/de/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/de/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3061 +0,0 @@ -# Translation of MComix to German -# Christoph Wolk , 2006. -# Chris Leick , 2009. -# Moritz Brunner , 2011. -# -msgid "" -msgstr "" -"Project-Id-Version: MComix 0.98\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2012-04-03 16:41+GMT\n" -"Last-Translator: Moritz Brunner \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Language: de_DE\n" -"X-Source-Language: en\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" -"%s ist ein Bildbetrachter, der speziell für den Umgang mit Comicbüchern " -"entworfen wurde." - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Es liest ZIP-, RAR- und Tar-Archive ebenso wie einfache Bilddateien." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s ist unter der \"GNU General Public License\" lizensiert." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "Eine Kopie dieser Lizenz kann unter %s bezogen werden" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Nicht unterstütztes Archiv-Format: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Extraktions-Fehler: %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Konnte Archiv \"%s\" nicht erstellen" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Konnte Datei %(sourcefile)s nicht zum Archiv %(archivefile)s hinzufügen, " -"breche ab..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! %s kann nicht gelesen werden" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Lesezeichen-Speicher %s kann nicht gelesen werden" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "Existierendes Lesezeichen auf Seite %s ersetzen?" -msgstr[1] "Existierende Lesezeichen auf den Seiten %s ersetzen?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"Das geöffnete Buch enthält bereits markierte Seiten. Wollen Sie diese mit " -"einem neuen Lesezeichen auf Seite %d ersetzen?" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"\"Nein\" erzeugt ein neues Lesezeichen, ohne die anderen Lesezeichen zu " -"beeinflussen." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Lesezeichen bearbeiten" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Typ" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Name" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Seite" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Ort" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "Hinzugefügt" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "_Lesezeichen hinzufügen" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "Lesezeichen _bearbeiten..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! Callback-Funktion %(function)r fehlgeschlagen: %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Kommentare" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "%s kann nicht gelesen werden" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Bitte beachten Sie, dass nur Dateien in Archiven automatisch zu dieser Liste " -"hinzugefügt werden, die MComix als Kommentare erkennt." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Größe" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Aus Archiv entfernen" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Archiv bearbeiten" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_Importieren" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Bilder" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "Kommentare" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Das neue Archiv konnte nicht gespeichert werden!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Die Originaldateien wurden nicht entfernt." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Archive werden als ZIP-Dateien gespeichert." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Bild aufbessern" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Auf Voreinstellung zurücksetzen." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "Die ausgewählten Werte als Standard für zukünftige Dateien verwenden." - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_Helligkeit:" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_Kontrast:" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "S_ättigung:" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "S_chärfe:" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "Kontrast _automatisch einstellen" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Kontrast automatisch einstellen (sowohl Helligkeit, als auch Dunkelheit) " -"getrennt für jedes Farbband." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Öffnen" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Speichern" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Alle Dateien" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "Alle Archive" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "%s-Archive" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Alle Bilder" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "%s-Bilder" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" -"Eine Datei mit dem Namen »%s« existiert bereits. Möchten Sie sie ersetzen?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Durch Ersetzen geht ihr alter Inhalt verloren." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Bücher hinzufügen" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Keine Bilder in »%s«" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "%s kann nicht geöffnet werden: Datei nicht gefunden." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "%s kann nicht geöffnet werden: Zugriff verweigert." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "Auf Seite %d weiterlesen?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"Sie haben zuletzt am %(date)s um %(time)s hier aufgehört zu lesen. Wenn Sie " -"\"Ja\" wählen, wird Seite %(page)d geöffnet. Ansonsten wird die erste Seite " -"geladen." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Korrupte Options-Datei \"%s\", wird gelöscht..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Ungültiger Pfad: '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! Icon %s kann nicht geladen werden" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Unbekannter Dateityp" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Vorherige Seite" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "Navigation" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Nächste Seite" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Zehn Seiten zurück " - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Zehn Seiten vor" - -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "Vorherige Seite (dynamisch)" - -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "Nächste Seite (dynamisch)" - -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "Vorherige Seite (immer einzeln)" - -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "Nächste Seite (immer einzeln)" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Erste Seite" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Letzte Seite" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Gehe zu Seite" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Nächstes Archiv" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Vorheriges Archiv" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Nächstes Verzeichnis" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Vorheriges Verzeichnis" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "Nach links unten rollen" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Rollen" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "Nach unten zur Mitte rollen" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "Nach unten rechts rollen" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "Zur Mitte links rollen" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "Zentrieren" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "Zur Mitte rechts rollen" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "Nach links oben rollen" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "Nach oben zur Mitte rollen" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "Nach oben rechts rollen" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "Nach unten rollen" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "Nach oben rollen" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "Nach rechts rollen" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "Nach links rollen" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "Intelligent nach oben rollen" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "Intelligent nach unten rollen" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Vergrößern" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "Vergrößern" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Verkleinern" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Orginalgröße" - -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "Veränderung behalten" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "Bild-Veränderung" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "90 Grad im Uhrzeigersinn drehen" - -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "180 Grad drehen" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "90 Grad gegen den Uhrzeigersinn drehen" - -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "Horizontal spiegeln" - -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "Vertikal spiegeln" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "Niemals automatisch rotieren" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "Automatisch nach Breite rotieren" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "Automatisch nach Höhe rotieren" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Doppelseitiger Modus" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "Ansicht" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Manga-Modus" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "Intelligentes Rollen umkehren" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lupe" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Kleine Bilder strecken" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Am besten passender Modus" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Modus mit angepasster Breite" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Modus mit angepasster Höhe" - -# Größe is spelled with two s in order to use s as accelerator key. -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "Modus mit fester Größe" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Manueller Vergrößerungsmodus" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Vollbildmodus verlassen" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Benutzeroberfläche" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "Informationsbereich anzeigen" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "Minimieren" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Vollbild" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "Zeige/verstecke Werkzeugleiste" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "Zeige/verstecke Menübar" - -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "Zeige/verstecke Statusleiste" - -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "Zeige/verstecke Rollleisten" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Vorschaubilder" - -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "Zeige/verstecke alles" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Diaschau starten" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "Löschen" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "Datei" - -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "Aktualisieren" - -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "Schließen" - -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "Beenden" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "Speichern und beenden" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "Speichern unter" - -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "Archiv-Kommentare" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Eigenschaften" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Einstellungen" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Bibliothek" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "Externes Programm ausführen" - -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "Externe Programme" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "Taste für \"%(action)s\" überschreibt andere Aktion mit selber Taste." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "Konnte Tastaturbelegung nicht laden: %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "Taste %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! Weder pysqlite2 noch sqlite3 konnten gefunden werden." - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! Konnte %s nicht entfernen" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "DIASCHAU" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Seite speichern als" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "\"%s\" löschen?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "Die Datei wird von Ihrer Festplatte gelöscht." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Nicht noch einmal fragen." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "\"%s\" ist in Archiven deaktiviert." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "Konnte Programm %(cmdlabel)s nicht ausführen: %(exception)s " - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "Befehlszeile ist leer." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" -"Unvollständige Escape-Sequenz. Benutze '%%', um das '%'-Zeichen zu erhalten." - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" -"Anführungszeichen nicht geschlossen. Benutze %\", um ein Anführungszeichen " -"im Befehl zu erhalten." - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "Datei-Variablen können nur für Dateien verwendet werden." - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "Variablen für Archive können nur in Archiven verwendet werden." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "Ungültige Escape-Sequenz: %%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "Externe Programme bearbeiten" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "_Trennzeile hinzufügen" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "Befehl _ausführen" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "Das ist ein Pseudo-Befehl für eine Trennzeile." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "\"%s\" hat kein gültiges Arbeitsverzeichnis." - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "\"%s\" scheint keine gültige ausführbare Datei zu haben." - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "Programm-Bezeichnung" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "Vorschau:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"Die Dokumentation für externe Befehle enthält eine Liste " -"aller Variablen und Hinweise zur Benutzung." - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "Bezeichnung" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "Befehl" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "Arbeitsverzeichnis" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "In Archiven deaktiviert" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "Änderungen an Befehlen speichern?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"Sie haben Änderung an der Liste der externen Befehle vorgenommen, die noch " -"nicht gespeichert wurden. Verwenden Sie \"Ja\", um alle Änderungen zu " -"speichern, und \"Nein\", um sie zu verwerfen." - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "_Externe Programme bearbeiten" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Gehe" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "_Abbrechen" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " von %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Aussehen" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Verhalten" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Anzeige" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Erweitert" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "Tastenkürzel" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Sprache (erfordert Neustart):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "Escape-Taste beendet das Programm" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"Wenn aktiv, wird das Programm durch Drücken der Escape-Taste beendet. " -"Ansonsten wird nur der Vollbildmodus verlassen." - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Hintergrund" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Farbe als Hintergrund verwenden:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Diese ausgewählte Farbe immer als Hintergrundfarbe verwenden." - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Dynamische Hintergrundfarbe verwenden" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Automatisch eine Hintergrundfarbe wählen, die zum angeschauten Bild passt." - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "" -"Diese ausgewählte Farbe immer als Vorschaubild-Hintergrundfarbe verwenden." - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Automatisch eine Hintergrundfarbe wählen, die zum angeschauten Vorschau-Bild " -"passt." - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Seitennummer auf Vorschaubildern anzeigen" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Archiv-Vorschaubild als Anwendungsicon verwenden" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"Wenn diese Option aktiviert ist, wird anstelle des normalen Icons die erste " -"Seite eines Buches als Anwendungsicon verwendet." - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Vorschaubildergröße (in Pixeln):" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparenz" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Karierten Hintergrund für transparente Bilder verwenden" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Einen grauen, karierten Hintergrund für transparente Bilder benutzen. Wenn " -"diese Einstellung nicht gesetzt ist, ist der Hintergrund stattdessen einfach " -"weiß." - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Intelligentes Rollen benutzen" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Wenn diese Einstellung aktiv ist, rollen die Leertaste und das Mausrad nicht " -"nur nach unten oder oben, sondern auch seitwärts. Damit wird versucht, dem " -"natürlichen Lesefluss eines Comicbuches zu folgen." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Seiten beim Rollen über den Rand der Seite hinaus umblättern" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Seiten umblättern, wenn mit dem Mausrad oder den Pfeiltasten »von der Seite« " -"herunter gerollt wird. Es nimmt drei aufeinander folgende »Schritte« mit dem " -"Mausrad oder den Pfeiltasten auf, um die Seiten umzublättern." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Automatisch das nächste Archiv öffnen" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Automatisch das nächste Archiv im Verzeichnis öffnen, wenn nach der letzten " -"Seite umgeblättert wird oder das vorherige Archiv, wenn über die erste Seite " -"geblättert wird." - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Automatisch nächstes Verzeichnis öffnen" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Automatisch erste Datei in benachbartem Verzeichnis öffnen, wenn nach der " -"letzten Seite in der letzten Datei eines Verzeichnisses umgeblättert wird. " -"Wenn in der ersten Datei eines Verzeichnisses nach vorne geblättert wird, " -"wird das vorherige Verzeichnis geöffnet." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "Anzahl von Pixeln, um die bei Knopfdruck gescrollt wird:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" -"Setzt die Anzahl von Pixeln, um die eine Seite gescrollt wird, wenn die " -"Pfeiltasten benutzt werden." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Anzahl von Pixeln, um die bei Mausrad-Bewegung gescrollt wird:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"Setzt die Anzahl von Pixeln, um die eine Seite gescrollt wird, wenn das " -"Mausrad benutzt werden." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" -"Anteil an Seite, um den bei Druck der Leertaste gescrollt wird (in Prozent):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" -"Setzt den prozentualen Anteil, um den eine Seite nach unten oder oben " -"gerollt wird, wenn die Leertaste betätigt wird." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Anzahl von \"Schritten\", bevor Seite gewechselt wird:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Setzt die Anzahl von \"Schritten\", die notwendig sind, um auf die nächste " -"oder vorhergehende Seite zu wechseln. Weniger Schritte erlauben schnellen " -"Seitenwechsel, aber können dazu führen, dass ein Seitenwechsel aus Versehen " -"zu früh ausgelöst wird." - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "Zwei Seiten im doppelseitigen Modus umblättern" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Jedesmal zwei, anstatt eine Seite umblättern, wenn im doppelseitigen Modus " -"umgeblättert wird." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "Nur eine Seite zeigen, wo angebracht:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Dateien" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "Beim Starten automatisch die letzte angesehene Datei öffnen" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Automatisch beim Starten die letzte Datei öffnen, die offen war, als MComix " -"das letzte Mal geschlossen wurde." - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Zuletzt geöffnete Dateien speichern:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Als Vorgabe Vollbild benutzen" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Bei Vollbild automatisch alle Werkzeugleisten ausblenden" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "Modus mit fester Größe" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "Nach Breite oder Höhe anpassen:" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "Feste Größe für diesen Modus:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Diaschau" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Diaschauverzögerung (in Sekunden):" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Diaschau-Scrolling (in Pixel):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Gibt die Anzahl von Pixel an, um die im Diaschau-Modus gescrollt wird. Ein " -"positiver Wert scrollt nach vorne, ein negativer Wert scrollt zurück. Ein " -"Wert von 0 führt dazu, dass immer sofort zur nächsten Seite gewechselt wird." - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Automatisch das nächste Archiv während einer Diaschau öffnen" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "Öffnet automatisch das nächste Archiv im Diaschau-Modus." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Drehung" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "Bilder automatisch gemäß ihrer Metadaten drehen" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Bilder automatisch drehen, wenn die Ausrichtung in den Metadaten, wie zum " -"Beispiel einem Exif-Etikett des Bildes, angegeben wurde." - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Bildqualität" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Skalierungs-Modus" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Datei-Reihenfolge" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "Sortiere Dateien und Verzeichnisse nach:" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "Sortiere Archive nach:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "Entpacken und Zwischenspeicher" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "Maximale Anzahl gleichzeitig gestarteter Entpacker:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" -"Setzt die Anzahl maximal gleichzeitig gestarteter Threads zum Entpacken von " -"Dateiformaten, die dies unterstützen." - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "Vorschaubilder für geöffnete Dateien speichern" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Vorschaubilder für geöffnete Dateien gemäß der Spezifikation von freedesktop." -"org speichern. Diese Vorschaubilder werden mit vielen anderen Anwendungen, " -"zumeist Dateimanagern, gemeinsam benutzt." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Maximale Anzahl von Seiten im Zwischenspeicher:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Maximale Anzahl von Seiten im Zwischenspeicher. Ein Wert von -1 hält das " -"komplette Archiv im Zwischenspeicher." - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lupe" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "Lupengröße (in Pixeln):" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Die Größe der Lupe setzen. Es ist ein Quadrat mit einer Seite von dieser " -"Anzahl Pixeln." - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Vergrößerungsfaktor:" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Den Vergrößerungsfaktor der Lupe setzen." - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "Kommentarerweiterungen:" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Bild aufbessern" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "_Tasten zurücksetzen" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "Setzt alle Tastenbelegungen auf Standard-Werte zurück." - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "_Dialogantworten löschen" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" -"Löscht alle Dialogantworten, bei denen Sie vorher angegeben hatten, nicht " -"mehr gefragt werden zu wollen." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Automatisch (Voreinstellung)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Niemals" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "Nur für Titelblätter" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "Nur für breite Bilder" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Immer" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"Wenn die erste Seite in einem Archiv angezeigt wird, oder ein Bild breiter " -"als hoch ist, wird nur eine einzelne Seite dargestellt." - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "Angepasste Breite" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "Angepasste Höhe" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "Keine Sortierung" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Dateiname" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Dateigröße" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "Zuletzt geändert" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "Aufsteigend" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "Absteigend" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"Dateien werden nach dem hier ausgewählten Merkmal sortiert geöffnet und " -"angezeigt. Diese Option hat keinen Einfluss auf die Sortierung von Dateien " -"in Archiven." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "Natürliche Sortierung" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "Buchstäbliche Sortierung" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"Dateien in Archiven werden nach der hier angegebenen Sortierung angezeigt. " -"Natürliche Sortierung sortiert nummerierte Dateien anhand ihrer natürlichen " -"Reihenfolge, z.B. 1, 2, ..., 10. Buchstäbliche Sortierung benutzt die " -"Standard-C-Reihenfolge, also 1, 2, 34, 5." - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Die zuletzt innerhalb von MComix geöffneten Dateien merken, um sie später " -"über das Menü schnell wieder öffnen zu können." - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "Liste zuletzt geöffneter Dateien löschen?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"Dies entfernt alle Einträge aus dem \"Zuletzt geöffnet\"-Menü, und löscht " -"Informationen zu zuletzt gelesenen Seiten." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "Normal (schnell)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilinear" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "Hyperbolisch (langsam)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"Ändert Bild-Skalierungs-Modus. Langsamere Algorithmen resultieren in " -"besserer Bildqualität, aber längeren Ladezeiten." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "Normal" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Alle in den Archiven gefundenen Dateien, die eine dieser Erweiterungen " -"haben, werden als Kommentare behandelt." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archiv" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Bild" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d Seiten" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d Kommentare" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Zugegriffen" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Geändert" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Rechte" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Eigentümer" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[OPTION...] [PFAD]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Betrachter für Bilder und Comicbuch-Archive." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Zeigt diesen Hilfetext an." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Startet die Anwendung im Diaschau-Modus." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Zeigt die Bibliothek beim Starten an." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Zeigt die Versionsnummer an und beendet das Programm." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Vorgabemodi" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Startet die Anwendung im Vollbild-Modus." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Startet die Anwendung im Manga-Modus." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Startet die Anwendung im Doppelseiten-Modus." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Zoom-Modi" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "Startet die Anwendung im automatisch angepassten Zoom-Modus." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "Startet die Anwendung im Zoom-Modus mit angepasster Breite." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "Startet die Anwendung im Zoom-Modus mit angepasster Höhe." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Debug-Einstellungen" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "Setzt den gewünschten Log-Level." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" -"Sie haben nicht die notwendigen Versionen von GTK+ und PyGTK installiert." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "Keine PyGTK-Version konnte auf Ihrem System gefunden werden." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "Dieser Fehler kann durch fehlende GTK+-Bibliotheken verursacht werden." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "Sie haben nicht die notwendigen Version der Python Imaging" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "Library (PIL) installiert." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "Installierte PIL-Version ist: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "Benötigte PIL-Version ist: 1.1.5 oder höher" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "Python Imaging Library (PIL) 1.1.5 oder höher wird benötigt." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"Keine Python Image Library-Version konnte auf Ihrem System gefunden werden." - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Diaschau anhalten" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "Seitennummer anzeigen" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "Dateinummer anzeigen" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "Auflösung anzeigen" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "Pfad anzeigen" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "Dateiname anzeigen" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Dateiname anzeigen" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP-Archiv" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR-Archiv" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar-Archiv" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Gzip-komprimiertes Tar-Archiv" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Bzip2-komprimiertes Tar-Archiv" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Gzip-komprimiertes Tar-Archiv" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "PDF-Dokument" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7zip-Archiv" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA-Archiv" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Ursprüngliche Entwicklung von Comix" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Entwickler von MComix" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Vereinfachte chinesische Übersetzung" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Spanische Übersetzung" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Portugiesische Übersetzung" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Deutsche Übersetzung und Vorschaubildersteller für Nautilus" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "Deutsche Übersetzung" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Italienische Übersetzung" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Holländische Übersetzung" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Französische Übersetzung" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "Polnische Übersetzung" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Polnische Übersetzung" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Griechische Übersetzung" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Katalanische Übersetzung" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traditionell-chinesische Übersetzung" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Japanische Übersetzung" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Ungarische Übersetzung" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Russische Übersetzung" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Kroatische Übersetzung" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Koreanische Übersetzung" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Persische Übersetzung" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Indonesische Übersetzung" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Tschechische Übersetzung" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Ukrainische Übersetzung" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "Gallische Übersetzung" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "Schwedische Übersetzung" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "Hebräische Übersetzung" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Italienische Übersetzung" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Symbol-Design" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! Konnte Vorschaubild \"%(thumbpath)s\" nicht speichern: %(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "Kopieren" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Kopiert die aktuelle Seite in die Zwischenablage." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_Löschen" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Löscht die aktuelle Seite oder das Archiv von der Festplatte." - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Nächste Seite" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Vorherige Seite" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Erste Seite" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Letzte Seite" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Gehe zu Seite..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Gehe zu Seite..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "_Aktualisieren" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Läd die aktuell geöffneten Dateien oder das Archiv neu." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Nächstes _Archiv" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Vorheriges A_rchiv" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "_Heranzoomen" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "_Wegzoomen" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "_Normale Größe" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Mi_nimieren" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "S_chließen" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "Schließt alle offenen Dateien." - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Beenden" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "_Speichern und beenden" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" -"Beendet das Programm und stellt die aktuell geöffnete Datei beim nächsten " -"Start wieder her." - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "90 Grad im _Uhrzeigersinn drehen" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "180 Grad _drehen" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "90 Grad gegen den Uhr_zeigersinn drehen" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "_Horizontal spiegeln" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "_Vertikal spiegeln" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "Speichern _unter" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "Ver_größern" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "_Zuletzt geöffnet" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "Lesezei_chen" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Werkzeugleisten" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "Bea_rbeiten" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "Ö_ffnen mit" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "Date_i" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "Ansic_ht" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_Werkzeuge" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Hilfe" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "Bild ändern" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "_Automatisch rotieren" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "...wenn Breite Höhe übersteigt" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "...wenn Höhe Breite übersteigt" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Vollbild" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Vollbild-Modus" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Doppelseitiger Modus" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Werkzeugleiste" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Menüleiste" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "St_atusleiste" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Ro_llleiste" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Vorschaubilder" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Alle verstec_ken" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga-Modus" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "Richtung des intelligenten Rollens umkehren." - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Veränderung _behalten" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" -"Behält die derzeit ausgewählten Transformationen für die nächsten Seiten bei." - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "Diaschau _starten" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lupe" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" -"Streckt kleine Bilder abhängig vom Zoom-Modus so, dass sie den Bildschirm " -"ausfüllen." - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Am besten _passender Modus" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Modus mit angepasster _Breite" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Modus mit angepasster _Höhe" - -# Größe is spelled with two s in order to use s as accelerator key. -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "Modus mit fester Grö_sse" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "M_anueller Vergrößerungsmodus" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Über" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "_Kommentare..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Eigenschaf_ten" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Einstell_ungen" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "Ar_chive bearbeiten ..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "Öffnet den Archiv-Editor." - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "Ö_ffnen ..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "Bild aufbesser_n..." - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "Bibliothe_k ..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" -"! Arbeiter-Thread in Bearbeitung von %(function)r fehlgeschlagen: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "Das Archiv ist passwortgeschützt:" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"Die entpackte Größe von %(filename)s ist %(actual_size)d Bytes, sollte aber " -"%(expected_size)d Bytes sein. Das Archiv könnte korrupt oder in einem nicht " -"unterstützten Format sein." - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Bücher hinzufügen" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Hinzugefügte Bücher:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Füge »%s« hinzu ..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! Nicht vorhandenes Buch #%i" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! Konnte Deckblatt für Buch \"%s\" nicht laden" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! Buch %s konnte nicht zur Bibliothek hinzugefügt werden" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! Sammlung \"%s\" konnte nicht hinzugefügt werden" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "! Konnte Buch %(book)s nicht zur Sammlung %(collection)s hinzufügen" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! Sammlung konnte nicht zu \"%s\" umbenannt werden" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Kopieren)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "Konnte Bibliothek-Datenbankversion nicht bestimmen!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "Aktualisiere Bibliothek-Datenbankversion von %(from)d auf %(to)d." - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "Zuletzt geöffnet" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Alle Bücher" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "Bücher in Bibliothek" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "Ö_ffnen" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "Öffnet die ausgewählten Bücher zum Lesen." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "Öffnen _ohne Bibliothek zu schließen" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "Öffnet die ausgewählten Bücher, aber lässt die Bibliothek offen." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "_Hinzufügen..." - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Weitere Bücher zu der Bibliothek hinzufügen." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Aus _Sammlung entfernen" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "Entfernt die ausgewählten Bücher von der aktuellen Sammlung." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Aus _Bibliothek entfernen" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "Entfernt die ausgewählten Bücher komplett aus der Bibliothek." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "Aus Bibliothek entfernen und _löschen" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "Löscht die ausgewählten Bücher von der Festplatte." - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "Kopiert den Dateipfad des ausgewählten Buches in die Zwischenablage." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_Sortierung" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "Ändert die Sortierung der Bibliothek." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "Deckblatt_größe" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "Ändert die Deckblattgröße der Bücher." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "Buch-Name" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "Voller Pfad" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "Hinzufüge-Datum" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "Riesig" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "Groß" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "Klein" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "Winzig" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "Benutzerdefiniert..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "Deckblattgröße ändern" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "%(num)d Buch wurde aus »%(collection)s« entfernt." -msgstr[1] "%(num)d Bücher wurden aus »%(collection)s« entfernt." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "%d Buch wurde aus der Bibliothek entfernt." -msgstr[1] "%d Bücher wurden aus der Bibliothek entfernt." - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Bücher aus der Bibliothek entfernen?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Die ausgewählten Bücher werden aus der Bibliothek entfernt und die " -"Originaldatei wird gelöscht. Sind Sie sicher, dass Sie fortfahren möchten?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "Sammlungen in Bibliothek" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "Neu" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Eine neue, leere Sammlung hinzufügen." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "_Umbenennen" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "Benennt die ausgewählte Sammlung um." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "_Duplizieren" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "Erstellt eine Kopie der ausgewählten Sammlung." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_Säubern" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "Entfernt Bücher aus der Bibliothek, die nicht mehr existieren." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "_Entfernen" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "Löscht die ausgewählte Sammlung." - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Neue Sammlung hinzufügen?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Bitte geben Sie einen Namen für die neue Sammlung ein." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Eine neue Sammlung mit Namen »%s« konnte nicht hinzugefügt werden." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Eine Sammlung mit diesem Namen existiert bereits." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Sammlung umbenennen?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Bitte geben Sie einen neuen Namen für die ausgewählte Sammlung ein." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Name konnte nicht zu »%s« geändert werden." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Sammlung konnte nicht dupliziert werden." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Wurzel" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Die Sammlung »%(subcollection)s« in die Sammlung »%(supercollection)s« " -"stellen." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Bücher zu »%s« hinzufügen." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Bücher von »%(source collection)s« nach »%(destination collection)s« " -"verschieben." - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "_Suche:" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Nur die Bücher anzeigen, die die angegebene Zeichenkette in ihrem " -"vollständigen Pfad haben. Die Suche ist unabhängig von Groß- und " -"Kleinschreibung." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "_Verzeichnisse" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "Öffnet den Editor zum Verwalten überwachter Verzeichnisse." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Ö_ffnen mit" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Das ausgewählte Buch öffnen." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "Gelesen am %(date)s, um %(time)s Uhr " - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "Suche nach neuen Büchern..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" -"Neues Buch '%(bookname)s' wurde aus dem Verzeichnis '%(directory)s' " -"hinzugefügt." - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" -"Es wurden %(count)d neue Bücher aus dem Verzeichnis '%(directory)s' " -"hinzugefügt." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "Keine neuen Bücher im Verzeichnis '%s' gefunden." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" -"! Sie benötigen ein sqlite-Modul, um die Bibliothek benutzen zu können." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "Überwachte Verzeichnisse" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "Jetzt _suchen" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Verzeichnis" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Sammlung" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Mit Unterverzeichnissen" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "_Hinzufügen" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "Aut_omatisch nach Büchern suchen, wenn Bibliothek geöffnet wird" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "Installierte GTK+-Version ist: %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "Benötigte GTK+-Version ist: 2.12.0 oder höher\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "Installierte PyGTK-Version ist: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "Benötigte PyGTK-Version ist: 2.12.0 oder höher" - -#~ msgid "Invalid working directory." -#~ msgstr "Ungültiges Arbeitsverzeichnis." - -#~ msgid "ZIP archives" -#~ msgstr "ZIP-Archive" - -#~ msgid "Tar archives" -#~ msgstr "Tar-Archive" - -#~ msgid "RAR archives" -#~ msgstr "RAR-Archive" - -#~ msgid "LHA archives" -#~ msgstr "LHA-Archive" - -#~ msgid "JPEG images" -#~ msgstr "JPEG-Bilder" - -#~ msgid "PNG images" -#~ msgstr "PNG-Bilder" - -#~ msgid "GIF images" -#~ msgstr "GIF-Bilder" - -#~ msgid "TIFF images" -#~ msgstr "TIFF-Bilder" - -#~ msgid "BMP images" -#~ msgstr "BMP-Bilder" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "%s kann nicht geöffnet werden: Unbekannter Dateityp." - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Farbe als Vorschaubild-Hintergrund verwenden:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! Prozess \"%(command)s\" konnte nicht gestartet werden: %(error)s." - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "" -#~ "\"%(command)s\" muss sich in einem Verzeichnis befinden, welches in PATH " -#~ "eingetragen ist." - -#~ msgid "Please enter the password to continue:" -#~ msgstr "Bitte geben Sie das Passwort ein, um fortzufahren:" - -#~ msgid "Cache" -#~ msgstr "Zwischenspeicher" - -#~ msgid "Toggle fullscreen" -#~ msgstr "Vollbildmodus an-/ausschalten" - -#~ msgid "Add to this collection:" -#~ msgstr "Zu Sammlung hinzufügen:" - -#~ msgid "Reading" -#~ msgstr "Lesen" - -#~ msgid "Page orientation and zoom" -#~ msgstr "Seitenausrichtung und Vergrößerung" - -#~ msgid "User Interface" -#~ msgstr "Benutzeroberfläche" - -#~ msgid "Image-related variables" -#~ msgstr "Variablen für Bilder" - -#~ msgid "File path" -#~ msgstr "Dateipfad" - -#~ msgid "Image directory path" -#~ msgstr "Datei-Verzeichnis" - -#~ msgid "Image directory name" -#~ msgstr "Name des Datei-Verzeichnisses" - -#~ msgid "Archive-related variables" -#~ msgstr "Variablen für Archive" - -#~ msgid "Archive path" -#~ msgstr "Archivpfad" - -#~ msgid "Archive's directory path" -#~ msgstr "Verzeichnis des Archivs" - -#~ msgid "Archive's directory name" -#~ msgstr "Name des Archiv-Verzeichnisse" - -#~ msgid "Miscellaneous variables" -#~ msgstr "Verschiedene Variablen" - -#~ msgid "Backslash or slash, depending on OS" -#~ msgstr "Schrägstrich oder Backslash" - -#~ msgid "Literal quote" -#~ msgstr "Anführungszeichen" - -#~ msgid "Literal % character" -#~ msgstr "Prozent-Zeichen" - -#~ msgid "Directory name" -#~ msgstr "Verzeichnis-Name" - -#~ msgid "Preview area" -#~ msgstr "Vorschau-Zeile" - -#~ msgid "Variables" -#~ msgstr "Variablen" - -#~ msgid "Absolute path variables" -#~ msgstr "Absolute Pfadangaben" - -#~ msgid "Directory containing archive or file" -#~ msgstr "Verzeichnis, das Archiv oder Datei enthält" - -#~ msgid "Directory containing files" -#~ msgstr "Verzeichnis, das Datei enthält" - -#~ msgid "Order files by:" -#~ msgstr "Sortiere Dateien nach:" - -#~ msgid "Only file names" -#~ msgstr "Nur Dateinamen" - -#~ msgid "File names and last read page" -#~ msgstr "Dateinamen und zuletzt gelesene Seite" - -#~ msgid "Catalan" -#~ msgstr "Katalanisch" - -#~ msgid "Czech" -#~ msgstr "Tschechisch" - -#~ msgid "German" -#~ msgstr "Deutsch" - -#~ msgid "Greek" -#~ msgstr "Griechisch" - -#~ msgid "English" -#~ msgstr "Englisch" - -#~ msgid "Spanish" -#~ msgstr "Spanisch" - -#~ msgid "Persian" -#~ msgstr "Persich" - -#~ msgid "French" -#~ msgstr "Französisch" - -#~ msgid "Galician" -#~ msgstr "Gallisch" - -#~ msgid "Croatian" -#~ msgstr "Kroatisch" - -#~ msgid "Hungarian" -#~ msgstr "Ungarisch" - -#~ msgid "Indonesian" -#~ msgstr "Indonesisch" - -#~ msgid "Italian" -#~ msgstr "Italienisch" - -#~ msgid "Japanese" -#~ msgstr "Japanisch" - -#~ msgid "Korean" -#~ msgstr "Koreanisch" - -#~ msgid "Dutch" -#~ msgstr "Niederländisch" - -#~ msgid "Polish" -#~ msgstr "Polnisch" - -#~ msgid "Portuguese" -#~ msgstr "Portugallisch" - -#~ msgid "Russian" -#~ msgstr "Russisch" - -#~ msgid "Swedish" -#~ msgstr "Schwedisch" - -#~ msgid "Ukrainian" -#~ msgstr "Ukrainisch" - -#~ msgid "Chinese (simplified)" -#~ msgstr "Chinesisch (vereinfacht)" - -#~ msgid "Chinese (traditional)" -#~ msgstr "Chinesisch (traditionell)" - -#~ msgid "! Deleting corrupt bookmarks file." -#~ msgstr "! Korrupter Lesezeichen-Speicher wird gelöscht." - -#~ msgid "User interface language" -#~ msgstr "Benutzeroberflächen-Sprache" - -#~ msgid "Delay thumbnail generation" -#~ msgstr "Laden von Vorschaubildern verzögern" - -#~ msgid "" -#~ "Thumbnails are generated only when required, instead of directly after " -#~ "opening a new file." -#~ msgstr "" -#~ "Vorschaubilder werden nur dann erzeugt, wenn sie benötigt werden, anstatt " -#~ "direkt nach dem Öffnen einer neuen Datei." - -#~ msgid "Open files ordered by:" -#~ msgstr "Öffne Dateien sortiert nach:" - -#~ msgid "Lead developer of MComix" -#~ msgstr "Hauptentwickler von MComix" - -#~ msgid "Show only one page where appropriate" -#~ msgstr "Nur eine Seite zeigen, wo angebracht" - -#~ msgid "! Non-supported archive format: %s" -#~ msgstr "! Nicht unterstütztes Archiv-Format: %s" - -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Nur ein breites Bild im doppelseitigen Modus anzeigen" - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Nur ein Bild im doppelseitigen Modus anzeigen, wenn die Breite des Bildes " -#~ "seine Höhe übersteigt. Im Ergebnis werden gescannte Bilder, die sich über " -#~ "zwei Seiten erstrecken, auch im doppelseitigen Modus korrekt (d.h. " -#~ "allein) dargestellt werden." - -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Dynamische Vorschaubild-Hintergrundfarbe verwenden." - -#~ msgid "Default modes" -#~ msgstr "Vogabemodi" - -#~ msgid "Use double page mode by default." -#~ msgstr "Als Vorgabe doppelseitigen Modus benutzen." - -#~ msgid "Use manga mode by default." -#~ msgstr "Als Vorgabe Manga-Modus benutzen." - -#~ msgid "Keeps the currently selected transformation for the next files." -#~ msgstr "" -#~ "Behält die derzeit ausgewählten Transformationen für die nächsten Seiten " -#~ "bei." - -#~ msgid "Refresh file" -#~ msgstr "Datei aktualisieren" - -#~ msgid "Invert smart scrolling direction" -#~ msgstr "Richtung des intelligenten Rollens umkehren" - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Bilder auf eine Größe strecken, die größer als die Originalgröße ist, " -#~ "wenn der aktuelle Vergrößerungsmodus das erfordert. Wenn diese " -#~ "Einstellung nicht gesetzt ist, werden Bilder niemals so skaliert, dass " -#~ "sie größer als ihre Originalgröße sind." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Die ausgewählten Bücher werden aus der Bibliothek entfernt (aber die " -#~ "Originaldateien werden nicht angerührt). Sind Sie sicher, dass Sie " -#~ "fortfahren möchten?" - -#~ msgid "Do you want to remove non-existent books from the library?" -#~ msgstr "" -#~ "Wollen Sie Bücher aus der Bibliothek entfernen, die nicht mehr existieren?" - -#~ msgid "" -#~ "Books that appear in your library, but no longer exist at their original " -#~ "path, will be removed from the library. This clears books that have been " -#~ "moved or deleted outside of MComix." -#~ msgstr "" -#~ "Bücher, die sich noch in der Bibliothek befinden, aber nicht mehr auf dem " -#~ "ursprünglichen Datenträger gefunden werden, werden entfernt. Dies säubert " -#~ "Bücher, die außerhalb von MComix verschoben oder gelöscht wurden." - -#~ msgid "Remove collection from the library?" -#~ msgstr "Sammlung aus der Bibliothek entfernen?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Die ausgewählte Sammlung wird aus der Bibliothek entfernt (aber die " -#~ "Bücher und Untersammlungen darin werden bestehen bleiben). Sind Sie " -#~ "sicher, dass Sie fortfahren möchten?" - -#~ msgid "Sort order" -#~ msgstr "Sortierung" - -#~ msgid "Completely _remove" -#~ msgstr "Komplett _entfernen" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "%d Buch(Bücher) wurden aus der Bibliothek entfernt." - -#~ msgid "Rename..." -#~ msgstr "Umbenennen ..." - -#~ msgid "Duplicate collection" -#~ msgstr "Sammlung duplizieren" - -#~ msgid "Remove collection..." -#~ msgstr "Sammlung entfernen ..." - -#~ msgid "_Add books" -#~ msgstr "Bücher _hinzufügen" - -#~ msgid "Add _folder" -#~ msgstr "_Sammlung hinzufügen" - -#~ msgid "_Clean library" -#~ msgstr "Bibliothek _säubern" - -#~ msgid "Removes no longer existing books from the library." -#~ msgstr "Entfernt Bücher aus der Bibliothek, die nicht mehr existieren." - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Es sind missbilligte Dateien auf Ihrem Rechner zurückgeblieben." - -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Einige alte Dateien (die von älteren Versionen von Comix für zum " -#~ "Speichern von Einstellungen, die Bibliothek, Lesezeichen usw. benutzt " -#~ "wurden) wurden auf Ihrem Rechner gefunden. Wenn Sie nicht planen, die " -#~ "älteren Versionen von Comix erneut zu benutzen, sollten Sie diese Dateien " -#~ "entfernen, um Festplattenplatz zu sparen. Möchten Sie, dass diese Dateien " -#~ "nun für Sie entfernt werden?" - -#~ msgid "! Could not remove %s" -#~ msgstr "! Konnte %s nicht entfernen" - -#~ msgid "Defaults" -#~ msgstr "Vorgaben" - -#~ msgid "Copy to c_lipboard" -#~ msgstr "In Zwischenab_lage kopieren" - -#~ msgid "Usage:" -#~ msgstr "Verwendung:" - -#~ msgid "" -#~ "\n" -#~ "View images and comic book archives.\n" -#~ msgstr "" -#~ "\n" -#~ "Betrachter für Bilder und Comicbuch-Archive.\n" - -#~ msgid "Options:" -#~ msgstr "Schalter:" - -#~ msgid " -h, --help Show this help and exit." -#~ msgstr " -h, --help Zeigt diesen Hilfetext an." - -#~ msgid " -f, --fullscreen Start the application in fullscreen mode." -#~ msgstr " -f, --fullscreen Startet die Anwendung im Vollbild-Modus." - -#~ msgid " -s, --slideshow Start the application in slideshow mode." -#~ msgstr " -s, --slideshow Startet die Anwendung im Diaschau-Modus." - -#~ msgid " -l, --library Show the library on startup." -#~ msgstr " -l, --library Zeigt die Bibliothek beim Starten an." - -#~ msgid " -m, --manga Start the application in manga mode." -#~ msgstr " -m, --manga Startet die Anwendung im Manga-Modus." - -#~ msgid " -d, --double-page Start the application in double page mode." -#~ msgstr "" -#~ " -d, --double-page Startet die Anwendung im Doppelseiten-Modus." - -#~ msgid "" -#~ " -B, --zoom-best Start the application with zoom set to best fit " -#~ "mode." -#~ msgstr "" -#~ " -B, --zoom-best Startet die Anwendung im automatisch angepassten " -#~ "Zoom-Modus." - -#~ msgid "" -#~ " -W, --zoom-width Start the application with zoom set to fit " -#~ "width." -#~ msgstr "" -#~ " -W, --zoom-width Startet die Anwendung im Zoom-Modus mit " -#~ "angepasster Breite." - -#~ msgid "" -#~ " -H, --zoom-height Start the application with zoom set to fit " -#~ "height." -#~ msgstr "" -#~ " -H, --zoom-height Startet die Anwendung im Zoom-Modus mit " -#~ "angepasster Höhe." - -#~ msgid " -v, --version Show the version number and exit." -#~ msgstr "" -#~ " -v, --version Zeigt die Versionsnummer an und beendet das " -#~ "Programm." - -#~ msgid "_Clear bookmarks" -#~ msgstr "Lese_zeichen löschen" - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Alle Lesezeichen löschen?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Alle gespeicherten Lesezeichen werden entfernt. Sind Sie sicher, dass Sie " -#~ "fortfahren möchten?" - -#~ msgid "_Next archive" -#~ msgstr "Nächstes _Archiv" - -#~ msgid "_Previous archive" -#~ msgstr "Vorheriges A_rchiv" - -#~ msgid "Logging output" -#~ msgstr "Ereignisprotokollierung" - -#~ msgid "All debug messages" -#~ msgstr "Alle Debug-Nachrichten" - -#~ msgid "Notices, warnings and errors" -#~ msgstr "Hinweise, Warnungen und Fehler" - -#~ msgid "Warnings and errors (Default)" -#~ msgstr "Warnungen und Fehler (Voreinstellung)" - -#~ msgid "Only errors" -#~ msgstr "Nur Fehler" - -#~ msgid "Avoid possibly unintentional page flips." -#~ msgstr "Ungewollte Seitenwechsel vermeiden." - -#~ msgid "Only flip to a new page if MComix is the top window. " -#~ msgstr "Wechselt nur zu einer neuen Seite, wenn MComix den Fokus hat. " - -#~ msgid "This prevents the possibility of \"accidental\" page flips when " -#~ msgstr "Dies verhindert \"versehentliche\" Seitenwechsel wenn " - -#~ msgid "" -#~ "clicking on the MComix window surface while trying to make MComix the " -#~ msgstr "auf das MComix-Fenster geklickt wird, um MComix in den " - -#~ msgid "top window." -#~ msgstr "Vordergrund zu holen." - -#~ msgid "Default zoom mode" -#~ msgstr "Standard-Vergrößerungsmodus" - -#~ msgid "Page Numbers" -#~ msgstr "Seitennummern" - -#~ msgid "" -#~ "Show page numbers in the Title bar and the status bar. If unset the page " -#~ "numbers will be hidden." -#~ msgstr "" -#~ "Zeigt Seitennummern in der Titelleiste und im Statusfeld. Wenn nicht " -#~ "gesetzt, werden Seitennummern versteckt." - -#~ msgid "Crash Recovery" -#~ msgstr "Automatische Wiederherstellung" - -#~ msgid "Enable crash recovery." -#~ msgstr "Automatische Wiederherstellung aktivieren." - -#~ msgid "" -#~ "Crash recovery saves the current configuration information every " -#~ "specified seconds. In case of a crash the previous file will be re-" -#~ "loaded." -#~ msgstr "" -#~ "Automatische Wiederherstellung speichert die derzeitige Konfiguration in " -#~ "spezifizierten Abständen. Sollte MComix abstürzen, wird die zuletzt " -#~ "geöffnete Datei wieder geladen." - -#~ msgid "Save the current configuration information every n seconds" -#~ msgstr "Speichere aktuelle Konfiguration alle n Sekunden" - -#~ msgid "" -#~ "Every n seconds the current configuration will be saved to disk. Choose " -#~ "a lower number if crashes are frequent on your machine. 30 seconds " -#~ "(default)" -#~ msgstr "" -#~ "Die aktuelle Konfiguration wird alle n Sekunden gespeichert. Wählen Sie " -#~ "eine niedrigere Zahl, falls Abstürze häufig auftreten. Standardwert: 30 " -#~ "Sekunden" - -#~ msgid "O_riginal size" -#~ msgstr "_Originalgröße" - -#~ msgid "_View comments..." -#~ msgstr "_Kommentare ansehen ..." - -#~ msgid "About %s" -#~ msgstr "Über %s" - -#~ msgid "About" -#~ msgstr "Über" - -#~ msgid "Credits" -#~ msgstr "Danksagungen" - -#~ msgid "Manual _Zoom" -#~ msgstr "_Manuell Vergrößern" - -#~ msgid "PyGTK version 2.12.0 or higher is required to run MComix." -#~ msgstr "" -#~ "PyGTK-Version 2.12.0 oder höher wird benötigt, um MComix auszuführen." - -#~ msgid "MComix is released to the public domain." -#~ msgstr "MComix ist unter der »GNU General Public License« lizenziert." - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "%s kann nicht geöffnet werden: Es ist ein Verzeichnis." - -#~ msgid "! Could not write \"%s\"" -#~ msgstr "! %s kann nicht beschrieben werden" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/el/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/el/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/el/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/el/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3923 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2006-09-27 10:18+0200\n" -"Last-Translator: Paul Chatzidimitriou \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Σελίδα" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Τοποθεσία" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Σχόλια" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "" - -# -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Σχολιασμός αρχείου" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Φωτεινότητα" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Αντίθεση" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Κορεσμός" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Οξύτητα" - -# -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Αυτόματη ρύθμιση της αντίθεσης" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Άνοιγμα" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Όλα τα αρχεία" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Αρχεία %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Όλες οι εικόνες" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Εικόνα %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "" - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Προηγούμενη σελίδα" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Επόμενη σελίδα" - -# -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Αποσυμπίεση σελίδας" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Προηγούμενη σελίδα" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Επόμενη σελίδα" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Προηγούμενη σελίδα" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Επόμενη σελίδα" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Πρώτη σελίδα" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Τελευταία σελίδα" - -# -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Πήγαινε στην σελίδα" - -# -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Αρχείο tar" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Προηγούμενη σελίδα" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Κύλιση" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Ζουμ" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Διατήρηση μετατροπής" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Διατήρηση μετατροπής" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Περιστροφή 90 μοιρών" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Περιστροφή 180 μοι_ρών" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Περιστροφ_ή 180 μοιρών" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Οριζόντια αναστροφή" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Κάθετη αναστροφή" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -#, fuzzy -msgid "Autorotate by width" -msgstr "Α_ποσυμπίεση εικόνας..." - -# -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Autorotate by height" -msgstr "Α_ποσυμπίεση εικόνας..." - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Προβολή διπλής σελίδας" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Προσαρμοζμένη κατά πλάτος προβολή" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Προβολή Magna" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Μεγενθυτικοί φακοί" - -# -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Τέντωμα μικρών εικόνων" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Προσαρμοζμένη κατά πλάτος προβολή" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Προσαρμοζμένη κατά ύψος προβολή" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Προσαρμοζμένη κατά _πλάτος προβολή" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Χειροκίνητη προβολή ζουμ" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Γρ_αμμή κατάστασης" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Γ_ραμμή κύλισης" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Προεπισκοπήσεις" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Απόκρυψη όλων" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Προβολή εναλλαγής εικόνων" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "_Αρχείο" - -# -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "_Πρόσφατα αρχεία" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Κλείσιμο" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Έξοδος" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Προβολή _σχολίων" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Ιδιότητες" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Προτιμήσεις" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Βιβλιοθήκη" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Επεξεργασία σελιδοδεικτών" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Δεν μπορεί να διαγραφεί" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Σχόλιο" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Σχολιασμός αρχείου" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Προηγούμενη σελίδα" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Σχόλιο" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Κατάλογοι" - -# -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Όλα τα αρχεία" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Επεξεργασία σελιδοδεικτών" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Πήγαινε" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Συμπεριφορά" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Εμφάνιση" - -# -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Προχωρημένο" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Χρώμα φόντου" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Απόκρυψη πάντα της γραμμής κύλισης μικρογραφιών." - -# -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Αυτόματο ανοιγμά της τελευταίας προβληθείστας σελίδας κατά την εκκίνηση του " -"Comix." - -# -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Εμφάνιση των νούμερων των σελίδων στις μικρογραφίες" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Μέγεθος προεπισκοπήσεων (px):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Το πλήκτρο κενού κυλάει" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Αλλαγή σελίδας όταν γίνει κύλιση πανώ ή κάτω από την τρέχουσα" - -# -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Αλλάγη σελίδας όταν γίνεται κύλιση \"εκτός της τρέχουσας σελίδας\" με τον " -"τροχό κύλισης, ακόμη και αν η προβολή δεν είναι σε προβολή προσαρμοζμένη " -"στην οθόνη. Απαιτούνται τρία \"βήματα\" του τροχού κύλισης για να συμβεί το " -"παραπάνω." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Αυτόματη ρύθμιση της αντίθεσης" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Χρησιμοποίηση έξυπνης αυξομείωσηςμεγέθους στην προβολή διπλής σελίδας" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Άνοιγμα του τελευταίου αρχείου που εμφανίστηκε, στην αρχή" - -# -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Αυτόματο ανοιγμά της τελευταίας προβληθείστας σελίδας κατά την εκκίνηση του " -"Comix." - -# -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Αποθήκευση πρόσφατα ανοιγμένων αρχείων" - -# -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Προβολή πλήρους οθόνης ως προεπιλογή" - -# -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Αυτόματη απόκρυψη μενού, γραμμών κύλισης, εργαλείων, και προεπίσκοπήσεων σε " -"προβολή πλήρης οθόνης." - -# -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Προσαρμοζμένη στην οθόνη προβολή" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Προσαρμοζμένη κατά πλάτος προβολή" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Προσαρμοζμένη κατά _πλάτος προβολή" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Προβολή εναλλαγής εικόνων" - -# -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Καθυστέρηση προβολής εναλλαγής εικόνων:" - -# -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Καθυστέρηση προβολής εναλλαγής εικόνων:" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Ποιότητα αυξομείωσης μεγέθους" - -# -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Αυξομείωση μεγέθους" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Αρχείο tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Αποθήκευση πρόσφατα ανοιγμένων αρχείων" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Μεγενθυτικοί φακοί" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Παράγοντας μεγέθυνσης:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Σχολιασμός αρχείου" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Όλες οι εικόνες" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Προσάρμοσε _πλάτος" - -# -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Προσάρμοσε _ύψος" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Αποθήκευση πρόσφατα ανοιγμένων αρχείων" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:590 -#, fuzzy -msgid "Normal (fast)" -msgstr "_Κανονικό μέγεθος" - -# -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Διγραμμικός" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Αρχείο" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Εικόνα" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Η πρόσβαση πραγματοποιήθηκε" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Τροποποιήθηκε" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Άδειες χρήσης" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Ιδιοκτήτης" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Προβολή εναλλαγής εικόνων" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Αρχείο ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Αρχείο RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Αρχείο tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Συμπιεσμένο αρχείο tar gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Συμπιεσμένο αρχείο tar bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Συμπιεσμένο αρχείο tar gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Απλουστευμένη Κινεζική μετάφραση" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Ισπανική μετάφραση" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Βραζιλιάνικη/Πορτογαλική μετάφραση" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Γερμανική μετάφραση και υπεύθυνος προεπισκοπήσεων στο Nautilus" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Ελληνική μετάφραση" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Ιταλική μετάφραση" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Ολλανδική μετάφραση" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Γαλλική μετάφραση" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Πολωνική μετάφραση" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Πολωνική μετάφραση" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Ελληνική μετάφραση" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Καταλανική μετάφραση" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Παραδοσιακή Κινέζικη μετάφραση" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Ιταλική μετάφραση" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Ελληνική μετάφραση" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Ιταλική μετάφραση" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Επόμενη σελίδα" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Προηγούμενη σελίδα" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Πρώτη σελίδα" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Τελευταία σελίδα" - -# -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Πήγαινε στην σελίδα..." - -# -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Πήγαινε στην σελίδα..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Κλείσιμο" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Έξοδος" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Περιστροφή 90 μοιρών" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Περιστροφή 180 μοι_ρών" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Περιστροφ_ή 180 μοιρών" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Οριζόντια αναστροφή" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Κάθετη αναστροφή" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -# -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Ζουμ" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Σελιδοδείκτες" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Επεξεργασία" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Αρχείο" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Προβολή" - -# -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Εργαλειοθήκες" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Βοήθεια" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -# -#: mcomix/mcomix/ui.py:105 -#, fuzzy -msgid "_Auto-rotate image" -msgstr "Α_ποσυμπίεση εικόνας..." - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Πλήρης οθόνη" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Προβολή διπλής σελίδας" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Εργαλειοθήκη" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Μενού" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Γρ_αμμή κατάστασης" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Γ_ραμμή κύλισης" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Μι_κρογραφίες" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Απόκρυψη όλων" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Προβολή Magna" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Διατήρηση μετατροπής" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Προβολή εναλλαγής εικόνων" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Μεγενθυτικοί _φακοί" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Προσαρμοζμένη κατά _πλάτος προβολή" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Προσαρμοζμένη κατά _ύψος προβολή" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Προσαρμοζμένη κατά _πλάτος προβολή" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Περί" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -# -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Ιδιότη_τες" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Πρ_οτιμήσεις" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Άνοιγμα..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "" - -# -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Προσθέθηκε:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "" - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "" - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "" - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "" - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -msgid "_Open list" -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -# -#: mcomix/mcomix/library/watchlist.py:43 -#, fuzzy -msgid "Directory" -msgstr "Κατάλογοι" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Τοποθεσία" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "" - -# -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Κατάλογοι" - -# -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Εικόνα GIF" - -# -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Εικόνα TIFF" - -# -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Εικόνα BMP" - -# -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Απόκρυψη πάντα της γραμμής κύλισης μικρογραφιών." - -# -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Δεν μπορεί να διαγραφεί" - -# -#, fuzzy -#~ msgid "File path" -#~ msgstr "Τύπος αρχείου" - -# -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Κατάλογοι" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Αρχείο" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Αρχείο" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive name" -#~ msgstr "Αρχείο" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Αρχείο" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Προηγούμενη σελίδα" - -# -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "" -#~ "Εμφάνιση μόνο μίας σελίδας στην προβολή διπλής σελίδας αν η εικόνα έχει " -#~ "μεγάλο πλάτος" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Περί" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Το Comix είναι ένας προβολέας εικόνων με συγκεκριμένο σκοπό το να " -#~ "χειρίζεται βιβλία κόμικ." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Το Comix χορηγείται με άδεια χρήσεως GNU." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Συνεργάτες" - -# -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Δεν μπορούν να δημιουργηθούν" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Προσθήκη σελιδοδείκτη" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Επεξεργασία σελιδοδεικτών..." - -# -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Δεν μπορούν να δημιουργηθούν" - -# -#, fuzzy -#~ msgid "\", deleting..." -#~ msgstr "Διαγραφή εικόνας..." - -# -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Δεν είναι δυνατό το ανοίγμα" - -# -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Δεν μπορεί να διαγραφεί" - -# -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Δεν ήταν δυνατή η ανάγνωση" - -# -#, fuzzy -#~ msgid " to the library" -#~ msgstr "_Προσθήκη στην βιβλιοθήκη" - -# -#, fuzzy -#~ msgid "Add folder" -#~ msgstr "Επιλογή φακέλου" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Σελίδα" - -# -#, fuzzy -#~ msgid "top window." -#~ msgstr "Κλείσιμο αυτού του παραθύρου." - -# -#, fuzzy -#~ msgid "_Refresh file" -#~ msgstr "_Πρόσφατα αρχεία" - -# -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Αρχείο tar" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Προηγούμενη σελίδα" - -# -# File: src/ui.py, line: 42 -#~ msgid "_Zoom in" -#~ msgstr "_Μεγέθυνση" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "Σμίκρυνση" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Χειροκίνητο _Zoom" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Μετατροπή" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Αφαίρεση μικρογραφιών" - -# -#~ msgid "No images in \"%s\"" -#~ msgstr "Όχι εικόνες σε \"%s\"" - -# -#~ msgid "Default" -#~ msgstr "Προεπιλογή" - -# -#~ msgid "Fit-to-_screen mode" -#~ msgstr "Προσαρμοζμένη στην _οθόνη προβολή" - -# -#~ msgid "Apply filter on full path" -#~ msgstr "Εφαρμογή του φίλτρου σε όλο το μονοπάτι" - -# -#~ msgid "Add archives to library." -#~ msgstr "Προσθήκη αρχείων στην βιβλιοθήκη." - -# -#~ msgid "Remove selected archive from library." -#~ msgstr "Αφαίρεση επιλεγμένου αρχείου απο την βιβλιοθήκη." - -# -#~ msgid "Clean up" -#~ msgstr "Εκκαθάριση" - -# -#~ msgid "Remove orphaned or outdated library entries." -#~ msgstr "Αφαίρεση ορφανής ή ξεπερασμένης καταχώρησης απο την βιβλιοθήκη." - -# -#~ msgid "Open selected archive." -#~ msgstr "Άνοιγμα επιλεγμένου αρχείου." - -# -#~ msgid "JPEG image" -#~ msgstr "Εικόνα JPEG" - -# -#~ msgid "PNG image" -#~ msgstr "Εικόνα PNG" - -# -#~ msgid "ICO image" -#~ msgstr "Εικόνα ICO" - -# -#~ msgid "XPM image" -#~ msgstr "Εικόνα XPM" - -# -#~ msgid "XBM image" -#~ msgstr "Εικόνα XBM" - -# -#~ msgid "Add archives recursively" -#~ msgstr "Προσθέστε τα αρχεία κατ' επανάληψη(επαναληπτικά)" - -# -#~ msgid "Double page mode as default" -#~ msgstr "Προβολή διπλής σελίδας ως προεπιλογή" - -# -#~ msgid "Always view comments when opening a new file" -#~ msgstr "Προβολή σχολίων όταν ανοίγει ένα νέο αρχείο" - -# -#~ msgid "Hide menubar, scrollbars etc. in fullscreen mode" -#~ msgstr "Μη εμφάνιση του μενού, γραμμής κύλισης στην προβολή πλήρης οθόνης" - -# -#~ msgid "Cache pages for faster forward flipping" -#~ msgstr "Γρήγορο φόρτωμα σελίδων για γρηγορότερη ανάγνωση" - -# -#~ msgid "Scroll wheel scrolls horizontally at top and bottom of page" -#~ msgstr "" -#~ "Ο τροχός κύλισης κυλάει οριζόντια στην κορυφή και στον πάτο της σελίδας" - -# -#~ msgid "Hide thumbnail scrollbar" -#~ msgstr "Μη εμφάνιση της γραμμής κύλισης προεπισκοπήσεων" - -# -#~ msgid "Space key uses smart scrolling" -#~ msgstr "Το πλήκτρο κενού να χρησιμοποιεί έξυπνη κύλιση" - -# -#~ msgid "Save window position and size for future sessions" -#~ msgstr "" -#~ "Σώσιμο της θέσης του παραθύρου και του μεγέθους του για μελλοντική χρήση" - -# -#~ msgid "Go to the next archive in directory after last page" -#~ msgstr "" -#~ "Μετακίνηση στο επόμενο αρχείο στον κατάλογο μετά την τελευταία σελίδα" - -# -#~ msgid "Hide cursor in fullscreen mode" -#~ msgstr "Μη εμφάνιση του κέρσορα στην προβολή πλήρης οθόνης" - -# -#~ msgid "Always use smart scrolling as if in double page mode" -#~ msgstr "Χρησιμοποίηση πάντα έξυπνης κύλισης σαν σε προβολή διπλής σελίδας" - -# -#~ msgid "Use stored thumbnails for images in directories" -#~ msgstr "Χρησιμοποίηση αποθηκευμένων μικρογραφιών για εικόνες σε καταλόγους" - -# -#~ msgid "Use stored thumbnails for images in archives" -#~ msgstr "Χρησιμοποίηση αποθηκευμένων μικρογραφιών για εικόνες σε αρχεία" - -# -#~ msgid "Always go to this directory in the \"Open\" dialog:" -#~ msgstr "Πήγαινε πάντα σε αυτό το κατάλογο στο διάλογο \"Άνοιγμα\" :" - -# -#~ msgid "Always go to the latest directory in the \"Open\" dialog" -#~ msgstr "Πήγαινε πάντα στο τελευταίο κατάλογο στο διάλογο \"Άνοιγμα\"" - -# -#~ msgid "Nearest (quickest, worst quality)" -#~ msgstr "Κοντινότερο (γρηγορότερο, χειρότερη ποιότητα)" - -# -#~ msgid "Tiles" -#~ msgstr "Tiles(κεραμίδια/πλακάκια)" - -# -#~ msgid "Hyper (slowest, best quality)" -#~ msgstr "Ανώτερο (αργότερο, καλύτερη ποιότητα)" - -# -#~ msgid "Manual zoom mode as default" -#~ msgstr "Χειροκίνητη προβολή ζουμ ως προεπιλογή" - -# -#~ msgid "Fit-to-screen mode as default" -#~ msgstr "Προσαρμοζμένη στην οθόνη προβολή ως προεπιλογή" - -# -#~ msgid "Fit width mode as default" -#~ msgstr "Προσαρμοζμένη κατά πλάτος προβολή ως προεπιλογή" - -# -#~ msgid "Fit height mode as default" -#~ msgstr "Προσαρμοζμένη κατά ύψος προβολή ως προεπιλογή" - -# -#~ msgid "Background colour:" -#~ msgstr "Χρώμα φόντου:" - -# -#~ msgid "Toolbar button labels:" -#~ msgstr "Ετικέτες κουμπιών εργαλειοθήκης:" - -# -#~ msgid "Icons only" -#~ msgstr "Μόνο εικονίδια" - -# -#~ msgid "Text only" -#~ msgstr "Μόνο κείμενο" - -# -#~ msgid "Icons and text" -#~ msgstr "Εικονίδια και κείμενο" - -# -#~ msgid "Treat files with the following extensions as comments:" -#~ msgstr "Μεταχείρηση των αρχείων με τις ακόλουθες επεκτάσεις ως σχόλια:" - -# -#~ msgid "of" -#~ msgstr "απο" - -# -#~ msgid "Window size" -#~ msgstr "Μέγεθος παραθύρου" - -# -#~ msgid "Page size" -#~ msgstr "Μέγεθος σελίδας" - -# -#~ msgid "Lens size (px):" -#~ msgstr "Μέγεθος φακών (px):" - -# -#~ msgid "Update interval (milliseconds):" -#~ msgstr "Χρόνος ανανέωσης (χιλιοστά του δευτερολέπτου):" - -# -#~ msgid "Lens" -#~ msgstr "Φακοί" - -# -#~ msgid "Library thumbnail sizes (px):" -#~ msgstr "Μέγεθος προεπισκοπήσεων βιβλιοθήκης (px):" - -# -#~ msgid "Adjust colour" -#~ msgstr "Ρύθμιση χρώματος" - -# -#~ msgid "Save values for future sessions" -#~ msgstr "Σώσιμο τιμών για μελλοντική χρήσεις" - -# -#~ msgid "Title" -#~ msgstr "Τίτλος" - -# -#~ msgid "It reads ZIP, RAR and tar archives (also gzip or bzip2 compressed)" -#~ msgstr "Διαβάζει ZIP, RAR και tar αρχεία (επίσης συμπιεσμένα gzip ή bzip2)" - -# -#~ msgid "as well as plain image files." -#~ msgstr "καθώς επίσης και απλά αρχεία εικόνας." - -# -#~ msgid "Developer and Swedish translation" -#~ msgstr "Υπεύθυνος για την ανάπτυξη και την Σουηδική μετάφραση" - -# -#~ msgid "Manage thumbnails" -#~ msgstr "Διαχείριση μικρογραφιών" - -# -#~ msgid "Remove all stored thumbnails:" -#~ msgstr "Αφαίρεση όλων των αποθηκευμένων μικρογραφιών:" - -# -#~ msgid "Remove orphaned thumbnails:" -#~ msgstr "Αφαίρεση όλων των ορφανών μικρογραφιών:" - -# -#~ msgid "Convert" -#~ msgstr "Μετατροπή" - -# -#~ msgid "Extension" -#~ msgstr "Κατάληξη" - -# -#~ msgid "Zip archive" -#~ msgstr "Αρχείο zip" - -# -#~ msgid "Delete old archive/directory" -#~ msgstr "Διαγραφή παλιών αρχείων/καταλόγων" - -# -#~ msgid "Permission denied" -#~ msgstr "Απαγορεύεται η πρόσβαση" - -# -#~ msgid "Confirm operation" -#~ msgstr "Επιβεβαίωση λειτουργίας" - -# -#~ msgid "Permanently remove %s?" -#~ msgstr "Μόνιμη διαγραφή %s;" - -# -#~ msgid "Perform lossless JPEG operation on %s?" -#~ msgstr "Εκτέλεση λειτουργίας χωρίς απώλειες εικόνας JPEG σε %s; " - -# -#~ msgid "Some images might be trimmed a bit during the operation." -#~ msgstr "" -#~ "Μερικές εικόνες μπορεί να περικοπούν λίγο κατα την διάρκεια της " -#~ "λειτουργίας" - -# -#~ msgid "Permanently convert %s to greyscale?" -#~ msgstr "Μόνιμη μετατροπή %s σε ασπρόμαυρη εικόνα συνεχών τόνων του γκρί;" - -# -#~ msgid "Location:" -#~ msgstr "Τοποθεσία:" - -# -#~ msgid "Quantity:" -#~ msgstr "Ποσότητα:" - -# -#~ msgid "Total size:" -#~ msgstr "Συνολικό μέγεθος:" - -# -#~ msgid "Removed:" -#~ msgstr "Αφαιρέθηκε:" - -# -#~ msgid "Done!" -#~ msgstr "Έγινε!" - -# -#~ msgid "pages" -#~ msgstr "Σελίδες" - -# -#~ msgid "comment" -#~ msgstr "σχόλιο" - -# -#~ msgid "comments" -#~ msgstr "σχόλια" - -# -#~ msgid "In library" -#~ msgstr "Στην βιβλιοθήκη" - -# -#~ msgid "Yes" -#~ msgstr "Ναί" - -# -#~ msgid "No" -#~ msgstr "Όχι" - -# -#~ msgid "Bookmarked" -#~ msgstr "Ο σελιδοδείκτης προστέθηκε" - -# -#~ msgid "Yes, page" -#~ msgstr "Ναί, σελίδα" - -# -#~ msgid "Mode" -#~ msgstr "Τρόπος" - -# -#~ msgid "Pixel count" -#~ msgstr "Πλήθος εικονοστοιχείων" - -# -#~ msgid "Pixel sum" -#~ msgstr "Άθροισμα εικονοστοιχείων" - -# -#~ msgid "Extrema" -#~ msgstr "Ακραίο" - -# -#~ msgid "Mean" -#~ msgstr "Σημαίνω" - -# -#~ msgid "Median" -#~ msgstr "διάμεσος (διάμεση τιμή)" - -# -#~ msgid "Standard deviation" -#~ msgstr "Πρώτυπη απόκλιση" - -# -#~ msgid "Image 1" -#~ msgstr "Εικόνα 1" - -# -#~ msgid "Image 2" -#~ msgstr "Εικόνα 2" - -# -#~ msgid "Please check your permissions." -#~ msgstr "Παρακαλώ ελέγξτε τις άδειες χρήσης σας." - -# -#~ msgid "Adding library entries" -#~ msgstr "Προσθήκη καταχωρήσεων στην βιβλιοθήκη" - -# -#~ msgid "Removing library entries" -#~ msgstr "Αφαίρεση καταχωρήσεων της βιβλιοθήκη" - -# -#~ msgid "page" -#~ msgstr "σελίδα" - -# -#~ msgid "" -#~ "Could not find the unrar executable. Please install it if you wish to " -#~ "open RAR archives." -#~ msgstr "" -#~ "Δεν μπόρεσε να βρεθεί το εκτελέσιμο unrar. Παρακαλώ εγκαταστήστε το αν " -#~ "επιθυμείτε να ανοίξετε αρχεία RAR." - -# -#~ msgid "is not a file." -#~ msgstr "δεν είναι αρχείο." - -# -#~ msgid "does not exist." -#~ msgstr "δεν υπάρχει." - -# -#~ msgid "Filetype of" -#~ msgstr "Τύπος αρχείου του" - -# -#~ msgid "not recognized." -#~ msgstr "δεν αναγνωρίζεται." - -# -#~ msgid "_Best fit" -#~ msgstr "_Καλύτερες δυνατές διαστάσεις" - -# -#~ msgid "Clear bookmarks" -#~ msgstr "Καθαρισμός σελιδοδεικτών" - -# -#~ msgid "_Manage thumbnails..." -#~ msgstr "_Χειρισμός μικρογραφιών..." - -# -#~ msgid "Clear recent files" -#~ msgstr "Εκκαθάριση πρόσφατων αρχείων" - -# -#~ msgid "Open _library..." -#~ msgstr "Άνοιγμα _βιβλιοθήκης..." - -# -#~ msgid "Con_vert..." -#~ msgstr "Μετα_τροπή..." - -# -#~ msgid "_Adjust colour..." -#~ msgstr "_Ρύθμιση χρώματος..." - -# -#~ msgid "CW lossless JPEG rotation..." -#~ msgstr "Δεξιόστοφη περιστροφή εικόνας JPEG χωρίς απώλειες..." - -# -#~ msgid "CCW lossless JPEG rotation..." -#~ msgstr "Αριστερόστροφη περιστροφή εικόνας JPEG χωρίς απώλειες..." - -# -#~ msgid "Horizontal lossless JPEG flip..." -#~ msgstr "Οριζόντια αναστροφή εικόνας JPEG χωρίς απώλειες" - -# -#~ msgid "Vertical lossless JPEG flip..." -#~ msgstr "Κάθετη αναστροφή εικόνας JPEG χωρίς απώλειες" - -# -#~ msgid "Convert JPEG to greyscale..." -#~ msgstr "Μετατροπή εικόνας JPEG σε ασπρόμαυρη εικόνα συνεχών τόνων του γκρί" - -# -#~ msgid "File o_perations" -#~ msgstr "Λειτουργίες α_ρχείου" - -# -#~ msgid "Enter fullscreen mode automatically when Comix is started." -#~ msgstr "Αυτόματη προβολή πλήρης οθόνης με την εκκίνηση του Comix." - -# -#~ msgid "Enter double page mode automatically when Comix is started." -#~ msgstr "Αυτόματη προβολή διπλής σελίδας με την εκκίνηση του Comix." - -# -#~ msgid "Enter manual zoom mode automatically when Comix is started." -#~ msgstr "Αυτόματη χειροκίνητη προβολή ζουμ με την εκκίνηση του Comix." - -# -#~ msgid "Enter fit-to-screen mode automatically when Comix is started." -#~ msgstr "" -#~ "Αυτόματη προσαρμοζμένη στην οθόνη προβολή με την εκκίνηση του Comix." - -# -#~ msgid "Enter fit width mode automatically when Comix is started." -#~ msgstr "" -#~ "Αυτόματη προσαρμοζμένη κατά πλάτος προβολή με την εκκίνηση του Comix." - -# -#~ msgid "Enter fit height mode automatically when Comix is started." -#~ msgstr "Αυτόματη προσαρμοζμένη κατά ύψος προβολή με την εκκίνηση του Comix." - -# -#~ msgid "" -#~ "Also scale images to a size that is larger than their original size in " -#~ "fit-to-screen mode, fit width mode and fit height mode." -#~ msgstr "" -#~ "Επίσης αυξομείωση μεγέθους εικόνων σε ένα μέγεθος το οποίο είναι " -#~ "μεγαλύτερο απο το αρχικό μέγεθος σε προσαρμοζμένη στην οθόνη προβολή, " -#~ "προσαρμοζμένη κατά πλάτος προβολή και προσαρμοζμένη κατά ύψος προβολή." - -# -#~ msgid "" -#~ "Scale the images independently when in double page mode and fit-to-screen " -#~ "mode. The smaller of the two images will scale up to fill any extra space " -#~ "that is given." -#~ msgstr "" -#~ "Αυξομείωση μεγέθους των εικόνων ανεξάρτητα απο όταν είναι σε προβολή " -#~ "διπλής σελίδας και σε προσαρμοζμένη στην οθόνη προβολή.Το μικρότερο απο " -#~ "τις δύο εικόνες θα αυξομειωθεί για να γεμίσει οποιοδήποτε πρόσθετο χώρο " -#~ "που δίνεται." - -# -#~ msgid "Automatically show any available comments when opening a new file." -#~ msgstr "Αυτόματη εμφάνιση τυχών σχολίων, στο ανοίγμα νέου αρχείου." - -# -#~ msgid "" -#~ "Cache the next page in the archive/directory to increase the perceived " -#~ "speed. This is generally recommended unless you are running low on RAM." -#~ msgstr "" -#~ "Γρήγορη φόρτωση, επομένης σελίδας σε αρχείο/κατάλογο, για αύξηση της " -#~ "ταχύτητας. Συνιστάται, εκτός και αν υπάρχει μικρή ποσότητα RAM." - -# -#~ msgid "" -#~ "Move the horizontal scrollbar instead of the vertical when using the " -#~ "scroll wheel at the top or the bottom of the page. The direction will be " -#~ "determined by whether you use manga mode or not." -#~ msgstr "" -#~ "Μετακίνηση της οριζόντιας γραμμής κύλισης αντί της κάθετης όταν " -#~ "χρισημοποιείται ο τροχός κύλισης στο πάνω ή κάτω μέρος της σελίδας. Η " -#~ "κατευθύνση θα καθορίζεται απο το εάν χρησιμοποιείται προβολή manga ή όχι." - -# -#~ msgid "" -#~ "Save the position and the size of the window for the next time you start " -#~ "Comix." -#~ msgstr "" -#~ "Αποθήκευση θέσης και μεγέθους παραθύρου, για την επομενή φορά που θα " -#~ "ανοίξετε το Comix." - -# -#~ msgid "" -#~ "Automatically open the next archive in the directory when scrolling past " -#~ "the last page of the current archive, and automatically open the previous " -#~ "archive in the directory when scrolling past the first page of the " -#~ "current archive." -#~ msgstr "" -#~ "Αυτόματο ανοίγμα επόμενου αρχείου στον φάκελο, μετά την τελευταία σελίδα " -#~ "του τρέχοντος αρχείου, και αυτόματο άνοιγμα του προηγουμένου αρχείου στον " -#~ "φάκελο, πρίν την πρώτη σελίδα του τρέχοντος αρχείου." - -# -#~ msgid "Hide the cursor when in fullscreen mode." -#~ msgstr "Απόκρυψη κέρσορα σε προβολή πλήρης οθόνης." - -# -#~ msgid "" -#~ "Set the image scaling method. The best choice is often \"Tiles\", it is " -#~ "quite quick and produces almost as good results as \"Bilinear\" or \"Hyper" -#~ "\"." -#~ msgstr "" -#~ "Ρυθμισή μεθόδου αυξομείωσης μεγέθους εικόνας.Συνιστόμενο:\"Tiles\", είναι " -#~ "αρκετά γρήγορο και παράγει σχεδόν εξίσου καλό αποτέλεσμα με το \"Bilinear" -#~ "\" ή το \"Hyper\"." - -# -#~ msgid "" -#~ "Treat files with the following extensions as comment files. Extensions " -#~ "should be separated by whitespaces. They are not case sensitive." -#~ msgstr "" -#~ "Μεταχείριση αρχείων με τις παρακάτω καταλήξεις, ως αρχεία-σχόλια. Οι " -#~ "καταλήξεις θα πρέπει να χωρίζονται με κενά. Τα γράμματα μπορεί να είναι " -#~ "είτε κεφαλαία είτε μικρά." - -# -#~ msgid "" -#~ "Use smart scrolling with the space key. Pressing the space key normally " -#~ "scrolls straight down one window height unless at the bottom of the page " -#~ "where it flips pages instead. When this option is set Comix automatically " -#~ "tries to follow the reading flow of the comic book. When pressing the " -#~ "space key it will not only scroll down but will also scroll horizontally " -#~ "to the edge of the page (left or right depending on whether you use manga " -#~ "mode). In double page mode it will go to the edge of the first page if it " -#~ "is in view, otherwise it will go to the edge of the second page. Also, in " -#~ "double page mode with this option, Comix will not flip pages unless at " -#~ "the bottom of the second page. At the bottom of the first page it will " -#~ "instead go to the top of the second page." -#~ msgstr "" -#~ "Χρήση έξυπνης κύλισης με το πλήκτρο κενού.Το πάτημα του πλήκτρου κενού " -#~ "κανονικά παράγει κύλιση κατά το ύψος απο πάνω εως κάτω ενός παραθύρου " -#~ "εκτός και αν βρισκόμαστε στον πάτο της σελίδας, οπότε πάει στην επόμενη. " -#~ "Όταν αυτή η ρύθμιση είναι επιλεγμένη το Comix αυτόματα προσπαθεί να " -#~ "ακολουθήσει την ροή αναγνωσής του κόμικ.Με το πάτημα του πλήκτρου κενού " -#~ "δεν θα κυλίσει μόνο κατώ αλλα και οριζόντια στην ακρη της σελίδας (είτε " -#~ "αριστερά είτε δεξιά, εξαρταταί από το αν η κατάσταση είναι manga ή όχι)." -#~ "Σε προβολή διπλής σελίδας, θα κυλίσει στο άκρο της πρώτης σελίδας αν αυτό " -#~ "φαίνεται, αλλίως στο άκρο της δευτερής.Επίσης, σε προβολή διπλής σελίδας " -#~ "με αυτήν την επιλογή το Comix δεν θα αλλάζει σελίδες εκτός αν βρεθεί στο " -#~ "τέλος της δεύτερης σελίδας.Αντίθετα απο το τέλος της πρώτης σελίδας, θα " -#~ "πηγαίνει στην αρχή της δευτερής." - -# -#~ msgid "" -#~ "Automatically go to the same directory as last time when opening the " -#~ "\"Open\" dialog." -#~ msgstr "" -#~ "Αυτόματο ανοιγμά του τελευταίου φακέλου, όταν χρισιμοποιείται το \"Ανοιγμά" -#~ "\"." - -# -#~ msgid "Automatically go to this directory when opening the \"Open\" dialog." -#~ msgstr "" -#~ "Αυτόματο ανοιγμά αυτού του φακέλου, όταν χρισιμοποιείται το \"Ανοιγμά\"." - -# -#~ msgid "Automatically restore these values the next time Comix is started." -#~ msgstr "" -#~ "Αυτόματη επαναφορά αυτών των τιμών την επόμενη φορά που το Comix θα " -#~ "ξεκινήσει." - -# -#~ msgid "Show the page number in the upper left corner of each thumbnail." -#~ msgstr "" -#~ "Εμφάνιση αριθμού σελίδας στην πάνω αριστερή γωνία κάθε μικρογραφίας." - -# -#~ msgid "" -#~ "Automatically adjust the contrast of the images so that the darkest pixel " -#~ "is completely black and the lightest pixel is completely white. This only " -#~ "works with images without an alpha channel." -#~ msgstr "" -#~ "Αυτόματη ρύθμιση της αντίθεσης των εικόνων, ετσί ώστε το πιο σκούρο " -#~ "εικονοστοιχείο να είναι μαύρο, και το πιο ανοιχτό εικονοστοιχείο λευκό. " -#~ "Αυτό λειτουργεί μόνο για εικόνες χωρίς alpha channel." - -# -#~ msgid "" -#~ "The space key uses smart scrolling as if in double page mode even when in " -#~ "single page mode. This can be useful for comics with two scanned pages in " -#~ "each image. The pages are assumed to be of equal size" -#~ msgstr "" -#~ "Το πλήκτρο κενού χρησιμοποιεί έξυπνη κύλιση όταν βρισκόμαστε σε προβολή " -#~ "διπλής σελίδας ακόμα και σε προβολή απλής σελίδας. Αυτό μπορεί να φανεί " -#~ "χρήσιμο για κόμικ με δύο σκανάρισμένες σελίδες σε κάθε εικόνα.Υποτίθεται " -#~ "ότι οι εικόνες έχουν ίσο μέγεθος." - -# -#~ msgid "Adjust the lens magnification factor." -#~ msgstr "Ρύθμιση παράγοντα μεγέθυνσης των φακών." - -# -#~ msgid "" -#~ "Set the lens width and height in pixels. A larger lens will use more CPU " -#~ "resources than a small one." -#~ msgstr "" -#~ "Ρύθμιση πλάτους και ύψους των φακών σε εικονοστοιχεία.Όσο μεγαλύτερος ο " -#~ "φακός τόσο περισσότεροι πόροι του επεξεργαστή χρεισιμοποιούνται." - -# -#~ msgid "" -#~ "Set the maximum update frequency for the magnification lens in " -#~ "milliseconds. Setting the value too low can cause the lens to lag behind " -#~ "when moving the mouse quickly. Setting the value too high can cause the " -#~ "lens to appear choppy." -#~ msgstr "" -#~ "Ρύθμιση της μέγιστης συχνότητας ανανέωσης για τους φακούς μεγένθυσης, σε " -#~ "χιλιοστά του δευτερολέπτου. Πολύ μικρή τιμή μπορεί να προκαλέσει χρονική " -#~ "καθυστέρηση των φακών στην γρήγορη κίνηση του ποντικιού.Πολύ μεγάλη τιμή " -#~ "μπορεί να κανεί τους φακούς να φαίνονται ασταθείς." - -# -#~ msgid "" -#~ "Read and write thumbnails in the ~/.thumbnails directory as proposed by " -#~ "the freedesktop.org standard. With this preference set, Comix will use " -#~ "the thumbnails already stored there to speed up thumbnail loading. If " -#~ "there are no thumbnails, Comix will create them and save them there. This " -#~ "is a standard that many applications conform to, thumbnails created by " -#~ "other applications can be used by Comix and vice versa. If this " -#~ "preference is not set, Comix will create thumbnails on the fly every time " -#~ "a directory is opened." -#~ msgstr "" -#~ "Ανάγνωση και εγγραφή μικρογραφιών στον κατάλογο ~/.thumbnails όπως " -#~ "προτείνεται από το στάνταρ του freedesktop.org. Με επιλεγμένη αυτήν την " -#~ "ρύθμιση, το Comix θα χρησιμοποιεί τις ήδη αποθηκευμένες εκεί μικρογραφίες " -#~ "για ταχύτερο φόρτωμα των μικρογραφιών.Αν δεν βρεθούν προεπισκοπήσεις, το " -#~ "Comix θα τις δημιουργήσει και θα τις αποθηκεύσει εκεί.Αυτό είναι ένα " -#~ "στάνταρ που χρησιμοποιείται από πολλές εφαρμογές, μικρογραφίες φτιαγμένες " -#~ "από άλλες εφαρμογές μπορούν να χρησιμοποιηθούν από το Comix και " -#~ "αντίστροφα.Αν αυτή η ρύθμιση δεν έχει επιλεγεί, το Comix θα δημιουργεί " -#~ "τις προεπισκοπήσεις κάθε φορά που ανοίγεται ένα αρχείο." - -# -#~ msgid "" -#~ "Also use stored thumbnails for images in archives in a similiar way. Due " -#~ "to restrictions in the freedesktop.org standard, these thumbnails will be " -#~ "stored in ~/.comix and will only be used by Comix. If this preference is " -#~ "not set, Comix will create thumbnails on the fly every time an archive is " -#~ "opened." -#~ msgstr "" -#~ "Χρησιμοποίηση αποθηκευμένων μικρογραφιών για τις εικόνες σε αρχεία με " -#~ "παρόμοιο τρόπο. Λόγω περιορισμών στο στάνταρ freedesktop.org, οι " -#~ "προεπισκοπήσεις αυτές θα αποθηκεύονται στο ~/.comix και θα " -#~ "χρησιμοποιούνται μόνο από το Comix. Αν αυτή η ρύθμιση δεν έχει επιλεγεί, " -#~ "το Comix θα δημιουργεί τις προεπισκοπήσεις κάθε φορά που ανοίγεται ένα " -#~ "αρχείο." - -# -#~ msgid "" -#~ "Only display a single image in double page mode if the image consists of " -#~ "two pages. An image is assumed to consist of two pages if its width is " -#~ "greater than its height." -#~ msgstr "" -#~ "Παρουσίαση μόνο μιας εικόνας σε προβολή διπλής σελίδας αν η εικόνα " -#~ "αποτελείται από δύο σελίδες.Μια εικόνα θεωρείται ότι αποτελείται από δύο " -#~ "σελίδες όταν το πλάτος της είναι μεγαλύτερο από το ύψος της." - -# -#~ msgid "Filter out archives with regular expressions." -#~ msgstr "Φιλτράρισμα αρχείων με κανονικές εκφράσεις." - -# -#~ msgid "Apply filters on full paths rather than filenames." -#~ msgstr "Εφαρμογή φίλτρων σε ολόκληρα τα μονοπάτια αντί για ονόματα αρχείων." - -# -#~ msgid "" -#~ "Store a list of the 10 last opened files that can be accessed through the " -#~ "menus." -#~ msgstr "" -#~ "Αποθήκευση λίστας των 10 τελευταίων αρχείων η οποία θα είναι προσβάσιμη " -#~ "μέσω των μενού." - -# -#~ msgid "No viewable files in" -#~ msgstr "Δεν υπάρχουν αρχεία προς προβολή σε" - -# -#~ msgid "No images in" -#~ msgstr "Δεν υπάρχουν εικόνες σε" - -# -#~ msgid "Save saturation and contrast for future sessions" -#~ msgstr "Αποθήκευση κορεσμού και αντίθεσης για μελλοντική χρήση" - -# -#~ msgid "Saturation (default 1.0):" -#~ msgstr "Κορεσμός (προεπιλογή 1.0):" - -# -#~ msgid "Contrast (default 1.0):" -#~ msgstr "Αντίθεση (προεπιλογή 1.0):" - -# -#~ msgid "Clear" -#~ msgstr "Καθαρισμός" - -# -#~ msgid "" -#~ "Automatically restore the saturation and contrast values the next time " -#~ "Comix is started." -#~ msgstr "" -#~ "Αυτόματη αποκατάσταση των τιμών κορεσμού και αντίθεσης την επόμενη φορά " -#~ "που θα εκκινήσει το Comix." - -# -#~ msgid "Permanently remove" -#~ msgstr "Μόνιμη αφαίρεση" - -# -#~ msgid "Perform lossless JPEG rotation on" -#~ msgstr "Εκτέλεση περιστροφής JPEG χωρίς απώλειες σε" - -# -#~ msgid "Some images might be trimmed a bit during the rotation." -#~ msgstr "" -#~ "Μερικές εικόνες μπορεί να περικοπούν λίγο κατα την διάρκεια της " -#~ "περιστροφής" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/es/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/es/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/es/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/es/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3580 +0,0 @@ -# translation of MComix to Spanish -# translation of es.po to Spanish -# Basada en la traducción al español de Comix. -# 2006 -# This file is distributed under the same license as the Comix package. -# Manuel Quiñones . -# Francisco Javier F. Serrador , 2006. -# Carlos Feliu , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: comix.HEAD\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2012-09-06 18:00+0100\n" -"Last-Translator: Carlos Feliu \n" -"Language-Team: Spanish \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: KBabel 1.9.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s es un visor de imágenes específicamente diseñado para cómics." - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"Lee archivadores ZIP, RAR y tar, así como archivos comunes de imágenes." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s utiliza la licencia general pública GNU." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "Una copia de esta licencia puede ser obtenida en %s" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Formato de archivador no soportado: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Error de extración: %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! No se pudo crear un archivador en la ruta \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! No se pudo añadir el archivo %(sourcefile)s al archivador %(archivefile)s, " -"abortando..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! No se pudo leer %s" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! No se pudo analizar el archivo de marcadores %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "¿Reemplazar el marcador existente en la página %s?" -msgstr[1] "¿Reemplazar los marcadores existentes en las páginas %s?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"El libro actual ya contiene páginas marcadas. ¿Desea reemplazarlas con un " -"nuevo marcador en la página %d?" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"Seleccionar \"No\" creará un nuevo marcador sin afectar a los otros " -"marcadores." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Editar marcadores" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Tipo" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nombre" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Página" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Lugar" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "Añadido" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "Añadir _marcador" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "_Editar marcadores..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! %(function)r callback fallida: %(error)s" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Comentarios" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "No se puede leer %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Tenga en cuenta que los únicos archivos que se agregan automáticamente a " -"esta lista son aquellos archivos en los archivadores que MComix reconoce " -"como comentarios." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Tamaño" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Quitar del archivador" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Editar archivador" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_Importar" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Imágenes" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "Comentarios" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "¡El archivador nuevo no se ha podido guardar!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Los archivos originales no se han eliminado." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Los archivadores se guardan como paquetes ZIP." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Mejorar la imagen" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Restaurar a valores por defecto." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" -"Guardar los valores seleccionados como valores por defecto para archivos " -"futuros." - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_Brillo:" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_Contraste:" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "S_aturación:" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "E_nfoque:" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "Ajustar el contraste automáticamente" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Ajusta el contraste automáticamente, tanto las partes claras como las " -"oscuras, para cada banda de color por separado." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Abrir" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Guardar" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Todos los archivos" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Todos los archivadores" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Archivadores %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Todas las imágenes" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Imágenes %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Ya existe un archivo de nombre '%s'. ¿Desea reemplazarlo?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Al reemplazarlo, su contenido será sobreescrito." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Agregar libros" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "No hay imágenes en '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "No se puede abrir %s: el archivo no existe." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "No se puede abrir %s: permiso denegado." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "¿Continuar leyendo a partir de la página %d?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"Dejó de leer aquí en %(date)s, %(time)s. Si elige \"Yes\", la lectura se " -"reanudará en la página %(page)d. Si no es así, se cargará la primera página." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Archivo de preferencias \"%s\" corrupto, eliminando..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Ruta no válida: '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! No se pudo cargar el icono \"%s\"" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipo de archivo desconocido" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Página anterior" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Página siguiente" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Guardar página como" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Página anterior" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Página siguiente" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Página anterior" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Página siguiente" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Primera página" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Última página" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Ir a la página..." - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Archivador siguiente" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Archivador anterior" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Carpeta siguiente" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Carpeta anterior" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "Desplazarse a la esquina inferior izquierda" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Desplazamiento" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "Desplazarse al punto central inferior" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "Desplazarse a la esquina inferior derecha" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "Desplazarse al punto central izquierdo" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "Desplazarse al centro" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "Desplazarse al punto central derecho" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "Desplazarse a la esquina superior izquierda" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "Desplazarse al punto central superior" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "Desplazarse a la esquina superior derecha" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "Desplazar hacia abajo" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "Desplazar hacia arriba" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "Desplazar hacia la derecha" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "Desplazar hacia la izquierda" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "Desplazamiento inteligente hacia arriba" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "Desplazamiento inteligente hacia abajo" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Ampliar zoom" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Reducir zoom\"" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Tamaño normal" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Mantener transformación" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Mantener transformación" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Rotar 90 grados en sentido horario" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Rotar 180 _grados" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Ro_tar 90 grados en sentido antihorario" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Voltear _horizontalmente" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Voltear _verticalmente" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Modo a doble página" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Ver modos" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Modo manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "Invertir desplazamiento inteligente" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lupa" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Estirar imágenes pequeñas" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Modo de mejor ajuste" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Modo ajustar a la anchura" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Modo ajustar a la altura" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Modo de ajuste a la a_nchura" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Modo de ampliación manual" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Salir de pantalla completa" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Interfaz de usuario" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "Mostrar el panel OSD en pantalla" - -#: mcomix/mcomix/keybindings.py:114 -#, fuzzy -msgid "Minimize" -msgstr "Mi_nimizar" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Pantalla completa" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -#, fuzzy -msgid "Show/hide menubar" -msgstr "Mostrar números de archivo" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Barra de _estado" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Barras de _desplazamiento" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniaturas" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "_Ocultar todo" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Empezar diapositivas" - -#: mcomix/mcomix/keybindings.py:125 -#, fuzzy -msgid "Delete" -msgstr "_Eliminar" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Archivos" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Re_frescar" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Cerrar" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Salir" - -#: mcomix/mcomix/keybindings.py:129 -#, fuzzy -msgid "Save and quit" -msgstr "_Guardar y salir" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Guardar _como" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Archivador" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Propiedades" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferencias" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteca" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Editar marcadores" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" -"La combinación de teclas para \"%(action)s\" anula la hotkey para otra " -"acción." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "No se pudieron cargar las combinaciones de teclas: %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! No se pudieron encontrar ni pysqlite2 ni sqlite3." - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! No se pudo eliminar el archivo \"%s\"" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "DIAPOSITIVAS" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Guardar página como" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "¿Eliminar \"%s\"?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "El archivo será eliminado de su disco duro." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "No preguntar de nuevo." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Los archivadores se guardan como paquetes ZIP." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Los archivadores se guardan como paquetes ZIP." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Comentarios" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Comentarios" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Página _anterior" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Comentarios" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Carpeta anterior" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Archivadores Tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Editar marcadores" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ir" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "_Cancelar" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " de %s" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Apariencia" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportamiento" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Visor" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Avanzado" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Idioma (requiere reinicio del programa):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "Tecla de escape cierra el programa" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"Cuando está activado, la tecla ESC cierra el programa, en lugar de " -"únicamente desactivar el modo a pantalla completa." - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Fondo" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Usar este color como fondo:" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Usar siempre el color seleccionado como color de fondo." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Usar un color de fondo dinámico" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Obtiene automáticamente un color de fondo que se ajusta a la imagen " -"presentada." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Usar siempre el color seleccionado como color de fondo." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Usar automáticamente el color de fondo que se ajuste a la imagen presentada " -"para el fondo de la miniatura." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Mostrar el número de página en las miniaturas" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Usar miniatura de archivador como icono de aplicación" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"Habilitando esta opción, la primera página del libro será utilizada como " -"icono de aplicación en lugar del icono estándar." - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Tamaño de la miniatura (en píxeles):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparencia" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Usar un fondo cuadriculado para las imágenes transparentes" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Usa un fondo gris a cuadros para las imágenes transparentes. Si esta " -"preferencia no está activada, el fondo será blanco liso." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Usar desplazamiento inteligente" - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Con esta preferencia activada, la barra espaciadora y la rueda del ratón no " -"solamente desplazan hacia arriba o abajo, sino también hacia los lados, " -"intentando seguir el flujo de lectura natural del cómic." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Pasar páginas al desplazarse fuera de los bordes de la página" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Pasa las páginas cuando se desplaza \"fuera de la página\" con la rueda del " -"ratón o con las teclas de dirección. Toma n \"pasos\" consecutivos de la " -"rueda del ratón o de las teclas de flechas para activarse." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Abrir automáticamente el archivador siguiente" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Abre automáticamente el archivador siguiente en la carpeta, cuando se pasa " -"la última página, o el archivador anterior cuando se pasa la primera." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Abrir automáticamente la carpeta siguiente" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Abrir automáticamente el primer archivo en el siguiente carpeta hermana " -"cuando se pase la última página del último archivo en una carpeta, o en la " -"anterior carpeta cuando se pase hacia atrás la primera página del primer " -"archivo." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" -"Número de píxeles a desplazar por cada pulsación de tecla de dirección:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" -"Fijar el número de píxeles a desplazar en la página cuando se usan las " -"flechas de dirección." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Número de píxeles a desplazar por cada movimiento de rueda del ratón:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"Fijar el número de píxeles a desplazar en la página cuando se usa la rueda " -"del ratón." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" -"Fracción de la página a desplazar por pulsación de la barra de espacio (en " -"porcentaje):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" -"Establece el porcentaje por el cual la página se desplazará hacia arriba o " -"abajo cuando se pulse la tecla de espacio." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Número de \"pasos\" a dar antes de pasar la página:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Establecer el número de \"pasos\" necesarios para pasar a la página anterior " -"o siguiente. Menos pasos permitirán un paso de página muy rápido, pero puede " -"provocar avances o retrocesos accidentales." - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "Pasar ambas páginas en el modo a doble página" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Cambia las dos páginas, en lugar de una, cada vez que se pasan las páginas " -"en el modo a doble página." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "Muestra solo una página donde sea apropiado:" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Archivos" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "Abrir automáticamente el último archivo visto al iniciar" - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Abre automáticamente, cuando la aplicación se inicia, el archivo que se " -"encontraba abierto la última vez que MComix fue cerrado." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Guardar información sobre los últimos archivos abiertos:" - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Usar pantalla completa por defecto" - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Ocultar automáticamente todas las barras de herramientos en pantalla completa" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "Modo de ajuste al tamaño" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "Ajustar a anchura o altura:" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "Tamaño fijo para este modo:" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Muestra de diapositivas" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Tiempo entre diapositivas (en segundos):" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Paso en diapositivas (en píxeles):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Especificar el número de píxeles a desplazar cuando se esté en modo de " -"presentación. Un valor positivo desplazará hacia adelante, un valor negativo " -"desplazará hacia atrás, y un valor de 0 hará que la presentación siempre " -"pase a una nueva página." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Abrir automáticamente el archivador siguiente durante una presentación" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" -"Cuando se esté en modo de presentación, permitir que el archivador siguiente " -"se abra de forma automática." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotación" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "Rotar imágenes automáticamente en función de sus metadatos" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Rotar imágenes automáticamente cuando se especifique una orientación en sus " -"metadatos, por ejemplo en una etiqueta Exif." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Calidad de la imagen" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Modo a escala" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Orden de archivos" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Archivadores Tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "Máximo número de páginas a almacenar en caché:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "Guardar miniaturas para los archivos abiertos" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Guarda las miniaturas para los archivos abiertos de acuerdo a la " -"especificación de freedesktop.org. Estas miniaturas son compartidas por " -"muchas otras aplicaciones, como por la mayoría de los administradores de " -"archivos." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Máximo número de páginas a almacenar en caché:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Indicar el número máximo de páginas a almacenar en caché. Un valor de -1 " -"almacenará en caché el archivador entero." - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lupa" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "Tamaño de la lupa (en píxeles):" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Determina el tamaño de la lupa. La lupa es un cuadrado que tiene esta " -"cantidad de píxeles de lado." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Factor de ampliación:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Determina el factor de ampliación de la lupa." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "Extensiones de los comentarios:" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Mejorar la imagen" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "Elimina opciones de diálogo" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" -"Elimina todas las opciones de diálogo previamente elegidas para no ser " -"preguntadas de nuevo." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Auto-detectar (por defecto)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Nunca" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "Solamente para las páginas de título" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "Solamente para imágenes anchas" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Siempre" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"Cuando se muestre la primera página de un archivador, o la anchura de una " -"imagen supere a su altura, solo se verá una única página." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "Ajustar a la anchura" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "Ajustar a la altura" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "Sin ordenación" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Nombre de archivo" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Tamaño de archivo" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "Modificado por última vez" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "Ascendiente" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "Descendiente" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"Los archivos se abrirán y mostrarán de acuerdo al orden especificado aquí. " -"Esta opción no afecta al orden dentro de los archivadores." - -#: mcomix/mcomix/preferences_dialog.py:494 -#, fuzzy -msgid "Natural order" -msgstr "Orden de archivos" - -#: mcomix/mcomix/preferences_dialog.py:495 -#, fuzzy -msgid "Literal order" -msgstr "Orden de archivos" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Agregar información sobre todos los archivos abiertos desde MComix a la " -"lista compartida de archivos recientes." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "¿Eliminar información sobre los archivos recientemente abiertos?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "Esto eliminará todas las entradas del menú \"Recent\", y " - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "Normal (rápido)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilinear" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "Hiperbólico (lento)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"Cambia el escalado de las imágenes. Algoritmos más lentos resultan en " -"tamaños de más calidad, pero mayor tiempo de carga de página." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "Normal" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Trata como comentarios a todos los archivos que se encuentren en los " -"archivadores y que tengan esta terminación en el nombre." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archivador" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Imagen" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d páginas" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d comentarios" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Accedido" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modificado" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permisos" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Propietario" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[OPTION...] [PATH]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Ver archivadores de imágenes y cómics." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Mostrar esta ayuda y salir." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Iniciar la aplicación en modo de presentación." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Mostrar la biblioteca al inicio." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Mostrar el número de versión y salir." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Ver modos" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Iniciar la aplicación en modo a pantalla completa." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Iniciar la aplicación en modo manga." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Iniciar la aplicación en modo a doble página." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Modos de zoom" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "Iniciar la aplicación con zoom establecido a modo de mejor ajuste." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "Iniciar la aplicación con zoom establecido a ajustar a la anchura." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "Iniciar la aplicación con zoom establecido a ajustar a la altura." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Opciones de depuración" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "Establece el nivel de log de salida deseado." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "No tiene instaladas las versiones requeridas de GTK+ y PyGTK." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "No se encontró ninguna versión de PyGTK en su sistema." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "Este error puede ser causado por la falta de librerías GTK+." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "No tiene la versión requerida de Python Imaging" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "Librería (PIL) instalada." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "La versión de PIL instalada es: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "La versión de PIL requerida es: 1.1.5 o más reciente" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "Se requiere Python Imaging Library (PIL) 1.1.5 o más reciente." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"No se encontró ninguna versión de Python Imaging Library en su sistema." - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Detener diapositivas" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "Mostrar números de página" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "Mostrar números de archivo" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "Mostrar resolución" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "Mostrar ruta" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "Mostrar nombre de archivo" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Mostrar nombre de archivo" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Archivador ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Archivador RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Archivador tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Archivador tar comprimido con gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Archivador tar comprimido con bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Archivador tar comprimido con gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "Archivador 7z" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "Archivador LHA" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Visión original/desarrollador de Comix" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Desarrollador de MComix" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Traducción al chino simplificado" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Traducción al español" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Traducción al portugués brasileño" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Traducción al alemán y realizador de miniaturas de Nautilus" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "Traducción al alemán" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Traducción al italiano" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Traducción al holandés" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Traducción al francés" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "Traducción al polaco" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Traducción al polaco" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Traducción al griego" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Traducción al catalán" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traducción al chino tradicional" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Traducción al japonés" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Traducción al húngaro" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Traducción al ruso" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Traducción al croata" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Traducción al coreano" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Traducción al persa" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Traducción al indonés" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Traducción al checo" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Traducción al ucraniano" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "Traducción al gallego" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "Traducción al sueco" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "Traducción al hebreo" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Traducción al italiano" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Diseño de iconos" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! No se puedo guardar la miniatura \"%(thumbpath)s\": %(error)s" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "_Copia" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Copia la página actual al portapapeles." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_Eliminar" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Elimina el archivo o archivador actual del disco." - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Página _siguiente" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Página _anterior" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Primera página" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "Ú_ltima página" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Ir a la página..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Ir a la página..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "Re_frescar" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Recarga los archivos o el archivador actualmente abierto/s." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Siguiente _archivador" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Anterior a_rchivador" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "_Aumentar zoom" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "_Reducir zoom" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "_Tamaño normal" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Mi_nimizar" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Cerrar" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "Cierra todos los archivos abiertos." - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Salir" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "_Guardar y salir" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" -"Sale y restaura el archivo actualmente abierto la próxima vez que el " -"programa se inicie." - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Rotar 90 grados en sentido horario" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotar 180 _grados" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Ro_tar 90 grados en sentido antihorario" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Voltear _horizontalmente" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Voltear _verticalmente" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "Guardar _como" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "_Reciente" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Marcadores" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Caja de _herramientas" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Editar" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "_Abrir" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Archivo" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Ver" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_Herramientas" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "Ay_uda" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "_Transformar imagen" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Pantalla completa" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Modo de pantalla completa" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Modo a _doble página" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Barra de _herramientas" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barra de _menú" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Barra de _estado" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barras de _desplazamiento" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "M_iniaturas" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Ocultar todo" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "Modo _manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "Invertir la dirección del desplazamiento inteligente." - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Mantener transformación" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" -"Mantiene la transformación actualmente seleccionada para las siguientes " -"páginas." - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "Iniciar _diapositivas" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lupa" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" -"Estirar imágenes para que se ajusten a la pantalla, dependiendo del modo de " -"zoom." - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Modo de _mejor ajuste" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Modo ajustar a la a_nchura" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Ajustar a la a_ltura" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "Modo de ajuste a la a_nchura" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Modo de ampliación m_anual" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Acerca de" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "Co_mentarios..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Propie_dades" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Prefere_ncias" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Editar archivador..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "Abre el editor de archivadores." - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Abrir…" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "Au_mentar imagen..." - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Biblioteca..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! %(function)r callback fallida: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "El archivador está protegido por contraseña." - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"El tamaño de %(filename)s al ser extraído es de %(actual_size)d bytes, pero " -"debería ser de %(expected_size)d bytes. El archivador puede estar corrupto o " -"en un formato no soportado." - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Agregando libros" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Libros agregados:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Agregando '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! Libro no existente #%i" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! No se pudo conseguir la portada para el libro \"%s\"" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! No se puedo añadir el libro \"%s\" a la biblioteca" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! No se pudo añadir la colección \"%s\"" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "! No se puedo añadir el libro %(book)s a la colección %(collection)s" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! No se pudo renombrar la colección a \"%s\"" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" -"¡No se puedo determinar la versión de la base de datos de la biblioteca!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" -"Actualizando la versión de la base de datos de la biblioteca de %(from)d a " -"%(to)d." - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "Reciente" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Todos los libros" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "Libros de la bilbioteca" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "_Abrir" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "Abre los libros seleccionados para su lectura." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "Abrir _sin cerrar la biblioteca" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" -"Abre los libros seleccionados, pero mantiene abierta la ventana de la " -"biblioteca." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "_Añadir..." - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Agregar más libros a la biblioteca." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Eliminar de esta _colección" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "Elimina los libros seleccionados de la colección actual." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Eliminar de la bib_lioteca" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "Elimina completamente los libros seleccionados de la biblioteca." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "_Eliminar y borrar en disco" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "Elimina los libros seleccionados en disco." - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "Copia la ruta del libro seleccionado al portapapeles." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_Ordenar" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "Cambia la ordenación de la biblioteca." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "_Tamaño de la portada" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "Cambia el tamaño de la portada del libro." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "Nombre del libro" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "Ruta completa" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "Fecha en la que fue añadido" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "Enorme" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "Grande" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "Pequeño" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "Diminuto" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "Personalizado..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "Fijar tamaño de portada de biblioteca" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Se han quitado %(num)d libro(s) desde '%(collection)s'." -msgstr[1] "Se han quitado %(num)d libro(s) desde '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "Eliminado %d libro de la biblioteca." -msgstr[1] "Eliminados %d libros de la biblioteca." - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "¿Eliminar los libros de la biblioteca?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Los libros seleccionados serán eliminados de la biblioteca y permanentemente " -"borrados. ¿Está seguro de que desea continuar?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "Colecciones de biblioteca" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "Nuevo" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Agregar una nueva colección vacía." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "Re_nombrar" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "Ren" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "_Duplicar" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "Crea un duplicado de la colección seleccionada." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_Limpiar" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "Elimina de la colección libros ya no existentes." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "_Eliminar" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "Elimina la colección seleccionada." - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "¿Agregar una nueva colección?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Ingrese un nombre para la nueva colección." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "No se puede agregar una nueva colección llamada '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Ya existe una colección con este nombre." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "¿Renombrar la colección?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Ingrese un nombre nuevo para la colección seleccionada." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "No se puede cambiar el nombre a '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "No se puede duplicar la colección." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Raíz" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Coloca la colección '%(subcollection)s' dentro de la colección " -"'%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Agregar libros a '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Mover libros desde la colección '%(source collection)s' hacia la colección " -"'%(destination collection)s'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "Buscar:" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Mostrar únicamente aquellos libros que tengan el texto especificado en su " -"ruta completa. La búsqueda no distingue mayúsculas de minúsculas." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "Lista de _preferencias" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "Abrir el diálogo de gestión de la lista de preferencias." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "_Abrir" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Abrir el libro seleccionado." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "Dejó de leer en %(date)s, %(time)s" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "Buscando nuevos libros..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" -"Se añadió el nuevo libro '%(bookname)s' desde la carpeta '%(directory)s'." - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Añadido/s %(count)d nuevo/s libro(s) desde la carpeta '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "No se encontraron nuevos libros en la carpeta '%s'" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! Necesita un envoltorio sqlite para usar la librería." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "Lista de preferencias de la biblioteva" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "E_scanear ahora" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Carpeta" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Colección" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Con subcarpetas" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "_Añadir" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "Buscar nuevos libros automáticamente al abrir la biblioteca" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "La versión de GTK+ instalada es: %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "La versión requerida de GTK+ es: 2.12.0 o más reciente\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "La versión de PyGTK instalada es: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "La versión requerida de GTK+ es: 2.12.0 o más reciente" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Carpeta anterior" - -# -# File: src/filechooser.py, line: 82 -#~ msgid "ZIP archives" -#~ msgstr "Archivadores ZIP" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Archivadores Tar" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "Archivadores RAR" - -#~ msgid "LHA archives" -#~ msgstr "Archivadores LHA" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "Imágenes JPEG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "Imágenes PNG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "GIF images" -#~ msgstr "Imágenes GIF" - -# -# File: src/edit.py, line: 50 -#~ msgid "TIFF images" -#~ msgstr "Imágenes TIFF" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "BMP images" -#~ msgstr "Imágenes BMP" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "No se puede abrir %s: tipo de archivo desconocido." - -# -# File: src/preferences.py, line: 95 -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Usar este color como fondo para miniaturas:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! Error creando proceso \"%(command)s\": %(error)s." - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "" -#~ "\"%(command)s\" debe estar en el PATH del sistema para poder ser " -#~ "encontrado." - -#~ msgid "Please enter the password to continue:" -#~ msgstr "Introduzca la contraseña para continuar:" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Caché" - -#~ msgid "Toggle fullscreen" -#~ msgstr "Activar/desactivar pantalla completa" - -# -# File: src/library.py, line: 795 -#~ msgid "Add to this collection:" -#~ msgstr "Agregar a esta colección:" - -#~ msgid "Reading" -#~ msgstr "Leyendo" - -#~ msgid "Page orientation and zoom" -#~ msgstr "Orientación de página y zoom" - -#~ msgid "User Interface" -#~ msgstr "Interfaz de usuario" - -#, fuzzy -#~ msgid "File path" -#~ msgstr "Ruta completa" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Carpeta siguiente" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Carpeta siguiente" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Los archivadores se guardan como paquetes ZIP." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Archivador" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Archivador" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Archivador" - -#, fuzzy -#~ msgid "Literal quote" -#~ msgstr "Orden de archivos" - -#, fuzzy -#~ msgid "Literal % character" -#~ msgstr "Orden de archivos" - -#, fuzzy -#~ msgid "Directory name" -#~ msgstr "Carpeta" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Archivador anterior" - -#~ msgid "Order files by:" -#~ msgstr "Ordenar archivos por:" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Mostrar sólo una imagen ancha en el modo a doble página." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Muestra sólo una imagen en el modo a doble página, si la anchura de la " -#~ "imagen excede su altura. Esto es para que las imágenes en que dos páginas " -#~ "fueron escaneadas se muestren apropiadamente, es decir por separado, " -#~ "también en el modo a doble página." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Usar un color de fondo dinámico." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Modos predeterminados" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Usar el modo a doble página por defecto." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Usar el modo manga por defecto." - -# -# File: src/edit.py, line: 51 -#, fuzzy -#~ msgid "Refresh file" -#~ msgstr "Otros archivos" - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Estira las imágenes, llevándolas a un tamaño mayor que el original, si el " -#~ "modo de ampliación lo requiere. Si esta preferencia no se activa, las " -#~ "imágenes nunca se escalarán a un tamaño mayor que el original." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Los libros seleccionados serán eliminados de la biblioteca, los archivos " -#~ "originales no se tocarán ¿Está seguro de que desea continuar?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "¿Quitar la colección de la biblioteca?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "La colección seleccionada será quitada de la biblioteca, pero sus libros " -#~ "y subcolecciones permanecerán. ¿Está seguro de que desea continuar?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Se han quitado %d libro(s) de la biblioteca." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Renombrar..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Duplicar la colección" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Quitar la colección..." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Acerca de" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix es un visor de imágenes específicamente diseñado para manipular " -#~ "cómics." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix se licencia mediante la GNU General Public License." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Créditos" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "¡No se ha podido encontrar el extractor de archivos RAR!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "¡No se ha podido encontrar el extractor de archivos RAR!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Necesita instalar uno de estos programas, rar o unrar, para " -#~ "poder leer los archivos RAR (.cbr)." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "No se puede cambiar el nombre a '%s'." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add file " -#~ msgstr "No se puede leer %s" - -# -# File: src/bookmark.py, line: 229 -#~ msgid "Edit bookmarks" -#~ msgstr "Editar marcadores" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Añadir marcador" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Editar marcadores…" - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Quitar los marcadores..." - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "¿Desea quitar todos los marcadores?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Todos los marcadores guardados serán quitados. ¿Está seguro que desea " -#~ "continuar?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Hay archivos obsoletos en su ordenador." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Se encontraron en su ordenador algunos archivos que se usaban en " -#~ "versiones anteriores de Comix, para guardar preferencias, la bibliioteca, " -#~ "los marcadores, etc. Si no piensa volver a usar las versiones anteriores " -#~ "de Comix, debería eliminarlos para ganarse un poco de espacio en el " -#~ "disco. ¿Quiere que estos archivos se eliminen ahora?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "No se puede leer %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Importar" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Valores predeterminados" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "No se puede abrir %s: es un directorio." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "No se puede leer %s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "No se puede cambiar el nombre a '%s'." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "No se puede leer %s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Quitar de la biblioteca..." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "No se puede duplicar la colección." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "No se puede duplicar la colección." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Eliminar de esta colección" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Quitar de la biblioteca..." - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Tamaño de la tapa" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Página" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Estirar las imágenes pequeñas." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Modo de ampliación por defecto" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Mostrar el número de página en las miniaturas." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Editar el archivo" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Página _anterior" - -# -# File: src/ui.py, line: 42 -#~ msgid "_Zoom in" -#~ msgstr "_Ampliar" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "_Reducir" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "Tamaño o_riginal" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "_Ampliación manual" - -# -# File: src/ui.py, line: 63 -#~ msgid "Open _recent" -#~ msgstr "Abrir _reciente" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Transformar" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/fa/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/fa/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/fa/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/fa/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3853 +0,0 @@ -# Persian translation of MComix. -# Copyright (C) 2008, 2008 Sharif FarsiWeb, Inc. -# Maryam Sanaat , 2008. -# Meelad Zakaria , 2008 -msgid "" -msgstr "" -"Project-Id-Version: comix 3.6.4\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2008-05-21 12:40+0330\n" -"Last-Translator: Meelad Zakaria \n" -"Language-Team: Persian \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "صفحه" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "مکان" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "توضیحات" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "" - -# -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "پروندهٔ توضیح" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "روشنی" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "کنتراست" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "اشباع" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "وضوح" - -# -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "کنتراست به صورت خودکار تنظیم شود" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "باز کردن" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "همهٔ پرونده‌ها" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "بایگانی‌ها" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "بایگانی‌ها" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "همهٔ تصاویر" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "همهٔ تصاویر" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "" - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "صفحهٔ قبل" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "صفحهٔ بعد" - -# -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "استخراج صفحه" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "صفحهٔ قبل" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "صفحهٔ بعد" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "صفحهٔ قبل" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "صفحهٔ بعد" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "صفحهٔ اول" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "آخرین صفحه" - -# -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "رفتن به صفحهٔ" - -# -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "بایگانی tar" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "صفحهٔ قبل" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "لغزش" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_زوم به جلو" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_نگهداشتن تغییر شکل‌ها" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_نگهداشتن تغییر شکل‌ها" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_چرخاندن ۹۰ درجه‌ای در جهت ساعت" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "چرخاندن ۱۸۰ در_جه‌ای" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "چرخان_دن ۹۰ درجه‌ای در خلاف جهت ساعت" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "_پشت و رو کردن افقی" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "پشت و رو کردن _عمودی" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -#, fuzzy -msgid "Autorotate by width" -msgstr "است_خراج تصویر..." - -# -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Autorotate by height" -msgstr "است_خراج تصویر..." - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "حالت دو صفحه‌ای" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "حالت منطبق با عرض صفحه" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "حالت ژاپنی" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "عدسی بزرگ‌نما" - -# -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "تصاویر کوچک به اندازهٔ کادر نمایش داده شوند" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "حالت منطبق با عرض صفحه" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "حالت منطبق با ارتفاع صفحه" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "حالت منطبق با عر_ض صفحه" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "حالت زوم دستی" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "نوار و_ضعیت" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "نوارهای ل_غزش" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "مسطوره‌ها" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "مخ_فی کردن همه" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "نمایش اسلایدی" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "_پرونده" - -# -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "_پرونده‌های اخیر" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "ب_ستن" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_خروج" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "نمایش _توضیحات" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "ویژگی‌ها" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "ترجیحات" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "کتاب‌خانه" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "ویرایش نشانک‌ها" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "قابل حذف نیست" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "توضیح" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "پروندهٔ توضیح" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "صفحهٔ _قبل" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "توضیح" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "شاخه‌ها" - -# -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "همهٔ بایگانی‌ها" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "ویرایش نشانک‌ها" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_رفتن" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "رفتار" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "نمایش" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "رنگ پس‌زمینه" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "همیشه نوار لغزش مسطوره‌ها مخفی شود." - -# -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "هنگام آغاز به کار کامیکس، آخرین صفحهٔ دیده‌شده به طور خودکار باز شود." - -# -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "شمارهٔ صفحه روی مسطوره‌ها نشان داده شود" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "اندازهٔ مسطوره‌ها (نقطه):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "مقدار لغزش کلید فاصله:" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "هنگام لغزش وقتی به بالا یا پایین صفحه رسید، به صفحهٔ قبل یا بعد برود" - -# -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"هنگام «لغزش به خارج صفحه» با چرخ لغزش، همین‌طور کلیدهای جابه‌جایی در صفحه‌کلید، " -"به صفحهٔ بعد یا قبل برود، حتی وقتی که در حالت منطبق با صفحهٔ نمایش نیستید. سه " -"«مرحله» با چرخ لغزش یا کلیدهای جابه‌جایی لازم است تا این حرکت فعال شود." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "کنتراست به صورت خودکار تنظیم شود" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "در حالت دو صفحه‌ای از تغییر اندازهٔ هوشمند استفاده شود" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "هنگام آغاز برنامه آخرین پروندهٔ دیده‌شده باز شود" - -# -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "هنگام آغاز به کار کامیکس، آخرین صفحهٔ دیده‌شده به طور خودکار باز شود." - -# -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "پرونده‌های به‌تازگی بازشده ذخیره شوند" - -# -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "حالت تمام‌صفحه به صورت پیش‌فرض" - -# -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"در حالت تمام‌صفحه به طور خودکار نوار لغزش، نوار منو، نوار ابزار، نوار وضعیت و " -"مسطوره‌ها مخفی شوند." - -# -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "حالت منطبق با صفحهٔ نمایش" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "حالت منطبق با عرض صفحه" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "حالت منطبق با عر_ض صفحه" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "نمایش اسلایدی" - -# -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "تأخیر نمایش اسلایدی:" - -# -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "تأخیر نمایش اسلایدی:" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "کیفیت تغییر اندازه" - -# -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "تغییر اندازه" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "بایگانی tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "پرونده‌های به‌تازگی بازشده ذخیره شوند" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "عدسی بزرگ‌نما" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "ضریب بزرگ‌نمایی:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "پروندهٔ توضیح" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "همهٔ تصاویر" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "منطبق با عر_ض" - -# -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "منطبق به _طول" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "پرونده‌های به‌تازگی بازشده ذخیره شوند" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:590 -#, fuzzy -msgid "Normal (fast)" -msgstr "اندازهٔ _طبیعی" - -# -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "دوخطی" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "بایگانی" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "تصویر" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "آخرین دسترسی" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "آخرین تغییر" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "اجازه‌ها" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "مالک" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "نمایش اسلایدی" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "بایگانی ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "بایگانی RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "بایگانی tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "بایگانی tar فشرده‌شده به صورت gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "بایگانی tar فشرده‌شده به صورت bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "بایگانی tar فشرده‌شده به صورت gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "ترجمهٔ چینی ساده‌شده" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "ترجمهٔ اسپانیایی" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "ترجمهٔ پرتغالی برزیلی" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "ترجمهٔ آلمانی و مسطوره‌ساز ناتیلوس" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "ترجمهٔ یونانی" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "ترجمهٔ ایتالیایی" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "ترجمهٔ هلندی" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "ترجمهٔ فرانسوی" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "ترجمهٔ لهستانی" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "ترجمهٔ لهستانی" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "ترجمهٔ یونانی" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "ترجمهٔ کاتالانی" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "ترجمهٔ چینی سنتی" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "ترجمهٔ ژاپنی" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "ترجمهٔ مجاری" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "ترجمهٔ روسی" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "ترجمهٔ کرواتی" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "ترجمهٔ چکی" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "ترجمهٔ ایتالیایی" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "ترجمهٔ یونانی" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "ترجمهٔ ایتالیایی" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "صفحهٔ _بعد" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "صفحهٔ _قبل" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "صفحهٔ _اول" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "صفحهٔ آ_خر" - -# -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_رفتن به صفحهٔ..." - -# -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "رفتن به صفحهٔ..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "ب_ستن" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_خروج" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_چرخاندن ۹۰ درجه‌ای در جهت ساعت" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "چرخاندن ۱۸۰ در_جه‌ای" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "چرخان_دن ۹۰ درجه‌ای در خلاف جهت ساعت" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "_پشت و رو کردن افقی" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "پشت و رو کردن _عمودی" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "نشان_ک‌ها" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_ویرایش" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_پرونده" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_نما" - -# -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "نوارهای _ابزار" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "را_هنما" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -# -#: mcomix/mcomix/ui.py:105 -#, fuzzy -msgid "_Auto-rotate image" -msgstr "است_خراج تصویر..." - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "تمام‌_صفحه" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "حالت _دو صفحه‌ای" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_نوار ابزار" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "نوار _منو" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "نوار و_ضعیت" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "نوارهای ل_غزش" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "مس_طوره‌ها" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "مخ_فی کردن همه" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "حالت _ژاپنی" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_نگهداشتن تغییر شکل‌ها" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "نمایش اسلایدی" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_عدسی بزرگ‌نما" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "حالت منطبق با عر_ض صفحه" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "حالت منطبق با _ارتفاع صفحه" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "حالت منطبق با عر_ض صفحه" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_درباره" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -# -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "ویژ_گی‌ها" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "تر_جیحات" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_باز کردن..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "" - -# -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "اضافه شده:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "" - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "" - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "" - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "" - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -msgid "_Open list" -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -# -#: mcomix/mcomix/library/watchlist.py:43 -#, fuzzy -msgid "Directory" -msgstr "شاخه‌ها" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "مکان" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "" - -# -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "شاخه‌ها" - -# -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "تصویر GIF" - -# -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "تصویر TIFF" - -# -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "تصویر BMP" - -# -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "همیشه نوار لغزش مسطوره‌ها مخفی شود." - -# -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "قابل حذف نیست" - -# -#, fuzzy -#~ msgid "File path" -#~ msgstr "نوع پرونده" - -# -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "شاخه‌ها" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "بایگانی" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "بایگانی" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive name" -#~ msgstr "بایگانی" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "بایگانی" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "صفحهٔ قبل" - -# -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "در حالت دو صفحه‌ای اگر تصویر بزرگ است، فقط یک صفحه نمایش داده شود" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "درباره" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "کامیکس یک نمایش‌دهندهٔ تصویر است که به طور اختصاصی برای کار کردن با کتاب‌های " -#~ "کامیک طراحی شده است." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "کامیکس دارای مجوز عمومی همگانی GNU است." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "دست‌اندرکاران" - -# -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "قابل ایجاد نیست" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "اضافه کردن نشانک_" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_ویرایش نشانک‌ها..." - -# -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "قابل ایجاد نیست" - -# -#, fuzzy -#~ msgid "\", deleting..." -#~ msgstr "حذف تصویر..." - -# -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "قابل باز کردن نیست" - -# -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "قابل حذف نیست" - -# -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "قابل خواندن نیست" - -# -#, fuzzy -#~ msgid " to the library" -#~ msgstr "_اضافه کردن به کتاب‌خانه" - -# -#, fuzzy -#~ msgid "Add folder" -#~ msgstr "انتخاب پوشه" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "صفحه" - -# -#, fuzzy -#~ msgid "top window." -#~ msgstr "بستن این پنجره" - -# -#, fuzzy -#~ msgid "_Refresh file" -#~ msgstr "_پرونده‌های اخیر" - -# -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "بایگانی tar" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "صفحهٔ _قبل" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "زوم به _عقب" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "_زوم دستی" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_تغییر شکل" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "در حال حذف مسطوره‌ها" - -# -#~ msgid "No images in \"%s\"" -#~ msgstr "هیچ تصویری در «%s» نیست." - -# -#~ msgid "Default" -#~ msgstr "پیش‌فرض" - -# -#~ msgid "Fit-to-_screen mode" -#~ msgstr "حالت منطبق با _صفحهٔ نمایش" - -# -#~ msgid "Apply filter on full path" -#~ msgstr "صافی بر مسیر کامل اعمال شود" - -# -#~ msgid "Add archives to library." -#~ msgstr "اضافه کردن بایگانی‌ها به کتاب‌خانه" - -# -#~ msgid "Remove selected archive from library." -#~ msgstr "حذف بایگانی انتخاب‌شده از کتاب‌خانه" - -# -#~ msgid "Clean up" -#~ msgstr "‍پاک‌سازی" - -# -#~ msgid "Remove orphaned or outdated library entries." -#~ msgstr "حذف مدخل‌های کهنه یا یتیم از کتابخانه." - -# -#~ msgid "Open selected archive." -#~ msgstr "باز کردن بایگانی انتخاب‌شده" - -# -#~ msgid "JPEG image" -#~ msgstr "تصویر JPEG" - -# -#~ msgid "PNG image" -#~ msgstr "تصویر PNG" - -# -#~ msgid "ICO image" -#~ msgstr "تصویر ICO" - -# -#~ msgid "XPM image" -#~ msgstr "تصویر XPM" - -# -#~ msgid "XBM image" -#~ msgstr "تصویر XBM" - -# -#~ msgid "Add archives recursively" -#~ msgstr "بایگانی‌ها به صورت بازگشتی اضافه شوند" - -# -#~ msgid "Double page mode as default" -#~ msgstr "حالت دو صفحه‌ای به صورت پیش‌فرض" - -# -#~ msgid "Always view comments when opening a new file" -#~ msgstr "هنگام باز شدن پرونده‌های جدید، همیشه توضیحات نمایش داده شوند" - -# -#~ msgid "Hide menubar, scrollbars etc. in fullscreen mode" -#~ msgstr "در حالت تمام‌صفحه نوار منو، نوارهای لغزش و غیره مخفی شود" - -# -#~ msgid "Cache pages for faster forward flipping" -#~ msgstr "برای جلو رفتن سریع‌تر، صفحات در حافظهٔ نهان ذخیره شوند" - -# -#~ msgid "Scroll wheel scrolls horizontally at top and bottom of page" -#~ msgstr "چرخ لغزش موشی در بالا و پایین صفحه سبب لغزش افقی شود" - -# -#~ msgid "Hide thumbnail scrollbar" -#~ msgstr "نوار لغزش مسطوره‌ها مخفی شود" - -# -#~ msgid "Space key uses smart scrolling" -#~ msgstr "کلید فاصله برای لغزش هوشمند استفاده شود" - -# -#~ msgid "Save window position and size for future sessions" -#~ msgstr "موقعیت و اندازهٔ پنجره برای نشست‌های بعدی ذخیره شود" - -# -#~ msgid "Go to the next archive in directory after last page" -#~ msgstr "پس از آخرین صفحه بایگانی بعدی در شاخه باز شود" - -# -#~ msgid "Hide cursor in fullscreen mode" -#~ msgstr "در حالت تمام‌صفحه، مکان‌نما مخفی شود" - -# -#~ msgid "Always use smart scrolling as if in double page mode" -#~ msgstr "همیشه از لغزش هوشمند مانند حالت دو صفحه‌ای استفاده شود" - -# -#~ msgid "Use stored thumbnails for images in directories" -#~ msgstr "برای تصاویر شاخه‌ها از مسطوره‌های ذخیره‌شده استفاده شود" - -# -#~ msgid "Use stored thumbnails for images in archives" -#~ msgstr "برای تصاویر بایگانی‌ها از مسطوره‌های ذخیره‌شده استفاده شود" - -# -#~ msgid "Always go to this directory in the \"Open\" dialog:" -#~ msgstr "محاورهٔ «باز کردن» همیشه به این شاخه برود:" - -# -#~ msgid "Always go to the latest directory in the \"Open\" dialog" -#~ msgstr "محاورهٔ «باز کردن» همیشه به آخرین شاخهٔ بازشده برود" - -# -#~ msgid "Nearest (quickest, worst quality)" -#~ msgstr "نزدیک‌ترین (سریع‌ترین، بدترین کیفیت)" - -# -#~ msgid "Tiles" -#~ msgstr "تکه تکه" - -# -#~ msgid "Hyper (slowest, best quality)" -#~ msgstr "دقیق (آهسته‌ترین، بهترین کیفیت)" - -# -#~ msgid "Manual zoom mode as default" -#~ msgstr "حالت زوم دستی به صورت پیش‌فرض" - -# -#~ msgid "Fit-to-screen mode as default" -#~ msgstr "حالت منطبق با صفحهٔ نمایش به صورت پیش‌فرض" - -# -#~ msgid "Fit width mode as default" -#~ msgstr "حالت منطبق با عرض صفحه به صورت پیش‌فرض" - -# -#~ msgid "Fit height mode as default" -#~ msgstr "حالت منطبق با ارتفاع صفحه به صورت پیش‌فرض" - -# -#~ msgid "Background colour:" -#~ msgstr "رنگ پس‌زمینه:" - -# -#~ msgid "Toolbar button labels:" -#~ msgstr "برچسب دگمه‌های نوار ابزار:" - -# -#~ msgid "Icons only" -#~ msgstr "فقط شمایل" - -# -#~ msgid "Text only" -#~ msgstr "فقط متن" - -# -#~ msgid "Icons and text" -#~ msgstr "شمایل و متن" - -# -#~ msgid "Treat files with the following extensions as comments:" -#~ msgstr "با پرونده‌های دارای پسوندهای زیر مثل توضیحات رفتار شود:" - -# -#~ msgid "of" -#~ msgstr "از" - -# -#~ msgid "Window size" -#~ msgstr "اندازهٔ پنجره" - -# -#~ msgid "Page size" -#~ msgstr "اندازهٔ صفحه" - -# -#~ msgid "Lens size (px):" -#~ msgstr "اندازهٔ عدسی (نقطه):" - -# -#~ msgid "Update interval (milliseconds):" -#~ msgstr "فاصلهٔ زمانی به‌روزرسانی (میلی‌ثانیه):" - -# -#~ msgid "Lens" -#~ msgstr "عدسی" - -# -#~ msgid "Library thumbnail sizes (px):" -#~ msgstr "اندازهٔ مسطوره‌های کتاب‌خانه (نقطه):" - -# -#~ msgid "Adjust colour" -#~ msgstr "تنظیم رنگ" - -# -#~ msgid "Save values for future sessions" -#~ msgstr "مقادیر برای نشست‌های آینده ذخیره شود" - -# -#~ msgid "Title" -#~ msgstr "عنوان" - -# -#~ msgid "It reads ZIP, RAR and tar archives (also gzip or bzip2 compressed)" -#~ msgstr "" -#~ "این نرم‌افزار بایگانی‌های ZIP، RAR و tar (و همچنین پرونده‌هایی که با gzip یا " -#~ "bzip2 فشرده شده‌اند) " - -# -#~ msgid "as well as plain image files." -#~ msgstr "و همچنین پرونده‌های تصویری ساده را می‌خواند." - -# -#~ msgid "Developer and Swedish translation" -#~ msgstr "برنامه‌سازی و ترجمهٔ سوئدی" - -# -#~ msgid "Manage thumbnails" -#~ msgstr "مدیریت مسطوره‌ها" - -# -#~ msgid "Remove all stored thumbnails:" -#~ msgstr "همهٔ مسطوره‌های ذخیره‌شده حذف شوند:" - -# -#~ msgid "Remove orphaned thumbnails:" -#~ msgstr "مسطوره‌های یتیم‌شده حذف شوند:" - -# -#~ msgid "Convert" -#~ msgstr "تبدیل" - -# -#~ msgid "Extension" -#~ msgstr "پسوند" - -# -#~ msgid "Zip archive" -#~ msgstr "بایگانی ZIP" - -# -#~ msgid "Delete old archive/directory" -#~ msgstr "بایگانی/شاخهٔ قدیمی حذف شود." - -# -#~ msgid "Permission denied" -#~ msgstr "اجازه داده نشد" - -# -#~ msgid "Confirm operation" -#~ msgstr "تأیید عملیات" - -# -#~ msgid "Permanently remove %s?" -#~ msgstr "%s برای همیشه حذف شود؟" - -# -#~ msgid "Perform lossless JPEG operation on %s?" -#~ msgstr "عملیات JPEG بی‌خسارت روی %s انجام شود؟" - -# -#~ msgid "Some images might be trimmed a bit during the operation." -#~ msgstr "ممکن است در طول عملیات حاشیهٔ بعضی تصاویر کمی بریده شوند." - -# -#~ msgid "Permanently convert %s to greyscale?" -#~ msgstr "%s برای همیشه به سایه‌خاکستری تبدیل شود؟" - -# -#~ msgid "Location:" -#~ msgstr "مکان:" - -# -#~ msgid "Quantity:" -#~ msgstr "کمیت:" - -# -#~ msgid "Total size:" -#~ msgstr "اندازهٔ کلی:" - -# -#~ msgid "Removed:" -#~ msgstr "حذف‌شده:" - -# -#~ msgid "Done!" -#~ msgstr "انجام شد!" - -# -#~ msgid "pages" -#~ msgstr "صفحه" - -# -#~ msgid "comment" -#~ msgstr "توضیح" - -# -#~ msgid "comments" -#~ msgstr "توضیح" - -# -#~ msgid "In library" -#~ msgstr "در کتاب‌خانه" - -# -#~ msgid "Yes" -#~ msgstr "بله" - -# -#~ msgid "No" -#~ msgstr "نه" - -# -#~ msgid "Bookmarked" -#~ msgstr "نشانک‌گذاری شده" - -# -#~ msgid "Yes, page" -#~ msgstr "بله، صفحهٔ" - -# -#~ msgid "Mode" -#~ msgstr "حالت" - -# -#~ msgid "Pixel count" -#~ msgstr "تعداد نقاط" - -# -#~ msgid "Pixel sum" -#~ msgstr "مجموع نقاط" - -# -#~ msgid "Extrema" -#~ msgstr "بیشینه" - -# -#~ msgid "Mean" -#~ msgstr "میانگین" - -# -#~ msgid "Median" -#~ msgstr "میانه" - -# -#~ msgid "Standard deviation" -#~ msgstr "انحراف معیار استاندارد" - -# -#~ msgid "Image 1" -#~ msgstr "تصویر ۱" - -# -#~ msgid "Image 2" -#~ msgstr "تصویر ۲" - -# -#~ msgid "Please check your permissions." -#~ msgstr "لطفاً اجازه‌هایتان را بررسی کنید." - -# -#~ msgid "Adding library entries" -#~ msgstr "در حال اضافه کردن مدخل‌های کتاب‌خانه" - -# -#~ msgid "Removing library entries" -#~ msgstr "در حال حذف مدخل‌های کتاب‌خانه" - -# -#~ msgid "page" -#~ msgstr "صفحه" - -# -#~ msgid "" -#~ "Could not find the unrar executable. Please install it if you wish to " -#~ "open RAR archives." -#~ msgstr "" -#~ "پروندهٔ اجرایی بازکنندهٔ RAR پیدا نمی‌شود. اگر می‌خواهید بایگانی‌های RAR را " -#~ "باز کنید، لطفاً آن را نصب کنید." - -# -#~ msgid "is not a file." -#~ msgstr "پرونده نیست." - -# -#~ msgid "does not exist." -#~ msgstr "وجود ندارد." - -# -#~ msgid "Filetype of" -#~ msgstr "نوع پروندهٔ" - -# -#~ msgid "not recognized." -#~ msgstr "شناخته‌نشده است." - -# -#~ msgid "_Best fit" -#~ msgstr "_بهترین تطابق" - -# -#~ msgid "Clear bookmarks" -#~ msgstr "پاک‌سازی نشانک‌ها" - -# -#~ msgid "_Manage thumbnails..." -#~ msgstr "_مدیریت مسطوره‌ها..." - -# -#~ msgid "Clear recent files" -#~ msgstr "پاک‌سازی فهرست پرونده‌های اخیر" - -# -#~ msgid "Open _library..." -#~ msgstr "باز کردن _کتاب‌خانه..." - -# -#~ msgid "Con_vert..." -#~ msgstr "تب_دیل..." - -# -#~ msgid "_Adjust colour..." -#~ msgstr "_تنظیم رنگ..." - -# -#~ msgid "CW lossless JPEG rotation..." -#~ msgstr "دوران JPEG بی‌خسارت در جهت ساعت..." - -# -#~ msgid "CCW lossless JPEG rotation..." -#~ msgstr "دوران JPEG بی‌خسارت در خلاف جهت ساعت..." - -# -#~ msgid "Horizontal lossless JPEG flip..." -#~ msgstr "پشت و رو کردن افقی JPEG بی‌خسارت..." - -# -#~ msgid "Vertical lossless JPEG flip..." -#~ msgstr "پشت و رو کردن عمودی JPEG بی‌خسارت..." - -# -#~ msgid "Convert JPEG to greyscale..." -#~ msgstr "تبدیل JPEG به سایه‌خاکستری..." - -# -#~ msgid "File o_perations" -#~ msgstr "ع_ملیات پرونده" - -# -#~ msgid "Enter fullscreen mode automatically when Comix is started." -#~ msgstr "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت تمام‌صفحه شود." - -# -#~ msgid "Enter double page mode automatically when Comix is started." -#~ msgstr "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت دو صفحه‌ای شود." - -# -#~ msgid "Enter manual zoom mode automatically when Comix is started." -#~ msgstr "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت زوم دستی شود." - -# -#~ msgid "Enter fit-to-screen mode automatically when Comix is started." -#~ msgstr "" -#~ "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت منطبق با صفحهٔ نمایش شود." - -# -#~ msgid "Enter fit width mode automatically when Comix is started." -#~ msgstr "" -#~ "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت منطبق با عرض صفحه شود." - -# -#~ msgid "Enter fit height mode automatically when Comix is started." -#~ msgstr "" -#~ "هنگام آغاز به کار کامیکس، به طور خودکار وارد حالت منطبق با ارتفاع صفحه " -#~ "شود." - -# -#~ msgid "" -#~ "Also scale images to a size that is larger than their original size in " -#~ "fit-to-screen mode, fit width mode and fit height mode." -#~ msgstr "" -#~ "همچنین در حالت منطبق با صفحهٔ نمایش، منطبق با عرض و منطبق با ارتفاع، " -#~ "تصاویر بزرگ‌تر از اندازهٔ واقعی‌شان نمایش داده شوند." - -# -#~ msgid "" -#~ "Scale the images independently when in double page mode and fit-to-screen " -#~ "mode. The smaller of the two images will scale up to fill any extra space " -#~ "that is given." -#~ msgstr "" -#~ "در حالت دو صفحه‌ای و منطبق با صفحهٔ نمایش، تصاویر مستقلاً بزرگ شوند. تصویر " -#~ "کوچک‌تر بزرگ می‌شود تا فضای اضافی موجود را پر کند." - -# -#~ msgid "Automatically show any available comments when opening a new file." -#~ msgstr "" -#~ "هنگام باز شدن یک پروندهٔ جدید، توضیح‌های موجود به طور خودکار نشان داده شوند." - -# -#~ msgid "" -#~ "Cache the next page in the archive/directory to increase the perceived " -#~ "speed. This is generally recommended unless you are running low on RAM." -#~ msgstr "" -#~ "برای افزایش سرعت مشاهده، صفحهٔ بعدی در بایگانی/شاخه در حافظهٔ نهان ذخیره " -#~ "شود. استفاده از این گزینه معمولاً توصیه می‌شود مگر آن که حافظهٔ کامپیوترتان " -#~ "کم باشد." - -# -#~ msgid "" -#~ "Move the horizontal scrollbar instead of the vertical when using the " -#~ "scroll wheel at the top or the bottom of the page. The direction will be " -#~ "determined by whether you use manga mode or not." -#~ msgstr "" -#~ "هنگام استفاده از چرخ لغزش در بالا یا پایین صفحه، به جای نوار لغزش عمودی، " -#~ "نوار لغزش افقی حرکت کند. جهت حرکت بسته به این که شما از حالت ژاپنی " -#~ "استفاده کنید یا نه، تعیین می‌شود." - -# -#~ msgid "" -#~ "Save the position and the size of the window for the next time you start " -#~ "Comix." -#~ msgstr "" -#~ "موقعیت و اندازهٔ پنجره برای دفعهٔ بعدی که کامیکس را آغاز می‌کنید، ذخیره شود." - -# -#~ msgid "" -#~ "Automatically open the next archive in the directory when scrolling past " -#~ "the last page of the current archive, and automatically open the previous " -#~ "archive in the directory when scrolling past the first page of the " -#~ "current archive." -#~ msgstr "" -#~ "وقتی لغزش صفحهٔ آخر بایگانی فعلی تمام شد، بایگانی بعدی در شاخه به طور " -#~ "خودکار باز شود و وقتی از صفحهٔ اول بایگانی فعلی بالاتر رفتید، به طور " -#~ "خودکار بایگانی قبل از این شاخه باز شود." - -# -#~ msgid "Hide the cursor when in fullscreen mode." -#~ msgstr "در حالت تمام‌صفحه مکان‌نما مخفی شود." - -# -#~ msgid "" -#~ "Set the image scaling method. The best choice is often \"Tiles\", it is " -#~ "quite quick and produces almost as good results as \"Bilinear\" or \"Hyper" -#~ "\"." -#~ msgstr "" -#~ "روش بزرگ‌نمایی تصویر را تنظیم کنید. بهترین انتخاب غالباً «تکه تکه» است، این " -#~ "گزینه کاملاً سریع است و تقریباً به خوبی «دو خطی» و «دقیق» نتیجه می‌دهد." - -# -#~ msgid "" -#~ "Treat files with the following extensions as comment files. Extensions " -#~ "should be separated by whitespaces. They are not case sensitive." -#~ msgstr "" -#~ "با پرونده‌های دارای پسوندهای زیر مانند پرونده‌های توضیح رفتار شود. عبارات " -#~ "باید با فاصله جدا شده باشند. سیستم به بزرگی و کوچکی حروف حساس نیست." - -# -#~ msgid "" -#~ "Use smart scrolling with the space key. Pressing the space key normally " -#~ "scrolls straight down one window height unless at the bottom of the page " -#~ "where it flips pages instead. When this option is set Comix automatically " -#~ "tries to follow the reading flow of the comic book. When pressing the " -#~ "space key it will not only scroll down but will also scroll horizontally " -#~ "to the edge of the page (left or right depending on whether you use manga " -#~ "mode). In double page mode it will go to the edge of the first page if it " -#~ "is in view, otherwise it will go to the edge of the second page. Also, in " -#~ "double page mode with this option, Comix will not flip pages unless at " -#~ "the bottom of the second page. At the bottom of the first page it will " -#~ "instead go to the top of the second page." -#~ msgstr "" -#~ "از لغزش هوشمند با کلید فاصله استفاده شود. به طور معمول فشردن کلید فاصله " -#~ "طول یک صفحه را به طرف پایین می‌لغزاند، مگر در آخر صفحه که به صفحهٔ بعد " -#~ "می‌رود. وقتی این گزینه انتخاب شده کامیکس به طور خودکار تلاش می‌کند که روند " -#~ "خواندن کتاب کامیک را دنبال کند. با فشار دادن کلید فاصله، نه تنها صفحه به " -#~ "پایین می‌لغزد بلکه به صورت افقی هم به لبهٔ صفحه (چپ یا راست بسته به " -#~ "استفادهٔ شما از حالت ژاپنی) می‌رود. در حالت دو صفحه‌ای اگر صفحهٔ اول در نما " -#~ "باشد، به لبهٔ صفحهٔ اول می‌رود. در غیر این صورت به لبهٔ صفحهٔ دوم می‌رود. " -#~ "همچنین با این گزینه در حالت دو صفحه‌ای، کامیکس به صفحهٔ بعد نمی‌رود مگر در " -#~ "آخر صفحهٔ دوم. در آخر صفحهٔ اول به اول صفحهٔ دوم می‌رود." - -# -#~ msgid "" -#~ "Automatically go to the same directory as last time when opening the " -#~ "\"Open\" dialog." -#~ msgstr "" -#~ "هنگام باز شدن محاورهٔ «باز کردن»، به طور خودکار به همان شاخه‌ای برود که " -#~ "آخرین بار در آن بود." - -# -#~ msgid "Automatically go to this directory when opening the \"Open\" dialog." -#~ msgstr "هنگام باز شدن محاورهٔ «باز کردن»، به طور خودکار به این شاخه برود." - -# -#~ msgid "Automatically restore these values the next time Comix is started." -#~ msgstr "" -#~ "دفعهٔ بعد که کامیکس شروع به کار کرد، این مقادیر به طور خودکار برگردانده " -#~ "شوند." - -# -#~ msgid "Show the page number in the upper left corner of each thumbnail." -#~ msgstr "شمارهٔ صفحه در گوشهٔ چپ و بالای تک‌تک مسطوره نشان داده شود." - -# -#~ msgid "" -#~ "Automatically adjust the contrast of the images so that the darkest pixel " -#~ "is completely black and the lightest pixel is completely white. This only " -#~ "works with images without an alpha channel." -#~ msgstr "" -#~ "کنتراست تصویر به صورت خودکار تنظیم شود طوری که تیره‌ترین نقطه کاملاً سیاه و " -#~ "روشن‌ترین نقطه کاملاً سفید باشد. این امکان فقط در مورد تصویرهای بدون کانال " -#~ "آلفا کار می‌کند." - -# -#~ msgid "" -#~ "The space key uses smart scrolling as if in double page mode even when in " -#~ "single page mode. This can be useful for comics with two scanned pages in " -#~ "each image. The pages are assumed to be of equal size" -#~ msgstr "" -#~ "مانند حالت دو صفحه‌ای، کلید فاصله در لغزش هوشمند استفاده می‌شود حتی در حالت " -#~ "یک صفحه‌ای. این گزینه می‌تواند برای کامیک‌هایی با دو صفحهٔ پویش‌شده در هر " -#~ "تصویر مفید باشد. انتظار می‌رود اندازهٔ صفحات برابر باشد." - -# -#~ msgid "Adjust the lens magnification factor." -#~ msgstr "ضریب بزرگ‌نمایی عدسی را تنظیم کنید." - -# -#~ msgid "" -#~ "Set the lens width and height in pixels. A larger lens will use more CPU " -#~ "resources than a small one." -#~ msgstr "" -#~ "عرض و طول عدسی را بر حسب نقطه وارد کنید. عدسی‌های بزرگ‌تر بیش از عدسی‌های " -#~ "کوچک منابع واحد پردازش مرکزی را مصرف می‌کنند." - -# -#~ msgid "" -#~ "Set the maximum update frequency for the magnification lens in " -#~ "milliseconds. Setting the value too low can cause the lens to lag behind " -#~ "when moving the mouse quickly. Setting the value too high can cause the " -#~ "lens to appear choppy." -#~ msgstr "" -#~ "حداکثر بسامد به‌روزرسانی برای بزرگ‌نمایی عدسی را به میلی‌ثانیه وارد کنید. " -#~ "وارد کردن مقادیر خیلی کم ممکن است در هنگام حرکت سریع موشی باعت تاخیر در " -#~ "عملکرد عدسی شود.وارد کردن مقادیر خیلی زیاد ممکن است سبب شود عدسی مواج به " -#~ "نظر برسد." - -# -#~ msgid "" -#~ "Read and write thumbnails in the ~/.thumbnails directory as proposed by " -#~ "the freedesktop.org standard. With this preference set, Comix will use " -#~ "the thumbnails already stored there to speed up thumbnail loading. If " -#~ "there are no thumbnails, Comix will create them and save them there. This " -#~ "is a standard that many applications conform to, thumbnails created by " -#~ "other applications can be used by Comix and vice versa. If this " -#~ "preference is not set, Comix will create thumbnails on the fly every time " -#~ "a directory is opened." -#~ msgstr "" -#~ "مطابق با استاندارد freedesktop.org، مسطوره‌ها در شاخهٔ ‎~/.thumbnails خوانده " -#~ "و نوشته شوند. در صورت استفاده از این گزینه، کامیکس برای سرعت دادن به بار " -#~ "کردن مسطوره‌ها از مسطوره‌هایی که قبلاً ذخیره شده‌اند استفاده می‌کند. در صورتی " -#~ "که هیچ مسطوره‌ای آن جا نباشد، کامیکس آنها را ایجاد و در آن جا ذخیره می‌کند. " -#~ "این استانداردی است که خیلی از برنامه‌ها با آن همخوانی دارند، ممکن است " -#~ "کامیکس از مسطوره‌هایی که توسط برنامه‌های دیگر ایجاد شده استفاده کند و یا " -#~ "برعکس. اگر این گزینه خاموش باشد، هر وقت شاخه‌ای باز شد، کامیکس همان موقع " -#~ "مسطوره‌های آن را ایجاد می‌کند." - -# -#~ msgid "" -#~ "Also use stored thumbnails for images in archives in a similiar way. Due " -#~ "to restrictions in the freedesktop.org standard, these thumbnails will be " -#~ "stored in ~/.comix and will only be used by Comix. If this preference is " -#~ "not set, Comix will create thumbnails on the fly every time an archive is " -#~ "opened." -#~ msgstr "" -#~ "همچنین از مسطوره‌های ذخیره‌شده برای تصاویر داخل بایگانی‌ها به شکل مشابه " -#~ "استفاده شود. با توجه به محدودیت‌های استاندارد freedesktop.org، این " -#~ "مسطوره‌ها در ~/.comix ذخیره می‌شوند و فقط توسط کامیکس مورد استفاده قرار " -#~ "می‌گیرند. اگر این گزینه خاموش باشد، هر وقت یک بایگانی باز شود، کامیکس " -#~ "هم‌زمان مسطوره‌ها را برای آن ایجاد می‌کند." - -# -#~ msgid "" -#~ "Only display a single image in double page mode if the image consists of " -#~ "two pages. An image is assumed to consist of two pages if its width is " -#~ "greater than its height." -#~ msgstr "" -#~ "در حالت دو صفحه‌ای در صورتی که تصویر شامل دو صفحه باشد، فقط یک تصویر نمایش " -#~ "داده شود. اگر عرض تصویر بزرگ‌تر از طولش باشد، فرض می‌شود دو صفحه است." - -# -#~ msgid "Filter out archives with regular expressions." -#~ msgstr "بایگانی‌ها با عبارات باقاعده صافی شوند." - -# -#~ msgid "Apply filters on full paths rather than filenames." -#~ msgstr "صافی‌ها به جای نام پرونده‌ها روی مسیر کامل اعمال شود." - -# -#~ msgid "" -#~ "Store a list of the 10 last opened files that can be accessed through the " -#~ "menus." -#~ msgstr "" -#~ "فهرستی از ۱۰ پروندهٔ آخری که باز شده‌اند، ذخیره شود تا از طریق منو‌ها قابل " -#~ "دسترسی باشند." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/fr/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/fr/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/fr/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/fr/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3062 +0,0 @@ -# Frédéric Chateaux , 2012, 2013. -msgid "" -msgstr "" -"Project-Id-Version: MComix 0.93\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2015-04-05 08:54+0100\n" -"Last-Translator: Benoit Pierre \n" -"Language-Team: \n" -"Language: fr_FR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 1.7.5\n" -"X-Language: fr\n" -"X-Source-Language: en\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" -"%s est un visionneur d'images, dédié à la lecture des bandes dessinées. " - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"Il lit les archives ZIP, RAR et Tar aussi bien que les fichiers images." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s est disponible suivant les termes de la GNU General Public License." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "Une copie de cette licence peut être obtenue sur %s" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Format d'archive non supporté : %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "Erreur d'extraction : %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Impossible de créer une archive à l'emplacement spécifié \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Impossible d'ajouter le fichier %(sourcefile)s à l'archive " -"%(archivefile)s, Processus abandonné." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! Impossible de lire %s" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Impossible de lire le fichier de signets %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "Remplacer le signet actuel pour la page %s ? " -msgstr[1] "Remplacer les signets actuels pour les pages %s ? " - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"Le livre courant contient déjà des pages marquées. Voulez-vous les remplacer " -"avec un nouveau signet sur la page %d ? " - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"Sélectionner « Non » créera un nouveau signet sans affecter les autres " -"signets." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Éditer les signets" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Type" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nom" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Page" - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":" -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Emplacement " - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "Ajoutés" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "_Ajouter un signet" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "_Éditer les signets…" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! Échec de la fonction de rappel %(function)r : %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Commentaires" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Impossible de lire %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Les seuls fichiers ajoutés automatiquement à cette liste sont les fichiers " -"de l'archive que MComix reconnait comme commentaires." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Taille" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Effacer de l'archive" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Éditer l'archive" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_Importer" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Images" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "Fichiers de commentaires" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Impossible d'enregistrer la nouvelle archive !" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Les fichiers originaux n'ont pas été supprimés." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Les archives sont enregistrés comme fichiers ZIP." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Amélioration de l'image" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Réinitialiser." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "Enregistrer les valeurs sélectionnées pour les futurs fichiers." - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_Luminosité :" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_Contraste :" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "_Saturation :" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "_Netteté :" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "_Ajuster automatiquement le contraste" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Ajustement automatique du contraste (clarté et obscurité), séparément pour " -"chaque couleur." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Ouvrir" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Enregistrer" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Tous les fichiers" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "Toutes les archives" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "Archives %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Toutes les images" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "Images %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Un fichier nommé '%s' existe déjà. Voulez-vous le remplacer?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Le remplacement du fichier écrasera son contenu." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Ajouter des livres" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Pas d'images dans '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Impossible d'ouvrir %s : fichier inexistant." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Impossible d'ouvrir %s : permission refusée." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "Continuer la lecture depuis la page %d ?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"Vous avez arrêté de lire à cet endroit le %(date)s à %(time)s. Si vous " -"choisissez « Oui  », la lecture se poursuivra depuis la page %(page)d. " -"Autrement, elle reprendra à la première page du livre." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Fichier de préférences corrompu \"%s\",suppression…" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Emplacement non valide : '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! Impossible de charger l'icône \"%s\"" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Type de fichier inconnu" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Page précédente" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "Navigation" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Page suivante" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Retourner de 10 pages en arrière" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Avancer de 10 pages" - -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "Page précédente (dynamique)" - -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "Page suivante (dynamique)" - -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "Page précédente (toujours une page)" - -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "Page suivante (toujours une page)" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Première page" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Dernière page" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Aller à la page..." - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Archive suivante" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Archive précédente" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Répertoire suivant" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Répertoire précédent" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "Aller dans le coin inférieur gauche" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Défilement" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "Aller au centre du bas de l'image" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "Aller dans le coin inférieur droit" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "Aller au milieu gauche de l'image" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "Aller au centre de l'image" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "Aller au milieu droit de l'image" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "Aller dans le coin supérieur gauche" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "Aller au centre du haut de l'image" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "Aller dans le coin supérieur droit" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "Défilement vers le bas" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "Défilement vers le haut" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "Défilement à droite" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "Défilement à gauche" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "Défilement intelligent vers le haut" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "Défilement intelligent vers le bas" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Zoomer" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "Zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Dézoomer" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Taille normale" - -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "Mémoriser la transformation" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "Transformation" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "Rotation de 90 degrés sens horaire" - -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "Rotation de 180 degrés" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "Rotation de 90 degrés sens anti-horaire" - -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "Miroir horizontal" - -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "Miroir vertical" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "Désactiver les rotations automatiques" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "Rotation automatique basée sur la largeur" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "Rotation automatique basée sur la hauteur" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Mode double page" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "Modes d'affichage" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Mode manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "Inversion du défilement intelligent" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Loupe" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Étirer les petites images" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Taille idéale" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Ajuster à la largeur" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Ajuster à la hauteur" - -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "Adapter à la page" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Zoom manuel" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Quitter le mode plein écran" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Interface utilisateur" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "Afficher le panneau OSD" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "Minimiser" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Plein écran" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "Afficher/masquer la barre d'outils" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "Afficher/masquer la barre des menus" - -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "Afficher/masquer la barre d'état" - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":". -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "Afficher/masquer les barres de défilement" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Vignettes" - -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "Tout afficher/masquer" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Démarre le diaporama" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "Supprimer" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "Fichier" - -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "Actualiser" - -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "Fermer" - -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "Quitter" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "Enregistrer et quitter" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "Enregistrer sous…" - -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "Commentaires de l'archive" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Propriétés" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Préférences" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Bibliothèque" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "Exécuter une commande externe" - -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "Éditer les commandes externes" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" -"Le raccourci pour \"%(action)s\" remplace le raccourci clavier d'une autre " -"action." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "Impossible de charger les raccourcis clavier : %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "Touche %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Erreur : impossible de localiser pysqlite2 et sqlite3." - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! Impossible de supprimer \"%s\"" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "DIAPORAMA" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Enregistrer la page sous" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "Supprimer \"%s\" ?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "Le fichier sera effacer de votre disque dur." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Ne plus demander." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "'%s' ne peut être utilisé que pour les archives." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "Impossible d'exécuter la commande %(cmdlabel)s : %(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "La ligne de commande est vide." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" -"Séquence d'échappement incomplète. Pour une '%' littérale, utilisez '%%'." - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" -"Séquence d'échappement incomplète. Pour une '\"' littérale, utilisez '%\"'." - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" -"Les variables liées au fichier courant ne peuvent être utilisées que pour " -"les fichiers." - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" -"Les variables liées à l'archive courante ne peuvent être utilisées que pour " -"les archives." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "Séquence d'échappement non valide : %%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "Éditer les commandes externes" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "Ajouter un séparateur" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "Lancer la _commande" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "Ceci est un séparateur." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "\"%s\" n'a pas de répertoire de travail valide." - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "\"%s\" ne semble pas avoir un exécutable valide." - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "Libellé de la commande" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "Pré-visualisation:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"Veuillez vous référer à la documentation sur les commandes " -"externes pour obtenir la liste des variables supportées et des astuces " -"concernant leur utilisation." - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "Libellé" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "Commande" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "Répertoire de travail" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "Désactivé pour les archives" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "Sauvegarder les changements à la liste des commandes externes ?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"Vous avez des changements non-sauvegardés à la liste des commandes externes. " -"Pressez \"Oui\" pour les sauvegardez, ou \"Non\" pour les annuler." - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "Éditer les commandes externes" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "A_ller à" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "_Annuler" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " de %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Apparence" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportement" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Affichage" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Avancé" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "Raccourcis" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Langue (redémarrage requis) :" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "La touche Échappe ferme le programme" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"Appuyer sur la touche Échap ferme le programme plutôt que de désactiver le " -"mode plein écran." - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Arrière-plan" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Utiliser cette couleur comme arrière-plan :" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Toujours utiliser cette couleur comme arrière-plan" - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Utiliser une couleur d'arrière-plan dynamique" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Sélectionne automatiquement une couleur d'arrière-plan correspondant à " -"l'image affichée" - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Toujours utiliser cette couleur comme arrière-plan des vignettes" - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Sélectionne automatiquement une couleur d'arrière-plan correspondant aux " -"vignettes affichées" - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Afficher le numéro de la page sur les vignettes" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Utiliser la vignette de l'archive comme icône du fichier" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"En activant ce paramètre, la première page d'un livre sera utilisée comme " -"icône du fichier à la place de l'icône par défaut." - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Taille des vignettes (en pixels) :" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparence" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Arrière-plan en damier pour les images transparentes" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Utilise un arrière-plan gris en damier pour les images transparentes. Si ce " -"paramètre n'est pas activé, l'arrière-plan est blanc." - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Utiliser le défilement intelligent" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Avec ce paramètre, le défilement se fait verticalement à l'aide de la touche " -"Espace ou la molette de la souris mais également latéralement en essayant de " -"conserver l'ordre de lecture naturel de la bande dessinée." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Tourner les pages lors du défilement en-dehors de la page" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Tourne les pages lors du défilement en-dehors de la page avec la mollette de " -"la souris ou les flèches du clavier. La page est tournée après 3 actions de " -"défilement successives." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Ouvrir automatiquement l'archive suivante" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Ouvre automatiquement la prochaine archive du répertoire courant en tournant " -"la dernière page de l'archive lue ou de la précédente s'il s'agit d'une " -"première page." - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Ouvrir automatiquement le dossier répertoire suivant" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Ouvre automatiquement le premier fichier du prochain répertoire enfant " -"lorsque la dernière page du dernier fichier d'un répertoire est passée, ou " -"du répertoire précédent lorsqu'il s'agit de la première page du premier " -"fichier." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "Défilement (en pixel) avec les flèches :" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" -"Définit le nombre de pixels à faire défiler à l'aide des touches flèches." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Défilement (en pixel) avec la molette :" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "Défini le nombre de pixels à faire défiler avec la molette" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" -"Fraction de la page à faire défiler lors de l'appui sur la touche espace (en " -"%) :" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" -"Définit le pourcentage de défilement d'une page vers le haut ou vers le bas " -"à chaque appui sur la touche espace." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Étapes à exécuter avant un changement de page :" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Défini le nombre d'étapes nécessaire avant un changement de page. Moins " -"d'étapes signifie un changement rapide de page. Mais vous pourriez changer " -"de page accidentellement." - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "Tourner 2 pages en mode double page" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Tourne 2 pages au lieu d'une à chaque fois que l'on tourne une page en mode " -"double page." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "N'afficher qu'une seule page lorsque nécessaire :" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Fichiers" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "Ouvrir automatiquement la dernière archive visualisée au démarrage" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Ouvre automatiquement au démarrage le dernier fichier qui était ouvert quand " -"MComix a été fermé." - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Enregistrer les informations sur les fichiers récemment ouverts:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Utiliser le mode plein écran par défaut" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Masquer automatiquement les barres d'outils en plein écran" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "Adapter à la page" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "Ajuster à la largeur ou à la hauteur :" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "Défini la taille pour ce mode :" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Diaporama" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Intervalle du diaporama (en secondes) :" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Pas du diaporama (en pixels) :" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Défini le nombre de pixels à faire défiler lors du diaporama. Une valeur " -"positive indique un mouvement vers l'avant, une valeur négative indique un " -"mouvement vers l'arrière et une valeur de 0 effectuera un saut de page." - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Ouvrir automatiquement l'archive suivante" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "Lors d'un diaporama, ouvre automatiquement l'archive suivante." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotation" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "Rotation automatique des images suivant leurs métadonnées" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Rotation automatique des images quand une orientation est spécifiée dans les " -"métadonnées de l'image, comme un tag EXIF." - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Qualité d'image" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Interpolation" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Ordre des fichiers" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "Trier les fichiers et les répertoires par :" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "Trier les archives par :" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "Décompression et cache" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "Nombre maximal de taches concurrentes pour la décompression :" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" -"Défini le nombre maximum de taches concurrentes à utiliser lors de la " -"décompression pour les formats le supportant." - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "Enregistrer les vignettes des fichiers ouverts" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Enregistrer les vignettes des fichiers ouverts selon les spécifications de " -"freedesktop.org. Ces vignettes sont partagés par d'autres applications comme " -"les gestionnaires de fichiers." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Nombre maximal de pages dans le cache :" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Définir le nombre maximal de pages dans le cache. Une valeur de -1 stockera " -"toute l'archive en cache." - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Loupe" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "Taille de la loupe (en pixels) :" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Défini la taille de la loupe. C'est un carré dont la taille du côté est égal " -"à ce paramètre en pixel." - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Facteur d'agrandissement :" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Défini le facteur d'agrandissement de la loupe" - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "Extensions des fichiers de commentaires :" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Amélioration de l'image" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "_Réinitialiser les raccourcis" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "Réinitialise tout les raccourcis à leur valeur par défaut." - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "Oublier les choix des dialogues" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" -"Oublie les choix des dialogues pour lesquels vous avez précédemment " -"sélectionner \"Ne plus demander\"." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Détection automatique (défaut)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Jamais" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "Uniquement pour les pages titres" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "Uniquement pour les grandes images" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Toujours" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"Une seule image s'affichera pour la première page d'une archive ou lorsque " -"la largeur d'une image est supérieure à sa hauteur," - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "Ajuster à la largeur" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "Ajuster à la hauteur" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "Pas de tri" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Nom de fichier" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Taille du fichier" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "Dernière modification" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "Ascendant" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "Descendant" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"Les fichiers seront ouverts et affichés selon l'ordre de tri spécifié ici. " -"Cette option n'affecte pas l'ordre des fichiers à l'intérieur des archives." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "Ordre naturel" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "Ordre littéral" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"Les fichiers seront triés à l'intérieur des archives selon l'ordre spécifié. " -"L'ordre naturel triera les fichiers numérotés selon leur ordre naturel (1, 2," -"…, 10), alors que l'ordre littéral utilisera le tri standard C (1, 2, 34, " -"5)." - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Ajoute les informations sur les fichiers ouverts par MComix dans la liste " -"des documents récents." - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "Effacer les informations sur les fichiers récemment ouverts ?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"Ceci va effacer toutes les entrées concernant le menu « Récemment ouverts » " -"et supprimer les informations sur les dernières pages lues." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "Normale (rapide)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilinéaire" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "Hyperbolique (lent)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"Modifie la méthode de mise à l'échelle des images. Les algorithmes les plus " -"lents offrent un meilleur rendu, mais le chargement des images s'en trouve " -"ralenti." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "Normale" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Considérer tous les fichiers des archives qui utilisent une de ces " -"extensions comme fichiers de commentaires." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archive" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Image" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d pages" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d commentaires" - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":" -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Accédé le " - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":" -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modifié le " - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":" -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permissions " - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":" -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Propriétaire " - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[OPTION...] [FICHIER]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Visionne des images et des archives de bandes dessinés." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Affiche cette aide et quitte" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Démarre l'application en mode diaporama" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Affiche la bibliothèque au démarrage." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Affiche le numéro de version et quitte." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Modes d'affichage" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Démarre l'application en mode plein écran" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Démarre l'application en mode manga" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Démarre l'application en mode double page" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Modes de zoom" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" -"Démarre l'application avec le zoom réglé pour s'adapter à la meilleure " -"dimension." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "Démarre l'application avec le zoom réglé pour s'adapter à la largeur." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "Démarre l'application avec le zoom réglé pour s'adapter à la hauteur." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Options de debug" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "Définit le niveau de sortie du journal." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "Vous n'avez pas les versions requises de GTK+ et PyGTK." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "Aucune version de PyGTK n'a été détectée sur votre système." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "L'erreur peut être due à des bibliothèques GTK+ manquantes." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "Vous n'avez pas la version requise de Python Imaging." - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "Bibliothèque (PIL) installée." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "La version de PIL installée est : %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "Version requise de PIL : 1.1.5 ou plus." - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "Version requise de Python Imaging Library (PIL) : 1.1.5 ou plus." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"Aucun version du Python Imaging Library n'a été détectée sur votre système." - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Arrêter le diaporama" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "Afficher les numéros de page" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "Afficher les numéros de fichiers" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "Afficher la résolution" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "Afficher le chemin" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "Afficher le nom de fichier" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Afficher le nom de fichier" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Archive ZIP" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Archive RAR" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Archive Tar" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Archive Tar compressée avec Gzip" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Archive Tar compressée avec Bzip2" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Archive Tar compressée avec Gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "Document PDF" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "Archive 7z" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "Archive LHA" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Visionnaire et développeur original de Comix" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Développeur" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Traduction en chinois simplifié" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Traduction espagnole" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Traduction en portugais brésilien" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "" -"Traduction allemande et développement du générateur de vignettes pour " -"Nautilus" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "Traduction allemande" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Traduction italienne" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Traduction néerlandaise" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Traduction française" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "Traduction polonaise" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Traduction polonaise" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Traduction grec" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Traduction catalane" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traduction en chinois traditionnel" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Traduction japonaise" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Traduction hongroise" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Traduction russe" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Traduction croate" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Traduction coréenne" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Traduction persane" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Traduction indonésienne" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Traduction tchèque" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Traduction ukrainienne" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "Traduction galicienne" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "Traduction suédoise" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "Traduction hébraïque" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Traduction italienne" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Réalisation des icônes" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! Impossible d'enregistrer la vignette \"%(thumbpath)s\" : %(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "_Copier" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Copie la page courante dans le presse-papier." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_Supprimer" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Supprime le fichier ou l'archive courant du disque" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Page _suivante" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Page _précédente" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_remière page" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Dernière page" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Aller à la page…" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Aller à la page…" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "Act_ualiser" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Recharge le fichier ou l'archive courant." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Archive sui_vante" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Archive pré_cédente" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "Zoom a_vant" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "Zoom a_rrière" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "Taille _normale" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Mi_nimiser" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Fermer" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "Ferme tous les fichiers ouverts." - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Quitter" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "E_nregistrer et quitter" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "Quitte et rouvre le fichier actuellement ouvert au prochain lancement." - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Rotation de 90 degrés sens _horaire" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotation de 180 de_grés" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Rotation de 90 degrés sens _anti-horaire" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Miroir h_orizontal" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Miroir _vertical" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "_Enregistrer sous…" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "Fichiers _récents" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Signets" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Barre d'ou_tils" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "É_dition" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "_Ouvrir avec" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Fichier" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Affichage" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_Outils" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "Aid_e" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "Tra_nsformer l'image" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "_Rotation automatique des images" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "… lorsque que la largeur est plus grande que la hauteur" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "… lorsque que la hauteur est plus grande que la largeur" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Plein écran" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Mode plein écran" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Double page" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Barre d'_outils" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barre de _menus" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Barre d'_état" - -# Do not remove extra blank space at the end of the fr translation. It is needed before ":". -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barres de _défilement" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Vignettes" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Tout mas_quer" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "Inverse la direction du défilement intelligent." - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Mémoriser la _transformation" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" -"Conserve la transformation actuellement sélectionnée pour les prochaines " -"pages." - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "Démarrer le d_iaporama" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Loupe" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "Étire les images pour les adapter à l'écran, selon le mode zoom." - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Ajuster l'image à la _fenêtre" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Adapter à la lar_geur" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Adapter à la _hauteur" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "Adapter à la pa_ge" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Zoom m_anuel" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "À _propos" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "Co_mmentaires…" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "_Propriétés" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Préférences" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Éditer l'archive…" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "Ouvre l'éditeur d'archive." - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Ouvrir…" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "A_mélioration de l'image…" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Bibliothèque…" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! Échec de la fonction de rappel %(function)r : %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "L'archive est protégée par un mot de passe :" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"La taille après décompression du fichier %(filename)s est de %(actual_size)d " -"octets, mais elle devrait être de %(expected_size)d octets. L'archive est " -"peut-être corrompue ou dans un format inconnu." - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Ajout de livres" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Livres ajoutés :" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Ajout de '%s'…" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! Le livre #%i n'existe pas." - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! Impossible de charger la couverture de '%s'" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! Impossible d'ajouter %s à la bibliothèque" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! Impossible d'ajouter la collection \"%s\"" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" -"! Impossible d'ajouter le livre %(book)s à la collection %(collection)s" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! Impossible de renommer la collection en \"%s\"" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copie)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" -"Impossible de déterminer la version de la base de données de la " -"bibliothèque !" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" -"Mise à jour de la version de la base de données de la bibliothèque de " -"%(from)d vers %(to)d." - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "Fichiers récents" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Tous les livres" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "Livres de la bibliothèque" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "_Ouvrir" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "Ouvre les livres sélectionnés pour lecture." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "Ouvrir _sans fermer la bibliothèque" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" -"Ouvre les livres sélectionnés, mais conserve la fenêtre de la bibliothèque " -"ouverte." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "_Ajouter…" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Ajoute plus de livres à la bibliothèque." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Effacer de cette _collection" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "Efface les livres sélectionnés de la collection courante." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Effacer de la _bibliothèque…" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "Supprime définitivement les livres sélectionnés de la bibliothèque." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "_Effacer et supprimer du disque" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "Supprime les livres sélectionnés du disque." - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "Copie le chemin du livre courant dans le presse-papier." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_Trier par" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "Modifie l'ordre de tri de la bibliothèque." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "Taille de la cou_verture" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "Modifie la taille de la couverture du livre." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "Nom du livre" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "Chemin complet" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "Date d'ajout" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "Énorme" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "Grande" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "Petite" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "Minuscule" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "Personnalisée…" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "Définir la taille des couvertures de la bibliothèque." - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Suppression de %(num)d livre de '%(collection)s'." -msgstr[1] "Suppression de %(num)d livres de '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "Suppression du livre %d de la bibliothèque." -msgstr[1] "Suppression des livres %d de la bibliothèque." - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Effacer le livre de la bibliothèque ?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Les livres sélectionnés seront supprimés de la bibliothèque et " -"définitivement effacés. Voulez-vous vraiment continuer ?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "Collections de la bibliothèque" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "_Nouveau" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Ajouter une nouvelle collection vide." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "_Renommer" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "Renomme la collection sélectionnée." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "Dupli_quer" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "Crée un double de la collection sélectionnée." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_Nettoyer" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "Efface de la collection les livres qui n'existent plus." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "_Effacer" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "Supprime la collection sélectionnée." - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Ajouter une nouvelle collection ?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Veuillez saisir un nom pour la nouvelle collection." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Impossible d'ajouter une nouvelle collection appelée '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Une collection de ce nom existe déjà." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Renommer la collection ?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Veuillez saisir un nouveau nom pour la collection sélectionnée." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Impossible de changer le nom en '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Impossible de dupliquer la collection" - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Racine" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Déplacer la collection '%(subcollection)s' dans la collection " -"'%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Ajouter des livres à '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Déplacer les livres de '%(source collection)s' vers " -"'%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "_Rechercher :" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Affiche uniquement les livres avec la chaîne de caractère spécifiée dans le " -"chemin complet. La recherche n'est pas sensible à la casse." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "_Liste de suivi" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "Ouvre l'éditeur de la liste de suivi." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "_Ouvrir avec" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Ouvrir le livre sélectionné." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "Achevé de lire le %(date)s, %(time)s" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "Recherche de nouvelles archives…" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" -"Nouveau livre '%(bookname)s' ajouté depuis le répertoire '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" -"%(count)d nouveaux livres ajoutés depuis le répertoire '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "Pas de nouveau livre trouvé dans le répertoire '%s'." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! Il faut la composante sqlite pour utiliser la bibliothèque" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "Liste de suivi de la bibliothèque" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "_Rechercher maintenant" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Répertoire" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Collection" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Inclure les sous-dossiers" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "_Ajouter…" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "" -"Rechercher automatiquement les nouveaux livres à l'_ouverture de la " -"bibliothèque" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "La version de GTK+ installée est : %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "Version requise de GTK+ : 2.12.0 ou plus\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "La version de PyGTK installée est : %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "Version requise de PyGTK : 2.12.0 ou plus" - -#~ msgid "Invalid working directory." -#~ msgstr "Répertoire de travail invalide." - -#~ msgid "ZIP archives" -#~ msgstr "Archives ZIP" - -#~ msgid "Tar archives" -#~ msgstr "Archives Tar" - -#~ msgid "RAR archives" -#~ msgstr "Archives RAR" - -#~ msgid "LHA archives" -#~ msgstr "Archives LHA" - -#~ msgid "JPEG images" -#~ msgstr "Images JPEG" - -#~ msgid "PNG images" -#~ msgstr "Images PNG" - -#~ msgid "GIF images" -#~ msgstr "Images GIF" - -#~ msgid "TIFF images" -#~ msgstr "Images TIFF" - -#~ msgid "BMP images" -#~ msgstr "Images BMP" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Impossible d'ouvrir %s : type de fichier inconnu." - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Utiliser cette couleur comme arrière-plan des vignettes :" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! Erreur lors du processus \"%(command)s\": %(error)s" - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "\"%(command)s\" doit être dans le PATH de votre système." - -#~ msgid "Please enter the password to continue:" -#~ msgstr "Veuillez saisir le mot de passe pour continuer :" - -#~ msgid "Cache" -#~ msgstr "Cache" - -#~ msgid "Toggle fullscreen" -#~ msgstr "Basculer en mode plein écran" - -#~ msgid "Add to this collection:" -#~ msgstr "Ajouter à cette collection :" - -#~ msgid "Reading" -#~ msgstr "Lecture" - -#~ msgid "Page orientation and zoom" -#~ msgstr "Orientation des pages et zoom" - -#~ msgid "User Interface" -#~ msgstr "Interface utilisateur" - -#, fuzzy -#~ msgid "Image-related variables" -#~ msgstr "Autres variables" - -#~ msgid "File path" -#~ msgstr "Chemin du fichier" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Répertoire suivant" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Nom du répertoire" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Autres variables" - -#~ msgid "Archive path" -#~ msgstr "Chemin de l'archive" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Chemin de l'archive" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Nom du répertoire" - -#~ msgid "Miscellaneous variables" -#~ msgstr "Autres variables" - -#~ msgid "Backslash or slash, depending on OS" -#~ msgstr "" -#~ "Barre oblique ou barre oblique inversée, suivant le système d'exploitation" - -#~ msgid "Literal quote" -#~ msgstr "Citation littérale" - -#~ msgid "Literal % character" -#~ msgstr "Caractère % littéral" - -#~ msgid "Variables" -#~ msgstr "Variables" - -#, fuzzy -#~ msgid "Absolute path variables" -#~ msgstr "variables de chemin absolu" - -#~ msgid "Directory containing archive or file" -#~ msgstr "Répertoire contenant l'archive ou le fichier" - -#~ msgid "Directory containing files" -#~ msgstr "Répertoire contenant les fichiers" - -#~ msgid "Preview area" -#~ msgstr "Zone de prévisualisation" - -#~ msgid "Order files by:" -#~ msgstr "Trier les fichiers par :" - -#~ msgid "Only file names" -#~ msgstr "Uniquement les noms de fichier" - -#~ msgid "File names and last read page" -#~ msgstr "Noms de fichiers et dernière page lue" - -#~ msgid "Catalan" -#~ msgstr "Catalan" - -#~ msgid "Czech" -#~ msgstr "Tchèque" - -#~ msgid "German" -#~ msgstr "Allemand" - -#~ msgid "Greek" -#~ msgstr "Grec" - -#~ msgid "English" -#~ msgstr "Anglais" - -#~ msgid "Spanish" -#~ msgstr "Espagnol" - -#~ msgid "Persian" -#~ msgstr "Persan" - -#~ msgid "French" -#~ msgstr "Français" - -#~ msgid "Galician" -#~ msgstr "Galicien" - -#~ msgid "Croatian" -#~ msgstr "Croate" - -#~ msgid "Hungarian" -#~ msgstr "Hongroise" - -#~ msgid "Indonesian" -#~ msgstr "Indonésienne" - -#~ msgid "Italian" -#~ msgstr "Italien" - -#~ msgid "Japanese" -#~ msgstr "Japonais" - -#~ msgid "Korean" -#~ msgstr "Coréen" - -#~ msgid "Dutch" -#~ msgstr "Néerlandais" - -#~ msgid "Polish" -#~ msgstr "Polonais" - -#~ msgid "Portuguese" -#~ msgstr "Portugais" - -#~ msgid "Russian" -#~ msgstr "Russe" - -#~ msgid "Swedish" -#~ msgstr "Suédois" - -#~ msgid "Ukrainian" -#~ msgstr "Ukrainienne" - -#~ msgid "Chinese (simplified)" -#~ msgstr "Chinois (simplifié)" - -#~ msgid "Chinese (traditional)" -#~ msgstr "Chinois (traditionnel)" - -#~ msgid "! Deleting corrupt bookmarks file." -#~ msgstr "! Suppression du fichier de signets corrompu." - -#~ msgid "User interface language" -#~ msgstr "Langue de l'interface" - -#~ msgid "Delay thumbnail generation" -#~ msgstr "Délais de génération des vignettes" - -#~ msgid "" -#~ "Thumbnails are generated only when required, instead of directly after " -#~ "opening a new file." -#~ msgstr "" -#~ "Les vignettes sont générées lorsqu'elles sont requises, plutôt qu'après " -#~ "l'ouverture d'un nouveau fichier." - -#~ msgid "Lead developer of MComix" -#~ msgstr "Développeur principal de MComix" - -#~ msgid "! Non-supported archive format: %s" -#~ msgstr "! Impossible d'ouvrir l'archive '%s'." - -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Afficher uniquement une grande image en mode double page" - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Affiche une seule image en mode double page si la largeur de l'image est " -#~ "supérieure à sa hauteur. Cela permet d'afficher correctement (i.e. tout " -#~ "seul) une double page." - -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Utiliser une couleur d'arrière-plan dynamique pour les vignettes" - -#~ msgid "Default modes" -#~ msgstr "Modes par défaut" - -#~ msgid "Use double page mode by default." -#~ msgstr "Utiliser le mode double page par défaut." - -#~ msgid "Use manga mode by default." -#~ msgstr "Utiliser le mode manga par défaut." - -#~ msgid "Refresh file" -#~ msgstr "Rafraîchir le fichier" - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Étire les images plus petites que la fenêtre si le mode de zoom le " -#~ "requière. Si ce paramètre n'est pas activé, les images ne sont jamais " -#~ "étirés." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Les livres sélectionnés seront supprimés de la bibliothèque (mais les " -#~ "fichiers originaux ne seront pas affectés). Êtes-vous sûr de vouloir " -#~ "continuer ?" - -#~ msgid "Do you want to remove non-existent books from the library?" -#~ msgstr "" -#~ "Voulez-vous supprimer les livres qui n'existent plus de la bibliothèque ?" - -#~ msgid "" -#~ "Books that appear in your library, but no longer exist at their original " -#~ "path, will be removed from the library. This clears books that have been " -#~ "moved or deleted outside of MComix." -#~ msgstr "" -#~ "Les livres présents dans votre bibliothèque mais qui ne sont plus à " -#~ "l'emplacement original seront supprimés de la bibliothèque. Ceci efface " -#~ "les livres qui ont été déplacés ou effacés avec une autre application que " -#~ "MComix." - -#~ msgid "Remove collection from the library?" -#~ msgstr "Supprimer la collection de la bibliothèque ?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "La collection sélectionnée sera supprimée de la bibliothèque (mais les " -#~ "livres et sous-collections seront conservés). Êtes-vous sûr de vouloir " -#~ "continuer ?" - -#~ msgid "Completely _remove" -#~ msgstr "Supprimer _définitivement" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "%d livre(s) supprimés de la bibliothèque." - -#~ msgid "Rename..." -#~ msgstr "Renommer…" - -#~ msgid "Duplicate collection" -#~ msgstr "Dupliquer la collection" - -#~ msgid "Remove collection..." -#~ msgstr "Supprimer la collection…" - -#~ msgid "_Add books" -#~ msgstr "Ajouter des livres" - -#~ msgid "Add _folder" -#~ msgstr "Ajouter un dossier" - -#~ msgid "_Clean library" -#~ msgstr "Supprimer de la bibliothèque…" - -#~ msgid "Removes no longer existing books from the library." -#~ msgstr "Supprimer les livres qui n'existent plus de la bibliothèque ?" - -#~ msgid "_Clear bookmarks" -#~ msgstr "Effacer les _signets…" - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Effacer tous les signets ?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Tous les signets seront effacés. Êtes-vous sûr de vouloir continuer ?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Il reste des fichiers obsolètes sur votre ordinateur." - -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "D'anciens fichiers (utilisés pour sauvegarder les préférences, la " -#~ "bibliothèque, les signets, etc. d'anciennes versions de Comix) ont été " -#~ "trouvés sur votre ordinateur. Si vous ne comptez plus utiliser " -#~ "d'anciennes versions de Comix, vous devriez supprimer ces fichiers afin " -#~ "de libérer de l'espace disque. Voulez-vous que ces fichiers soient " -#~ "supprimés maintenant ?" - -#~ msgid "! Could not remove %s" -#~ msgstr "! Impossible de supprimer %s" - -#~ msgid "Defaults" -#~ msgstr "Réinitialisation" - -#~ msgid "Usage:" -#~ msgstr "Usage :" - -#~ msgid "Options:" -#~ msgstr "Options :" - -#~ msgid "Avoid possibly unintentional page flips." -#~ msgstr "Éviter les changements de page inattendus." - -#~ msgid "Only flip to a new page if MComix is the top window. " -#~ msgstr "Change de page uniquement si MComix est la fenêtre active." - -#~ msgid "This prevents the possibility of \"accidental\" page flips when " -#~ msgstr "Ceci empêche les changements de page inattendus lorsqu'on " - -#~ msgid "" -#~ "clicking on the MComix window surface while trying to make MComix the " -#~ msgstr "clique dans la fenêtre de MComix pour rentre la fenêtre de MComix" - -#~ msgid "top window." -#~ msgstr "active." - -#~ msgid "Default zoom mode" -#~ msgstr "Mode zoom par défaut" - -#~ msgid "Page Numbers" -#~ msgstr "Numéros de page" - -#~ msgid "" -#~ "Show page numbers in the Title bar and the status bar. If unset the page " -#~ "numbers will be hidden." -#~ msgstr "" -#~ "Affiche les numéros de page dans la barre de titre et la barre d'état. Si " -#~ "vide, les numéros seront masqués." - -#~ msgid "Crash Recovery" -#~ msgstr "Récupération post-plantage" - -#~ msgid "Enable crash recovery." -#~ msgstr "Activer récupération post-plantage" - -#~ msgid "" -#~ "Crash recovery saves the current configuration information every " -#~ "specified seconds. In case of a crash the previous file will be re-" -#~ "loaded." -#~ msgstr "" -#~ "La récupération post-plantage enregistre la configuration courante à " -#~ "chaque intervalle spécifié. En cas de plantage, le fichier sera de " -#~ "nouveau charger." - -#~ msgid "Save the current configuration information every n seconds" -#~ msgstr "Enregistrer la configuration chaque n secondes" - -#~ msgid "" -#~ "Every n seconds the current configuration will be saved to disk. Choose " -#~ "a lower number if crashes are frequent on your machine. 30 seconds " -#~ "(default)" -#~ msgstr "" -#~ "Chaque n secondes, la configuration sera enregistrer sur disque. Choisir " -#~ "un nombre plus bas si les plantages sont fréquents sur votre ordinateur. " -#~ "30 secondes par défaut." - -#~ msgid "Copy to c_lipboard" -#~ msgstr "Copier dans le p_resse-papiers" - -#~ msgid "_Next archive" -#~ msgstr "Archive _suivante" - -#~ msgid "_Previous archive" -#~ msgstr "Archives _précédente" - -#~ msgid "About" -#~ msgstr "À propos" - -#~ msgid "MComix is released to the public domain." -#~ msgstr "" -#~ "Comix est distribué selon les termes de la GNU General Public License" - -#~ msgid "Credits" -#~ msgstr "Crédits" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Impossible d'ouvrir %s: C'est un répertoire." - -#~ msgid "PyGTK version 2.12.0 or higher is required to run MComix." -#~ msgstr "PyGTK 2.12.0 ou plus est requis pour démarrer MComix." - -#~ msgid "_Refresh file" -#~ msgstr "_Rafraîchir le fichier" - -#~ msgid "O_riginal size" -#~ msgstr "Taille _originale" - -#~ msgid "Manual _Zoom" -#~ msgstr "_Zoom manuel" - -#~ msgid "_View comments..." -#~ msgstr "_Voir les commentaires" - -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Impossible de localiser le décompresseur RAR !" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Impossible de localiser le décompresseur RAR !" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Vous devez installer le logiciel rar ou unrar afin de lire " -#~ "les fichiers RAR (.cbr)." - -#~ msgid "_Properties" -#~ msgstr "_Propriétés" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Utiliser le cache pour accélérer la navigation." - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Mettre en cache les images suivantes afin d'accélérer la navigation. Il " -#~ "est recommandé d'utiliser ce réglage à la vue du gain en vitesse que cela " -#~ "procure sauf si vous utilisez un ordinateur disposant de peu de mémoire " -#~ "vive." - -#~ msgid "Thumbnail maintenance" -#~ msgstr "Gestion des vignettes" - -#~ msgid "Cleanup" -#~ msgstr "Nettoyage" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "Nettoyage des vignettes" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Les vignettes sont enregistrés dans votre répertoire dédié (home " -#~ "directory). Des applications différentes utilisent et créent ces " -#~ "vignettes, et parfois des vignettes polluent l'espace disque car elles " -#~ "n'ont pas été supprimées en même temps que le fichier original. Cette " -#~ "option permet de nettoyer les vignettes orphelines et périmées stockés " -#~ "localement." - -#~ msgid "Total number of thumbnails" -#~ msgstr "Nombre total de vignettes" - -#~ msgid "Calculating..." -#~ msgstr "Calcul en cours..." - -#~ msgid "Total size of thumbnails" -#~ msgstr "Taille totale des vignettes" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "" -#~ "Voulez-vous nettoyer maintenant les vignettes orphelines et périmées ?" - -#~ msgid "Removing thumbnails" -#~ msgstr "Suppression des vignettes" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "Nombre de vignettes supprimés" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Taille totale des vignettes supprimées" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Vignette supprimée pour '%s'" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Gestion des vignettes..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/gl/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/gl/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/gl/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/gl/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2883 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: Marcelo Góes \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Le arquivos ZIP, RAR e tar, así como imaxes normais." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nome" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Páxina" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Local" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Comentarios" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Non foi posíbel ler %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Por favor, teña en conta que os únicos arquivos engadidos automaticamente a " -"esta lista son os arquivos que o Comix recoñece como comentarios." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Tamaño" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Eliminar do arquivo" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Editar arquivo" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Imaxes" - -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Comentarios" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "O novo arquivo non puido ser gravado!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Os arquivos orixinais non foron eliminados." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Os arquivos gravaranse en formato ZIP." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Mellorar imaxe" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Brillo" - -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Contraste" - -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Saturación" - -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Nitidez" - -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Axustar o contraste automaticamente." - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Axustar o contraste (claridade e escuridade) automaticamente, de maneira " -"separada para cada banda de cor." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Abrir" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Gardar" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Todos os documentos" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Todos os arquivos" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Arquivos %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Todas as imaxes" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Imaxes %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Un arquivo co nome '%s' xa existe. Desexa substituílo?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "A substitución sobreescribirá o seu contido." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Engadir libros" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Non hai imaxes en '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Imposíbel abrir %s: O arquivo non existe." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Imposíbel abrir %s: Permiso denegado." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipo de arquivo descoñecido" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Páxina anterior" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Próxima páxina" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Última páxina" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Páxina anterior" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Próxima páxina" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Páxina anterior" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Próxima páxina" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Primeira páxina" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Última páxina" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Próxima páxina" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Editar arquivo" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Páxina anterior" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Progresión das imaxes" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Aumentar zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Manter a transformación" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Manter a transformación" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "Ro_tación de 90 graos horarios" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Rotación de 180 graos horarios" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Ro_tación de 90 graos antihorarios" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Inverter _horizontalmente" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Inverter _verticalmente" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Modo de páxina dobre" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Modo de axustar a largura" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Modo manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lente de aumento" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Modo de encaixe óptimo" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Modo de axustar a largura" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Modo de axustar a altura" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Modo de axuste de la_rgura" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Modo de zoom manual" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Pantalla completa" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "B_arra de estado" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Barra de progresi_on" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniaturas" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "E_sconder todos" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Presentación de imaxes" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Arquivos" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Outros arquivos" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Fechar" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Saír" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Gardar" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Arquivo" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Propiedades" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferencias" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteca" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Editar favoritos" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Non foi posíbel ler %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "Presentación de imaxes" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Os arquivos gravaranse en formato ZIP." - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Os arquivos gravaranse en formato ZIP." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Comentarios" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Comentarios" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Pá_xina anterior" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Comentarios" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Directorio de miniaturas" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Arquivos tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Editar favoritos" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ir" - -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Caché" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Aparencia" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportamento" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Superficie de visualización" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Fondo da pantalla" - -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Usar esa cor no fondo da pantalla" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Sempre usar esa cor como cor de fondo." - -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Usar cor de fondo dinámica." - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Escoller unha cor de fondo compatíbel coa imaxe visualizada automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Sempre usar esa cor como cor de fondo." - -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Escoller unha cor de fondo compatíbel coa imaxe visualizada automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Mostrar números de páxina nas miniaturas." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Tamaño da miniatura (en pixels)" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparencia" - -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Usar un fondo cuadriculado para as imaxes transparentes." - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Usar un fondo cuadriculado cinza para as imaxes transparentes. Se esta " -"preferencia non estiver marcada, o fondo usado será branco." - -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Usar a progresión intelixente de imaxes coa tecla de espazo." - -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Usar a progresión intelixente de imaxes coa tecla de espazo. Normalmente, a " -"tecla de espazo só avanza para abaixo (ou para arriba, cando se apreta a " -"tecla de maiúsculas). No entanto, con esta preferencia tamén avanzará para " -"os lados e tentará seguir a orde natural de lectura dunha banda deseñada." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Pasar as páxinas cando se avance fóra do bordo da páxina." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Pasar as páxinas cando cando se avance \"fóra da páxina\" coa roda do rato " -"ou coas teclas do cursor. Serán necesarios tres \"pasos\" consecutivos coa " -"roda do rato ou coas teclas do cursor para pasar as páxinas." - -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Abre o próximo arquivo do directorio automaticamente cando se pase a " -"derradeira páxina, ou o arquivo anterior cando se pase atrás antes da " -"primeira páxina." - -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Pasar dúas páxinas no modo de páxina dobre." - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Pasar dúas páxinas, en lugar dunha, cada vez que se pase páxina no modo de " -"páxina dobre." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Arquivos" - -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Abrir o último arquivo visto automaticamente ao iniciar." - -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Abre, cando se inicia, o arquivo que estaba aberto cando o Comix foi fechado " -"por última vez." - -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Garda informacións sobre arquivos abertos recentemente." - -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Usar a pantalla completa por defecto." - -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Esconder todas as barras de ferramentas por defecto no modo de pantalla " -"completa." - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Modo de axustar a largura" - -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Modo de axustar a largura" - -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Modo de axuste de la_rgura" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Presentación de imaxes" - -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Espera da presentación de imaxes (en segundos)" - -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Espera da presentación de imaxes (en segundos)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotación" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "Rotar automaticamente as imaxes segundo os seus metadatos" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Rotar automaticamente as imaxes cando a orientación se especifique nos " -"metadatos, como no caso dos tag Exif." - -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Escala da imaxe" - -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Modo manga" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Arquivos tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Gardar as miniaturas para os arquivos abertos." - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Garda as miniaturas de arquivos abertos de acordo coa especificación do " -"freedesktop.org. Esas miniaturas son compartidas por varios outros " -"programas, como a maior parte dos xestores de arquivos." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lente de aumento" - -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Tamaño da lente de aumento (en pixels)" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Axustar o tamaño da lente de aumento. É un cadrado con ese tamaño de pixels." - -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Factor de aumento" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Axustar o factor da lente de aumento." - -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Comentar as extensións" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Mellorar imaxe" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Modo de axustar a largura" - -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Modo de axustar a altura" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Engadir informacións sobre todos os arquivos abertos dentro do Comix para a " -"lista de arquivos compartidos recentemente." - -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Garda informacións sobre arquivos abertos recentemente." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Tratar todos os documentos atopados dentro de arquivos, incluíndo os que " -"teñen estas terminacións de arquivo, como comentarios." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arquivo" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Imaxe" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d páxinas" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d comentarios" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Accedido" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modificado" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permisos" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Propietario" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Presentación de imaxes" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Arquivo ZIP" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Arquivo RAR" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Arquivo tar" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Arquivo tar comprimido con gzip" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Arquivo tar comprimido con bzip2" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Arquivo tar comprimido con gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Tradución ao chinés simplificado" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Tradución ao castelán" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Tradución ao portugués do Brasil" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Tradución ao alemán e thumbnailer do Nautilus" - -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Tradución ao persa" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Tradución ao italiano" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Tradución ao holandés" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Tradución ao francés" - -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Tradución ao polaco" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Tradución ao polaco" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Tradución ao grego" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Tradución ao catalán" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Tradución ao chinés tradicional" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Tradución ao xaponés" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Tradución ao húngaro" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Tradución ao ruso" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Tradución ao croata" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Tradución ao coreano" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Tradución ao persa" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Tradución ao indonesio" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Tradución ao checo" - -#: mcomix/mcomix/strings.py:64 -#, fuzzy -msgid "Ukrainian translation" -msgstr "Tradución ao croata" - -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Tradución ao italiano" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Tradución ao grego" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Tradución ao italiano" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Deseño das iconas" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Copia)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Próxima páxina" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Pá_xina anterior" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_rimeira páxina" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Ultima páxina" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Fechar" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Saír" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Ro_tación de 90 graos horarios" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotación de 180 graos horarios" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Ro_tación de 90 graos antihorarios" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Inverter _horizontalmente" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Inverter _verticalmente" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "F_avoritos" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Barra de _ferramentas" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Editar" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Abrir recente" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Arquivo" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Exhibir" - -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "Barra de ferramentas" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "A_xuda" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Pantalla completa" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Modo de páxina _dobre" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Barra de ferramentas" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barra de men_u" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "B_arra de estado" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barra de progresi_on" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "M_iniaturas" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "E_sconder todos" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Modo manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Manter a transformación" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Come_zar a presentación de imaxes" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lente de aumento" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Modo de axuste ó_ptimo" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Modo de axuste de la_rgura" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Modo de axuste de al_tura" - -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Modo de axuste de la_rgura" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Modo de _zoom manual" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "S_obre" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Pr_eferencias" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Editar arquivo..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Abrir..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "Bib_lioteca..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Engadindo libros." - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Libros engadidos" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Engadindo '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Todos os libros" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Engadir máis libros á biblioteca." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Abrir o libro seleccionado." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Foron eliminados %(num)d libro(s) de '%(collection)s'." -msgstr[1] "Foron eliminados %(num)d libro(s) de '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Eliminar libros desta biblioteca?" - -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Os libros seleccionados serán eliminados da biblioteca (mais os arquivos " -"orixinais non serán modificados). Está seguro de que desexa continuar?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Engadir nova colección baleira." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Engadir nova colección?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Por favor, introduza o nome da nova colección." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Imposíbel engadir unha nova colección chamada '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Unha colección con ese nome xa existe." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Renomear a colección?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Por favor, introduza un novo nome para a colección seleccionada." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Imposíbel renomear como '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Imposíbel duplicar a colección." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Raíz" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Coloque a colección '%(subcollection)s' na colección '%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Engadir libros a '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Mover libros de '%(source collection)s' a '%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Busca" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Mostrar só os libros que teñan o texto especificado no seu roteiro completo. " -"A busca non diferencia entre letras maiúsculas e minúsculas." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Abrir recente" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Abrir o libro seleccionado." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Foron eliminados %(num)d libro(s) de '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nova colección" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Engadir libros a esta colección automaticamente" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Directorio de miniaturas" - -#~ msgid "Tar archives" -#~ msgstr "Arquivos tar" - -#~ msgid "RAR archives" -#~ msgstr "Arquivos RAR" - -#~ msgid "JPEG images" -#~ msgstr "Imaxes JPEG" - -#~ msgid "PNG images" -#~ msgstr "Imaxes PNG" - -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Imaxes PNG" - -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Imaxes" - -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Imaxes PNG" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Imposíbel abrir %s: Tipo de arquivo descoñecido." - -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Usar esa cor no fondo da pantalla" - -#~ msgid "Cache" -#~ msgstr "Caché" - -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Engadir colección" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Directorio de miniaturas" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Directorio de miniaturas" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Os arquivos gravaranse en formato ZIP." - -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Páxina anterior" - -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Mostrar só unha imaxe larga no modo de páxina dobre" - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Mostra só unha imaxe no modo de páxina dobre, se a largura da imaxe " -#~ "excede da súa altura. O resultado disto é que as imaxes escaneadas que " -#~ "abranguen dúas páxinas serán mostrados adecuadamente (isto é, de maneira " -#~ "illada) tamén no modo de páxina dobre." - -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Usar cor de fondo dinámica." - -#~ msgid "Default modes" -#~ msgstr "Preferencias por defecto" - -#~ msgid "Use double page mode by default." -#~ msgstr "Usar o modo de páxina dobre por defecto." - -#~ msgid "Use manga mode by default." -#~ msgstr "Usar o modo manga por defecto." - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Estricar imaxes para un tamaño que é maior que o seu tamaño original se o " -#~ "modo de zoom actual o esixe. Se esta preferencia non está marcada, as " -#~ "imaxes nunca serán vistas nun tamaño maior que o orixinal." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Os libros seleccionados serán eliminados da biblioteca (mais os arquivos " -#~ "orixinais non serán modificados). Está seguro de que desexa continuar?" - -#~ msgid "Remove collection from the library?" -#~ msgstr "Eliminar a colección da biblioteca?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "A colección seleccionada será eliminada da biblioteca (mais os libros e " -#~ "as sub-coleccións dentro dela permanecerán). Está seguro de que desexa " -#~ "continuar?" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Foron eliminados %d libro(s) da biblioteca." - -#~ msgid "Rename..." -#~ msgstr "Renomear..." - -#~ msgid "Duplicate collection" -#~ msgstr "Colección duplicada" - -#~ msgid "Remove collection..." -#~ msgstr "Remover coleção..." - -#~ msgid "About" -#~ msgstr "Sobre" - -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix é un visualizador de imaxes deseñado especificamente para ler " -#~ "bandas deseñadas no seu ordenador." - -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix publícase baixo a GNU General Public License." - -#~ msgid "Credits" -#~ msgstr "Créditos" - -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "" -#~ "Non foi posíbel encontrar un programa para a extracción de arquivos RAR!" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "" -#~ "Non foi posíbel encontrar un programa para a extracción de arquivos RAR!" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Vostede precisa ter o programa rar ou unrar instalado para " -#~ "poder ler arquivos RAR (.cbr)." - -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Imposíbel renomear como '%s'." - -#~ msgid "_Add bookmark" -#~ msgstr "_Adicionar favorito" - -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Editar favoritos..." - -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Limpar favoritos..." - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Eliminar todos os favoritos?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Todos os favoritos gravados serán eliminados. Está seguro de que desexa " -#~ "continuar?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Hai algúns arquivos obsoletos no seu ordenador." - -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Algúns arquivos obsoletos (usados para gardar as preferencias, a " -#~ "biblioteca, os favoritos e outros, en versións antigas do Comix) foron " -#~ "encontrados no seu ordenador. Se vostede non ten pensado usar as versións " -#~ "antigas do Comix novamente, debe eliminar eses arquivos para economizar " -#~ "espazo no disco duro. Desexa que eses arquivos sexan eliminados agora?" - -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Non foi posíbel ler %s" - -#~ msgid "Import" -#~ msgstr "Importar" - -#~ msgid "Defaults" -#~ msgstr "Preferencias por defecto" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Imposíbel abrir %s: É un directorio." - -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Non foi posíbel ler %s" - -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Imposíbel renomear como '%s'." - -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Non foi posíbel ler %s" - -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Eliminar da biblioteca..." - -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Imposíbel duplicar a colección." - -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Imposíbel duplicar a colección." - -#~ msgid "Remove from this collection" -#~ msgstr "Eliminar desta colección" - -#~ msgid "Remove from the library..." -#~ msgstr "Eliminar da biblioteca..." - -#~ msgid "Cover size" -#~ msgstr "Tamanño da portada" - -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Páxina" - -#~ msgid "Stretch small images." -#~ msgstr "Estricar imaxes pequenas." - -#~ msgid "Default zoom mode" -#~ msgstr "Modo de zoom por defecto" - -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Mostrar números de páxina nas miniaturas." - -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Editar arquivo" - -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Pá_xina anterior" - -#~ msgid "Zoom _out" -#~ msgstr "_Diminuir zoom" - -#~ msgid "O_riginal size" -#~ msgstr "Tamaño _orixinal" - -#~ msgid "Manual _Zoom" -#~ msgstr "Zoom _manual" - -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "Transf_ormar" - -#~ msgid "_View comments..." -#~ msgstr "_Ver comentarios..." - -#~ msgid "_Properties" -#~ msgstr "_Propiedades" - -#~ msgid "_Enhance image..." -#~ msgstr "_Mellorar imaxe..." - -#~ msgid "Developer" -#~ msgstr "Programador" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Usar un caché para aumentar a velocidade de navegación." - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Fai un caché da imaxes próximas a imaxe vista actualmente para acelerar a " -#~ "navegación. Xa que a mellora de velocidade é grande, é recomendábel ter " -#~ "esta preferencia marcada, agás que vostede dispoña de pouca memoria RAM " -#~ "no seu ordenador." - -#~ msgid "Thumbnail maintenance" -#~ msgstr "Manutención de miniaturas" - -#~ msgid "Cleanup" -#~ msgstr "Limpar" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "Limpar miniaturas" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "As miniaturas para os arquivos (como arquivos de imaxes e bandas " -#~ "deseñadas serán gardadas no seu directorio de usuario. Moitos programas " -#~ "diferentes usan e crean esas miniaturas, mais algunhas veces as " -#~ "miniaturas permanecen cando os arquivos orixinais son eliminados - " -#~ "desperdiciando espazo. Este diálogo pode limpar as miniaturas ao eliminar " -#~ "minaturas orfas e obsoletas." - -#~ msgid "Total number of thumbnails" -#~ msgstr "Número total de miniaturas" - -#~ msgid "Calculating..." -#~ msgstr "Calculando..." - -#~ msgid "Total size of thumbnails" -#~ msgstr "Tamaño total das miniaturas" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Desexa eliminar as miniaturas orfas ou obsoletas agora?" - -#~ msgid "Removing thumbnails" -#~ msgstr "Eliminando miniaturas" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "Número de miniaturas eliminadas" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Tamaño total das miniaturas eliminadas" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Eliminada a miniatura de '%s'" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "Manu_tención de miniaturas..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/he/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/he/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/he/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/he/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2736 +0,0 @@ -# Hebrew translation for mcomix. -# Copyright © 2005-2009 Pontus Ekberg -# Copyright © 2010-2012 Louis Casillas, Moritz Brunner -# This file is distributed under the same license as the mcomix package. -# Isratine Citizen , 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: mcomix 0.99\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2013-01-07 22:51+0200\n" -"Last-Translator: Isratine Citizen \n" -"Language-Team: Hebrew \n" -"Language: he\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.5.4\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "‏%s הינו מציג תמונות שתוכנן במיוחד לטיפול ולניהול של חוברות קומיקס." - -# Tranlated plain into normal -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "ביכולתו לקרוא ארכיוני ZIP, RAR וגם tar, וכמו כן גם קבצי תמונה רגילים." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "‏%s רשוי תחת הרישיון הציבורי הכללי של GNU." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "ניתן להשיג עותק של רישיון זה בכתובת %s" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "תסדיר ארכיון שלא נתמך: %s" - -# ! שגיאת חילוץ: %s -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Extraction error: %s" - -# ! לא ניתן ליצור ארכיון בנתיב \"%s\" -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Could not create archive at path \"%s\"" - -# ! לא ניתן להוסיף את הקובץ %(sourcefile)s אל הארכיון %(archivefile)s, נוטש כעת... -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." - -# ! לא ניתן לקרוא את %s -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! Could not read %s" - -# ! לא ניתן לנתח את קובץ הסימניות %s -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Could not parse bookmarks file %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "להחליף את הסימנייה שבעמוד %s?" -msgstr[1] "להחליף סימניות קיימות בעמודים %s?" - -# החוברת הנוכחית -# להחליפן (סימניות קיימות) -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"חוברת זו כבר מכילה עמודים מסומנים. האם ברצונך להחליפם עם עם סימנייה חדשה " -"בעמוד %d? " - -# מבלי לשנות -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "בבוחרך \"לא\" תיווצר סימנייה חדשה וזאת מבלי להשפיע על הסימניות האחרות." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "עריכת סמניות" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "טיפוס" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "שם" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "עמוד" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "מיקום" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "תאריך הוספה" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "הוסף _סימניה" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "_ערוך סימניות..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! Callback %(function)r failed: %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "הערות" - -# לא היה ניתן לקרוא -# המילה ניתן יכולה להיות מופנת להווה ולעבר בו זמנית -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "לא ניתן לקרוא את %s" - -# מזהם = מזהה אותם -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"נא לשים לב שהקבצים היחידים שייווספו אוטומטית אל רשימה זו יהיו קבצים " -"בארכיונים שהיישום MComix מזהם כהערות." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "גודל" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "הסר מן ארכיון" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "עריכת ארכיון" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_ייבוא" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "תמונות" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "קבצי הערות" - -# מאחר ונרשם שמירה (saved) בנטיה לעבר, יש הכרח לציין את המילה "היה" (לשמור) בהתאמה -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "לא ניתן היה לשמור את הארכיון החדש!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "הקבצים הנוכחיים לא הוסרו." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "הארכיונים מאוחסנים כקבציי ZIP." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "שיפור תמונה" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "שחזר אל ברירות המחדל." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "שמור את הערך הנבחר כערך משתמט (ברירת מחדל) עבור קבצים עתידיים." - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_בהירות:" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_ניגודיות:" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "_רוויה:" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "ח_דות:" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "התאם ניגודיות _אוטומטית" - -# עבור כל ערוץ/רצועת -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"התאם ניגודיות (הן אפילה והן בהירות) אוטומטית, באופן נפרד עבור כל פס צבע." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "פתיחה" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "שמר" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "כל הקבצים" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "כל הארכיונים" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "ארכיוני %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "כל התמונות" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "תמונות %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "קובץ בשם '%s' כבר קיים. האם ברצונך להחליפו?" - -# משום שזהו רגע די גורלי, בחרתי להשתמש במשפט ארוך כמה שניתן. -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "החלפתו של הקובץ תשכתב את תכולתו של הקובץ." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "הוסף חוברות" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "לא קיימות תמונות בתוך '%s'" - -# לא ניתן לפתוח את ‫%s: הקובץ אינו קיים. -# לא ניתן לפתוח את %s\n -# קובץ לא קיים. -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "לא ניתן לפתוח את הקובץ ‫%s: קובץ לא קיים." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "לא ניתן לפתוח את הקובץ ‫%s הרשאה נדחתה." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "להמשיך לקרוא מעמוד %d?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"הפסקת לקרוא כאן בתאריך %(date)s, %(time)s. בבוחרך \"כן\", הקריאה תימשך בעמוד " -"%(page)d. אחרת, העמוד הראשון יוטען במקום." - -# ! קובץ העדפות פגום \"%s\", מוחק כעת... -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "נתיב שגוי: '%s'" - -# ! לא ניתן לטעון את הצלמית \"%s\" -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "טיפוס קובץ לא מוכר" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "עמוד קודם" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "עמוד הבא" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "שמירת עמוד בשם" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "עמוד קודם" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "עמוד הבא" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "עמוד קודם" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "עמוד הבא" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "עמוד ראשון" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "עמוד אחרון" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "לך אל עמוד..." - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "ארכיון הבא" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "ארכיון קודם" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "מדור הבא" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "מדור קודם" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "גלילה אל שמאל תחתון" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "גלילה" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "גלילה אל מרכז תחתון" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "גלילה אל ימין תחתון" - -# שמאל תיכוני -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "גלילה אל אמצע שמאל" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "גלילה אל המרכז" - -# ימין תיכוני -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "גלילה אל אמצע ימין" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "גלילה אל שמאל עליון" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "גלילה אל מרכז עליון" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "גלילה אל ימין עליון" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "גלילה מטה" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "גלילה מעלה" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "גלילה ימינה" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "גלילה שמאלה" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "גלילה חכמה מעלה" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "גלילה חכמה מטה" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "זום פנימה" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_זום" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "זום החוצה" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "גודל מקורי" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "ה_שאר שינויים" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "ה_שאר שינויים" - -# ימינה -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "סובב 90 מעלות _עם כיוון השעון" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "_סובב 180 מעלות" - -# שמאלה -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "סובב 90 מעלות _נגד כיוון השעון" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "הפוך במאו_זן" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "הפוך במאו_נך" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -#, fuzzy -msgid "Autorotate by width" -msgstr "סובב תמונה _אוטומטית" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Autorotate by height" -msgstr "סובב תמונה _אוטומטית" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "מצב עמוד כפול" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "CLI" - -# Tranlated to: Manga mode (Japanese comic brochure) -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "מצב מנגה (חוברת קומיקס יפנית)" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "היפוך גלילה חכמה" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "עדשת מגדלת" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "מתח תמונות קטנות" - -# ההתאמה הטובה ביותר -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "מצב התאמה מיטבית" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "מצב התאמה לרוחב" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "מצב התאמה לגובה" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "מצב התאמה ל_גודל" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "מצב זום ידני" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "צא ממסך מלא" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "ממשק משתמש" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "הצג לוח OSD" - -#: mcomix/mcomix/keybindings.py:114 -#, fuzzy -msgid "Minimize" -msgstr "_מזער" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "מסך מלא" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -#, fuzzy -msgid "Show/hide menubar" -msgstr "הצג מספרי קבצים" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "שורת _מצב" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "סרגלי _גלילה" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "תמונות־ציפורן" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "ה_סתר הכל" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "התחל מצגת" - -#: mcomix/mcomix/keybindings.py:125 -#, fuzzy -msgid "Delete" -msgstr "_מחק" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "קבצים" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "_רענן" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_סגור" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "י_ציאה" - -#: mcomix/mcomix/keybindings.py:129 -#, fuzzy -msgid "Save and quit" -msgstr "_שמור וצא" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "שמור _בשם" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "שם ארכיון" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "מאפיינים" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "העדפות" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "ספרייה" - -#: mcomix/mcomix/keybindings.py:145 -#, fuzzy -msgid "Execute external command" -msgstr "עריכת פקודות חיצוניות" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "עריכת פקודות חיצוניות" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -msgid "! Could neither find sqlite3." -msgstr "" - -# ! לא ניתן להסיר את הקובץ \"%s\" -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "מצגת" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "שמירת עמוד בשם" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "למחוק את \"%s\"?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "הקובץ יימחק מן הכונן הקשיח שלך." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "אל תשאל אותי שנית." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "משתנים שונים" - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "משתנים שונים" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "עריכת פקודות חיצוניות" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "פקודה" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "סיווג פקודה" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_תצוגה מקדימה" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "פקודה" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "מדור קודם" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "ארכיוני Tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "עריכת פקודות חיצוניות" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_לך" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "_ביטול" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " של %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "מראה" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "התנהגות" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "תצוגה" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "מתקדם" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -# עליך לאתחל את היישום -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "שפה (עליך לאתחל את היישום):" - -# מקש Escape סוגר את התוכנית -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "מקש Escape סוגר תוכנית" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"במידה ואפשרות זו פעילה, המקש ESC יסגור את התוכנית, במקום לנטרל מצב של מסך " -"מלא." - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "רקע" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "השתמש בצבע זה כרקע:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "השתמש תמיד בצבע הנבחר כצבע הרקע." - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "השתמש בצבע רקע משתנה (דינמי)" - -# שמוצגת -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "קטוף אוטומטית צבע רקע שמתאים לתמונה שנצפית." - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "השתמש תמיד בצבע הנבחר כצבע רקע תמונות־ציפורן." - -# למרקע -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "בחר אוטומטית צבע רקע שמתאים לרקע תמונות־ציפורן." - -# on the side of, near -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "הצג מספרי עמודים לצד תמונות־ציפורן" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "השתמש בתמונות־ציפורן כצלמית יישום" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"בהתרת הגדרה זו, MComix יעשה שימוש בעמוד החוברת הראשון כצלמית יישום במקום " -"הצלמית האופיינית לו." - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "מידת תמונות־ציפורן (בפיקסלים):" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "שקיפות" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "השתמש ברקע משובץ עבור תמונות שקופות" - -# Omitted: instead -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"השתמש ברקע אפור משובץ עבור תמונות שקופות. במידה והעדפה זו אינה מוגדרת, צבע " -"הרקע יהיה לבן." - -# גלילה חכמה עם המקש רווח -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "השתמש בגלילה חכמה" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"בקביעת העדפה זו, המקש רווח וגלגל העכבר לא יגוללו רק מטה או מעלה, אלא גם " -"לצדדים ובכך MComix ינסה לעקוב אחר סדר הקריאה הטבעי של חוברת הקומיקס." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "דפדף עמודים בעת גלילה מחוץ לקצוות של העמוד" - -# הדבר, העניין -# על מנת שהעמוד ידופדף -# Do not use this character ״ -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"דפדוף עמודים בעת גלילה \"מחוץ לקצוות\" באמצעות גולל העכבר או באמצעות מקשי " -"החיצים. הדבר מצריך מספר \"צעדים\" עקביים עם גולל העכבר או מקשי החיצים על מנת " -"לדפדף בעמודים." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "פתח את הארכיון הבא אוטומטית" - -# past = מעבר = beyond -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"פתח אוטומטית את הארכיון הבא שבמדור הקבצים בעת דפדוף מעבר לעמוד האחרון, או של " -"הארכיון הקודם בעת דפדוף מעבר לעמוד הראשון." - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "פתח את המדור הבא אוטומטית" - -# past = מעבר = beyond -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"פתח אוטומטית את הקובץ הבא שבמדור הקבצים המקביל הבא בעת דפדוף מעבר לעמוד " -"האחרון, או של הקובץ האחרון שבמדור, או המדור הקודם בעת דפדוף מעבר לעמוד " -"הראשון של הקובץ הראשון." - -# בכל לחיצה -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "מספר פיקסלים לגולל לכל לחיצה על מקש חץ:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "קבע את מספר הפיקסלים לגולל בעמוד בעת שימוש במקשי החצים." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "מספר פיקסלים לגולל לכל סיבוב של גלגל העכבר:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "קבע את מספר הפיקסלים לגולל בעמוד בעת שימוש בגלגל העכבר." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "מקטע עמוד לגולל לכל לחיצה על מקש הרווח (באחוזים):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "קביעת האחוז שבו העמוד יגולל מטה או מעלה כאשר מקש הרווח נלחץ." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "מספר של \"צעדים\" שיש לקחת לפני דפדוף העמוד:" - -# שדרושים/שנצרכים -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"קבע את המספר של \"צעדים\" שדרושים כדי לדפדף אל העמוד הבא או הקודם. פחות " -"צעדים יקנו דפדוף מהיר מאוד של עמודים אולם יש סיכוי שתמצא/י את עצמך מעלעל/ת " -"עמודים באופן מקרי ובלתי מכוון." - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "דפדף שני עמודים במצב של עמוד כפול" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"דפדף שני עמודים, במקום אחד, בכל פעם שאנחנו מדפדפים עמודים במצב של עמוד כפול." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "הצג עמוד אחד בלבד במקום שהדבר הולם:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "קבצים" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "פתח אוטומטית את הקובץ האחרון בעת הפעלה" - -# באחרונה או בפעם האחרונה? -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"פתח אוטומטית, בזמן הפעלה, את הקובץ שהיה פתוח בזמן שהיישום MComix נסגר " -"באחרונה." - -# זה לא ה-קבצים מאחר שמדובר כאן ברשימה של קבצים ולא בקבצים עצמם שנפתחו לאחרונה! -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "אחסן מידע אודות קבצים שנפתחו לאחרונה:" - -# שימוש במסך -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "השתמש במסך מלא באופן משתמט" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "הסתר אוטומטית את כל סרגלי הכלים במסך מלא" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "מצב התאמה לגודל" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "מצב התאמה לגובה או לרוחב:" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "גודל קבוע עבור מצב זה:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "מצגת" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "שיהוי מצגת (בשניות):" - -# מדרג -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "צעדי מצגת (בשניות):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"ציין את מספר הפיקסלים לגולל במהלך מצב מצגת. ערך חיובי יגולל הלאה, ערך שלילי " -"יגולל לאחור, וערך של 0 יגרום למצגת לדפדף תמיד אל עמוד חדש." - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "במהלך מצגת פתח אוטומטית את הארכיון הבא." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "בהיותי במצב מצגת פתח אוטומטית את הארכיון הבא." - -# סיבוב -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "רוטציה" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "סובב אוטומטי של תמונות בהתאם לנתונים המוצמדים (Metadata) הטמונים בתוכן" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"סובב אוטומטי של תמונות במידה ומצוין כיוון בנתונים המוצמדים (Metadata) של " -"התמונה, כמו למשל בתווית Exif." - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "איכות תמונה" - -# מדרגיות -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "מצב סילומיות" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "מסדר קבצים" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "סדר קבצים ומדורים לפי:" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "סדר ארכיונים לפי:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "מספר עמודים מרבי לאחסון בתוך המטמון:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "אחסן תמונות־ציפורן עבור קבצים פתוחים" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"אחסן תמונות־ציפורן עבור קבצים פתוחים בהתאם למפרט של freedesktop.org. תמונות־" -"ציפורן אלה משותפות על ידי יישומים רבים אחרים, כגון רוב מנהלי הקבצים." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "מספר עמודים מרבי לאחסון בתוך המטמון:" - -# לחלוטין -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "קבע את מספר העמודים המרבי להטמנה. ערך של 1- יטמין את הארכיון בשלמותו." - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "עדשת מגדלת" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "גודל עדשת המגדלת (בפיקסלים):" - -# עם פיקסלים רבים בצדדיה -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"קבע את גודל עדשת המגדלת. כעדשת המגדלת היא ריבוע עם מספר פיקסלים זה בצידיה." - -# יחס ההגדלה -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "מידת ההגדלה:" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "קבע את מידת ההגדלה של עדשת המגדלת." - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "סיומות הערה:" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "שיפור תמונה" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -# Reset -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "אפס ברירות דו שיח" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "איפוס כל ברירות דו שיח שבעבר בחרת שלא להישאל עליהם בשנית." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "איתור אוטומטי (משתמט)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "לעולם לא" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "עבור כותרות עמודים בלבד" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "עבור תמונות רחבות בלבד" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "תמיד" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"בעת הצגת העמוד הראשון של ארכיון, או כשרוחב התמונה עולה על גובהה, רק עמוד " -"בודד יוצג." - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "התאמה לרוחב" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "התאמה לגובה" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "ללא מיון" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "שם קובץ" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "גודל קובץ" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "שונה לאחרונה" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "סדר מיון עולה" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "סדר מיון יורד" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"קבצים יפתחו ויוצגו בהתאם אל סדר המיון שמצוין כאן. אפשרות זו לא משפיעה על " -"הסדר שכבר מצוי בתוך ארכיונים." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "סדר טבעי" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "סדר מילולי" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# הרשימת המשותפת של הקבצים שנפתחו לאחרונה -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"הוסף מידע אודות כל הקבצים שנפתחו מתוך MComix אל רשימת הקבצים האחרונים " -"המשותפת." - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "למחוק מידע אודות קבצים שנפתחו לאחרונה?" - -# באשר לעמודים שנקראו -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"אפשרות זו תסיר את כל הרשומות שבתפריט \"קבצים אחרונים\", ותאפס מידע אודות " -"עמודים שנקראו לאחרונה." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "רגיל (מהיר)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "דו־קווי" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "היפרבולי (איטי)" - -# איכות שינוי גודל באיכות גבוהה -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"משנה את אופן התאמת הממדים של התמונות. אלגוריתמים איטיים יניבו איכות שינוי " -"גודל גבוהה, אולם זמני טעינת עמודים יהיו ארוכים יותר." - -# מקורי -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "רגיל" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# לטפל, לנהוג -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"התייחסות אל כל הקבצים הנמצאים בתוך ארכיונים, שלהם יש אחת מסיומות הקבצים " -"הללו, כהערות." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "ארכיון" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "תמונה" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d עמודים" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d הערות" - -# הונגש -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "נוגש לאחרונה" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "שונה לאחרונה" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "הרשאות" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "בעלים" - -#: mcomix/mcomix/run.py:41 -#, fuzzy -msgid "[OPTION...] [PATH]" -msgstr "CLI" - -#: mcomix/mcomix/run.py:42 -#, fuzzy -msgid "View images and comic book archives." -msgstr "CLI" - -#: mcomix/mcomix/run.py:45 -#, fuzzy -msgid "Show this help and exit." -msgstr "CLI" - -#: mcomix/mcomix/run.py:47 -#, fuzzy -msgid "Start the application in slideshow mode." -msgstr "CLI" - -#: mcomix/mcomix/run.py:49 -#, fuzzy -msgid "Show the library on startup." -msgstr "CLI" - -#: mcomix/mcomix/run.py:51 -#, fuzzy -msgid "Show the version number and exit." -msgstr "CLI" - -#: mcomix/mcomix/run.py:53 -#, fuzzy -msgid "View modes" -msgstr "CLI" - -#: mcomix/mcomix/run.py:55 -#, fuzzy -msgid "Start the application in fullscreen mode." -msgstr "CLI" - -#: mcomix/mcomix/run.py:57 -#, fuzzy -msgid "Start the application in manga mode." -msgstr "CLI" - -#: mcomix/mcomix/run.py:59 -#, fuzzy -msgid "Start the application in double page mode." -msgstr "CLI" - -#: mcomix/mcomix/run.py:62 -#, fuzzy -msgid "Zoom modes" -msgstr "CLI" - -#: mcomix/mcomix/run.py:65 -#, fuzzy -msgid "Start the application with zoom set to best fit mode." -msgstr "CLI" - -#: mcomix/mcomix/run.py:68 -#, fuzzy -msgid "Start the application with zoom set to fit width." -msgstr "CLI" - -#: mcomix/mcomix/run.py:71 -#, fuzzy -msgid "Start the application with zoom set to fit height." -msgstr "CLI" - -#: mcomix/mcomix/run.py:74 -#, fuzzy -msgid "Debug options" -msgstr "CLI" - -#: mcomix/mcomix/run.py:78 -#, fuzzy -msgid "Sets the desired output log level." -msgstr "CLI" - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "CLI" - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "CLI" - -# ייתכן ששגיאה זו נגרמה משום ספריות +GTK חסרות. -#: mcomix/mcomix/run.py:136 -#, fuzzy -msgid "This error might be caused by missing GTK+ libraries." -msgstr "CLI" - -#: mcomix/mcomix/run.py:144 -#, fuzzy -msgid "You don't have the required version of the Python Imaging" -msgstr "CLI" - -#: mcomix/mcomix/run.py:145 -#, fuzzy -msgid "Library (PIL) installed." -msgstr "CLI" - -#: mcomix/mcomix/run.py:146 -#, fuzzy, python-format -msgid "Installed PIL version is: %s" -msgstr "CLI" - -#: mcomix/mcomix/run.py:147 -#, fuzzy -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "CLI" - -#: mcomix/mcomix/run.py:151 -#, fuzzy -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "CLI" - -#: mcomix/mcomix/run.py:152 -#, fuzzy -msgid "No version of the Python Imaging Library was found on your system." -msgstr "CLI" - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "הפסק מצגת" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "הצג מספרי עמוד" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "הצג מספרי קבצים" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "הצג רזולוציה" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "הצג נתיב" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "הצג שם קובץ" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "הצג שם קובץ" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ארכיון ZIP" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "ארכיון RAR" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "ארכיון Tar" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "ארכיון Tar מכווץ Gzip" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "ארכיון Tar מכווץ Bzip2" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "ארכיון Tar מכווץ Gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "ארכיון 7z" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "ארכיון LHA" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Comix המפתח המקורי של" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "MComix ‏מפתח" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "תרגום לסינית מפושטת" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "תרגום לספרדית" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "תרגום לפורטוגזית ברזילאית" - -# Should Caja (Nautilus fork) be added as well? -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Nautilus תרגום לגרמנית וגם מחולל תמונות־ציפורן עבור" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "תרגום לגרמנית" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "תרגום לאיטלקית" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "תרגום להולנדית" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "תרגום לצרפתית" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "תרגום לפולנית" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "תרגום לפולנית" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "תרגום ליוונית" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "תרגום לקטלנית" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "תרגום לסינית מסורתית" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "תרגום ליפנית" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "תרגום להונגרית" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "תרגום לרוסית" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "תרגום לקרואטית" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "תרגום לקוריאנית" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "תרגום לפרסית" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "תרגום לאינדונזית" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "תרגום לצ'כית" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "תרגום לאוקראינית" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "תרגום לגליציאנית" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "תרגום לשוודית" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "תרגום לעברית" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "תרגום לאיטלקית" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "עיצוב צלמית" - -# ! לא ניתן לשמור תמונות־ציפורן \"%(thumbpath)s\": %(error)s -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "_העתק" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "העתקת העמוד הנוכחי אל לוח גזירים." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_מחק" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "מחיקת הקובץ או הארכיון הנוכחי מן הכונן." - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "עמוד ה_בא" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "עמוד _קודם" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "עמוד _ראשון" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "עמוד _אחרון" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_לך אל עמוד..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "לך אל עמוד..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "_רענן" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "טעינה מחדש של הקבצים או הארכיון הנוכחיים." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "_ארכיון הבא" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "א_רכיון קודם" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "זום _פנימה" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "זום ה_חוצה" - -# מקורי -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "גודל _מקורי" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "_מזער" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_סגור" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "סגירת כל הקבצים הפתוחים." - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "י_ציאה" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "_שמור וצא" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "יציאה ושחזור הקובץ שפתוח כעת בפעם הבאה בה התוכנית תופעל." - -# ימינה -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "סובב 90 מעלות _עם כיוון השעון" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "_סובב 180 מעלות" - -# שמאלה -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "סובב 90 מעלות _נגד כיוון השעון" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "הפוך במאו_זן" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "הפוך במאו_נך" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "שמור _בשם" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_זום" - -# Tranlated to: Recent files -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "קבצים _אחרונים" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_סימניות" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_סרגלי כלים" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "ע_רוך" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "_פתח באמצעות" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_קובץ" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_תצוגה" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_כלים" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_עזרה" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "_שנה תמונה" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "סובב תמונה _אוטומטית" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "...כאשר רוחב עובר גובה" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "...כאשר גובה עובר רוחב" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "מ_סך מלא" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "מצב מסך מלא" - -# מצב עמוד _זוגי -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "מצב עמוד _כפול" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "סרגל _כלים" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "שורת _תפריט" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "שורת _מצב" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "סרגלי _גלילה" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "תמונות־_ציפורן" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "ה_סתר הכל" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "מצב _מנגה" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "היפוך כיוון גלילה חכמה." - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "ה_שאר שינויים" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "השארת השינוי הנבחר הנוכחי עבור בעמודים הבאים." - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "התחל _מצגת" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "עדשת מ_גדלת" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "מתח תמונות כדי התאמה למסך, תלוי במצב זום." - -# מצב ההתאמה ה_טובה ביותר -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "מצב התאמה מי_טבית" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "מצב התאמה ל_רוחב" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "מצב התאמה ל_גובה" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "מצב התאמה ל_גודל" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "מצב זום י_דני" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_אודות" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "הע_רות" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "מ_אפיינים" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "ה_עדפות" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "ערוך _ארכיון..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "פתיחת עורך הארכיון." - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_פתח..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "ש_פר תמונה..." - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_ספרייה..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! Callback %(function)r failed: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "הארכיון מוגן בסיסמא" - -# גודלו המחולץ של הקובץ %(filename)s הינו %(actual_size)d בתים, אולם גודלו אמור/צריך להיות %(expected_size)d בתים. הארכיון עשוי להיות פגום או שסוג ארכיון זה אינו נתמך. -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "חוברות מתווספות כעת" - -# חוברות שהוספו: -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "חוברות שנוספו:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "מתווספות כעת '%s'..." - -# ! חוברת שלא קיימת #%i -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -# ! לא ניתן לאחזר כריכה עבור החוברת \"%s\" -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -# ! לא ניתן להוסיף את החוברת \"%s\" אל הספרייה -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -# ! לא ניתן להוסיף את האוסף \"%s\" -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -# ! לא ניתן להוסיף את החוברת %(book)s אל האוסף %(collection)s -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -# ! לא ניתן לשנות את שם האוסף אל \"%s\" -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(עותק)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -# Tranlated to: Recent files -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "קבצים אחרונים" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "כל החוברות" - -# חוברות ספרייה -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "ספריית חוברות" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "_פתח" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "פתיחת החוברת הנבחרת לצפיה." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "פתח _ללא סגירת הספרייה" - -# והשאר את -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "פתיחת החוברות הנבחרות, והשארת חלון הספרייה פתוח." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "הוס_ף..." - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "הוסף עוד חוברות אל הספרייה." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "הסר מן _אוסף זה" - -# אולי מוטב יהיה להחליף את המילה from "מן" אל "מהאוסף" -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "הסרת החוברות הנבחרות מן האוסף הנוכחי." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "הסר מן ה_ספרייה" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "הסרה מוחלטת של החוברות הנבחרות מן הספרייה." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "הסר ומחק מן ה_כונן" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "מחיקת החוברות הנבחרות מן הכונן." - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "העתקת נתיב החוברת הנבחרת אל לוח גזירים." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_מיון" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "שינוי סדר המיון של הספרייה." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "_גודל כריכה" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "שינוי גודל כריכת החוברת." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "שם חוברת" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "נתיב מלא" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "תאריך הוספה" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "ענק" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "גדול" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "קטן" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "זעיר" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "מותאם..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "קבע כריכה עבור הספרייה" - -# אולי מוטב יהיה להחליף את המילה from "מן" אל "מהאוסף" -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "הוסרה חוברת %(num)d מהאוסף '%(collection)s'." -msgstr[1] "הוסרו %(num)d חוברות מהאוסף '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "הוסרה חוברת %d מן הספרייה." -msgstr[1] "הוסרו %d חוברות מן הספרייה." - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "להסיר חוברות מן הספרייה?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"החוברות הנבחרות יוסרו מן הספרייה וימחקו לצמיתות. האם עדיין ברצונך להמשיך?" - -# ספריית אוספים -# אוספי ספרייה -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "ספריית אוספים" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "חדש" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "הוסף אוסף ריק חדש." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "_שינוי שם..." - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "שינוי שם האוסף הנבחר." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "ש_כפול" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "יצירת עותק זהה של האוסף הנבחרץ" - -# ניקוי/איפוס -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_טיהור" - -# שכבר לא קיימות -# שאינן קיימות עוד -# שלא קיימות עוד -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "הסרת חוברות שאינן קיימות עוד מהאוסף." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "ה_סר" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "מחיקת האוסף הנבחר." - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "להוסיף אוסף חדש?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "נא להזין שם עבור האוסף החדש." - -# בשם, שנקרא -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "לא ניתן להוסיף אוסף חדש בשם '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "אוסף הקרוי בשם זה כבר קיים." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "לשנות שם אוסף?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "נא להזין שם חדש עבור האוסף הנוכחי." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "לא ניתן לשנות את השם אל '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "לא ניתן לשכפל אוסף." - -# מקור -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "שורש" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "השמת האוסף '%(subcollection)s' בתוך האוסף '%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "הוסף חוברות אל '%s'." - -# אולי מוטב יהיה להחליף את המילה from "מן" אל "מהאוסף" ואת המילה to "אל" אל "אל האוסף" -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"העברת חוברות מהאוסף '%(source collection)s' אל האוסף " -"'%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "_חיפוש:" - -# התאמת אותיות גדולות/קטנות -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"הצגה של חוברות שלהן מחרוזת התמליל שמצוינת בנתיב המלא שלהן, בלבד. החיפוש אינו " -"תלוי רישיות." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "רשימת _צפיה" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "ניהול רשימת צפיה." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "_פתח באמצעות" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "פתח את החוברת הנבחרת." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "סורק כעת עבור חוברות חדשות..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "התווספה חוברת חדשה '%(bookname)s' מן המדור '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "התווספו %(count)d חוברות חדשות מן המדור '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "לא נמצאו חוברות חדשות במדור '%s'." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! You need an sqlite wrapper to use the library." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "רשימת צפיה" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "_סרוק עכשיו" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "מדור" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "אוסף" - -# לכלול מדורי משנה -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "עם מדורי משנה" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "הוס_ף" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "סרוק חוברות אוטומטית כאשר הספרייה הינה _פתוחה" - -#, fuzzy -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "CLI" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "CLI" - -#, fuzzy -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "CLI" - -#, fuzzy -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "CLI" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "מדור קודם" - -#~ msgid "ZIP archives" -#~ msgstr "ארכיוני ZIP" - -#~ msgid "Tar archives" -#~ msgstr "ארכיוני Tar" - -#~ msgid "RAR archives" -#~ msgstr "ארכיוני RAR" - -#~ msgid "LHA archives" -#~ msgstr "ארכיוני LHA" - -#~ msgid "JPEG images" -#~ msgstr "תמונות JPEG" - -#~ msgid "PNG images" -#~ msgstr "תמונות PNG" - -#~ msgid "GIF images" -#~ msgstr "תמונות GIF" - -#~ msgid "TIFF images" -#~ msgstr "תמונות TIFF" - -#~ msgid "BMP images" -#~ msgstr "תמונות BMP" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "לא ניתן לפתוח את הקובץ ‫%s טיפוס קובץ לא מוכר." - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "השתמש בצבע זה כרקע עבור תמונות־ציפורן:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! Error spawning process \"%(command)s\": %(error)s." - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "הפקודה \"%(command)s\" חייבת להימצא אצל PATH המערכת כדי להימצא." - -#~ msgid "Please enter the password to continue:" -#~ msgstr "נא להזין את הסיסמא כדי להמשיך." - -#~ msgid "Cache" -#~ msgstr "מטמון" - -#~ msgid "Toggle fullscreen" -#~ msgstr "הפעל מסך מלא" - -#~ msgid "Add to this collection:" -#~ msgstr "הוסף אל אוסף זה:" - -#~ msgid "Reading" -#~ msgstr "קורא" - -#~ msgid "Page orientation and zoom" -#~ msgstr "כיוון הדפסה וזום של עמוד" - -#~ msgid "User Interface" -#~ msgstr "ממשק משתמש" - -#, fuzzy -#~ msgid "Image-related variables" -#~ msgstr "משתנים שונים" - -#~ msgid "File path" -#~ msgstr "נתיב קובץ" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "מדור הבא" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "מדור הבא" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "משתנים שונים" - -#~ msgid "Archive path" -#~ msgstr "נתיב ארכיון" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "נתיב ארכיון" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "נתיב ארכיון" - -#~ msgid "Miscellaneous variables" -#~ msgstr "משתנים שונים" - -#~ msgid "Backslash or slash, depending on OS" -#~ msgstr "לוכסן אחורי או לוכסן, תלוי במערכת הפעלה" - -#~ msgid "Directory name" -#~ msgstr "שם מדור" - -#~ msgid "Preview area" -#~ msgstr "שטח תצוגה מקדימה" - -#~ msgid "Variables" -#~ msgstr "משתנים" - -#~ msgid "Absolute path variables" -#~ msgstr "משתני נתיב מוחלט" - -#~ msgid "Directory containing archive or file" -#~ msgstr "מדור מכיל ארכיון או קובץ" - -#~ msgid "Directory containing files" -#~ msgstr "מדור מכיל קבצים" - -#~ msgid "Order files by:" -#~ msgstr "סידור קבצים לפי:" - -#~ msgid "Only file names" -#~ msgstr "שמות קבצים בלבד" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/hr/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/hr/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/hr/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/hr/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3607 +0,0 @@ -# Croatian translation for Comix. -# Adrian C. , 2008. -# -msgid "" -msgstr "" -"Project-Id-Version: comix 4.0.1\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2008-12-13 18:00+0100\n" -"Last-Translator: Adrian C. \n" -"Language-Team: Croatian\n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Čita ZIP, RAR i tar arhive, kao i obične grafičke datoteke." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Ime" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Stranica" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Lokacija" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Komentari" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Neuspješno čitanje %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Imajte na umu da su jedine datoteke koje se automatski dodaju na listu one " -"datoteke u arhivama koje Comix prepozna kao komentare." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Veličina" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Ukloni iz arhive" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Uredi arhivu" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Slike" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Komentari" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Neuspješna pohrana nove arhive!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Izvorne datoteke nisu obrisane." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Arhive se spremaju kao ZIP datoteke." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Poboljšaj sliku" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Svjetlina" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Kontrast" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Zasićenje" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Oštrina" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Automatski prilagodi kontrast." - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Automatski prilagodi kontrast (osvjetljenje i crninu), posebno za svaki skup " -"boja." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Otvori" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Spremi" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Sve datoteke" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Sve arhive" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s arhive" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Sve slike" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s slike" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Datoteka imena '%s' već postoji. Želite je zamijeniti?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Zamjenom će sadržaj biti prepisan." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Dodaj knjige" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Nema slika u '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Nemoguće otvoriti %s: Datoteka ne postoji." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Nemoguće otvoriti %s: Pristup odbijen." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Nepoznat tip datoteke" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Prethodna stranica" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Sljedeća stranica" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Zadnja stranica" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Prethodna stranica" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Sljedeća stranica" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Prethodna stranica" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Sljedeća stranica" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Prva stranica" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Zadnja stranica" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Sljedeća stranica" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Uredi arhivu" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Prethodna stranica" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Pomicanje" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Uvećaj" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Zadrži transformaciju" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Zadrži transformaciju" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Okreni za 90 stupnjeva u smjeru kazaljke na satu" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Okreni za 180 _stupnjeva" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Okre_ni za 90 stupnjeva obrnuto od smjera kazaljke na satu" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Okreni _vodoravno" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Okreni _okomito" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Prikaz dvostrukih stranica" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Prilagodi širini" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Manga prikaz" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Povećalo" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Najbolje pristajanje" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Prilagodi širini" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Prilagodi visini" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Pri_lagodi širini" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Ručno uvećanje" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Cijeli zaslon" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "S_tanje" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Kli_zači" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Sličice" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "_Sakrij sve" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Prezentacija" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Datoteke" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Druge datoteke" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Zatvori" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Izlaz" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Spremi" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Arhiva" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Svojstva" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Postavke" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteka" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Uredi oznake" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Neuspješno čitanje %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "PREZENTACIJA" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Arhive se spremaju kao ZIP datoteke." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Arhive se spremaju kao ZIP datoteke." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Komentari" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Komentari" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Prethodna stranica" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Komentari" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Direktorij sa sličicama" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Tar arhive" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Uredi oznake" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Idi na" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Međuspremnik" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Izgled" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Ponašanje" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Prikaz" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Pozadina" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Koristi ovu boju kao pozadinu" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Uvijek koristi označenu boju kao boju pozadine." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Koristi dinamičnu boju pozadine." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "Automatski izaberi boju pozadine koja se slaže sa prikazanom slikom." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Uvijek koristi označenu boju kao boju pozadine." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "Automatski izaberi boju pozadine koja se slaže sa prikazanom slikom." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Prikazuj broj stranice na sličicama." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Veličina sličica (u pikselima)" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparentnost" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Koristi kvadratnu pozadinu za transparentne slike." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Koristi sivu kvadratnu pozadinu za transparentne slike. Ukoliko nije " -"postavljeno pozadina će biti čisto bijela." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Koristi pametno pomicanje space tipkom." - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Koristi pametno pomicanje space tipkom. Obično space tipka pomiče samo ravno " -"dolje (ili gore u kombinaciji sa shift tipkom), ali sa ovom postavkom " -"uključenom također pomiče bočno i tako pokušava pratiti prirodni red čitanja " -"stripa." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Okreni stranicu kod pomicanja preko ruba stranice." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Okreni stranicu kod pomicanja \"preko ruba stranice\" sa kotačićem miša ili " -"strelicama. Potrebna su tri uzastopna \"koraka\" sa kotačićem ili strelicama " -"da bi se stranica okrenula." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Automatski otvori sljedeću arhivu." - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Automatski otvori sljedeću arhivu u direktoriju kod okretanja zadnje " -"stranice, ili prošlu arhivu kod okretanja prve stranice." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Automatski otvori sljedeću arhivu." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Okreni dvije stranice kod prikaza dvostrukih stranica." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Okreni dvije stranice, umjesto jedne, svaki put kad okrenemo stranicu kod " -"prikaza dvostrukih stranica." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Datoteke" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Kod pokretanja automatski otvori zadnje prikazanu stranicu." - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Kod pokretanja automatski otvori datoteku koja je bila otvorena u trenutku " -"gašenja." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Spremaj informacije o nedavno otvorenim datotekama." - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Koristi cijeli zaslon kao predefinirani način." - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Automatski sakri sve alatne trake kod prikaza preko cijelog zaslona." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Prilagodi širini" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Prilagodi širini" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Pri_lagodi širini" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Prezentacija" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Zadrška prezentacije (u sekundama)" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Zadrška prezentacije (u sekundama)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Automatski otvori sljedeću arhivu." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Skaliranje slike" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Manga prikaz" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar arhive" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Spremaj sličice za otvorene datoteke." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Spremaj sličice za otvorene datoteke prema freedesktop.org specifikaciji. " -"Ove sličice se dijele između mnogo aplikacija, kao npr. većine upravitelja " -"datotekama." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Povećalo" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Veličina povećala (u pikselima)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Postavi veličinu povećala. To je pravokutnik stranica veličine ovoliko " -"piksela." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Faktor uvećanja" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Postavi faktor uvećanja povećala." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Ekstenzije komentara" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Poboljšaj sliku" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Prilagodi širini" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Prilagodi visini" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Dodaj informacije o datotekama otvorenim iz Comix na dijeljeni popis nedavno " -"otvorenih datoteka." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Spremaj informacije o nedavno otvorenim datotekama." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Tretiraj sve datoteke unutar arhiva, koje imaju jednu od ovih ekstenzija, " -"kao komentare." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arhiva" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Slika" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d stranica" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d komentara" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Pristupljeno" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Mijenjano" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Dozvole" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Vlasnik" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Prezentacija" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP arhiva" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR arhiva" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar arhiva" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Tar arhiva sažeta programom Gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Tar arhiva sažeta programom Bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Tar arhiva sažeta programom Gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Pojednostavljeni kineski prijevod" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Španjolski prijevod" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Brazilsko portugalski prijevod" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Njemački prijevod i Nautilus-ov program za prikazivanje sličica" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Perzijski prijevod" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Talijanski prijevod" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Nizozemski prijevod" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Francuski prijevod" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Poljski prijevod" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Poljski prijevod" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Grčki prijevod" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Katalonski prijevod" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Tradicionalni kineski prijevod" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Japanski prijevod" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Mađarski prijevod" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Ruski prijevod" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Hrvatski prijevod" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Korejski prijevod" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Perzijski prijevod" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Indoneški prijevod" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Češki prijevod" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Talijanski prijevod" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Grčki prijevod" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Talijanski prijevod" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Dizajn ikona" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Kopiranje)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Sljedeća stranica" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Prethodna stranica" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_rva stranica" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Zadnja stranica" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Zatvori" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Izlaz" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Okreni za 90 stupnjeva u smjeru kazaljke na satu" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Okreni za 180 _stupnjeva" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Okre_ni za 90 stupnjeva obrnuto od smjera kazaljke na satu" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Okreni _vodoravno" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Okreni _okomito" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Oznake" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "A_latne trake" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Uredi" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Nedavno otvo_reno" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Datoteka" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Prikaz" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Alati" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Pomoć" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Preko cijelog zaslona" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Prikaz _dvostrukih stranica" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Alati" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Izbornici" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "S_tanje" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Kli_zači" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Sliči_ce" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Sakrij sve" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga prikaz" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Zadrži transformaciju" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Pokreni _prezentaciju" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Povećalo" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Najbolje pristajanje" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Pri_lagodi širini" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Prilagodi _visini" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Pri_lagodi širini" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "R_učno uvećanje" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_O programu" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Po_stavke" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Uredi arhivu..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Otvori..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Biblioteka..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Dodajem knjige" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Dodane knjige" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Dodajem '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Kopiranje)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Sve knjige" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Dodaj još knjiga u biblioteku." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Otvori označenu knjigu." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Obrisano %(num)d knjiga iz '%(collection)s'." -msgstr[1] "Obrisano %(num)d knjiga iz '%(collection)s'." -msgstr[2] "Obrisano %(num)d knjiga iz '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Obrisati knjige iz biblioteke?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Označene knjige će biti obrisane iz biblioteke (ali originali će ostati " -"nepromijenjeni). Sigurni ste da želite nastaviti?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Dodaj novu praznu kolekciju." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Dodaj novu kolekciju?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Unesite ime za novu kolekciju." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Nemoguće dodati novu kolekciju imena '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Kolekcija s tim imenom već postoji." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Preimenuj kolekciju?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Unesite novo ime za označenu kolekciju." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Nemoguće promijeniti ime u '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Nemoguće udvostručiti kolekciju." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Korijen" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "Stavi kolekciju '%(subcollection)s' u kolekciju '%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Dodaj knjige u '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Premjesti knjige iz '%(source collection)s' u '%(destination collection)s'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Pretraga" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Prikaži samo one knjige koje imaju naznačeni tekst u njihovoj punoj putanji. " -"Pretraga nije osjetljiva na velika i mala slova." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Nedavno otvo_reno" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Otvori označenu knjigu." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Obrisano %(num)d knjiga iz '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nova kolekcija" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Automatski pridodaj knjige ovoj zbirci" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Direktorij sa sličicama" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Tar arhive" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "RAR arhive" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "JPEG slike" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "PNG slike" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "PNG slike" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Slike" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "PNG slike" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Nemoguće otvoriti %s: Nepoznat tip datoteke." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Koristi ovu boju kao pozadinu" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Međuspremnik" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Dodaj kolekciju" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Direktorij sa sličicama" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Direktorij sa sličicama" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Arhive se spremaju kao ZIP datoteke." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arhiva" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arhiva" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arhiva" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Prethodna stranica" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Prikaži samo jednu široku sliku kod prikaza dvostrukih stranica." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Prikaži samo jednu sliku, kod prikaza dvostrukih stranica, ako širina " -#~ "slike nadilazi veličinu. Rezultat je ispravno prikazivanje stripova " -#~ "skeniranih po dvije stranice, kod prikaza dvostrukih stranica." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Koristi dinamičnu boju pozadine." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Predefinirani načini" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Koristi prikaz dvostrukih stranica kao predefinirani način." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Koristi manga prikaz kao predefinirani način." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Rastezanje slike na veličinu veću od izvorne ako to trenutna postavka " -#~ "uvećanja zahtjeva. Ukoliko nije postavljeno slike se nikad ne skaliraju " -#~ "na veličinu veću od izvorne." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Označene knjige će biti obrisane iz biblioteke (ali originali će ostati " -#~ "nepromijenjeni). Sigurni ste da želite nastaviti?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Obriši kolekciju iz biblioteke?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Označena kolekcija će biti obrisana iz biblioteke (ali knjige i pod-" -#~ "kolekcije će ostati). Sigurni ste da želite nastaviti?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Obrisano %d knjiga iz biblioteke." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Preimenuj..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Udvostruči kolekciju" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Obriši kolekciju..." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "O programu" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix je preglednik slika posebno dizajniran za rukovanje stripovima." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix je licenciran pod uvjetima GNU opće javne licence" - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Zahvale" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "RAR program nije pronađen!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "RAR program nije pronađen!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Za čitanje RAR (.cbr) datoteka potreban je rar ili unrar " -#~ "program." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Nemoguće promijeniti ime u '%s'." - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Dodaj oznaku" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Uredi oznake..." - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Očisti oznake..." - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Očisti sve oznake?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "Sve spremljene oznake će biti uklonjene. Sigurno želite nastaviti?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Pronađene su zastarjele datoteke na vašem računalu." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Neke stare datoteke (koje su korištene za spremanje postavki, biblioteke, " -#~ "oznaka itd. u starijim Comix inačicama) su pronađene na vašem računalu. " -#~ "Ukoliko više ne planirate koristiti starije Comix inačice, trebali bi " -#~ "obrisati te datoteke da sačuvate prostor na disku. Želite li da se te " -#~ "datoteke uklone za vas sada?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Neuspješno čitanje %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Uvoz" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Predefinirano" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Nemoguće otvoriti %s: To je direktorij." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Neuspješno čitanje %s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Nemoguće promijeniti ime u '%s'." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Neuspješno čitanje %s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Obriši iz biblioteke..." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Nemoguće udvostručiti kolekciju." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Nemoguće udvostručiti kolekciju." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Obriši iz ove kolekcije" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Obriši iz biblioteke..." - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Veličina naslovnice" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Stranica" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Rastegni male slike." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Predefinirana metoda uvećanja" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Prikazuj broj stranice na sličicama." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Uredi arhivu" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Prethodna stranica" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "U_manji" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "I_zvorna veličina" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Ručno U_većanje" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Transformacija" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "_Pogledaj komentare..." - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Svojstva" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "_Poboljšaj sliku..." - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Razvojni Programer" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Koristi međuspremnik da bi ubrzao pregledavanje." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Spremaj slike (koje su blizu trenutno prikazanoj) u međuspremnik da bi " -#~ "ubrzao pregledavanje. Kako su ubrzanja prilično velika preporučeno je " -#~ "označiti ovu postavku, ako vam ne nedostaje slobodne radne memorije." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Održavanje sličica" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Čišćenje" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Očisti sličice" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Sličice datoteka (kao slika i arhiva sa stripovima) se spremaju u vašu " -#~ "osobnu mapu. Mnogo različitih aplikacija koristi i stvara ove sličice, " -#~ "ali ponekad sličice zaostanu iako su izvorne datoteke obrisane - troše " -#~ "prostor na disku. Ovaj dijalog može očistiti vaše spremljene sličice " -#~ "brišući te i zastarjele sličice." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Ukupni broj sličica" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Izračunavanje..." - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Ukupna veličina sličica" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Želite li sada očistiti zaostale i zastarjele sličice?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Uklanjam sličice" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Broj obrisanih sličica" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Ukupna veličina obrisanih sličica" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Obrisana sličica za '%s'" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Održavanje sličica..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/hu/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/hu/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/hu/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/hu/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2882 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Comix 4.0.3\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-01-26 19:34+0100\n" -"Last-Translator: Ernő Drabik \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"A program a szokásos képfájlok mellett megnyitja a ZIP, RAR és tar " -"arhívumokat is." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Név" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Oldal" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Hely" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Megjegyzések" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Nem olvasható a(z) %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Vegye figyelembe, hogy itt csak azon arhívumbeli fájlok jelennek meg " -"automatikusan, melyeket a Comix megjegyzésfájlként ismer fel." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Méret" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Törlés a gyűjteményből." - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Archívum szerkesztése" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Képek" - -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Megjegyzések" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Nem lehet elmenteni az új arhívumot!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Az eredeti fájlok megmaradtak." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Az arhívumok ZIP állományként lesznek tárolva." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Kép kiemelése" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Fényerő" - -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Kontraszt" - -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Telítettség" - -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Élesség" - -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Kontraszt automatikus beállítása." - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"A kontraszt automatikus beállítása (mind a világosságot és a sötétséget is) " -"minden egyes színsávhoz." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Megnyitás" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Mentés" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Minden fájl" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Minden archívum" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s archívumok" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Minden kép" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s képek" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "A megadott nevű állomány már létezik: '%s'. Akarja a cserét?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "A csere felülírja az eredeti tartalmat." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Könyvek hozzáadása" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Nincsenek képek a következő helyen: '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "%s-t nem lehet megnyitni: Nincs ilyen fájl." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "%s-t nem lehet megnyitni: Hozzáférés megtagadva." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Ismeretlen fájltípus" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Előző oldal" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Következő oldal" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Utolsó oldal" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Előző oldal" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Következő oldal" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Előző oldal" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Következő oldal" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Első oldal" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Utolsó oldal" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Következő oldal" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Archívum szerkesztése" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Előző oldal" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Gördítés" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Nagyítás" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "Á_talakítás megtartása" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "Á_talakítás megtartása" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "A kép elfo_rgatása 90 fokkal" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "A kép e_lforgatása 180 fokkal" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "A kép _elforgatása -90 fokkal" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Tükrözés _vízszintesen" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Tükrözés _függőlegesen" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Dupla lapos mód" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Szélességhez igazítás" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Manga mód" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Nagyító" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Legjobb illeszkedés" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Szélességhez igazítás" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Magassághoz igazítás" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "_Szélességhez igazítás" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Kézi nagyítás" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Teljes képernyő" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Állap_otsor" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Gö_rdítősávok" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Bélyegképek" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "M_inden elrejtve" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Diavetítés" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Fájlok" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Egyéb állományok" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Bezárás" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Kilépés" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Mentés" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Archívum" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Tulajdonságok" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Beállítások" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Könyvtár" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Könyvjelzők szerkesztése" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Nem olvasható a(z) %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "Diavetítés" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Az arhívumok ZIP állományként lesznek tárolva." - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Az arhívumok ZIP állományként lesznek tárolva." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Megjegyzések" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Megjegyzések" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Előző _oldal" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Megjegyzések" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Bélyegképek könyvtára" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Tar archívumok" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Könyvjelzők szerkesztése" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ugrás" - -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Gyorsítótár" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Megjelenés" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Viselkedés" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Képernyő" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Háttér" - -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "A következő szín legyen a háttérszín" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Mindig a kiválasztott szín legyen a háttérszín." - -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Változó háttérszín használata" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"A program magától válasszon egy háttérszínt, ami az aktuális képhez illik." - -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Mindig a kiválasztott szín legyen a háttérszín." - -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"A program magától válasszon egy háttérszínt, ami az aktuális képhez illik." - -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "A lapok sorszáma legyen rajta a bélyegképen." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Bélyegkép mérete (pixelben megadva)" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Átlátszóság" - -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Az átlátszó képek háttere tarka legyen." - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Az átlátszó képek háttere tarka legyen (szürke). Ha ez a beállítás nem " -"aktív, akkor a háttérszín teljesen fehér lesz." - -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "A szóköz billentyű intelligens gördítést végez." - -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Intelligens gördítés használata a szóköz billentyűvel. Alapértelmezés " -"szerint a szóköz csak lefelé gördít (vagy a váltó/shift gombot lenyomva " -"felfelé), de ezt a beállítást használva oldalirányba is gördíti a képet, " -"megpróbálva a képregényes könyv természetes olvasási sorrendjét követni." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Lapozás a lap alján vagy tetején történő kigördítéskor." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Az egérgörgővel, vagy a nyílbillentyűkkel a lapról való \"átgördítéskor\" " -"lapozás fog történni. Három egymást követő \"lépés - gördítés\" szükséges " -"ehhez." - -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "A következő arhívum automatikus megnyitása." - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Automatikusan megnyitja a következő arhívumot, ha az aktuális utolsó lapját " -"elhagyjuk, illetve az előzőt, ha az első kép elé lépünk." - -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "A következő arhívum automatikus megnyitása." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Dupla lapos megjelenítési módban két oldal lapozása." - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Két lapot lapozzon a program egy helyett, amikor a dupla lapos megjelenítési " -"mód az aktív." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Fájlok" - -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Programindításkor az utoljára megjelenített állomány betöltése." - -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"A program automatikusan nyissa meg induláskor a Comix bezárásakor " -"megjelenített állományt." - -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Az aktuálisan megnyitott állományok adatainak tárolása." - -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "A teljes képernyős megjelenítési mód legyen az alapértelmezett." - -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Teljes képernyős módban az összes eszköztár automatikusan legyen elrejtve." - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Szélességhez igazítás" - -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Szélességhez igazítás" - -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "_Szélességhez igazítás" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Diavetítés" - -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Diavetítés késleltetése (másodpercben megadva)" - -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Diavetítés késleltetése (másodpercben megadva)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "A következő arhívum automatikus megnyitása." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Elforgatás" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "A képek automatikus elforgatása a metaadatának megfelelően." - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Ha a képek metaadatában meghatározott megjelenítési irány található " -"(például: egy EXIF cimkében), akkor a program automatikusan elvégzi az " -"elforgatást." - -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Kép méretezése" - -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Manga mód" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar archívumok" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "A megnyitott fájlok bélyegképeinek eltárolása." - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"A megnyitott fájlok bélyegképei legyenek eltárolva a freedesktop.org " -"előírásainak megfelelően. Ezen bélyegképeket más alkalmazások, például a " -"legtöbb fájlkezelő is használhatja majd." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Nagyító" - -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Nagyító mérete (pixelben)" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"A nagyító lencse méreteinek megadása. Ez egy négyzet, aminek az oldalai " -"megadott pixelszámúak." - -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Nagyítási tényező" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "A nagyító nagyítási tényezőjének beállítása." - -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Megjegyzésfájlok kiterjesztése" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Kép kiemelése" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Szélességhez igazítás" - -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Magassághoz igazítás" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"A program a Comix-ban megnyitott állományok adatát hozzáadja majd a " -"megosztott, utoljára használt fájlok listájához." - -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Az aktuálisan megnyitott állományok adatainak tárolása." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Az itt megadott kiterjesztésű állományokat az arhívumokban " -"megjegyzésfájlként kezeli majd a program." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archívum" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Kép" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d lapok" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "Megjegyzések: %d" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Utolsó elérés" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Módosítva" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Jogosultságok" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Tulajdonos" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Diavetítés" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Zip archívum" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR archívum" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar archívum" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "tar archívum (gzip-pel tömörített)" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "tar archívum (bzip2-vel tömörített)" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "tar archívum (gzip-pel tömörített)" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Egyszerűsített kínai fordítás" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Spanyol fordítás" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Brazíliai portugál fordítás" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Német fordítás, Nautilus bélyegkép modul" - -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Perzsa fordítás" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Olasz fordítás" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Holland fordítás" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Francia fordítás" - -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Lengyel fordítás" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Lengyel fordítás" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Görög fordítás" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Katalán fordítás" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Hagyományos kínai fordítás" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Japán fordítás" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Magyar fordítás" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Orosz fordítás" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Horvát fordítás" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Koreai fordítás" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Perzsa fordítás" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Indonéz fordítás" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Cseh fordítás" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Olasz fordítás" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Görög fordítás" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Olasz fordítás" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Ikonok kivitelezése" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Másolás)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Következő oldal" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Előző _oldal" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Első oldal" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Utolsó oldal" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Bezárás" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Kilépés" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "A kép elfo_rgatása 90 fokkal" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "A kép e_lforgatása 180 fokkal" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "A kép _elforgatása -90 fokkal" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Tükrözés _vízszintesen" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Tükrözés _függőlegesen" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Könyvjelzők" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Eszköztárak" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "S_zerkesztés" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "_Legutóbbi fájlok" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Fájl" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Nézet" - -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Eszköztár" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Súgó" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Teljes képernyő" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Dupla lapos mód" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Eszköztár" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Menüsor" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Állap_otsor" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Gö_rdítősávok" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Bélyegképek" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "M_inden elrejtve" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga mód" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Á_talakítás megtartása" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Diavetítés _indítása" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "N_agyító" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Legjobb illeszkedés" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "_Szélességhez igazítás" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Magasság_hoz igazítás" - -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "_Szélességhez igazítás" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Ké_zi nagyítás" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Névjegy" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "B_eállítások" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Arhívum szerkesztése..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Megnyitás..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Gyűjtemény" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Könyvek hozzáadása" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Hozzáadott könyvek" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Hozzáadás '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Másolás)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Minden könyv" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Több könyv hozzáadása a könyvtárhoz." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "A kiválasztott könyv megnyitása." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Removed %(num)d book(s) from '%(collection)s'." -msgstr[1] "Removed %(num)d book(s) from '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Eltávolítja a könyveket a könyvtárból?" - -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"A kiválasztott könyvek a könyvtárból eltávolításra kerülnek (az eredeti " -"fájlok természetesen a helyükön maradnak). Biztosan folytatja?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Új, üres gyűjtemény hozzáadása." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Új gyűjtemény hozzáadása?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Adja meg az új gyűjtemény nevét." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Nem lehetett hozzáadni a '%s' nevű gyűjteményt." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "A megadott nevű gyűjtemény már létezik." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Átnevezi a gyűjteményt?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Adja meg a kiválasztott gyűjtemény új nevét." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "A nevet nem lehet megváltoztatni a következőre: '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "A gyűjteményt nem lehet duplikálni." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Alapkönyvtár" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"A '%(subcollection)s' gyűjtemény áthelyezése a következőbe: " -"'%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Könyvek hozzáadása a következőhöz: '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Könyvek mozgatása innen: '%(source collection)s' ide: " -"'%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Keresés" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Csak azokat a könyveket jeleníti meg, melyek a teljes elérési útvonalukban " -"tartalmazzák a megadott szövegrészt. A keresés nem kisbetű/nagybetű érzékeny." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "_Legutóbbi fájlok" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "A kiválasztott könyv megnyitása." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Removed %(num)d book(s) from '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Új gyűjtemény." - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "A könyveket automatikusan adja hozzá az aktuális gyűjteményhez." - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Bélyegképek könyvtára" - -#~ msgid "Tar archives" -#~ msgstr "Tar archívumok" - -#~ msgid "RAR archives" -#~ msgstr "RAR archívumok" - -#~ msgid "JPEG images" -#~ msgstr "JPEG képek" - -#~ msgid "PNG images" -#~ msgstr "PNG képek" - -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "PNG képek" - -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Képek" - -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "PNG képek" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "%s-t nem lehet megnyitni: Ismeretlen fájltípus." - -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "A következő szín legyen a háttérszín" - -#~ msgid "Cache" -#~ msgstr "Gyorsítótár" - -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Gyűjtemény hozzáadása" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Bélyegképek könyvtára" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Bélyegképek könyvtára" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Az arhívumok ZIP állományként lesznek tárolva." - -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Archívum" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Archívum" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Archívum" - -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Előző oldal" - -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Csak a széles kép megjelenítése dupla lapos módban." - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "A dupla lapos megjelenítési módban csak egy képet jelenít meg a program " -#~ "akkor, ha a kép szélessége eléri a magasságát. Tehát ha egy kép két " -#~ "lapból tevődik össze, akkor még dupla lapos módban is csak a széles kép " -#~ "lesz egyedül megjelenítve." - -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Változó háttérszín használata" - -#~ msgid "Default modes" -#~ msgstr "Alapértelmezett módok" - -#~ msgid "Use double page mode by default." -#~ msgstr "A kétlapos megjelenítési mód legyen az alapértelmezett." - -#~ msgid "Use manga mode by default." -#~ msgstr "A manga mód legyen az alapértelmezett." - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Ha az aktuális nagyítási mód igényli, akkor a program nyújtsa ki az " -#~ "eredetinél nagyobb méretűre a képeket. Amennyiben ez az opció nincs " -#~ "kiválasztva, akkor a képek ez eredeti nagyságuknál nem fognak nagyobbra " -#~ "nyúlni." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "A kiválasztott könyvek a könyvtárból eltávolításra kerülnek (az eredeti " -#~ "fájlok természetesen a helyükön maradnak). Biztosan folytatja?" - -#~ msgid "Remove collection from the library?" -#~ msgstr "Törli a gyűjteményt a könyvtárból?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "A kiválasztott gyűjtemény kikerül a könyvtárból (de a benne lévő könyvek " -#~ "és algyűjtemények megmaradnak). Biztosan folytatja?" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "A könyvtárból eltávolítva a következő(k): %d." - -#~ msgid "Rename..." -#~ msgstr "Átnevezés..." - -#~ msgid "Duplicate collection" -#~ msgstr "Gyűjtemény duplikálása" - -#~ msgid "Remove collection..." -#~ msgstr "Gyűjtemény eltávolítása..." - -#~ msgid "About" -#~ msgstr "Névjegy" - -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "A Comix egy képnézegető alkalmazás, melyet kimondottan a képregények " -#~ "megjelenítéséhez terveztek." - -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "" -#~ "A Comix a GNU General Public License (GNU Általános Nyilvános Licenc) " -#~ "alapján kerül terjesztésre." - -#~ msgid "Credits" -#~ msgstr "Közreműködők" - -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Nem található a RAR fájlokat kicsomagoló alkalmazás!" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Nem található a RAR fájlokat kicsomagoló alkalmazás!" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "A RAR (.cbr) fájlok megnyitásához a rar, vagy az unrar " -#~ "alkalmazást telepítenie kell." - -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "A nevet nem lehet megváltoztatni a következőre: '%s'." - -#~ msgid "_Add bookmark" -#~ msgstr "Könyvjelző hozzá_adása" - -#~ msgid "_Edit bookmarks..." -#~ msgstr "Könyvjelzők sz_erkesztése..." - -#~ msgid "_Clear bookmarks..." -#~ msgstr "Könyvjelzők _törlése..." - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Törli az összes könyvjelzőt?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Az összes eltárolt könyvjelző eltávolítására készül. Biztosan folytatja?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Érvénytelenített fájlok találhatók a számítógépén." - -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Néhány régi fájl (amiket a régebbi Comix verziók használtak beállítások, " -#~ "könyvtárak könyvjelzők, stb. tárolására) található a számítógépén. Ha már " -#~ "nem fog régebbi Comix verziókat használni, akkor tanácsos ezeket " -#~ "eltávolítani helymegtakarítás miatt. Szeretné eltávolítani őket most?" - -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Nem olvasható a(z) %s" - -#~ msgid "Import" -#~ msgstr "Importálás" - -#~ msgid "Defaults" -#~ msgstr "Alapértelmezések" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "%s-t nem lehet megnyitni: Ez egy könyvtár." - -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Nem olvasható a(z) %s" - -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "A nevet nem lehet megváltoztatni a következőre: '%s'." - -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Nem olvasható a(z) %s" - -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Eltávolítás a könyvtárból." - -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "A gyűjteményt nem lehet duplikálni." - -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "A gyűjteményt nem lehet duplikálni." - -#~ msgid "Remove from this collection" -#~ msgstr "Eltávolítás az aktuális gyűjteményből." - -#~ msgid "Remove from the library..." -#~ msgstr "Eltávolítás a könyvtárból." - -#~ msgid "Cover size" -#~ msgstr "Borító mérete" - -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Oldal" - -#~ msgid "Stretch small images." -#~ msgstr "Kisméretű képek kinyújtása." - -#~ msgid "Default zoom mode" -#~ msgstr "Alapértelmezett nagyítási mód" - -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "A lapok sorszáma legyen rajta a bélyegképen." - -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Archívum szerkesztése" - -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Előző _oldal" - -#~ msgid "Zoom _out" -#~ msgstr "_Kicsinyítés" - -#~ msgid "O_riginal size" -#~ msgstr "E_redei méret" - -#~ msgid "Manual _Zoom" -#~ msgstr "_Kézi nagyítás" - -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "Áta_lakítás" - -#~ msgid "_View comments..." -#~ msgstr "Megjegy_zések megtekintése" - -#~ msgid "_Properties" -#~ msgstr "_Tulajdonságok" - -#~ msgid "_Enhance image..." -#~ msgstr "Kép k_iemelése" - -#~ msgid "Developer" -#~ msgstr "Fejlesztő" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "A program használjon gyorsítótárat a gyorsabb böngészés eléréséhez." - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "A Comix a gyorsabb böngészés eléréséhez az aktuálisan megjelenített kép " -#~ "melletti fájlokat gyorstárazza. Ajánlott ezt az opciót bekapcsolni, mivel " -#~ "nagy sebességjavuláshoz vezet, kivéve ha kevés a memória." - -#~ msgid "Thumbnail maintenance" -#~ msgstr "Bélyegképek karbantartása" - -#~ msgid "Cleanup" -#~ msgstr "Tisztítás" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "Bélyegképek törlése" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "A fájlok bélyegképei (például képek és képregény könyv arhívumok) a " -#~ "felhasználói könyvtárban tárolódnak. Több különböző alkalmazás használja " -#~ "és hoz létre ilyen bélyegképeket, de ezek néha még az eredeti fájl " -#~ "törlése után is megmaradnak helypazarló módon. Ez a párbeszédablak segít " -#~ "az efféle árva és elavult bélyegképek törlésében." - -#~ msgid "Total number of thumbnails" -#~ msgstr "Bélyegképek száma" - -#~ msgid "Calculating..." -#~ msgstr "Számolás..." - -#~ msgid "Total size of thumbnails" -#~ msgstr "Bélyegképek mérete" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Szeretné eltávolítani az árva és elavult bélyegképeket?" - -#~ msgid "Removing thumbnails" -#~ msgstr "Bélyegképek eltávolítása" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "Eltávolított bélyegképek száma" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Az eltávolított bélyegképek mérete" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "'%s' - eltávolított bélyegképek" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "Bélyegképek kar_bantartása" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/id/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/id/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/id/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/id/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3615 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Andhika Padmawan , 2008. -# -msgid "" -msgstr "" -"Project-Id-Version: Comix-4.0.1\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2008-12-13 21:23+0700\n" -"Last-Translator: Andhika Padmawan \n" -"Language-Team: Indonesia \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Poedit-Language: Indonesian\n" -"X-Poedit-Country: INDONESIA\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"Comix membaca arsip ZIP, RAR dan tar, begitu pula dengan berkas citra biasa." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nama" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Halaman" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Lokasi" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Komentar" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Tak dapat membaca %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Perlu dicatat bahwa satu-satunya berkas yang secara otomatis ditambah ke " -"senarai ini adalah berkas di dalam arsip yang Comix kenali sebagai komentar." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Ukuran" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Hapus dari arsip" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Sunting arsip" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Citra" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Komentar" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Berkas baru tak dapat disimpan!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Berkas asli belum dihapus." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Arsip disimpan sebagai berkas ZIP." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Tingkatkan citra" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Kecerahan" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Kontras" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Saturasi" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Ketajaman" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Otomatis menyesuaikan kontras." - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Otomatis menyesuaikan kontras (baik kecerahan dan kegelapan), terpisah untuk " -"tiap pita warna." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Buka" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Simpan" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Semua berkas" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Semua arsip" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Arsip %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Semua gambar" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Citra %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Berkas bernama '%s' telah ada. Anda ingin menggantinya?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Mengganti berkas akan menimpa isinya." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Tambah buku" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Tak ada citra di '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Tak dapat membuka %s: Tak ada berkas." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Tak dapat membuka %s: Hak akses ditolak." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipe berkas tak diketahui" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Halaman sebelumnya" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Halaman berikutnya" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Halaman terakhir" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Halaman sebelumnya" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Halaman berikutnya" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Halaman sebelumnya" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Halaman berikutnya" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Halaman pertama" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Halaman terakhir" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Halaman berikutnya" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Sunting arsip" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Halaman sebelumnya" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Gulung" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Pembesaran ke dalam" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Jaga transformasi" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Jaga transformasi" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Rotasi 90 derajat searah jarum jam" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Rotasi 180 de_rajat" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Rotasi 90 derajat b_erlawanan arah jarum jam" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Put_ar horizontal" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Putar _vertikal" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Mode halaman ganda" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Mode sesuai lebar" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Mode manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lensa pembesar" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Mode ukuran terbaik" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Mode sesuai lebar" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Mode sesuai tinggi" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Mode sesuai _lebar" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Mode pembesaran manual" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Layar Penuh" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Batang st_atus" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Batang _gulung" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniatur gambar" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Sembuny_ikan semua" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Presentasi" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Berkas" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Berkas lain" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Tutup" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Keluar" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Simpan" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Arsip" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Properti" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Pengaturan" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Perpustakan" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Sunting bookmark" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Tak dapat membaca %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "SALINDIA" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Arsip disimpan sebagai berkas ZIP." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Arsip disimpan sebagai berkas ZIP." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Komentar" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Komentar" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Halaman _sebelumnya" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Komentar" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Direktori miniatur" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Arsip Tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Sunting bookmark" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ke" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Tembolok" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Penampilan" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Perilaku" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Tampilan" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Latar Belakang" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Gunakan warna ini sebagai latar belakang" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Selalu gunakan warna terpilih ini sebagai warna latar belakang." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Gunakan warna latar belakang dinamis." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Secara otomatis mengambil warna latar belakang yang cocok dengan citra yang " -"ditampilkan." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Selalu gunakan warna terpilih ini sebagai warna latar belakang." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Secara otomatis mengambil warna latar belakang yang cocok dengan citra yang " -"ditampilkan." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Tampilkan nomor halaman di miniatur." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Ukuran miniatur (dalam piksel)" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparansi" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Gunakan latar belakang yang telah diperiksa untuk citra transparan." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Gunakan warna latar belakang yang telah diperiksa untuk citra transparan. " -"Jika pengaturan ini tidak diatur, latar belakang menjadi putih polos." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Gunakan penggulung tombol spasi cerdas." - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Gunakan penggulung cerdas dengan tombol spasi. Normalnya tombol gulung spasi " -"hanya bergerak dari kanan ke bawah (atau atas jika shift ditekan), tapi " -"dengan pengaturan ini diatur tombol akan menggulung ke samping dan mencoba " -"untuk mengikuti urutan membaca natural buku komik." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Lipat halaman ketika menggulung tepi halaman." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Lipat halaman ketika menggulung \"tepi halaman\" dengan roda gulung atau " -"tombol panah. Membutuhkan tiga \"langkah\" berurutan dengan menggunakan roda " -"gulung atau tombol panah agar halaman terlipat." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Otomatis membuka arsip berikutnya." - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Otomatis membuka arsip berikutnya di direktori ketika melipat halaman " -"terakhir, atau arsip sebelumnya ketika melipat halaman pertama." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Otomatis membuka arsip berikutnya." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Lipat dua halaman dalam mode halaman ganda." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Lipat dua halaman, ketimbang satu, tiap kali kami menggulung dalam mode " -"halaman ganda." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Berkas" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Otomatis membuka berkas yang terakhir ditampilkan pada hidupkan." - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Otomatis membuka, pada hidupkan, berkas yang terbuka ketika Comix terakhir " -"kali ditutup." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Simpan informasi tentang berkas yang baru-baru ini terbuka." - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Gunakan layar penuh sebagai standar." - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Otomatis menyembunyikan semua batang alat di layar penuh." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Mode sesuai lebar" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Mode sesuai lebar" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Mode sesuai _lebar" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Presentasi" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Jeda salindia (dalam detik)" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Jeda salindia (dalam detik)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Otomatis membuka arsip berikutnya." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Skala citra" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Mode manga" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Arsip Tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Simpan miniatur untuk berkas yang dibuka." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Simpan miniatur untuk berkas yang dibuka menurut spesifikasi freedesktop." -"org. Miniatur ini dikongsikan oleh banyak aplikasi lain, seperti kebanyakan " -"manajer berkas." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lensa Pembesar" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Ukuran lensa pembesar (dalam piksel)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Atur ukuran lensa pembesar. Berupa kotak dengan sisi dari sebanyak ini " -"piksel." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Faktor pembesaran" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Atur faktor pembesaran dari lensa pembesar." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Ekstensi komentar" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Tingkatkan citra" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Mode sesuai lebar" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Mode sesuai tinggi" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Tambah informasi tentang semua berkas yang dibuka dari dalam Comix ke " -"senarai berkas terkini yang dikongsi." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Simpan informasi tentang berkas yang baru-baru ini terbuka." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Perlakukan semua berkas yang ditemukan dalam arsip, yang mempunyai salah " -"satu akhiran berkas ini, sebagai komentarl." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arsip" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Gambar" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d halaman" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d komentar" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Diakses" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Dimodifikasi" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Hak Akses" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Pemilik" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Presentasi" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Arsip ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Arsip RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Arsip Tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Arsip tar terkompres Gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Arsip tar terkompres Bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Arsip tar terkompres Gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Terjemahan bahasa China yang disederhanakan" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Terjemahan bahasa Spanyol" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Terjemahan bahasa Portugis Brasil" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Terjemahan bahasa Jerman dan pembuat miniatur gambar Nautilus" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Terjemahan bahasa Persia" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Terjemahan bahasa Italia" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Terjemahan bahasa Belanda" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Terjemahan bahasa Prancis" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Terjemahan bahasa Polandia" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Terjemahan bahasa Polandia" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Terjemahan bahasa Yunani" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Terjemahan bahasa Catalan" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Terjemahan bahasa China tradisional" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Terjemahan bahasa Jepang" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Terjemahan bahasa Hungaria" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Terjemahan bahasa Rusia" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Terjemahan bahasa Kroasia" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Terjemahan bahasa Korea" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Terjemahan bahasa Persia" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Terjemahan bahasa Indonesia" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Terjemahan bahasa Ceko" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Terjemahan bahasa Italia" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Terjemahan bahasa Yunani" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Terjemahan bahasa Italia" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Desain ikon" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Salin)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Halaman _berikutnya" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Halaman _sebelumnya" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "Halaman _pertama" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "Halaman _terakhir" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Tutup" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Keluar" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Rotasi 90 derajat searah jarum jam" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotasi 180 de_rajat" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Rotasi 90 derajat b_erlawanan arah jarum jam" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Put_ar horizontal" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Putar _vertikal" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "B_ookmark" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "B_atang alat" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Sunting" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Buk_a terkini" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Berkas" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Tampilan" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "Batang _alat" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "Ba_ntuan" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "La_yar penuh" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Mode _halaman ganda" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Batang _alat" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Batang _menu" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Batang st_atus" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Batang _gulung" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniat_ur" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Sembuny_ikan semua" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Mode manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Jaga transformasi" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Jalankan _salindia" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Lensa _pembesar" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Mode ukuran te_rbaik" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Mode sesuai _lebar" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Mode sesuai _tinggi" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Mode sesuai _lebar" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Mode pembesaran m_anual" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Tentang" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "P_engaturan" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Sunting arsip..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "B_uka..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "Pus_taka..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Menambah buku" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Buku yang ditambah" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Menambah '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Salin)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Semua buku" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Tambah lebih banyak buku ke pustaka." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Buka buku terpilih." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Hapus %(num)d buku dari '%(collection)s'." -msgstr[1] "Hapus %(num)d buku dari '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Hapus buku dari pustaka?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Buku terpilih akan dihapus dari pustaka (tapi berkas aslinya akan tetap tak " -"tersentuh). Anda yakin ingin melanjutkan?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Tambah koleksi kosong baru." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Tambah koleksi baru?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Silakan masukkan nama untuk koleksi baru." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Tak dapat menambah koleksi baru bernama '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Koleksi dengan nama tersebut telah ada." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Ganti nama koleksi?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Silakan masukkan nama baru untuk koleksi terpilih." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Tak dapat mengubah nama ke '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Tak dapat menduplikasi koleksi." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Root" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "Taruh koleksi '%(subcollection)s' di koleksi '%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Tambah buku ke '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Pindah buku dari '%(source collection)s' ke '%(destination collection)s'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Cari" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Hanya tampilkan buku yang mempunyai benang teks di alamat penuh mereka. " -"Pencarian tidak sensitif huruf." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Buk_a terkini" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Buka buku terpilih." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Hapus %(num)d buku dari '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Koleksi baru" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Otomatis menambah buku ke koleksi ini" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Direktori miniatur" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Arsip Tar" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "Arsip RAR" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "Citra JPEG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "Citra PNG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Citra PNG" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Citra" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Citra PNG" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Tak dapat membuka %s: Tipe berkas tak diketahui." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Gunakan warna ini sebagai latar belakang" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Tembolok" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Tambah koleksi" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Direktori miniatur" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Direktori miniatur" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Arsip disimpan sebagai berkas ZIP." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arsip" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arsip" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arsip" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Halaman sebelumnya" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Hanya tampilkan satu citra lebar dalam mode halaman ganda." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Hanya tampilkan satu citra dalam mode halaman ganda, jika lebar citra " -#~ "melebihi tingginya. Hasil dari ini adalah pemindaian yang merentangkan " -#~ "dua halaman akan ditampilkan secara benar (misalnya sendiri) juga dalam " -#~ "mode halaman ganda." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Gunakan warna latar belakang dinamis." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Mode standar" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Gunakan mode halaman gandar sebagai standar." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Gunakan mode manga sebagai standar." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Rentangkan citra ke ukuran yang lebih besar dari ukuran asli jika mode " -#~ "pembesaran saat ini memintanya. Jika pengaturan ini tak diatur, citra " -#~ "tidak pernah diubah menjadi lebih besar dari ukuran aslinya." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Buku terpilih akan dihapus dari pustaka (tapi berkas aslinya akan tetap " -#~ "tak tersentuh). Anda yakin ingin melanjutkan?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Hapus koleksi dari pustaka?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Koleksi terpilih akan dihapus dari pustaka (tapi buku dan subkoleksi di " -#~ "dalamnya akan tetap terjaga). Apakah anda yakin ingin melanjutkan?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Hapus %d buku dari pustaka." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Ganti Nama..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Duplikasi koleksi" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Hapus koleksi..." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Tentang" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix adalah penampil gambar yang didesain khusus untuk menangani buku " -#~ "komik." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix dilisensikan di bawah GNU General Public License." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Kredit" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Tak dapat menemukan pengekstrak berkas RAR!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Tak dapat menemukan pengekstrak berkas RAR!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Anda memerlukan program rar atau unrar yang terinstal untuk " -#~ "dapat membaca berkas RAR (.cbr)." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Tak dapat mengubah nama ke '%s'." - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Tambah bookmark" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Sunting bookmark..." - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Hapus bookmark..." - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Hapus semua bookmark?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Semua bookmark tersimpan akan dihapus. Anda yakin ingin melanjutkan?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Ada berkas tertinggal di komputer anda." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Beberapa berkas lama (yang digunakan untuk pengaturan penyimpanan, " -#~ "pustaka, bookmark, dll. untuk versi lama Comix) ditemukan di komputer " -#~ "anda. Jika anda tidak berencana untuk menggunakan versi lama Comix lagi, " -#~ "anda harus menghapus berkas ini agar menghemat ruang kosong di cakram. " -#~ "Anda ingin berkas ini dihapus sekarang?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Tak dapat membaca %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Impor" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Standar" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Tak dapat membuka %s: Sebuah direktori." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Tak dapat membaca %s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Tak dapat mengubah nama ke '%s'." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Tak dapat membaca %s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Hapus dari pustaka..." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Tak dapat menduplikasi koleksi." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Tak dapat menduplikasi koleksi." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Hapus dari koleksi ini" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Hapus dari pustaka..." - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Ukuran sampul" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Halaman" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Rentangkan citra kecil." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Mode pembesaran standar" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Tampilkan nomor halaman di miniatur." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Sunting arsip" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Halaman _sebelumnya" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "Pembesaran _ke luar" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "U_kuran asli" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Pembesaran _Manual" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Ubah" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "_Tampilkan komentar..." - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Properti" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "Tingkatkan _citra..." - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Pengembang" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Gunakan tembolok untuk meningkatkan kecepatan meramban." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Tembolok citra yang ada di samping ke citra yang saat ini ditampilkan " -#~ "supaya meningkatkan kecepatan meramban. Karena peningkatan kecepatan " -#~ "cukup besar, disarankan agar anda mengatur pengaturan ini, kecuali anda " -#~ "kekurangan RAM bebas." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Pengelolaan miniatur" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Bersihkan" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Bersihkan miniatur" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Miniatur untuk berkas (seperti berkas citra dan arsip buku komik) yang " -#~ "disimpan di direktori rumah anda. Banyak aplikasi yang berbeda " -#~ "menggunakan dan membuat miniatur ini, tapi terkadang miniatur akan tetap " -#~ "meskipun berkas aslinya telah dihapus - menghabiskan ruang. Dialog ini " -#~ "dapat membersihkan miniatur tersimpan anda dengan menghapus miniatur " -#~ "yatim dan kadaluwarsa." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Jumlah total miniatur" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Mengalkulasi..." - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Ukuran total miniatur" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Anda ingin menghapus miniatur yatim dan kadaluwarsa sekarang?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Menghapus miniatur gambar" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Jumlah miniatur yatim" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Ukuran total miniatur yang dihapus" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Hapus miniatur untuk '%s'" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "Pengelolaan _miniatur..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/it/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/it/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/it/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/it/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2623 +0,0 @@ -# Italian translation of MComix -# Copyright (C) 2012 -# This file is distributed under the same license as the MComix package. -# -# Translators: -# Giovanni Scafora , 2013. -msgid "" -msgstr "" -"Project-Id-Version: MComix\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2013-04-26 18:00+0100\n" -"Last-Translator: Giovanni Scafora \n" -"Language-Team: Arch Linux Italian Team \n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" -"%s è un visualizzatore di immagini specificamente progettato per gestire i " -"fumetti." - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Legge gli archivi ZIP, RAR, tar e le immagini." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s è distribuito sotto i termini della GNU General Public License." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "Una copia di questa licenza può essere scaricata da %s" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Il formato dell'archivio non è supportato: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Si è verificato un errore durante l'estrazione: %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Impossibile creare un archivio nel percorso \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Impossibile aggiungere il file %(sourcefile)s all'archivio " -"%(archivefile)s, operazione annullata..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! Impossibile leggere %s" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Impossibile analizzare il file %s dei segnalibri" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "Vuoi sostituire il segnalibro esistente sulla pagina %s?" -msgstr[1] "Vuoi sostituire i segnalibri esistenti sulle pagine %s?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"Il libro attuale già contiene pagine segnate. Vuoi sostituirle con un nuovo " -"segnalibro sulla pagina %d? " - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"Selezionando \"No\" creerà un nuovo segnalibro senza influenzare gli altri " -"segnalibri." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Modifica i segnalibri" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Tipo" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nome" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Pagina" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Posizione" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "Aggiunto" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "_Aggiungi un segnalibro" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "_Modifica i segnalibri..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! Callback %(function)r fallito: %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Commenti" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Impossibile leggere %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Nota che gli unici file che sono automaticamente aggiunti a questa lista " -"sono quelli presenti negli archivi che MComix riconosce come commenti." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Dimensione" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Rimuovi dall'archivio" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Modifica l'archivio" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_Importa" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Immagini" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "File di commento" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Il nuovo archivio non può essere salvato!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "I file originali non sono stati rimossi." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Gli archivi sono salvati come file ZIP." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Migliora l'immagine" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Ripristina i valori di default." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "Salva i valori selezionati come default per i futuri file." - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_Luminosità:" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_Contrasto:" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "S_aturazione:" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "_Nitidezza:" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "R_egola automaticamente il contrasto" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Regola automaticamente il contrasto (luminosità ed oscurità), separatamente " -"per ciascuna banda di colore." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Apri" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Salva" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Tutti i documenti" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Tutti gli archivi" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Archivi %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Tutte le immagini" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Immagini %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Il file '%s' già esiste. Vuoi sostituirlo?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Sostituendolo, sovrascriverai il suo contenuto." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Aggiungi libri" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Non ci sono immagini in '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Impossibile aprire %s: il file non esiste." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Impossibile aprire %s: permesso negato." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "Continui a leggere da pagina %d?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"Ti sei fermato a leggere qui il %(date)s, %(time)s. Se hai scelto \"Yes\", " -"la lettura riprenderà dalla pagina %(page)d. Altrimenti, sarà caricata la " -"prima pagina." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Il file delle preferenze \"%s\" è corrotto, eliminazione in corso..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Il percorso non è esatto: '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! Impossibile caricare l'icona \"%s\"" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipo di file sconosciuto" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Pagina precedente" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Pagina successiva" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Indietro di dieci pagine" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Avanti di dieci pagine" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Pagina precedente" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Pagina successiva" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Pagina precedente" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Pagina successiva" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Prima pagina" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Ultima pagina" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Vai alla pagina..." - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Archivio successivo" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Archivio precedente" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Cartella successiva" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Cartella precedente" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "Scorri in basso a sinistra" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Scorrimento" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "Scorri in basso e centra" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "Scorri in basso a destra" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "Scorri a sinistra e centra" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "Scorri al centro" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "Scorri a destra e centra" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "Scorri in alto a sinistra" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "Scorri in alto e centra" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "Scorri in alto a destra" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "Scorri verso il basso" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "Scorri verso l'alto" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "Scorri a destra" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "Scorri a sinistra" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "Scorrimento intelligente verso l'alto" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "Scorrimento intelligente verso il basso" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Zoom avanti" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Zoom indietro" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Dimensione reale" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Mantieni trasformazione" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Mantieni trasformazione" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Ruota di 90 gradi in senso orario" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Ruota di 180 _gradi" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Ruota di 90 gradi in s_enso antiorario" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Rifletti _orizzontalmente" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Rifletti _verticalmente" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -#, fuzzy -msgid "Autorotate by width" -msgstr "_Rotazione automatica dell'immagine" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Autorotate by height" -msgstr "_Rotazione automatica dell'immagine" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Modalità pagina doppia" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Modalità di visualizzazione" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Modalità manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "Inverti lo scorrimento intelligente" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lente di ingrandimento" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Ingrandisci le immagini piccole" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Migliore modalità di adattamento" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Modalità adatta alla larghezza" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Modalità adatta all'altezza" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "A_datta modalità di ridimensionamento" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Modalità di ingrandimento manuale" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Esci dalla modalità a schermo intero" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Interfaccia utente" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "Mostra il pannello OSD" - -#: mcomix/mcomix/keybindings.py:114 -#, fuzzy -msgid "Minimize" -msgstr "Mi_nimizza" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Schermo intero" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -#, fuzzy -msgid "Show/hide menubar" -msgstr "Mostra i numeri dei file" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Barra di st_ato" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Barre di s_corrimento" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniature" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "_Nascondi tutto" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Avvia la presentazione" - -#: mcomix/mcomix/keybindings.py:125 -#, fuzzy -msgid "Delete" -msgstr "_Elimina" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "File" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "A_ggiorna" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Chiudi" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "Esc_i" - -#: mcomix/mcomix/keybindings.py:129 -#, fuzzy -msgid "Save and quit" -msgstr "Sal_va ed esci" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "_Salva come" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "%d commenti" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Proprietà" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferenze" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Libreria" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "Esegui comando esterno" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Edita i comandi esterni" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" -"L'associazione del tasto \"%(action)s\" sovrascrive il tasto di scelta " -"rapida di un'altra azione." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "Impossibile caricare le associazioni dei tasti : %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! Impossibile trovare pysqlite2 e sqlite3." - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! Impossibile rimuovere il file \"%s\"" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "PRESENTAZIONE" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Salva la pagina come" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "Vuoi eliminare \"%s\"?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "Il file sarà cancellato dal tuo harddisk." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Non chiedere di nuovo." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "'%s' è disabilitato per gli archivi." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "Impossibile avviare il comando %(cmdlabel)s: %(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "La riga di comando è vuota." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "La sequenza di escape è incompleta. Per un letterale '%', use '%%'." - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" -"Sequenza di citazione incompleta. Per un letterale '\"', utilizza '%\"'." - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "Le variabili dei file possono essere usate solo per i file." - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "Le variabili degli archivi possono essere usate solo per gli archivi." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "La sequenza di escape è incompleta: %%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "Edita i comandi esterni" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "Aggiungi un _separatore" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "Esegui _comando" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "Questo è un separatore pseudo-comando." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "\"%s\" non ha una valida directory di lavoro." - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "\"%s\" non sembra essere un valido eseguibile." - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "Etichetta del comando" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "Anteprima:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"Si prega di far riferimento alla documentazione del comando " -"esterno per ottenere una lista di variabili utilizzabili ed altri " -"suggerimenti." - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "Etichetta" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "Comando" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "Directory di lavoro" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "Disabilitato negli archivi" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "Vuoi salvare i comandi modificati?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"Hai appena modificato la lista dei comandi esterni che non sono stati ancora " -"salvati. Premere \"Sì\" per salvare tutte le modifiche oppure \"No\" per non " -"salvarle." - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "_Edita comandi" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "Va_i" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "_Annulla" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " di %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Aspetto" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportamento" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Mostra" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Avanzate" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Lingua (necessita di riavvio):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "Il tasto escape chiude il programma" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"Quando è attivo, il tasto ESC chiude il programma, invece di disabilitare " -"solo la modalità a schermo intero." - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Sfondo" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Usa questo colore come sfondo:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Usa sempre questo colore selezionato come colore dello sfondo." - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Usa colore di sfondo dinamico" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Usa automaticamente un colore di sfondo che si adatti all'immagine " -"visualizzata." - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "" -"Usa sempre questo colore selezionato come colore di sfondo delle miniature." - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Utilizza automaticamente il colore che si adatta all'immagine visualizzata " -"per lo sfondo delle miniature." - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Mostra i numeri delle pagine nelle miniature" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Usa la miniatura dell'archivio come icona dell'applicazione" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"Abilitando questa impostazione, la prima pagina di un libro sarà usata come " -"icona dell'applicazione al posto dell'icona standard." - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Dimensioni della miniatura (in pixel):" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Trasparenza" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Utilizza lo sfondo a scacchi per le immagini trasparenti" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Utilizza uno sfondo grigio a scacchi per le immagini trasparenti. Se questa " -"opzione non è impostata, lo sfondo sarà bianco." - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Usa lo scorrimento intelligente" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Con questa preferenza si imposta anche lo scorrimento laterale e cerca così " -"di seguire l'ordine naturale di lettura del fumetto." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Volta le pagine quando ci si muove oltre inizio o fine pagina" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Volta le pagine quando si scorre \"a fine pagina\" con la rotellina del " -"mouse o con i tasti freccia. Per voltare pagina, bisogna compiere tre " -"\"scatti\" con la rotellina del mouse oppure con i tasti freccia." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Apri automaticamente l'archivio successivo" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Apre automaticamente l'archivio successivo nella directory, dopo aver " -"visualizzato l'ultima pagina o l'archivio precedente dopo la prima pagina." - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Apri automaticamente la directory successiva" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Apre automaticamente il primo file presente nella prossima directory, quando " -"si giunge all'ultima pagina dell'ultimo file di una directory, o la " -"directory precedente quando si giunge alla prima pagina del primo file." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "Numero di pixel da scorrere quando si preme il tasto freccia:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" -"Imposta il numero di pixel da scorrere su una pagina, quando si usano i " -"tasti freccia." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Numero di pixel da scorrere per ogni scatto della rotellina del mouse:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"Imposta il numero di pixel da scorrere su una pagina quando si una la " -"rotellina del mouse." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" -"Frazione di pagina da scorrere quando si preme la barra di spazio (in " -"percentuale):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" -"Imposta la percentuale di cui la pagina scorrerà verso il basso o verso " -"l'alto, quando viene premuta la barra di spazio." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Numero di \"scatti\" da compiere prima di voltare la pagina:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Imposta il numero di \"scatti\" da compiere per passare alla pagina " -"successiva o a quella precedente. Un minor numero di scatti consentirà di " -"voltare pagina velocemente, ma anche di sfogliarle accidentalmente." - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "Capovolgi due pagine in modalità pagina doppia" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Capovolge due pagine, invece di una, ogni volta che capovolgiamo le pagine " -"in modalità pagina doppia." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "Mostra solo una pagina quando:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "File" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "" -"Apri automaticamente l'ultimo file visualizzato all'apertura del programma" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"All'avvio, apre automaticamente il file che è stato aperto quando MComix è " -"stato chiuso l'ultima volta." - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Memorizza le informazioni dei file aperti di recente:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Usa la modalità a schermo intero di default" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Nascondi automaticamente tutte le barre degli strumenti in modalità a " -"schermo intero" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "Adatta modalità di ridimensionamento" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "Adatta alla larghezza o all'altezza:" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "Ridimensionamento per questa modalità:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Presentazione" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Intervallo della presentazione (in secondi):" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Intervallo della presentazione (in pixel):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Specifica il numero di pixel da scorrere durante la modalità presentazione. " -"Un valore positivo li farà scorrere in avanti, un valore negativo " -"all'indietro ed un valore pari a 0 farà sì che la presentazione visualizzi " -"sempre una nuova pagina." - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Durante una presentazione apri automaticamente l'archivio successivo" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" -"Durante la modalità presentazione consente automaticamente l'apertura " -"dell'archivio successivo." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotazione" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "Ruota automaticamente le immagini in base ai metadata" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Ruota automaticamente le immagini quando nei metadata dell'immagine è " -"specificato un orientamento, come ad esempio in un tag Exif." - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Qualità dell'immagine" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Modalità di ridimensionamento" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Ordine dei file" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "Ordina file e directory per:" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "Ordina gli archivi per:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "Massimo numero di pagine da memorizzare nella cache:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "Memorizza le miniature dei file aperti" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Salva le miniature dei file aperti in base alle specifiche di freedesktop." -"org. Queste miniature sono condivise da molte altre applicazioni, come, ad " -"esempio, la maggior parte dei gestori di file." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Massimo numero di pagine da memorizzare nella cache:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Imposta il numero massimo di pagine da memorizzare nella cache. Un valore " -"pari a -1, memorizzerà l'intero archivio nella cache." - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lente di ingrandimento" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "Dimensione della lente di ingrandimento (in pixel):" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Imposta la dimensione della lente di ingrandimento. È un quadrato con un " -"lato di questo numero di pixel." - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Fattore di ingrandimento:" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Imposta il fattore di ingrandimento della lente." - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "Estensioni dei commenti:" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Migliora l'immagine" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "Cancella le scelte nella finestra di dialogo" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" -"Cancella tutte le scelte nella finestra di dialogo che precedentemente hai " -"scelto di non chiedere di nuovo" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Rileva automaticamente (default)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Mai" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "Solo per i titoli delle pagine" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "Solo per le immagini di grandi dimensioni" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Sempre" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"Quando la prima pagina di un archivio, o la larghezza di un'immagine supera " -"la sua altezza, sarà visualizzata solo una pagina singola." - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "Adatta alla larghezza" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "Adatta all'altezza" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "Nessun ordinamento" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Nome del file" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Dimensione del file" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "Ultima modifica" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "Ascendente" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "Discendente" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"I file saranno aperti e visualizzati secondo l'ordine qui specificato. " -"Questa opzione non influisce sull'ordine all'interno degli archivi." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "Ordine naturale" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "Ordine letterale" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"I file presenti all'interno degli archivi saranno ordinati secondo l'ordine " -"specificato qui. Ordine naturale ordinerà i file numerati in base al loro " -"ordine naturale, ad esempio 1, 2, ..., 10, mentre l'ordine letterale " -"utilizza l'ordinamento standard C, ad esempio 1, 2, 34, 5." - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Aggiunge le informazioni di tutti i file aperti da MComix ad una lista " -"condivisa dei file recenti." - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "Vuoi eliminare le informazioni dei file aperti di recente?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"Questo rimuoverà tutte le voci presenti nel menu \"Recenti\" e le " -"informazioni delle ultime pagine lette." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "Normale (veloce)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilineare" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "Iperbolico (lento)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"Cambia in base a come le immagini sono ridimensionate. Algoritmi più lenti " -"producono un ridimensionamento di qualità superiore, ma tempi più lunghi per " -"il caricamento delle pagine." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "Normale" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Tratta tutti i file trovati con queste estensioni, all'interno degli " -"archivi, come se fossero dei commenti." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archivio" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Immagine" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d pagine" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d commenti" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Visitata" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modificata" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permessi" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Proprietario" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[OPZIONE...] [PERCORSO]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Visualizza le immagini e gli archivi dei fumetti." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Mostra questo aiuto ed esce." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Avvia l'applicazione in modalità presentazione." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Mostra la libreria all'avvio." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Mostra il numero di versione ed esce." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Modalità di visualizzazione" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Avvia l'applicazione in modalità a schermo intero." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Avvia l'applicazione in modalità manga." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Avvia l'applicazione in modalità pagina doppia." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Modalità di zoom" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" -"Avvia l'applicazione con lo zoom impostato al fine di ottenere il migliore " -"adattamento." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "Avvia l'applicazione con lo zoom adattato in larghezza." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "Avvia l'applicazione con lo zoom adattato in altezza." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Opzioni di debug" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "Imposta il livello di log desiderato." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "Non hai installato le versioni richieste di GTK+ e PyGTK." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "Non è stata trovata nessuna versione di PyGTK nel tuo sistema." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" -"Questo errore potrebbe essere causato dalla mancanza delle librerie GTK+." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "Non hai installato la versione richiesta di Python Imaging" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "La libreria (PIL) è installata." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "La versione installata di PIL è: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "La versione richiesta di PIL è: 1.1.5 o superiore" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" -"È necessario installare Python Imaging Library (PIL) 1.1.5 o superiore." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"Non è stata trovata nessuna versione di Python Imaging Library nel tuo " -"sistema." - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Ferma la presentazione" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "Mostra i numeri delle pagine" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "Mostra i numeri dei file" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "Mostra la risoluzione" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "Mostra il percorso" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "Mostra il nome del file" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Mostra il nome del file" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Archivio ZIP" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Archivio RAR" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Archivio tar" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Archivio tar (compresso gzip)" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Archivio tar (compresso bzip2)" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Archivio tar (compresso gzip)" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "Archivio 7z" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "Archivio LHA" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Sviluppatore di Comix" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Sviluppatore di MComix" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "traduzione in cinese semplificato" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "traduzione in spagnolo" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "traduzione in portoghese brasiliano" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "traduzione in tedesco e gestione delle miniature in Nautilus" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "traduzione in tedesco" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "traduzione in italiano" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "traduzione in olandese" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "traduzione in francese" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "traduzione in polacco" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "traduzione in polacco" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "traduzione in greco" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "traduzione in catalano" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "traduzione in cinese tradizionale" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "traduzione in giapponese" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "traduzione in ungherese" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "traduzione in russo" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "traduzione in croato" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "traduzione in coreano" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "traduzione in persiano" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "traduzione in indonesiano" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "traduzione in ceco" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "traduzione in ucraino" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "traduzione in galiziano" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "traduzione in svedese" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "traduzione in ebraico" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "traduzione in italiano" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "design dell'icona" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! Impossibile salvare la miniatura \"%(thumbpath)s\": %(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "_Copia" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Copia la pagina attuale negli appunti." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_Elimina" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Elimina l'attuale file o archivio dal disco." - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "P_agina successiva" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Pagina precedente" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_rima pagina" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Ultima pagina" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Vai alla pagina..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Vai alla pagina..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "A_ggiorna" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Ricarica i file o gli archivi attualmente aperti." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Ar_chivio successivo" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Arc_hivio precedente" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "Zoom _avanti" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "Zoom _indietro" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "_Dimensione normale" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Mi_nimizza" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Chiudi" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "Chiude tutti i file aperti." - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "Esc_i" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "Sal_va ed esci" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" -"Chiudi e ripristina il file attualmente aperto per la prossima volta che si " -"avvia il programma." - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Ruota di 90 gradi in senso orario" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Ruota di 180 _gradi" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Ruota di 90 gradi in s_enso antiorario" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Rifletti _orizzontalmente" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Rifletti _verticalmente" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "_Salva come" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "_Recenti" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "S_egnalibri" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Barra degli strumenti" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Modifica" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "_Apri con" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_File" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Visualizza" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_Strumenti" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Aiuto" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "_Trasforma l'immagine" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "_Rotazione automatica dell'immagine" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "...quando la larghezza è superiore all'altezza" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "...quando l'altezza è superiore alla larghezza" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Schermo intero" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Modalità a schermo intero" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Modalità pagina doppia" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Barra degli strumenti" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barra dei _menù" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Barra di st_ato" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barre di s_corrimento" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniat_ure" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Nascondi tutto" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "M_odalità manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "Inverti lo scorrimento intelligente della direzione." - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Mantieni trasformazione" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" -"Mantiene la trasformazione attualmente selezionata per le pagine successive." - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "A_vvia la presentazione" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "L_ente di ingrandimento" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" -"Ingrandisci le immagini adattandole allo schermo, a seconda della modalità " -"zoom." - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Mi_gliore modalità di adattamento" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Mo_dalità adatta alla larghezza" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Mod_alità adatta all'altezza" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "A_datta modalità di ridimensionamento" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Moda_lità di ingrandimento manuale" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Informazioni" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "C_ommenti..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "_Proprietà" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Preferenze" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Modifica archivio..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "Apri l'editor dell'archivio." - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Apri..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "_Migliora l'immagine..." - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Libreria..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! Callback %(function)r fallito: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "L'archivio è protetto da una password." - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"%(filename)s's è stato estratto, la dimensione è di %(actual_size)d byte, ma " -"dovrebbe essere di %(expected_size)d byte. L'archivio potrebbe essere " -"corrotto oppure è un formato non supportato." - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Aggiungi libri" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Libri aggiunti:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Aggiunta di '%s' in corso..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! #%i libro inesistente" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! Impossibile prelevare la copertina del libro \"%s\"" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! Impossibile aggiungere il libro \"%s\" alla libraria" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! Impossibile aggiungere la collezione \"%s\"" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" -"! Impossibile aggiungere il libro %(book)s alla collezione %(collection)s" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! Impossibile rinominare la collezione in \"%s\"" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "Impossibile determinare la versione del database della libreria!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" -"Aggiornamento in corso della versione del database della libreria da " -"%(from)d a %(to)d." - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "_Recente" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Tutti i libri" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "Libri della libreria" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "_Apri" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "Apri i libri selezionati per la visualizzazione." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "Apri _senza chiudere la libreria" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" -"Apri i libri selezionati, ma mantieni aperta la finestra della libreria." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "_Aggiungi..." - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Aggiungi piu libri alla libreria." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Rimuovi da questa _collezione" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "Rimuove i libri selezionati dall'attuale collezione." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Rimuove dalla _libreria" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "Rimuovi completamente i libri selezionati dalla libreria." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "_Rimuovi ed elimina dal disco" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "Elimina i libri selezionati dal disco." - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "Copia negli appunti il percorso del libro selezionato." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_Ordina" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "Cambia l'ordine della libreria." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "Dimen_sione della copertina" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "Cambia la dimensione della copertina del libro." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "Nome del libro" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "Percorso completo" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "Data di inserimento" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "Enorme" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "Larga" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "Piccola" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "Molto piccola" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "Personalizza..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "Imposta la dimensione della copertina della libreria" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Rimosso %(num)d libro da '%(collection)s'." -msgstr[1] "Rimossi %(num)d libri da '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "Rimossoo %d libro dalla libreria." -msgstr[1] "Rimossi %d libri dalla libreria." - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Vuoi rimuovere i libri dalla libreria?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"I libri selezionati saranno rimossi dalla libreria e definitivamente " -"cancellati. Sei sicuro di voler continuare?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "Collezioni della libreria" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "Nuovo" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Aggiungi una collezione vuota." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "Ri_nomina" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "Rinomina la collezione selezionata." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "_Duplica" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "Crea un duplicato della collezione selezionata." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_Pulisci" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "Rimuove dalla collezione i libri che non ci sono più." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "_Rimuovi" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "Elimina la collezione selezionata." - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Vuoi aggiungere una nuova collezione?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Digitare un nome per la nuova collezione." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Impossibile aggiungere una nuova collezione chiamata '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Esiste già una collezione con quel nome." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Vuoi rinominare la collezione?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Digitare un nuovo nome per la collezione selezionata." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Impossibile cambiare il nome in '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Impossibile duplicare la collezione." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Root" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Mette la collezione '%(subcollection)s' nella collezione " -"'%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Aggiungi libri a '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Sposta i libri da '%(source collection)s' a '%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "_Cerca:" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Visualizza solo quei libri che hanno la stringa di testo specificata nel " -"loro percorso completo. La ricerca non è case sensitive." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "_Watch list" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "Apri la finestra di dialogo della watchlist." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "_Apri con" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Apri il libro selezionato." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "Lettura terminata il %(date)s, %(time)s" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "Ricerca di nuovi libri in corso..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" -"Aggiunto un nuovo libro '%(bookname)s' dalla directory '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Aggiunti %(count)d nuovi libri dalla directory '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "Non ci sono nuovi libri nella directory '%s'." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! Per usare la libreria è necessario disporre di un wrapper sqlite." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "Lista delle collezioni da guardare" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "_Cerca adesso" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Cartella" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Collezione" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Con le sottodirectory" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "_Aggiungi" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "Cerca automaticamente nuovi libri quando la libreria è _aperta" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "La versione installata di GTK+ è: %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "La versione richiesta di GTK+ è: 2.12.0 o superiore\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "La versione installata di PyGTK è: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "La versione richiesta di PyGTK è: 2.12.0 o superiore" - -#~ msgid "Invalid working directory." -#~ msgstr "Cartella di lavoro non valida." - -#~ msgid "ZIP archives" -#~ msgstr "Archivi ZIP" - -#~ msgid "Tar archives" -#~ msgstr "Archivi tar" - -#~ msgid "RAR archives" -#~ msgstr "Archivi RAR" - -#~ msgid "LHA archives" -#~ msgstr "Archivi LHA" - -#~ msgid "JPEG images" -#~ msgstr "Immagini JPEG" - -#~ msgid "PNG images" -#~ msgstr "Immagini PNG" - -#~ msgid "GIF images" -#~ msgstr "Immagini GIF" - -#~ msgid "TIFF images" -#~ msgstr "Immagini TIFF" - -#~ msgid "BMP images" -#~ msgstr "Immagini BMP" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Impossibile aprire %s: tipo di file sconosciuto." - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Usa questo colore come sfondo delle miniature:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "" -#~ "! Si è verificato un errore durante il processo di riproduzione " -#~ "\"%(command)s\": %(error)s." - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "" -#~ "\"%(command)s\" il PERCORSO deve essere nel tuo sistema per essere " -#~ "trovato." - -#~ msgid "Please enter the password to continue:" -#~ msgstr "Digitare la password per continuare:" - -#~ msgid "Cache" -#~ msgstr "Cache" - -#~ msgid "Toggle fullscreen" -#~ msgstr "Passa alla modalità a schermo intero" - -#~ msgid "Add to this collection:" -#~ msgstr "Aggiungi a questa collezione:" - -#~ msgid "Reading" -#~ msgstr "Lettura in corso" - -#~ msgid "Page orientation and zoom" -#~ msgstr "Orientamento della pagina e zoom" - -#~ msgid "User Interface" -#~ msgstr "Interfaccia utente" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ja/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/ja/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ja/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/ja/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2623 +0,0 @@ -# Japanese translations for MComix package -# MComix パッケージに対する英訳. -# Copyright (C) 2011 THE MComix'S COPYRIGHT HOLDER -# This file is distributed under the same license as the MComix package. -# Keita Haga , 2011 -# Toshiharu Kudoh , 2011, 2012. -# -msgid "" -msgstr "" -"Project-Id-Version: MComix 1.00-SVN\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2012-08-16 13:10+0900\n" -"Last-Translator: Toshiharu Kudoh \n" -"Language-Team: Japanese\n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s はコミックを扱うために特化してデザインされた画像ビューアーです。" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"ZIP, RAR, tar 形式のアーカイブファイルや、普通の画像ファイルを読むことができ" -"ます。" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s は GNU General Public License の下でライセンスされています。" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "このライセンスの複製は %s から入手できます" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "サポートされていないアーカイブ形式です: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! 展開エラーです: %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! パス \"%s\" でアーカイブを作成できませんでした" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! ファイル %(sourcefile)s を アーカイブファイル %(archivefile)s に追加できま" -"せんでした。中止します..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! %s を読めませんでした" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! ブックマークファイル %s をパースできませんでした" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "ページ %s の現ブックマークを置き換えますか?" -msgstr[1] "ページ %s の現ブックマークを置き換えますか?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"現在の本は既にブックマークされたページに含まれています。それらをページ %d の" -"新規ブックマークで置き換えますか?" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"\"No\" の選択は他のブックマークへの影響なしに、新しいブックマークを作成しま" -"す。" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "ブックマークの編集" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "種類" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "名前" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "ページ" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "位置" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "追加日" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "ブックマークに追加(_B)" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "ブックマークの編集(_E)..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! %(function)r のコールバックに失敗しました: %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "コメント" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "%s を読めませんでした" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"注意:MComix がコメントファイルだと認識するアーカイブファイル内のファイルだけ" -"が、自動的にこのリストに追加されます。" - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "サイズ" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "アーカイブファイルから削除" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "アーカイブファイルを編集" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "インポート(_I)" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "画像" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "コメントファイル" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "新しいアーカイブファイルが保存できませんでした!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "元のファイルは削除されません。" - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "アーカイブファイルは ZIP 形式で保存されます。" - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "画像の調整" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "デフォルトにリセットします。" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "将来のファイルのデフォルトとして選択された値を保存します。" - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "明度(_B):" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "コントラスト(_C):" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "彩度(_A):" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "シャープネス(_H):" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "コントラストを自動調節する(_A)" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "各々のカラーバンド毎にコントラスト(明度と暗度)を自動調節します。" - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "開く" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "保存" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "全てのファイル" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "全てのアーカイブファイル" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s アーカイブファイル" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "全ての画像" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s 画像" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "'%s' という名前のファイルは既に存在します。置き換えますか?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "置き換えると元のファイルの内容が上書きされます。" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "本に追加しました" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "'%s' の中には画像がありません" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "'%s' を開けませんでした。ファイルが存在しません。" - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "'%s' を開けませんでした。パーミッションが許可されていません。" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "%d ページから続けて閲覧していきますか?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"%(date)s 、%(time)s にこのページで閲覧を止めています。もし \"Yes\" を選択すれ" -"ば、閲覧を %(page)d ページで再開します。そうでなければ、最初のページが読み込" -"まれます。" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "設定ファイル \"%s\" は壊れています。消去中です..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "無効なパスです: '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! アイコン \"%s\" を読めませんでした" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "不明なファイル形式です" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "前のページ" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "次のページ" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "別名でページを保存" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "前のページ" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "次のページ" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "前のページ" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "次のページ" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "最初のページ" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "最後のページ" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "ページへ移動..." - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "次のアーカイブファイル" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "前のアーカイブファイル" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "次のディレクトリー" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "前のディレクトリー" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "スクロール" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "スクロールダウン" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "スクロールアップ" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "右にスクロール" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "左にスクロール" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "上にスマートスクロール" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "下にスマートスクロール" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "拡大" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "ズーム(_Z)" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "縮小" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "通常サイズ" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "回転の状態を維持する(_K)" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "回転の状態を維持する(_K)" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "右回りに90度回転(_R)" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "180度回転(_G)" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "左回りに90度回転(_E)" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "左右をフリップ(_P)" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "上下をフリップ(_V)" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "見開き表示" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "モードを表示" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "マンガのページ順に表示" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "反対方向にスマートスクロール" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "拡大レンズ" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "小さな画像を引きのばす" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "ベストフィットモード" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "横幅に合わせる" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "高さに合わせる" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "フィットサイズモード(_S)" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "手動でズームを調整する" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "全画面表示から退出" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "ユーザーインターフェース" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "OSD パネルを表示" - -#: mcomix/mcomix/keybindings.py:114 -#, fuzzy -msgid "Minimize" -msgstr "最小化(_N)" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "全画面表示" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -#, fuzzy -msgid "Show/hide menubar" -msgstr "ファイル数を表示" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "ステータスバー(_A)" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "スクロールバー(_C)" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "サムネイル" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "全て隠す(_I)" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "スライドショーを動かす" - -#: mcomix/mcomix/keybindings.py:125 -#, fuzzy -msgid "Delete" -msgstr "消去(_D)" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "ファイル" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "再読み込み(_F)" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "閉じる(_C)" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "終了(_Q)" - -#: mcomix/mcomix/keybindings.py:129 -#, fuzzy -msgid "Save and quit" -msgstr "保存して終了(_S)" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "別名で保存(_A)" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "アーカイブファイル" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "プロパティー" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "設定" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "ライブラリー" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "ブックマークの編集" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" -"\"%(action)s\" のキーバインディングは他のアクションのホットキーをオーバーライ" -"ドします。" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "! キーバインディング \"%s\" を読めませんでした" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! pysqlite2 もしくは sqlite3 が見つかりませんでした。" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! ファイル \"%s\" を削除できませんでした" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "SLIDESHOW" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "別名でページを保存" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "\"%s\" を消去しますか?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "ファイルはあなたのハードディスクから消去されます。" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "再度聞かない。" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "アーカイブファイルは ZIP 形式で保存されます。" - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "アーカイブファイルは ZIP 形式で保存されます。" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "コメント" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "コメントファイル" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "前のページ(_P)" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "コメント" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "前のディレクトリー" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Tar アーカイブファイル" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "ブックマークの編集" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "移動(_G)" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "キャンセル(_C)" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " of %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "外観" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "挙動" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "表示" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "高度な設定" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "言語(要再起動):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "エスケープキーでプログラムを終了する" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"アクティブなとき、ESC キーで全画面表示モードを無効にする代わりにプログラムを" -"終了します。" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "背景" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "この色を背景に用いる:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "選択された色を常に背景色に用います。" - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "背景色を自動選択する" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "画像に合う背景色を自動選択します。" - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "選択された色を常にサムネイルの背景色に用います。" - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "閲覧している画像のサムネイルの背景に合う色を自動的に用います。" - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "サムネイルの上にページ数を表示する" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "アプリケーションアイコンとしてアーカイブサムネイルを用いる" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"この設定が有効となることにより、本の最初のページが標準アイコンの代わりにアプ" -"リケーションアイコンとして使用されます。" - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "サムネイルのサイズ(ピクセル数):" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "透過度" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "透過画像の背景に格子模様を用いる" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"透過画像の背景にグレーの格子模様を使用します。もし、この項目が設定されていな" -"い場合は、代わりの背景は単色の白色となります。" - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "スマートスクロールを使用する" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"この設定を行うと、スペースキーとマウスホイールは上下へのスクロールを行うだけ" -"ではなく左右にもスクロールするようになり、コミックを読む自然な流れに従おうと" -"します。" - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "スクロールがページの端を越えた時、ページを送る" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "自動的に次のアーカイブファイルを開く" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"アーカイブファイルの最後のページの次に進もうとした時には同じディレクトリー内" -"の次のアーカイブファイルを、或いは最初のページの前に進もうとした時には前の" -"アーカイブファイルを自動的に開きます。" - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "自動的に次のディレクトリーを開く" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "矢印キーを押すごとにスクロールするピクセル数:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "矢印キーを使う際にページ上でスクロールするピクセル数を設定します。" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "マウスホイールを回すごとにスクロールするピクセル数:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"マウスホイールを使う際にページ上でスクロールするピクセル数を設定します。" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "スペースキーを押すごとにスクロールするページの割合 (パーセント):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "見開き表示の時、2ページずつページを送る" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "見開き表示の時、1ページずつではなく、2ページずつ表示を進めます。" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "見開き表示の時、幅が広い画像の時は1枚だけ表示する:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "ファイル" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "起動時に自動で最後に閲覧したファイルを開く" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"MComix が最後に終了した時開いていたファイルを、起動時に自動的に開きます。" - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "最近開いたファイルの情報を保存する:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "デフォルトで全画面表示にする" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "全画面表示時に自動的に全てのツールバーを隠す" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "サイズ固定モード" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "横幅か高さに合わせる" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "このモードで固定されるサイズ:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "スライドショー" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "スライドショーの間隔(秒単位):" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "スライドショーの間隔(ピクセル数):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "スライドショーの間、次のアーカイブファイルを自動的に開く" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" -"スライドショーモードの間、次のアーカイブファイルが自動的に開かれるのを許可し" -"ます。" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "回転" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "メタデータに従い画像を自動的に回転する" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Exif タグのようなメタデータに画像の回転方向が示されている時は、自動的に画像を" -"回転します。" - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "画質" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "スケーリングモード" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "ファイルの順序" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar アーカイブファイル" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "キャッシュに蓄積するページの最大数:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "開いたファイルのサムネイルを保存する" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"開いたファイルのサムネイルを freedesktop.org の規格に従って保存します。これら" -"のサムネイルは、ほとんどのファイルマネージャー等、多くのアプリケーションが共" -"有して使うことができます。" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "キャッシュに蓄積するページの最大数:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"キャッシュするページの最高数を設定します。-1の値はアーカイブ全てをキャッシュ" -"します。" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "拡大レンズ" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "拡大するサイズ(ピクセル数):" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"レンズが拡大する範囲のサイズを設定します。一辺がこのピクセル数の正方形状の範" -"囲が拡大されます。" - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "拡大率:" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "レンズの拡大率を設定します。" - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "コメントファイルの拡張子:" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "画像の調整" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "ダイアログの選択をクリア" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "以前に再度聞かれないようにしたダイアログ選択のすべてをクリアします。" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "自動判別(デフォルト)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "しない" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "タイトルページのみ" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "ワイド画像のみ" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "常に" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "横幅に合わせる" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "高さに合わせる" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "ソートしない" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "ファイル名" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "ファイルサイズ" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "最終修正時" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "昇順" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "降順" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -#, fuzzy -msgid "Natural order" -msgstr "ファイルの順序" - -#: mcomix/mcomix/preferences_dialog.py:495 -#, fuzzy -msgid "Literal order" -msgstr "ファイルの順序" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"MComix が開いた全ファイルの情報を、最近開いたファイルの共有リストに追加しま" -"す。" - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "最近開いたファイルについての情報を消去しますか?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"これは全てのエントリーを \"最近のファイルを開く\" から削除し、最後に閲覧した" -"ページについての情報をクリアします。" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "通常 (高速)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "バイリニア" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "ハイパーボリック (低速)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "普通" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"アーカイブファイルの中にある、これらの拡張子を持つファイルを全てコメントとし" -"て扱います。" - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "アーカイブファイル" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "画像" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d ページ" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d コメント" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "最終アクセス時" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "最終修正時" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "パーミッション" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "所有者" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[オプション...] [パス]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "画像とコミックアーカイブファイルを閲覧します。" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "このヘルプを表示して終了する。" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "スライドショーモードでアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "起動時にライブラリーを表示する。" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "バージョンを表示して終了する。" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "モードを表示" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "全画面モードでアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "漫画のページ順でアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "見開き表示でアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "ズームモード" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "ベストフィットモードでアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "横幅に合わせてアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "高さに合わせてアプリケーションを起動する。" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "デバッグオプション" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "望む出力ログレベルを設定する。" - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" -"インストールされている GTK+ と PyGTK が要求されたバージョンを満たしていませ" -"ん。" - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "PyGTK のどのバージョンもシステムには見つかりませんでした。" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" -"このエラーは恐らく欠損している GTK+ ライブラリーによりひき起こされています。" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "要求された Python Imaging のバージョンを満たしていません" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "ライブラリー (PIL) はインストールされています。" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "インストールされた PIL のバージョン: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "要求されている PIL のバージョン: 1.1.5 かそれ以上" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" -"Python Imaging Library (PIL) のバージョン 1.1.5 かそれ以上が要求されていま" -"す。" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"Python Imaging Library のどのバージョンもシステムには見つかりませんでした。" - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "スライドショーを止める" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "ページ数を表示" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "ファイル数を表示" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "解像度を表示" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "パスを表示" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "ファイル名を表示" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "ファイル名を表示" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP アーカイブファイル" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR アーカイブファイル" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar アーカイブファイル" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Gzip 圧縮されたアーカイブファイル" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Bzip2 圧縮されたアーカイブファイル" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Gzip 圧縮されたアーカイブファイル" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z アーカイブファイル" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA アーカイブファイル" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "原案/Comix の開発者" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "MComix の開発者" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "簡体字中国語への翻訳" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "スペイン語への翻訳" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "(ブラジル)ポルトガル語への翻訳" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "ドイツ語への翻訳と Nautilus のサムネイル作成" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "ドイツ語への翻訳" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "イタリア語への翻訳" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "オランダ語への翻訳" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "フランス語への翻訳" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "ポーランド語への翻訳" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "ポーランド語への翻訳" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "ギリシア語への翻訳" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "カタロニア語への翻訳" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "繁体字中国語への翻訳" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "日本語への翻訳" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "ハンガリー語への翻訳" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "ロシア語への翻訳" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "クロアチア語への翻訳" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "朝鮮語への翻訳" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "ペルシア語への翻訳" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "インドネシア語への翻訳" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "チェコ語への翻訳" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "ウクライナ語への翻訳" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "ガリシア語への翻訳" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "スウェーデン語への翻訳" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "ヘブライ語への翻訳" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "イタリア語への翻訳" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "アイコンのデザイン" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! サムネイル \"%(thumbpath)s\" を保存できませんでした: %(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "コピー(_C)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "現在のページをクリップボードにコピーしました。" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "消去(_D)" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "ディスクから現在のファイルを消去します。" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "次のページ(_N)" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "前のページ(_P)" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "最初のページ(_F)" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "最後のページ(_L)" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "ページへ移動(_G)..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "ページへ移動..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "再読み込み(_F)" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" -"現在開かれているファイル、もしくはアーカイブファイルを再読み込みします。" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "次のアーカイブファイル(_A)" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "前のアーカイブファイル(_R)" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "拡大(_I)" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "縮小(_O)" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "通常サイズ(_N)" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "最小化(_N)" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "閉じる(_C)" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "全ての開かれているファイルを閉じます。" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "終了(_Q)" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "保存して終了(_S)" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" -"次回プログラムを起動した際、現在開かれているファイルを復元するようにしてから" -"終了します。" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "右回りに90度回転(_R)" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "180度回転(_G)" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "左回りに90度回転(_E)" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "左右をフリップ(_P)" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "上下をフリップ(_V)" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "別名で保存(_A)" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "ズーム(_Z)" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "最近のファイルを開く(_R)" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "ブックマーク(_B)" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "ツールバー(_O)" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "編集(_E)" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "開く(_O)" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "ファイル(_F)" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "表示(_V)" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "ツール(_T)" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "ヘルプ(_H)" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "画像の回転(_T)" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "全画面表示(_F)" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "全画面モード" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "見開き表示(_D)" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "ツールバー(_T)" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "メニューバー(_M)" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "ステータスバー(_A)" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "スクロールバー(_C)" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "サムネイル(_U)" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "全て隠す(_I)" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "マンガのページ順に表示(_M)" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "スマートスクロールの方向を反対にします。" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "回転の状態を維持する(_K)" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "現在選択された回転状態を次ページ以降も維持します。" - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "スライドショーを動かす(_S)" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "拡大レンズ(_L)" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "ズームモードに応じてスクリーンに適応するように画像を引きのばします。" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "ベストフィットモード(_B)" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "横幅に合わせる(_W)" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "高さに合わせる(_H)" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "フィットサイズモード(_S)" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "手動でズームを調整する(_A)" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "MComix について(_A)" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "コメント(_M)..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "プロパティー(_T)" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "設定(_E)" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "アーカイブファイルを編集(_E)" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "アーカイブファイルエディターを開きます。" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "開く(_O)" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "画像の調整(_H)" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "ライブラリー(_L)..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! %(function)r のコールバックに失敗しました: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "アーカイブファイルはパスワードで保護されています。" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"%(filename)s の展開サイズは %(actual_size)d バイトですが、%(expected_size)d " -"バイトであるべきです。アーカイブは壊れているか、サポートされていないフォー" -"マットかも知れません。" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "本を追加中" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "本を追加しました:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "'%s' を追加中..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! #%i は存在しない本です" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! 書籍 \"%s\" のカバーを取得できませんでした" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! ライブラリーに \"%s\" を追加できませんでした" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "コレクション \"%s\" を追加できませんでした" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "書籍 %(book)s を コレクション %(collection)s に追加できませんでした" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! コレクションを \"%s\" へ名称変更できませんでした" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(コピー)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "ライブラリーデータベースのバージョンが特定できませんでした!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" -"ライブラリーデータベースのバージョンを %(from)d から %(to)d へアップグレード" -"しています。" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "最近のファイルを開く" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "全ての本" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "ライブラリーの本" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "開く(_O)" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "閲覧のために選択された本を開きます。" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "ライブラリーを閉じずに開く(_W)" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "ライブラリーウィンドウを維持したまま、選択された本を開きます。" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "追加(_A)..." - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "ライブラリーに本を追加します。" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "このコレクションから削除(_C)" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "現在のコレクションから選択された本を削除します。" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "ライブラリーから削除(_L)" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "ライブラリーから選択された本を完全に削除します。" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "削除してディスクから消去(_R)" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "選択された本をディスクから消去します。" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "選択された本のパスをクリップボードにコピーします。" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "ソート(_S)" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "ライブラリーのソート順を変更します。" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "カバーサイズ(_Z)" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "本のカバーサイズを変更します。" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "本の名前" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "フルパス" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "日付追加" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "巨大" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "大" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "小" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "極小" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "カスタム..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "ライブラリーのカバーサイズを指定" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "%(num)d 個の本が '%(collection)s' から削除されました。" -msgstr[1] "%(num)d 個の本が '%(collection)s' から削除されました。" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "%d 個の本がライブラリーから削除されました。" -msgstr[1] "%d 個の本がライブラリーから削除されました。" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "ライブラリーから本を削除しますか?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"選択された本はライブラリーから削除され、永久に消去されます。よろしいですか?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "ライブラリーコレクション" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "新規" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "新たな空コレクションを追加します。" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "名称変更(_N)" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "選択されたコレクションの名称を変更します。" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "複製(_D)" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "選択されたコレクションの複製を作成します。" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "クリーンアップ(_C)" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "コレクションから存在しない本を削除します。" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "削除(_R)" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "選択されたコレクションを消去します。" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "新規コレクションを追加しますか?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "新規コレクションの名称を入力してください。" - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "'%s' という新規コレクションを追加できませんでした。" - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "その名前のコレクションは既に存在します。" - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "コレクションの名前を変更しますか?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "選択されたコレクションの新しい名前を入力してください。" - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "'%s' へ名称変更できませんでした。" - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "コレクションを複製できませんでした。" - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "ルート" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"コレクション '%(subcollection)s' をコレクション '%(supercollection)s' の中に" -"入れます。" - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "本を '%s' に加えます。" - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"本をコレクション '%(source collection)s' から '%(destination collection)s' に" -"移動します。" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "検索(_S):" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"フルパス名に次の文字列が含まれている本のみを表示します。検索では大文字小文字" -"を区別しません。" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "ウォッチリスト(_W)" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "ウォッチリスト管理ダイアログを開きます。" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "開く(_O)" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "選択された本を開きます。" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "%(date)s 、%(time)s に閲覧終了" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "新しい本を検索中..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" -"新しい本 '%(bookname)s' が ディレクトリー '%(directory)s' から追加されまし" -"た。" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" -"%(count)d 個の新しい本が ディレクトリー '%(directory)s' から追加されました。" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "ディレクトリー '%s' に新しい本はありません。" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! ライブラリーを使用するためには sqlite ラッパーが必要です。" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "ライブラリーウォッチリスト" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "直ちにスキャン(_S)" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "ディレクトリー" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "コレクション" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "サブディレクトリー含む" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "追加(_A)" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "ライブラリーが開かれているとき自動的に新しい本をスキャン(_O)" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "インストールされた GTK+ のバージョン: %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "要求された GTK+ のバージョン: 2.12.0 か それ以上\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "インストールされた PyGTK のバージョン: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "要求された PyGTK のバージョン: 2.12.0 か それ以上" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "前のディレクトリー" - -#~ msgid "ZIP archives" -#~ msgstr "ZIP アーカイブファイル" - -#~ msgid "Tar archives" -#~ msgstr "Tar アーカイブファイル" - -#~ msgid "RAR archives" -#~ msgstr "RAR アーカイブファイル" - -#~ msgid "LHA archives" -#~ msgstr "LHA アーカイブファイル" - -#~ msgid "JPEG images" -#~ msgstr "JPEG 画像" - -#~ msgid "PNG images" -#~ msgstr "PNG 画像" - -#~ msgid "GIF images" -#~ msgstr "GIF 画像" - -#~ msgid "TIFF images" -#~ msgstr "TIFF 画像" - -#~ msgid "BMP images" -#~ msgstr "BMP 画像" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "'%s' を開けませんでした。不明なファイル形式です。" - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "この色をサムネイルの背景に用いる:" - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "" -#~ "\"%(command)s\" はあなたのシステム上でみつけられる PATH になくてはなりませ" -#~ "ん。" - -#~ msgid "Please enter the password to continue:" -#~ msgstr "続行するにはパスワードを入力してください:" - -#~ msgid "Cache" -#~ msgstr "キャッシュ" - -#~ msgid "Toggle fullscreen" -#~ msgstr "全画面表示に切り替え" - -#~ msgid "Add to this collection:" -#~ msgstr "このコレクションに追加:" - -#~ msgid "Reading" -#~ msgstr "閲覧" - -#~ msgid "User Interface" -#~ msgstr "ユーザーインターフェース" - -#, fuzzy -#~ msgid "File path" -#~ msgstr "フルパス" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "次のディレクトリー" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "次のディレクトリー" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "アーカイブファイルは ZIP 形式で保存されます。" - -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "アーカイブファイル" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "アーカイブファイル" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "アーカイブファイル" - -#, fuzzy -#~ msgid "Literal quote" -#~ msgstr "ファイルの順序" - -#, fuzzy -#~ msgid "Literal % character" -#~ msgstr "ファイルの順序" - -#, fuzzy -#~ msgid "Directory name" -#~ msgstr "ディレクトリー" - -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "前のアーカイブファイル" - -#~ msgid "Order files by:" -#~ msgstr "ファイルの順序:" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ko/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/ko/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ko/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/ko/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2461 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2018-05-10 22:46+0900\n" -"Last-Translator: Minho Jeung \n" -"Language-Team: \n" -"Language: ko_KR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-SourceCharset: utf-8\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.4\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s는 만화책 전문 이미지 뷰어입니다." - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "ZIP, RAR, tar 압축파일 등과 일반 이미지 파일을 읽습니다." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s는 GNU General Public License를 따릅니다." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "라이센스의 전문은 %s 에서 볼 수 있습니다" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "지원하지 않는 압축 형식: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! 압축 해제 에러: %s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! 다음 경로에 압축파일을 생성할 수 없습니다: \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! 파일 %(sourcefile)s을(를) %(archivefile)s에 추가할 수 없습니다. 취소하는 " -"중..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! %s을(를) 읽을 수 없습니다" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! 책갈피 파일 %s를 해석할 수 없습니다" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "페이지 %s에 이미 존재하는 책갈피를 교체하시겠습니까?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"이 책에는 이미 책갈피가 있습니다. 페이지 %d 를 새 책갈피로 설정하시겠습니까? " - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"\"아니요\"를 선택하면 다른 책갈피에 영향을 주지 않고 새 책갈피를 생성합니다." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "책갈피 편집" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "유형" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "이름" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "페이지" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "위치" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "추가된 날짜" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "책갈피 추가(_B)" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "책갈피 편집...(_E)" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! 콜백 %(function)r 실패: %(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "주석" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "%s을(를) 읽을 수 없습니다" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"참고: 압축파일 내 MComix가 주석으로 인식한 파일만 \n" -"이 목록에 자동으로 추가합니다." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "크기" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "압축파일에서 제거" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "압축파일 편집" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "가져오기(_I)" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "이미지" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "주석 파일" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "새 압축파일을 저장할 수 없습니다!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "원본 파일이 제거되지 않았습니다." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "ZIP 압축파일로 저장되어 있습니다." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "이미지 보정" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "기본값으로 리셋." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "앞으로를 위해 선택한 값을 기본값으로 저장." - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "명도:" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "대비:" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "채도:" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "선명도:" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "자동으로 명암 조정(_A)" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "각 색 대역마다 따로 자동으로 명암 대비를 조정합니다." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "열기" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "저장" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "모든 파일" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "모든 압축파일" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "%s archives" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "모든 이미지" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "%s images" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "'%s' 파일이 이미 있습니다. 덮어씌우시겠습니까?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "내용을 덮어씁니다." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "책 추가" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "다음 디렉토리에 파일이 없습니다: '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "%s을(를) 열 수 없습니다.: 파일이 존재하지 않습니다." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "%s을(를) 열 수 없습니다.: 접근 권한이 거부되었습니다." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "%d 페이지부터 계속해서 읽으시겠습니까?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"%(date)s, %(time)s에 여기까지 읽으셨습니다. \n" -"\"네\"를 선택하면 %(page)d 페이지로 돌아갑니다. \n" -"아니면 첫 페이지를 불러옵니다." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! 환경설정 파일 \"%s\"이(가) 손상되었습니다. 삭제하는중..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "유효하지 않은 경로: '%s'" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! 다음 아이콘을 불러올 수 없습니다: \"%s\"" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "알 수 없는 파일 형식" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "이전 페이지" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "내비게이션" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "다음 페이지" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "10 페이지 이전으로" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "10 페이지 다음으로" - -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "이전 페이지 (계속해서)" - -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "다음 페이지 (계속해서)" - -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "이전 페이지 (한장씩)" - -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "다음 페이지(한장씩)" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "처음 페이지" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "마지막 페이지" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "특정 페이지 바로가기" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "다음 압축파일" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "이전 압축파일" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "다음 디렉토리" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "이전 디렉토리" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "왼쪽 아래로 스크롤" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "스크롤" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "가운데 아래로 스크롤" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "오른쪽 아래로 스크롤" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "왼쪽 가운데로 스크롤" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "가운데로 스크롤" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "오른쪽 가운데로 스크롤" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "왼쪽 위로 스크롤" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "가운데 위로 스크롤" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "오른쪽 위로 스크롤" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "아래로 스크롤" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "위로 스크롤" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "오른쪽으로 스크롤" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "왼쪽으로 스크롤" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "위로 스마트 스크롤" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "아래로 스마트 스크롤" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "확대" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "확대/축소" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "축소" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "원래 크기" - -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "회전 상태 유지" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "이미지 변형" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "시계방향 90도 회전" - -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "180도 회전" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "반시계방향 90도 회전" - -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "좌우 뒤집기" - -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "상하 뒤집기" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "자동 회전 하지 않음" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "가로 길이에 따라 자동 회전" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "세로 길이에 따라 자동 회전" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "단면/양면 보기" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "보기 모드" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "일본만화 페이지순 보기" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "스마트 스크롤 방향 뒤집기" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "돋보기" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "작은 이미지 늘려서 표시" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "최적 맞춤" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "가로길이 맞춤" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "세로길이 맞춤" - -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "원본 크기 보기" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "수동 확대/축소 조절" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "전체화면에서 나가기" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "사용자 인터페이스" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "OSD 패널 보이기" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "최소화" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "전체화면" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "도구 막대 보이기/숨기기" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "메뉴 막대 보이기/숨기기" - -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "상태 막대 보이기/숨기기" - -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "스크롤 막대 보이기/숨기기" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "썸네일(미리보기)" - -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "모두 보이기/숨기기" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "슬라이드쇼 시작" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "삭제" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "파일" - -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "새로 고침" - -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "닫기" - -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "종료" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "저장하고 종료" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "다른 이름으로 저장" - -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "압축파일 주석" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "등록정보" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "환경설정" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "라이브러리" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "외부 명령 실행" - -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "외부 명령" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "\"%(action)s\"에 할당한 키는 다른 동작의 단축키보다 우선 동작합니다." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "키 설정을 불러오지 못했습니다.: %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "키 %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! pysqlite2, sqlite3 둘 중 어느 것도 찾을 수 없습니다." - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! 다음 파일을 제거할 수 없습니다: \"%s\"" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "슬라이드쇼" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "페이지를 다른 이름으로 저장" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "\"%s\"을(를) 삭제합니까?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "파일이 하드디스크에서 삭제됩니다." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "더 이상 묻지 않음." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "'%s' 는 압축 파일에 대해 비활성화됩니다." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "명령 %(cmdlabel)s 을 실행하지 못했습니다: %(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "명령행이 비어 있습니다." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "불완전한 이스케이프 시퀀스. '%' 대신 '%%' 를 사용하십시오." - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "불완전한 인용 시퀀스. '\"' 대신 '%\"' 를 사용하십시오." - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "File-related variables can only be used for files." - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "Archive-related variables can only be used for archives." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "적합하지 않은 이스케이프 시퀀스: %%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "외부 명령어 편집" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "구분자 추가(_s)" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "명령어 실행" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "이것은 구분자 의사 명령어입니다." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "\"%s\" 는 적절한 작업 디렉토리가 아닙니다." - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "\"%s\" 는 적절한 실행 파일이 아닙니다." - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "명령어 라벨" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "미리보기:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"변수 목록과 그 외 정보는 external command documentation를 참조하십시오." - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "라벨" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "명령어" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "작업 디렉토리" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "압축 파일 안에서 비활성화" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "변경점을 명령어 목록에 저장하시겠습니까?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"편집한 외부 명령어 목록이 저장되지 않았습니다. \"예\" 를 누르면 저장하고 \"아" -"니오\" 를 누르면 버립니다." - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "명령 편집(_E)" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "바로가기(_G)" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "취소(_C)" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " %s 의" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "보기" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "일반" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "표시" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "고급" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "바로가기" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "언어(재시작 필요):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "ESC 키로 프로그램 종료" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"체크할 경우 ESC 키를 누르면 프로그램을 종료합니다. \n" -"체크 해제 시는 풀스크린 모드 종료 기능입니다." - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "배경색" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "배경색:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "이 색을 항상 배경색으로 사용합니다." - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "배경색을 자동으로 선택" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "자동으로 이미지에 맞는 배경색을 선택." - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "이 색을 항상 미리보기 배경색으로 사용합니다." - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "자동으로 미리보기에 맞는 배경색을 선택." - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "미리보기 페이지 번호 보기" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "압축 파일 미리보기를 애플리케이션 아이콘으로 사용" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"체크하면 책의 첫 페이지가 기본 아이콘 대신 \n" -"애플리케이션 아이콘으로 사용됩니다." - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "미리보기 크기(픽셀)" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "투명도" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "투명한 이미지에 체크무늬 이미지를 사용" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"투명한 이미지에 회색 체크무늬 이미지를 배경으로 사용합니다. \n" -"설정되지 않을 경우 흰색을 배경으로 사용합니다." - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "스마트 스크롤링 사용" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"체크할 경우 스페이스바나 마우스휠이 \n" -"이미지의 옆면도 스크롤해 보여줍니다.\n" -"이미지 가로길이가 화면보다 클 경우에만 동작합니다." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "페이지의 가장자리에서 스크롤 할 때 페이지 넘기기" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "마우스 스크롤이나 방향키를 이용해서 페이지를 전환할 수 있습니다." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "자동으로 다음 압축파일 열기" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"압축 파일의 처음과 끝에서 이전/다음으로 페이지를 넘기면\n" -"이전/다음 압축파일을 불러옵니다.\n" -"같은 디렉토리 안에만 적용됩니다." - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "자동으로 다음 디렉토리 열기" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"압축 파일의 처음과 끝에서 이전/다음으로 페이지를 넘기면\n" -"이전/다음 압축파일을 불러옵니다.\n" -"형제 디렉토리에 적용됩니다." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "화살표키로 스크롤 할 픽셀 수:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" -"화살표키를 사용할 때 페이지에서 스크롤 할 픽셀 수를 설정하세요.\n" -"'마우스휠이나 키보드 방향키로 페이지 넘기기' 옵션이 꺼져 있고,\n" -"원래 크기로 보기 혹은 수동 줌 조절일 경우에만 동작합니다." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "마우스휠로 스크롤 할 픽셀 수:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"마우스휠을 사용할 때 페이지에서 스크롤 할 픽셀 수를 설정하세요. \n" -"'마우스휠이나 키보드 방향키로 페이지 넘기기' 옵션이 꺼져 있고,'\n" -"원래 크기로 보기 혹은 수동 줌 조절일 경우에만 동작합니다." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "스페이스 키로 스크롤 할 부분 (퍼센트)" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "스페이스 키를 눌렀을 때 스크롤 될 정도를 설정합니다." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "페이지 넘김 민감도:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"페이지 넘김 민감도를 설정합니다. \n" -"낮은 값을 설정할 경우 페이지가 \n" -"예기치 않게 전환될 수도 있습니다." - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "양면 보기 모드일때 페이지를 2장씩 넘기기" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "양면 보기 모드일 경우 페이지를 한 번에 2장씩 넘깁니다." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "양면 보기 모드에서 융통성 있게 1페이지만 보기:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "파일" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "프로그램 시작 시 마지막에 열었던 파일을 자동으로 열기" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "MComix로 열었던 마지막 파일을 자동으로 열어봅니다." - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "최근 파일 정보 표시:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "전체화면을 기본으로 사용" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "전체화면 상태에서 도구모음 숨김" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "원본 크기 보기" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "이미지 맞춤 기준:" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "가로길이:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "슬라이드쇼" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "슬라이드쇼 지연시간(초)" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "슬라이드쇼 단계(픽셀)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"슬라이드쇼 모드일 때 스크롤 할 픽셀 수를 지정하세요. \n" -"양수값은 앞으로, 음수값은 뒤로 스크롤합니다. \n" -"0은 항상 새 페이지로 넘깁니다." - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "슬라이드쇼 중 자동으로 다음 압축파일 열기" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "슬라이드 쇼 모드일때 다음 압축파일을 자동으로 엽니다." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "이미지 회전" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "이미지를 메타데이터에 따라 자동으로 회전" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"이미지를 Exif 태그 등 메타데이터에 따라 \n" -"자동으로 회전시킵니다." - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "이미지 품질" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "스케일링 모드" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "파일 순서" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "파일과 디렉토리를 다음에 따라 정렬:" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "압축파일 정렬방식:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "압축 해제와 캐시" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "압축 해제 시 사용할 최대 스레드 수:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "이미지 포맷 시 사용할 최대 스레드 수를 설정하세요." - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "열어본 파일의 미리보기를 보관" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"열었던 파일의 썸네일(미리보기)을 freedesktop.org 사양에 따라 \n" -"보관합니다. 이 썸네일은 파일 매니저 등 여러 프로그램과 공유됩니다." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "캐시에 저장할 최대 페이지 수:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "캐시할 페이지 수 지정. -1로 설정하면 압축파일 전체를 캐시합니다." - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "돋보기" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "돋보기 크기(픽셀)" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "돋보기의 크기를 설정합니다." - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "배율:" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "돋보기의 배율을 설정합니다." - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "주석 확장자:" - -#: mcomix/mcomix/preferences_dialog.py:299 -msgid "Animated images" -msgstr "애니메이션 이미지" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "애니메이션 모드:" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "키 리셋(_R)" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "모든 키보드 단축키를 기본값으로 리셋." - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "변경 취소" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "다이얼로그에서 선택한 것을 모두 취소합니다. 다시 묻지 않습니다." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "자동 감지(디폴트)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "하지 않음" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "타이틀 페이지만" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "가로길이가 넓은 이미지만" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "항상" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"압축 파일의 첫 페이지를 보여줄 때, \n" -"혹은 이미지의 가로길이가 세로길이보다 길 경우 \n" -"한 페이지만 출력하도록 하는 옵션입니다.\n" -"주의: '항상'을 선택한 경우 첫 페이지 혹은 가로길이가 \n" -"세로길이보다 긴 이미지만 한 페이지로 출력합니다. \n" -"항상 한 페이지만 출력하는 옵션이 아닙니다." - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "가로길이 맞춤" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "세로길이 맞춤" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "정렬하지 않음" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "파일명" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "파일 크기" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "수정한 날짜" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "오름차순" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "내림차순" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"파일은 여기서 지정한 순서로 열립니다. \n" -"이 옵션은 압축 파일 자체의 순서에는 영향을 주지 않습니다." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "자연 순서" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "기본 순서" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"압축 파일 안의 파일은 여기서 명시한 순서에 따라 정렬됩니다. \n" -"자연 순서는 1, 2, 3, 23 순으로,\n" -"기본 순서는 1, 2, 23, 3 순으로 정렬됩니다." - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "메뉴의 [파일 - 최근 파일]에 MComix로 열었던 파일 정보를 추가합니다." - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "최근 연 파일 정보를 삭제하시겠습니까?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"\"최근 파일\" 메뉴의 모든 항목을 제거합니다. 그리고 이전에 읽은 페이지 정보" -"를 지웁니다." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "노멀(빠름)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "바이리니어" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "하이퍼볼릭(느림)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"이미지 확대 방법을 변경합니다. \n" -"느린 알고리즘은 좋은 이미지 품질을 보장하지만 시간이 오래 걸립니다." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "노멀" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "애니메이션 이미지가 어떻게 출력될지 결정합니다." - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "목록중에 이와 같은 확장자 형식을 가진 파일을 주석으로 인식합니다." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "압축파일" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "이미지" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d 페이지" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d 주석" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "마지막 접근" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "마지막 수정" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "권한" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "소유자" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[OPTION...] [PATH]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "이미지와 책 압축 파일을 봅니다." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "도움말을 보고, 종료합니다." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "이 프로그램을 슬라이드쇼 모드로 시작합니다." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "시작할 때 라이브러리를 봅니다." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "버전 넘버를 보고, 종료합니다." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "보기 모드" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "풀스크린 모드로 프로그램을 시작합니다." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "망가 모드로 프로그램을 시작합니다." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "두 페이지 보기 모드로 프로그램을 시작합니다." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "확대/축소" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "확대/축소 최적맞춤으로 앱을 시작합니다." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "확대/축소 가로맞춤으로 앱을 시작합니다." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "확대/축소 세로맞춤으로 앱을 시작합니다." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "디버그 옵션" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "로그 출력 수준을 설정합니다." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "적절한 GTK+ 및 PyGTK 버전이 설치되어 있지 않습니다." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "어떤 버전의 PyGTK도 시스템에서 찾지 못했습니다." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "이 에러는 GTK+ 라이브러리가 없어 발생한 것일 수 있습니다." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "적절한 버전의 파이썬 이미징(Python Imaging)이 없습니다" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "라이브러리(PIL) 설치됨." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "설치된 PIL 버전: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "필요한 PIL 버전: 1.1.5 이상" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "파이썬 이미징 라이브러리(PIL) 1.1.5 이상이 필요합니다." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" -"어떤 버전의 파이썬 이미지 라이브러리(PIL)도 시스템에서 찾지 못했습니다." - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "슬라이드쇼" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "페이지 번호 보기" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "파일 번호 보기" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "해상도 보기" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "경로 보기" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "파일명 보기" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "파일용량 보기" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP 압축파일" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR 압축파일" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar압축파일" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Gzip으로 된 Tar압축파일" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Bzip2으로 된 Tar압축파일" - -#: mcomix/mcomix/strings.py:14 -msgid "XZ compressed tar archive" -msgstr "XZ으로 된 Tar압축파일" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "PDF 문서" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z 압축파일" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA 압축파일" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "오리지널 버전/Comix 개발자" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "MComix 개발자" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "간체 중국어 번역" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "스페인어 번역" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "포르투갈어(브라질) 번역" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "독일어 번역, Nautilus의 미리보기 기능 제작" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "독일어 번역" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "이탈리아어 번역" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "네덜란드어 번역" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "프랑스어 번역" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "폴란드어 번역" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "폴란드어 번역" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "그리스어 번역" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "카탈로니아어 번역" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "정체 중국어 번역" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "일본어 번역" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "헝가리어 번역" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "러시아어 번역" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "크로아티아어 번역" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "한국어 번역" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "페르시아어 번역" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "인도네시아어 번역" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "체코어 번역" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "우크라이나어 번역" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "갈리시아어 번역" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "스웨덴어 번역" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "히브리어 번역" - -#: mcomix/mcomix/strings.py:68 -msgid "Lithuanian translation" -msgstr "리투아니아어 번역" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "아이콘 디자인" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! 섬네일 저장 실패 \"%(thumbpath)s\": %(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "복사(_C)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "현재 페이지를 클립보드에 복사." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "삭제(_D)" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "현재 파일 또는 압축파일을 디스크에서 삭제." - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "다음 페이지(_N)" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "이전 페이지(_P)" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "처음 페이지(_F)" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "마지막 페이지(_L)" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "특정 페이지 바로가기...(_G)" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "페이지 바로가기..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "새로고침(_f)" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "현재 파일 또는 압축파일 다시 읽기." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "다음 압축파일(_a)" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "이전 압축파일(_r)" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "확대(_I)" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "축소(_O)" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "원래 크기(_N)" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "최소화(_n)" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "닫기(_C)" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "열린 파일 모두 닫기." - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "종료(_Q)" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "저장하고 종료(_S)" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "종료하고 다음 시작 시 현재 열린 파일 다시 열기." - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "우측으로 90도 회전(_R)" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "180도 회전(_G)" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "좌측으로 90도 회전(_E)" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "좌우 뒤집기(_P)" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "상하 뒤집기(_V)" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "다른 이름으로 저장(_A)" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "확대/축소(_Z)" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "최근 파일(_R)" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "북마크(_B)" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "도구(_O)" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "편집(_E)" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "추가기능(_w)" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "파일(_F)" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "보기(_V)" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "도구(_T)" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "도움말(_H)" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "이미지 변형(_T)" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "이미지 자동 회전(_A)" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "...가로가 세로보다 길 경우" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "...세로가 가로보다 길 경우" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "전체화면(_F)" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "풀스크린 모드" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "단면/양면 보기(_D)" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "도구(_T)" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "메뉴바(_M)" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "상태바(_A)" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "스크롤바(_C)" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "미리보기(_U)" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "모두 숨김(_I)" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "일본만화 페이지순 보기(_M)" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "스마트 스크롤 방향 역전." - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "회전 상태 유지(_K)" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "현재 선택된 회전 설정을 다음 페이지에도 적용." - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "슬라이드쇼 실행(_S)" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "돋보기(_l)" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "확대/축소 설정에 따라 화면에 맞도록 이미지를 늘리기." - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "최적 맞춤(_B)" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "가로길이 맞춤(_W)" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "세로길이 맞춤(_H)" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "원본 크기 보기(_s)" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "수동 확대/축소 조절(_A)" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "MComix에 대하여(_A)" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "주석...(_m)" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "등록정보(_t)" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "설정(_e)" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "압축파일 편집(_E)" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "압축 파일 편집기를 엽니다." - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "열기(_O)" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "이미지 보정..." - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "라이브러리(_L)" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! 콜백 %(function)r 실패: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "이 압축 파일은 암호로 보호되어 있습니다:" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"파일 %(filename)s의 압축 해제된 크기는 %(actual_size)d 바이트입니다. 그러나 " -"원래는 \n" -"%(expected_size)d 바이트여야 합니다. 이 압축 파일은 손상되었거나 지원되지 않" -"는 파일 형식입니다." - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "책 추가" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "책 추가:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "추가 '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! 존재하지 않는 책: #%i" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! 다음 책의 커버 이미지를 얻지 못했습니다: \"%s\"" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! 책 \"%s\" 을 라이브러리에 추가하지 못했습니다" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! 모음집을 추가하지 못했습니다: \"%s\"" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "! 책 %(book)s 을 모음집 %(collection)s 에 추가하지 못했습니다" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! 모음집 이름을 다음으로 변경하지 못했습니다: \"%s\"" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Copy)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "라이브러리 데이터베이스 버전을 특정할 수 없습니다!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "라이브러리 버전을 %(from)d 에서 %(to)d 으로 업그레이드합니다." - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "최근 파일" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "모든 책" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "라이브러리 북" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "열기(_O)" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "선택된 책들을 보기 위해 엽니다." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "라이브러리를 닫지 않고 엽니다(_w)" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" -"선택된 책들을 보기 위해 엽니다. 그러나 라이브러리 윈도우는 연 채로 둡니다." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "추가(_A)" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "라이브러리에 더 많은 책 추가." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "모음집에서 제거(_c)" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "선택된 책들을 현재 모음집에서 제거합니다." - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "라이브러리에서 제거" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "선택된 책들을 라이브러리에서 완전히 제거합니다." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "제거하고 디스크에서 삭제" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "선택된 책들을 디스크에서 삭제." - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "선택한 책 열기." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "정렬(_S)" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "라이브러리 정렬 순서 변경." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "커버 사이즈(_z)" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "북커버 사이즈 변경." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "책 이름" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "전체 경로" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "추가된 날짜" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "초대형" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "대형" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "소형" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "최소" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "고유설정..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "라이브러리 커버 사이즈 설정" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "'%(collection)s' 에서 %(num)d 책 제거." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "%d 권의 책을 라이브러리에서 제거했습니다." - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "라이브러리에서 책을 제거하시겠습니까?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"선택한 책은 라이브러리에서 (원본 파일은 보존) 제거됩니다. 계속하시겠습니까?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "라이브러리 모음집" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "새로" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "비어있는 새 모음집 추가." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "이름 변경(_n)" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "선택된 모음집 이름 변경." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "복제" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "선택된 모음집의 복제본을 만듭니다." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "정리(_C)" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "더 이상 존재하지 않는 책을 모음집에서 제거합니다." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "제거(_R)" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "선택된 모음집 제거." - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "새 모음집을 추가합니까?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "새 모음집의 이름을 입력해주세요." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "새 모음집을 추가하지 못했습니다: '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "같은 이름의 모음집이 존재합니다." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "모음집 이름을 변경하시겠습니까?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "선택된 모음집에 대한 새 이름을 입력하세요." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "이름을 변경하지 못했습니다. '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "모음집을 복제하지 못했습니다." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "관리자" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "'%(subcollection)s' 모음집을 '%(supercollection)s' 모음집에 넣기." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "책 추가 '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"'%(source collection)s' 에서 '%(destination collection)s' 으로 책 이동." - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "검색:(_S)" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"전체 경로에 지정된 문자열이 책을 표시합니다. 검색은 대소문자를 구분하지 않습" -"니다." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "와치 리스트(_W)" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "와치 리스트 관리 창을 엽니다." - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "추가기능(_w)" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "선택한 책 열기." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "%(date)s, %(time)s 에 읽기를 마쳤습니다" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "새 책 검색..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "새 책 '%(bookname)s'을 디렉토리 '%(directory)s'에서 추가했습니다." - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "새 책 %(count)d 권을 디렉토리 '%(directory)s'에서 추가했습니다." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "디렉토리 '%s'에서 새 책을 찾지 못했습니다." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "라이브러리를 사용하려면 sqlite 래퍼가 필요합니다." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "라이브러리 와치 리스트" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "지금 검색(_S)" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "디렉토리" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "새 모음집" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "하위 디렉토리 포함" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "추가" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "새 책을 모음집에 자동으로 추가(_o)" - -#~ msgid "Don't update fontconfig cache at startup." -#~ msgstr "시작할 때 폰트 캐시를 업데이트하지 않습니다." - -#~ msgid "Update fontconfig cache at startup." -#~ msgstr "시작할 때 폰트 캐시를 업데이트합니다." - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "설치된 GTK+ 버전: %s" - -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "필요한 GTK+ 버전: 2.12.0 이상" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "설치된 PyGTK 버전: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "필요한 PyGTK 버전: 2.12.0 이상" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/lt/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/lt/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/lt/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/lt/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2365 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the MComix package. -# Zygimantus , 2016. -# -msgid "" -msgstr "" -"Project-Id-Version: MComix 1.2.1\n" -"Report-Msgid-Bugs-To: https://sourceforge.net/projects/mcomix/\n" -"POT-Creation-Date: 2017-03-10 21:04+0100\n" -"PO-Revision-Date: 2016-09-18 15:30+0300\n" -"Last-Translator: Zygimantus \n" -"Language-Team: \n" -"Language: lt_LT\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" -"%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 1.8.9\n" - -#: mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" - -#: mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/archive_extractor.py:188 mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/archive_packer.py:72 mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/bookmark_backend.py:148 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/bookmark_backend.py:209 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: mcomix/bookmark_backend.py:214 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/bookmark_backend.py:217 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Tipas" - -#: mcomix/bookmark_dialog.py:51 mcomix/edit_comment_area.py:31 -#: mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Pavadinimas" - -#: mcomix/bookmark_dialog.py:52 mcomix/main.py:1067 -#: mcomix/library/control_area.py:136 -msgid "Page" -msgstr "Puslapis" - -#: mcomix/bookmark_dialog.py:53 mcomix/properties_dialog.py:112 -msgid "Location" -msgstr "Vieta" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/comment_dialog.py:11 mcomix/preferences_dialog.py:295 -msgid "Comments" -msgstr "" - -#: mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "" - -#: mcomix/edit_comment_area.py:18 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" - -#: mcomix/edit_comment_area.py:35 mcomix/properties_dialog.py:128 -msgid "Size" -msgstr "Dydis" - -#: mcomix/edit_comment_area.py:52 mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Pašalinti iš archyvo" - -#: mcomix/edit_dialog.py:28 mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Keisti archyvą" - -#: mcomix/edit_dialog.py:40 -msgid "_Import" -msgstr "Importuoti" - -#: mcomix/edit_dialog.py:55 -msgid "Images" -msgstr "Vaizdai" - -#: mcomix/edit_dialog.py:56 -msgid "Comment files" -msgstr "Komentuoti failus" - -#: mcomix/edit_dialog.py:134 -msgid "The new archive could not be saved!" -msgstr "" - -#: mcomix/edit_dialog.py:135 -msgid "The original files have not been removed." -msgstr "" - -#: mcomix/edit_dialog.py:153 -msgid "Archives are stored as ZIP files." -msgstr "" - -#: mcomix/enhance_dialog.py:18 mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Pagerinti vaizdą" - -#: mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Atstatyti į numatytuosius." - -#: mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/enhance_dialog.py:69 -msgid "_Brightness:" -msgstr "Šviesumas:" - -#: mcomix/enhance_dialog.py:70 -msgid "_Contrast:" -msgstr "Kontrastas:" - -#: mcomix/enhance_dialog.py:71 -msgid "S_aturation:" -msgstr "" - -#: mcomix/enhance_dialog.py:72 -msgid "S_harpness:" -msgstr "" - -#: mcomix/enhance_dialog.py:77 -msgid "_Automatically adjust contrast" -msgstr "" - -#: mcomix/enhance_dialog.py:79 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" - -#: mcomix/file_chooser_base_dialog.py:43 mcomix/keybindings.py:137 -msgid "Open" -msgstr "Atverti" - -#: mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Išsaugoti" - -#: mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Visi failai" - -#: mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "Visi archyvai" - -#: mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "%s archyvai" - -#: mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Visi vaizdai" - -#: mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "%s vaizdai" - -#: mcomix/file_chooser_base_dialog.py:233 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" - -#: mcomix/file_chooser_base_dialog.py:235 -msgid "Replacing it will overwrite its contents." -msgstr "" - -#: mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Visos knygos" - -#: mcomix/file_handler.py:147 -#, python-format -msgid "No images in '%s'" -msgstr "" - -#: mcomix/file_handler.py:265 -#, python-format -msgid "Could not open %s: No such file." -msgstr "" - -#: mcomix/file_handler.py:268 mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "" - -#: mcomix/file_handler.py:365 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/file_handler.py:366 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/file_handler.py:660 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/image_tools.py:561 -msgid "Unknown filetype" -msgstr "" - -#: mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "Raktas %d" - -#: mcomix/keybindings.py:40 mcomix/ui.py:44 -msgid "Previous page" -msgstr "Ankstesnis puslapis" - -#: mcomix/keybindings.py:40 mcomix/keybindings.py:41 mcomix/keybindings.py:42 -#: mcomix/keybindings.py:43 mcomix/keybindings.py:44 mcomix/keybindings.py:45 -#: mcomix/keybindings.py:46 mcomix/keybindings.py:47 mcomix/keybindings.py:49 -#: mcomix/keybindings.py:50 mcomix/keybindings.py:51 mcomix/keybindings.py:53 -#: mcomix/keybindings.py:54 mcomix/keybindings.py:55 mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "Navigacija" - -#: mcomix/keybindings.py:41 mcomix/ui.py:42 -msgid "Next page" -msgstr "Kitas puslapis" - -#: mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Atgal per 10 puslapių" - -#: mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Pirmyn per 10 puslapių" - -#: mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "" - -#: mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "" - -#: mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "" - -#: mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "" - -#: mcomix/keybindings.py:49 mcomix/ui.py:46 -msgid "First page" -msgstr "Pirmas puslapis" - -#: mcomix/keybindings.py:50 mcomix/ui.py:48 -msgid "Last page" -msgstr "Paskutinis puslapis" - -#: mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Eiti į puslapį" - -#: mcomix/keybindings.py:53 mcomix/ui.py:55 -msgid "Next archive" -msgstr "Kitas archyvas" - -#: mcomix/keybindings.py:54 mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Ankstesnis archyvas" - -#: mcomix/keybindings.py:55 mcomix/ui.py:58 mcomix/ui.py:59 -msgid "Next directory" -msgstr "Kita direktorija" - -#: mcomix/keybindings.py:56 mcomix/ui.py:60 mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Buvusi direktorija" - -#: mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/keybindings.py:59 mcomix/keybindings.py:60 mcomix/keybindings.py:61 -#: mcomix/keybindings.py:63 mcomix/keybindings.py:64 mcomix/keybindings.py:65 -#: mcomix/keybindings.py:67 mcomix/keybindings.py:68 mcomix/keybindings.py:69 -#: mcomix/keybindings.py:71 mcomix/keybindings.py:72 mcomix/keybindings.py:73 -#: mcomix/keybindings.py:74 mcomix/keybindings.py:76 mcomix/keybindings.py:77 -#: mcomix/preferences_dialog.py:128 -msgid "Scroll" -msgstr "" - -#: mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Priartinti" - -#: mcomix/keybindings.py:80 mcomix/keybindings.py:81 mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "Priartinti" - -#: mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Atitolinti" - -#: mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Normalusis dydis" - -#: mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "Palikti transformaciją" - -#: mcomix/keybindings.py:84 mcomix/keybindings.py:85 mcomix/keybindings.py:86 -#: mcomix/keybindings.py:87 mcomix/keybindings.py:88 mcomix/keybindings.py:89 -#: mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "Transformacija" - -#: mcomix/keybindings.py:85 mcomix/keybindings.py:92 mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "" - -#: mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "" - -#: mcomix/keybindings.py:87 mcomix/keybindings.py:93 mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "" - -#: mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "Apsukti horizontaliai" - -#: mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "Apsukti vertikaliai" - -#: mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/keybindings.py:92 mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/keybindings.py:94 mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/keybindings.py:97 mcomix/preferences_dialog.py:174 mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Dvigubo puslapio rėžimas" - -#: mcomix/keybindings.py:97 mcomix/keybindings.py:98 mcomix/keybindings.py:99 -#: mcomix/keybindings.py:101 mcomix/keybindings.py:102 -#: mcomix/keybindings.py:104 mcomix/keybindings.py:105 -#: mcomix/keybindings.py:106 mcomix/keybindings.py:107 -#: mcomix/keybindings.py:108 -msgid "View mode" -msgstr "Peržiūros rėžimas" - -#: mcomix/keybindings.py:98 mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Mangos rėžimas" - -#: mcomix/keybindings.py:99 mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/keybindings.py:101 mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Padidinimo stiklas" - -#: mcomix/keybindings.py:102 mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/keybindings.py:104 mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Geriausio tilpimo rėžimas" - -#: mcomix/keybindings.py:105 mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "" - -#: mcomix/keybindings.py:106 mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "" - -#: mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "" - -#: mcomix/keybindings.py:108 mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "" - -#: mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/keybindings.py:111 mcomix/keybindings.py:113 -#: mcomix/keybindings.py:114 mcomix/keybindings.py:115 -#: mcomix/keybindings.py:116 mcomix/keybindings.py:117 -#: mcomix/keybindings.py:118 mcomix/keybindings.py:119 -#: mcomix/keybindings.py:120 mcomix/keybindings.py:121 -#: mcomix/keybindings.py:122 mcomix/preferences_dialog.py:66 -msgid "User interface" -msgstr "" - -#: mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "Minimizuoti" - -#: mcomix/keybindings.py:115 mcomix/preferences_dialog.py:202 -msgid "Fullscreen" -msgstr "Pilnas ekranas" - -#: mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "Rodyti/slėpti įrankių juostą" - -#: mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "" - -#: mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "" - -#: mcomix/keybindings.py:120 mcomix/preferences_dialog.py:88 -msgid "Thumbnails" -msgstr "Miniatiūros" - -#: mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "" - -#: mcomix/keybindings.py:122 mcomix/slideshow.py:47 mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "" - -#: mcomix/keybindings.py:125 -msgid "Delete" -msgstr "Ištrinti" - -#: mcomix/keybindings.py:125 mcomix/keybindings.py:126 -#: mcomix/keybindings.py:127 mcomix/keybindings.py:128 -#: mcomix/keybindings.py:129 mcomix/keybindings.py:130 -#: mcomix/keybindings.py:132 mcomix/keybindings.py:133 -#: mcomix/keybindings.py:134 mcomix/keybindings.py:136 -#: mcomix/keybindings.py:137 mcomix/keybindings.py:138 -#: mcomix/keybindings.py:139 -msgid "File" -msgstr "Failas" - -#: mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "Atnaujinti" - -#: mcomix/keybindings.py:127 -msgid "Close" -msgstr "Uždaryti" - -#: mcomix/keybindings.py:128 -msgid "Quit" -msgstr "Išeiti" - -#: mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "Išsaugoti ir išeiti" - -#: mcomix/keybindings.py:130 -msgid "Save As" -msgstr "Išsaugoti kaip" - -#: mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "Archyvuoti komentarus" - -#: mcomix/keybindings.py:133 mcomix/properties_dialog.py:22 -msgid "Properties" -msgstr "Savybės" - -#: mcomix/keybindings.py:134 mcomix/preferences_dialog.py:26 -msgid "Preferences" -msgstr "Nustatymai" - -#: mcomix/keybindings.py:139 mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteka" - -#: mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/keybindings.py:146 -msgid "External commands" -msgstr "Išorinės komandos" - -#: mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/keybindings.py:294 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/last_read_page.py:16 mcomix/library/backend.py:21 -msgid "! Could neither find pysqlite2 nor sqlite3." -msgstr "" - -#: mcomix/last_read_page.py:209 mcomix/thumbnail_tools.py:117 -#: mcomix/library/book_area.py:578 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/main.py:962 -msgid "SLIDESHOW" -msgstr "" - -#: mcomix/main.py:993 -msgid "Save page as" -msgstr "Išsaugoti kaip" - -#: mcomix/main.py:1013 -#, python-format -msgid "Delete \"%s\"?" -msgstr "Ištrinti „%s“?" - -#: mcomix/main.py:1014 -msgid "The file will be deleted from your harddisk." -msgstr "Failas bus ištrintas iš jūsų sistemos." - -#: mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Daugiau nebeklausti." - -#: mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "Keisti komandas" - -#: mcomix/openwith.py:76 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/openwith.py:95 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/openwith.py:143 -msgid "Command line is empty." -msgstr "Komandinė eilutė yra tuščia." - -#: mcomix/openwith.py:186 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/openwith.py:190 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/openwith.py:206 -msgid "File-related variables can only be used for files." -msgstr "" - -#: mcomix/openwith.py:210 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/openwith.py:252 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/openwith.py:275 -msgid "Edit external commands" -msgstr "" - -#: mcomix/openwith.py:285 -msgid "Add _separator" -msgstr "" - -#: mcomix/openwith.py:296 -msgid "Run _command" -msgstr "" - -#: mcomix/openwith.py:359 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/openwith.py:370 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/openwith.py:373 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/openwith.py:382 -msgid "Command label" -msgstr "" - -#: mcomix/openwith.py:475 -msgid "Preview:" -msgstr "" - -#: mcomix/openwith.py:483 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/openwith.py:491 -msgid "Label" -msgstr "" - -#: mcomix/openwith.py:491 -msgid "Command" -msgstr "" - -#: mcomix/openwith.py:491 -msgid "Working directory" -msgstr "" - -#: mcomix/openwith.py:505 -msgid "Disabled in archives" -msgstr "" - -#: mcomix/openwith.py:560 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/openwith.py:561 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/pageselect.py:19 mcomix/ui.py:100 mcomix/ui.py:101 -msgid "_Go" -msgstr "Eiti" - -#: mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "Atšaukti" - -#: mcomix/pageselect.py:41 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/preferences_dialog.py:44 -msgid "Appearance" -msgstr "Išvaizda" - -#: mcomix/preferences_dialog.py:46 -msgid "Behaviour" -msgstr "Elgsena" - -#: mcomix/preferences_dialog.py:48 -msgid "Display" -msgstr "Rodymas" - -#: mcomix/preferences_dialog.py:50 -msgid "Advanced" -msgstr "Sudėtingiau" - -#: mcomix/preferences_dialog.py:52 -msgid "Shortcuts" -msgstr "Nuorodos" - -#: mcomix/preferences_dialog.py:68 -msgid "Language (needs restart):" -msgstr "Kalba (reikia perkrauti):" - -#: mcomix/preferences_dialog.py:72 -msgid "Escape key closes program" -msgstr "Escape mygtukas išjungia programą" - -#: mcomix/preferences_dialog.py:73 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/preferences_dialog.py:76 -msgid "Background" -msgstr "Fonas" - -#: mcomix/preferences_dialog.py:79 -msgid "Use this colour as background:" -msgstr "Naudoti šią spalvą kaip foną:" - -#: mcomix/preferences_dialog.py:81 -msgid "Always use this selected colour as the background colour." -msgstr "" - -#: mcomix/preferences_dialog.py:82 -msgid "Use dynamic background colour" -msgstr "Fonui naudoti kintančią spalvą" - -#: mcomix/preferences_dialog.py:84 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" - -#: mcomix/preferences_dialog.py:93 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "" - -#: mcomix/preferences_dialog.py:96 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" - -#: mcomix/preferences_dialog.py:101 -msgid "Show page numbers on thumbnails" -msgstr "" - -#: mcomix/preferences_dialog.py:105 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/preferences_dialog.py:107 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/preferences_dialog.py:109 -msgid "Thumbnail size (in pixels):" -msgstr "" - -#: mcomix/preferences_dialog.py:113 -msgid "Transparency" -msgstr "Permatomumas" - -#: mcomix/preferences_dialog.py:116 -msgid "Use checkered background for transparent images" -msgstr "" - -#: mcomix/preferences_dialog.py:118 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" - -#: mcomix/preferences_dialog.py:131 -msgid "Use smart scrolling" -msgstr "Naudoti išmanų slinkimą" - -#: mcomix/preferences_dialog.py:133 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" - -#: mcomix/preferences_dialog.py:138 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "" - -#: mcomix/preferences_dialog.py:140 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" - -#: mcomix/preferences_dialog.py:143 -msgid "Automatically open the next archive" -msgstr "Automatiškai atverti kitą archyvą" - -#: mcomix/preferences_dialog.py:145 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" - -#: mcomix/preferences_dialog.py:148 -msgid "Automatically open next directory" -msgstr "Automatiškai atverti sekantį aplanką" - -#: mcomix/preferences_dialog.py:150 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/preferences_dialog.py:152 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/preferences_dialog.py:155 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/preferences_dialog.py:157 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/preferences_dialog.py:160 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/preferences_dialog.py:162 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/preferences_dialog.py:166 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/preferences_dialog.py:169 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/preferences_dialog.py:172 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/preferences_dialog.py:177 -msgid "Flip two pages in double page mode" -msgstr "" - -#: mcomix/preferences_dialog.py:179 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" - -#: mcomix/preferences_dialog.py:181 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/preferences_dialog.py:184 -msgid "Files" -msgstr "" - -#: mcomix/preferences_dialog.py:187 -msgid "Automatically open the last viewed file on startup" -msgstr "" - -#: mcomix/preferences_dialog.py:189 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" - -#: mcomix/preferences_dialog.py:191 -msgid "Store information about recently opened files:" -msgstr "" - -#: mcomix/preferences_dialog.py:205 -msgid "Use fullscreen by default" -msgstr "" - -#: mcomix/preferences_dialog.py:209 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" - -#: mcomix/preferences_dialog.py:212 mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "" - -#: mcomix/preferences_dialog.py:214 -msgid "Fit to width or height:" -msgstr "" - -#: mcomix/preferences_dialog.py:217 -msgid "Fixed size for this mode:" -msgstr "" - -#: mcomix/preferences_dialog.py:221 -msgid "Slideshow" -msgstr "" - -#: mcomix/preferences_dialog.py:223 -msgid "Slideshow delay (in seconds):" -msgstr "" - -#: mcomix/preferences_dialog.py:227 -msgid "Slideshow step (in pixels):" -msgstr "" - -#: mcomix/preferences_dialog.py:230 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/preferences_dialog.py:233 -msgid "During a slideshow automatically open the next archive" -msgstr "" - -#: mcomix/preferences_dialog.py:235 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/preferences_dialog.py:237 -msgid "Rotation" -msgstr "" - -#: mcomix/preferences_dialog.py:240 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/preferences_dialog.py:242 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -#: mcomix/preferences_dialog.py:244 -msgid "Image quality" -msgstr "" - -#: mcomix/preferences_dialog.py:246 -msgid "Scaling mode" -msgstr "" - -#: mcomix/preferences_dialog.py:258 -msgid "File order" -msgstr "" - -#: mcomix/preferences_dialog.py:260 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/preferences_dialog.py:263 -msgid "Sort archives by:" -msgstr "" - -#: mcomix/preferences_dialog.py:266 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/preferences_dialog.py:268 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/preferences_dialog.py:271 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/preferences_dialog.py:274 -msgid "Store thumbnails for opened files" -msgstr "" - -#: mcomix/preferences_dialog.py:276 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" - -#: mcomix/preferences_dialog.py:278 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/preferences_dialog.py:281 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/preferences_dialog.py:283 -msgid "Magnifying Lens" -msgstr "" - -#: mcomix/preferences_dialog.py:285 -msgid "Magnifying lens size (in pixels):" -msgstr "" - -#: mcomix/preferences_dialog.py:288 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" - -#: mcomix/preferences_dialog.py:290 -msgid "Magnification factor:" -msgstr "" - -#: mcomix/preferences_dialog.py:293 -msgid "Set the magnification factor of the magnifying lens." -msgstr "" - -#: mcomix/preferences_dialog.py:297 -msgid "Comment extensions:" -msgstr "" - -#: mcomix/preferences_dialog.py:300 -#, fuzzy -msgid "Animated images" -msgstr "Pagerinti vaizdą" - -#: mcomix/preferences_dialog.py:302 -msgid "Animation mode:" -msgstr "" - -#: mcomix/preferences_dialog.py:320 -msgid "_Reset keys" -msgstr "" - -#: mcomix/preferences_dialog.py:322 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/preferences_dialog.py:325 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/preferences_dialog.py:327 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/preferences_dialog.py:355 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/preferences_dialog.py:398 mcomix/preferences_dialog.py:543 -#: mcomix/preferences_dialog.py:617 mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/preferences_dialog.py:399 -msgid "Only for title pages" -msgstr "" - -#: mcomix/preferences_dialog.py:400 -msgid "Only for wide images" -msgstr "" - -#: mcomix/preferences_dialog.py:401 mcomix/preferences_dialog.py:544 -msgid "Always" -msgstr "" - -#: mcomix/preferences_dialog.py:408 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/preferences_dialog.py:424 -msgid "Fit to width" -msgstr "" - -#: mcomix/preferences_dialog.py:425 -msgid "Fit to height" -msgstr "" - -#: mcomix/preferences_dialog.py:446 mcomix/preferences_dialog.py:494 -msgid "No sorting" -msgstr "Jokio rūšiavimo" - -#: mcomix/preferences_dialog.py:447 -msgid "File name" -msgstr "Failo pavadinimas" - -#: mcomix/preferences_dialog.py:448 mcomix/library/book_area.py:173 -msgid "File size" -msgstr "Failo dydis" - -#: mcomix/preferences_dialog.py:449 -msgid "Last modified" -msgstr "" - -#: mcomix/preferences_dialog.py:455 mcomix/preferences_dialog.py:502 -#: mcomix/library/book_area.py:177 -msgid "Ascending" -msgstr "" - -#: mcomix/preferences_dialog.py:456 mcomix/preferences_dialog.py:503 -#: mcomix/library/book_area.py:179 -msgid "Descending" -msgstr "" - -#: mcomix/preferences_dialog.py:466 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/preferences_dialog.py:495 -msgid "Natural order" -msgstr "" - -#: mcomix/preferences_dialog.py:496 -msgid "Literal order" -msgstr "" - -#: mcomix/preferences_dialog.py:513 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/preferences_dialog.py:556 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" - -#: mcomix/preferences_dialog.py:579 -msgid "Delete information about recently opened files?" -msgstr "" - -#: mcomix/preferences_dialog.py:580 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/preferences_dialog.py:591 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/preferences_dialog.py:592 -msgid "Bilinear" -msgstr "" - -#: mcomix/preferences_dialog.py:593 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/preferences_dialog.py:599 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/preferences_dialog.py:618 mcomix/library/book_area.py:189 -msgid "Normal" -msgstr "Normalus" - -#: mcomix/preferences_dialog.py:624 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/preferences_dialog.py:685 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" - -#: mcomix/properties_dialog.py:35 -msgid "Archive" -msgstr "" - -#: mcomix/properties_dialog.py:37 -msgid "Image" -msgstr "Vaizdas" - -#: mcomix/properties_dialog.py:76 mcomix/library/control_area.py:138 -#, python-format -msgid "%d pages" -msgstr "" - -#: mcomix/properties_dialog.py:77 -#, python-format -msgid "%d comments" -msgstr "" - -#: mcomix/properties_dialog.py:129 -msgid "Accessed" -msgstr "" - -#: mcomix/properties_dialog.py:131 -msgid "Modified" -msgstr "Modifikuota" - -#: mcomix/properties_dialog.py:133 -msgid "Permissions" -msgstr "Leidimai" - -#: mcomix/properties_dialog.py:134 -msgid "Owner" -msgstr "Savininkas" - -#: mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/run.py:56 -msgid "Don't update fontconfig cache at startup." -msgstr "" - -#: mcomix/run.py:61 -msgid "Update fontconfig cache at startup." -msgstr "" - -#: mcomix/run.py:63 -msgid "View modes" -msgstr "" - -#: mcomix/run.py:65 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/run.py:67 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/run.py:69 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/run.py:72 -msgid "Zoom modes" -msgstr "" - -#: mcomix/run.py:75 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/run.py:78 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/run.py:81 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/run.py:84 -msgid "Debug options" -msgstr "" - -#: mcomix/run.py:88 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/run.py:189 -msgid "You do not have the required versions of GTK+ and PyGTK installed." -msgstr "" - -#: mcomix/run.py:190 -#, python-format -msgid "Installed GTK+ version is: %s" -msgstr "" - -#: mcomix/run.py:192 -msgid "Required GTK+ version is: 2.12.0 or higher" -msgstr "" - -#: mcomix/run.py:193 -#, python-format -msgid "Installed PyGTK version is: %s" -msgstr "" - -#: mcomix/run.py:195 mcomix/run.py:199 -msgid "Required PyGTK version is: 2.12.0 or higher" -msgstr "" - -#: mcomix/run.py:200 -msgid "No version of PyGTK was found on your system." -msgstr "" - -#: mcomix/run.py:201 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/run.py:209 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/run.py:210 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/run.py:211 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/run.py:212 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/run.py:216 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/run.py:217 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "" - -#: mcomix/status.py:40 -msgid "Show page numbers" -msgstr "" - -#: mcomix/status.py:42 -msgid "Show file numbers" -msgstr "" - -#: mcomix/status.py:44 -msgid "Show resolution" -msgstr "" - -#: mcomix/status.py:46 -msgid "Show path" -msgstr "" - -#: mcomix/status.py:48 -msgid "Show filename" -msgstr "" - -#: mcomix/strings.py:9 mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "" - -#: mcomix/strings.py:10 -msgid "RAR archive" -msgstr "" - -#: mcomix/strings.py:11 -msgid "Tar archive" -msgstr "" - -#: mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "" - -#: mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "" - -#: mcomix/strings.py:14 -msgid "XZ compressed tar archive" -msgstr "" - -#: mcomix/strings.py:15 -msgid "PDF document" -msgstr "PDF dokumentas" - -#: mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z archyvas" - -#: mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA archyvas" - -#: mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/strings.py:23 mcomix/strings.py:24 mcomix/strings.py:25 -#: mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/strings.py:29 mcomix/strings.py:30 mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "" - -#: mcomix/strings.py:32 mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "" - -#: mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "" - -#: mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "" - -#: mcomix/strings.py:36 -msgid "German translation" -msgstr "" - -#: mcomix/strings.py:37 mcomix/strings.py:38 mcomix/strings.py:39 -msgid "Italian translation" -msgstr "" - -#: mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "" - -#: mcomix/strings.py:41 mcomix/strings.py:42 mcomix/strings.py:43 -#: mcomix/strings.py:44 -msgid "French translation" -msgstr "" - -#: mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "" - -#: mcomix/strings.py:46 -msgid "Polish translation" -msgstr "" - -#: mcomix/strings.py:47 -msgid "Greek translation" -msgstr "" - -#: mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "" - -#: mcomix/strings.py:49 mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "" - -#: mcomix/strings.py:51 mcomix/strings.py:52 mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "" - -#: mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "" - -#: mcomix/strings.py:55 mcomix/strings.py:56 -msgid "Russian translation" -msgstr "" - -#: mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "" - -#: mcomix/strings.py:58 mcomix/strings.py:59 -msgid "Korean translation" -msgstr "" - -#: mcomix/strings.py:60 -msgid "Persian translation" -msgstr "" - -#: mcomix/strings.py:61 -msgid "Indonesian translation" -msgstr "" - -#: mcomix/strings.py:62 -msgid "Czech translation" -msgstr "" - -#: mcomix/strings.py:63 -msgid "Ukrainian translation" -msgstr "" - -#: mcomix/strings.py:64 -msgid "Galician translation" -msgstr "" - -#: mcomix/strings.py:65 -msgid "Swedish translation" -msgstr "" - -#: mcomix/strings.py:66 -msgid "Hebrew translation" -msgstr "" - -#: mcomix/strings.py:67 -msgid "Lithuanian translation" -msgstr "" - -#: mcomix/strings.py:70 -msgid "Icon design" -msgstr "" - -#: mcomix/thumbnail_tools.py:221 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/ui.py:35 mcomix/library/book_area.py:161 -msgid "_Copy" -msgstr "Kopijuoti" - -#: mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/ui.py:38 -msgid "_Delete" -msgstr "Ištrinti" - -#: mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/ui.py:41 -msgid "_Next page" -msgstr "Kitas puslapis" - -#: mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Ankstesnis puslapis" - -#: mcomix/ui.py:45 -msgid "_First page" -msgstr "Pirmas puslapis" - -#: mcomix/ui.py:47 -msgid "_Last page" -msgstr "Paskutinis puslapis" - -#: mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "Eiti į puslapį..." - -#: mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Eiti į puslapį..." - -#: mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "Atnaujinti" - -#: mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Kitas archyvas" - -#: mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Ankstesnis archyvas" - -#: mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "Priartinti" - -#: mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "Atitolinti" - -#: mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/ui.py:70 -msgid "_Close" -msgstr "Uždaryti" - -#: mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/ui.py:72 -msgid "_Quit" -msgstr "Išeiti" - -#: mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "Išsaugoti ir išeiti" - -#: mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/ui.py:77 mcomix/ui.py:161 mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "" - -#: mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "" - -#: mcomix/ui.py:81 mcomix/ui.py:163 mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "" - -#: mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "" - -#: mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "" - -#: mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/ui.py:89 -msgid "_Zoom" -msgstr "Priartinti" - -#: mcomix/ui.py:90 -msgid "_Recent" -msgstr "Naujausi" - -#: mcomix/ui.py:91 mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "" - -#: mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Įrankių juostos" - -#: mcomix/ui.py:94 -msgid "_Edit" -msgstr "Keisti" - -#: mcomix/ui.py:95 mcomix/ui.py:96 -msgid "Open _with" -msgstr "Atverti su" - -#: mcomix/ui.py:97 -msgid "_File" -msgstr "Failas" - -#: mcomix/ui.py:98 mcomix/ui.py:99 -msgid "_View" -msgstr "Rodymas" - -#: mcomix/ui.py:102 -msgid "_Tools" -msgstr "Įrankiai" - -#: mcomix/ui.py:103 -msgid "_Help" -msgstr "Pagalba" - -#: mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "Pilnas ekranas" - -#: mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Pilno ekrano rėžimas" - -#: mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "" - -#: mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Įrankių juosta" - -#: mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Meniu juosta" - -#: mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Būsenos juosta" - -#: mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "" - -#: mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniatūros" - -#: mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Slėpti viską" - -#: mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "Mangos rėžimas" - -#: mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "" - -#: mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "" - -#: mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "" - -#: mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "" - -#: mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "" - -#: mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "" - -#: mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "" - -#: mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "" - -#: mcomix/ui.py:172 -msgid "_About" -msgstr "Apie" - -#: mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "Komentarai" - -#: mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Savybės" - -#: mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Nustatymai" - -#: mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "Keisti archyvą..." - -#: mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/ui.py:192 -msgid "_Open..." -msgstr "Atverti..." - -#: mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/ui.py:198 -msgid "_Library..." -msgstr "Biblioteka..." - -#: mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/archive/zip.py:54 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "" - -#: mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "" - -#: mcomix/library/add_progress_dialog.py:69 -#, python-format -msgid "Adding '%s'..." -msgstr "" - -#: mcomix/library/backend.py:134 mcomix/library/backend.py:147 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/library/backend.py:165 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/library/backend.py:343 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/library/backend.py:382 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/library/backend.py:395 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/library/backend.py:422 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/library/backend.py:433 mcomix/library/backend.py:435 -msgid "(Copy)" -msgstr "" - -#: mcomix/library/backend.py:535 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/library/backend.py:564 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/library/backend.py:664 -msgid "Recent" -msgstr "Naujausios" - -#: mcomix/library/backend_types.py:200 mcomix/library/collection_area.py:142 -msgid "All books" -msgstr "Visos knygos" - -#: mcomix/library/book_area.py:136 -msgid "Library books" -msgstr "Bibliotekos knygos" - -#: mcomix/library/book_area.py:138 -msgid "_Open" -msgstr "Atverti" - -#: mcomix/library/book_area.py:139 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/library/book_area.py:142 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/library/book_area.py:143 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/library/book_area.py:145 mcomix/library/collection_area.py:77 -msgid "_Add..." -msgstr "Pridėti..." - -#: mcomix/library/book_area.py:146 mcomix/library/collection_area.py:78 -msgid "Add more books to the library." -msgstr "" - -#: mcomix/library/book_area.py:149 -msgid "Remove from this _collection" -msgstr "Pašalinti iš šios kolekcijos" - -#: mcomix/library/book_area.py:150 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/library/book_area.py:153 -msgid "Remove from the _library" -msgstr "Pašalinti iš bibliotekos" - -#: mcomix/library/book_area.py:154 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/library/book_area.py:157 -msgid "_Remove and delete from disk" -msgstr "Pašalinti ir ištrinti iš disko" - -#: mcomix/library/book_area.py:158 -msgid "Deletes the selected books from disk." -msgstr "Ištrina pasirinktą knygą iš disko." - -#: mcomix/library/book_area.py:162 -msgid "Copies the selected book's path to clipboard." -msgstr "" - -#: mcomix/library/book_area.py:164 -msgid "_Sort" -msgstr "Rūšiuoti" - -#: mcomix/library/book_area.py:165 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/library/book_area.py:166 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/library/book_area.py:167 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/library/book_area.py:171 -msgid "Book name" -msgstr "Knygos pavadinimas" - -#: mcomix/library/book_area.py:172 -msgid "Full path" -msgstr "Pilnas kelias" - -#: mcomix/library/book_area.py:174 -msgid "Date added" -msgstr "Pridėjimo data" - -#: mcomix/library/book_area.py:185 -msgid "Huge" -msgstr "Milžiniškas" - -#: mcomix/library/book_area.py:187 -msgid "Large" -msgstr "Didelis" - -#: mcomix/library/book_area.py:191 -msgid "Small" -msgstr "Mažas" - -#: mcomix/library/book_area.py:193 -msgid "Tiny" -msgstr "Mažiukas" - -#: mcomix/library/book_area.py:195 -msgid "Custom..." -msgstr "Pasirinktas..." - -#: mcomix/library/book_area.py:395 -msgid "Set library cover size" -msgstr "Nustatyti bibliotekos viršelių dydį" - -#: mcomix/library/book_area.py:513 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: mcomix/library/book_area.py:535 mcomix/library/collection_area.py:190 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: mcomix/library/book_area.py:553 -msgid "Remove books from the library?" -msgstr "" - -#: mcomix/library/book_area.py:554 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" - -#: mcomix/library/collection_area.py:75 -msgid "Library collections" -msgstr "Bibliotekos kolekcijos" - -#: mcomix/library/collection_area.py:80 -msgid "New" -msgstr "Nauja" - -#: mcomix/library/collection_area.py:81 -msgid "Add a new empty collection." -msgstr "" - -#: mcomix/library/collection_area.py:83 -msgid "Re_name" -msgstr "Pervadinti" - -#: mcomix/library/collection_area.py:84 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/library/collection_area.py:86 -msgid "_Duplicate" -msgstr "" - -#: mcomix/library/collection_area.py:87 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/library/collection_area.py:89 -msgid "_Clean up" -msgstr "Išvalyti" - -#: mcomix/library/collection_area.py:90 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/library/collection_area.py:92 mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "Pašalinti" - -#: mcomix/library/collection_area.py:93 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/library/collection_area.py:154 -msgid "Add new collection?" -msgstr "Pridėti naują kolekciją?" - -#: mcomix/library/collection_area.py:155 -msgid "Please enter a name for the new collection." -msgstr "" - -#: mcomix/library/collection_area.py:174 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "" - -#: mcomix/library/collection_area.py:179 mcomix/library/collection_area.py:272 -msgid "A collection by that name already exists." -msgstr "" - -#: mcomix/library/collection_area.py:248 -msgid "Rename collection?" -msgstr "Pervadinti kolekciją?" - -#: mcomix/library/collection_area.py:249 -msgid "Please enter a new name for the selected collection." -msgstr "" - -#: mcomix/library/collection_area.py:268 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "" - -#: mcomix/library/collection_area.py:282 -msgid "Could not duplicate collection." -msgstr "" - -#: mcomix/library/collection_area.py:409 -msgid "Root" -msgstr "" - -#: mcomix/library/collection_area.py:413 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" - -#: mcomix/library/collection_area.py:434 -#, python-format -msgid "Add books to '%s'." -msgstr "" - -#: mcomix/library/collection_area.py:438 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" - -#: mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "Ieškoti:" - -#: mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" - -#: mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "Stebimų sąrašas" - -#: mcomix/library/control_area.py:90 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/library/control_area.py:96 -msgid "Open the selected book." -msgstr "" - -#: mcomix/library/control_area.py:145 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/library/main_dialog.py:84 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/library/main_dialog.py:99 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/library/main_dialog.py:102 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" - -#: mcomix/library/main_dialog.py:109 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "Aplanke '%s' nebuvo rasta naujų knygų." - -#: mcomix/library/main_dialog.py:169 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "Nuskaityti dabar" - -#: mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Aplankas" - -#: mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Kolekcija" - -#: mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Su poaplankiais" - -#: mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "Pridėti" - -#: mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "Automatiškai ieškoti naujų knygų kai yra atidaroma biblioteka" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/mcomix.pot mcomix-2.1.0/mcomix/mcomix/messages/mcomix.pot --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/mcomix.pot 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/mcomix.pot 1970-01-01 00:00:00.000000000 +0000 @@ -1,2377 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the MComix package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: MComix 1.3.0.dev0\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "" - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "" - -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "" - -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "" - -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "" - -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "" - -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "" - -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "" - -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "" - -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "" - -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "" - -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "" - -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -msgid "! Could neither find sqlite3." -msgstr "" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:299 -msgid "Animated images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "" - -#: mcomix/mcomix/strings.py:14 -msgid "XZ compressed tar archive" -msgstr "" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "" - -#: mcomix/mcomix/strings.py:68 -msgid "Lithuanian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -msgid "_Open list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/nl/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/nl/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/nl/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/nl/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3982 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2006-10-15 21:30+0100\n" -"Last-Translator: \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Pagina" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Locatie" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Commentaar" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "" - -# -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Comment file" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Helderheid" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Contrast" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Verzadiging" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Scherpte" - -# -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Automatisch contrast aanpassen" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Openen" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Alle bestanden" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Archieven" - -# -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s archief" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Alle afbeeldingen" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s afbeelding" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "" - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Vorige pagina" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Volgende pagina" - -# -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Pak pagina uit" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Vorige pagina" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Volgende pagina" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Vorige pagina" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Volgende pagina" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Eerste pagina" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Laatste pagina" - -# -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Ga naar pagina" - -# -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "tar archief" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Vorige pagina" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Scroll" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "Bewaar _transformatie" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "Bewaar _transformatie" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "_Roteer 90 graden MKM" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Roteer 180 graden" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Rot_eer 90 graden TKI" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Horizontaal spiegelen" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Verticaal spiegelen" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -#, fuzzy -msgid "Autorotate by width" -msgstr "_Pak afbeelding uit..." - -# -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Autorotate by height" -msgstr "_Pak afbeelding uit..." - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Dubbele pagina modus" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Rek naar hoogte" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Manga modus" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Vergrootglas" - -# -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Rek kleine afbeeldingen" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Rek naar hoogte" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Rek naar hoogte modus" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Rek naar breedte modus" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Handmatige zoom modus" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "St_atusbalk" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "S_crollbalken" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Voorbeelden" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Ve_rberg alles" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Slideshow" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "_Bestand" - -# -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "_Recente bestanden" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Sluiten" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Afsluiten" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "" - -# -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Bekijk _commentaar" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Eigenschappen" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Voorkeuren" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Bibliotheek" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Bewerk bladwijzers" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Kon niet verwijderen" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Commentaar" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Comment file" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Vo_rige pagina" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Commentaar" - -# -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Folders" - -# -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Alle archieven" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Bewerk bladwijzers" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ga naar" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Gedrag" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Toon" - -# -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Geavanceerd" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Achtergrondkleur" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Verberg altijd de voorbeeldenbalks scrollbalk." - -# -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Open automatisch de laatst bekeken pagina wanneer Comix wordt opgestart." - -# -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Toon pagina nummers op voorbeelden" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Voorbeelden grootte (px):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Met spatietoets scrollen" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "" -"Sla pagina om wanneer er van de boven- of onderkant van de pagina wordt " -"gescrolld." - -# -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Sla pagina's om wanneer u van de pagina af scrollt met het scrollwiel, ook " -"wanneer niet in fit-to-screen modus. Er zijn dan 3 \"stappen\" met het " -"scrollwiel nodig voordat dit ook gebeurt." - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Automatisch contrast aanpassen" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Gebruik intelligent schalen in dubbele pagina modus" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Open laatst bekeken bestand wanneer opgestart" - -# -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Open automatisch de laatst bekeken pagina wanneer Comix wordt opgestart." - -# -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Onthoud recent geopende bestanden" - -# -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Standaard volledig scherm modus gebruiken" - -# -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Automatisch de scrollbalken, menubalk, werkbalk, statusbalk en " -"voorbeeldenbalk verbergen in fullscreen modus." - -# -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Fit-to-screen modus" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Rek naar hoogte" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Rek naar breedte modus" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Slideshow" - -# -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Slideshow vertraging:" - -# -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Slideshow vertraging:" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Schaal kwaliteit" - -# -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Schalen" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar archief" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Onthoud recent geopende bestanden" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Vergrootglas" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Zoomfactor:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Comment file" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Alle afbeeldingen" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Pas aan aan _breedte" - -# -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Pas aan aan _hoogte" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Onthoud recent geopende bestanden" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -# -#: mcomix/mcomix/preferences_dialog.py:590 -#, fuzzy -msgid "Normal (fast)" -msgstr "_Normale grootte" - -# -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilineaer" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archief" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Afbeelding" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Gebruikt" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Gewijzigd" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Rechten" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Eigenaar" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Slideshow" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP archief" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR archief" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar archief" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Gzip ingepakt tar archief" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Bzip2 ingepakt tar archief" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Gzip ingepakt tar archief" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Versimpeld Chinese vertaling" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Spaanse vertaling" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Brazilisch Portugeze vertaling" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Duitse vertaling en Nautilus voorbeeldenmaker" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Griekse vertaling" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Italiaanse vertaling" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Nederlandse vertaling" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Franse vertaling" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Poolse vertaling" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Poolse vertaling" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Griekse vertaling" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Catalaanse vertaling" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traditioneel Chinese vertaling" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Italiaanse vertaling" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Griekse vertaling" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Italiaanse vertaling" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Vo_lgende pagina" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Vo_rige pagina" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Eerste pagina" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Laatste pagina" - -# -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Ga naar pagina..." - -# -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Ga naar pagina..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Sluiten" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Afsluiten" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Roteer 90 graden MKM" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Roteer 180 graden" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Rot_eer 90 graden TKI" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Horizontaal spiegelen" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Verticaal spiegelen" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -# -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Zoom" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Bladwijzers" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "Be_werken" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Bestand" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "Beel_d" - -# -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Werkbalk" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Hulp" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -# -#: mcomix/mcomix/ui.py:105 -#, fuzzy -msgid "_Auto-rotate image" -msgstr "_Pak afbeelding uit..." - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Volledig scherm" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Dubbele pagina modus" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Werkbalk" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Menubalk" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "St_atusbalk" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "S_crollbalken" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "P_reviews" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Ve_rberg alles" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Manga modus" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Bewaar _transformatie" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Slideshow" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Vergr_ootglas" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Rek naar breedte modus" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Rek naar hoogte modus" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Rek naar breedte modus" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "In_fo" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -# -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Eigenscha_ppen" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Voorkeuren" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Openen..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "" - -# -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Toegevoegd:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "" - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "" - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "" - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "" - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -msgid "_Open list" -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -# -#: mcomix/mcomix/library/watchlist.py:43 -#, fuzzy -msgid "Directory" -msgstr "Folders" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Locatie" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "" - -# -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Folders" - -# -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "GIF afbeelding" - -# -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "TIFF afbeelding" - -# -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "BMP afbeelding" - -# -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Verberg altijd de voorbeeldenbalks scrollbalk." - -# -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Kon niet verwijderen" - -# -#, fuzzy -#~ msgid "File path" -#~ msgstr "Bestandstype" - -# -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Folders" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Archief" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Archief" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive name" -#~ msgstr "Archief" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Archief" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Vorige pagina" - -# -#, fuzzy -#~ msgid "Only file names" -#~ msgstr "Ongeldige bestandsnaam" - -# -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "" -#~ "Toon slechts 1 pagina in dubbele pagina modus wanneer de afbeelding wijd " -#~ "is" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Info" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "Comix is een afbeeldingslezer, speciaal ontworpen voor stripboeken." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix is gelicenseerd onder de GNU General Public License." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Met dank aan" - -# -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Kon niet aanmaken" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Voeg bladwijzer toe" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "Blad_wijzers bewerken..." - -# -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Kon niet aanmaken" - -# -#, fuzzy -#~ msgid "\", deleting..." -#~ msgstr "Verwijder afbeelding..." - -# -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Kon niet openen" - -# -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Kon niet verwijderen" - -# -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Kon niet lezen" - -# -#, fuzzy -#~ msgid " to the library" -#~ msgstr "_Voeg toe aan bibliotheek" - -# -#, fuzzy -#~ msgid "Add folder" -#~ msgstr "Selecteer folder" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Pagina" - -# -#, fuzzy -#~ msgid "top window." -#~ msgstr "Sluit dit venster." - -# -#, fuzzy -#~ msgid "_Refresh file" -#~ msgstr "_Recente bestanden" - -# -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "tar archief" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Vo_rige pagina" - -# -# File: src/ui.py, line: 42 -#~ msgid "_Zoom in" -#~ msgstr "_Zoom in" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "Zoom _uit" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Handmatige _zoom" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Transformeer" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Verwijder previews" - -# -#~ msgid "No images in \"%s\"" -#~ msgstr "Geen afbeeldingen in \"%s\"" - -# -#~ msgid "Default" -#~ msgstr "Standaard" - -# -#~ msgid "Fit-to-_screen mode" -#~ msgstr "Fit-to-_screen modus" - -# -#~ msgid "Apply filter on full path" -#~ msgstr "Pas filter toe op volledig pad" - -# -#~ msgid "Add archives to library." -#~ msgstr "Voeg archieven toe aan bibliotheek." - -# -#~ msgid "Remove selected archive from library." -#~ msgstr "Verwijderen geselecteerd archief van de bibliotheek." - -# -#~ msgid "Clean up" -#~ msgstr "Ruim op" - -# -#~ msgid "Remove orphaned or outdated library entries." -#~ msgstr "Verwijder verweesde of gedateerde bibliotheek referenties." - -# -#~ msgid "Open selected archive." -#~ msgstr "Open geselecteerd archief." - -# -#~ msgid "JPEG image" -#~ msgstr "JPEG afbeelding" - -# -#~ msgid "PNG image" -#~ msgstr "PNG afbeelding" - -# -#~ msgid "ICO image" -#~ msgstr "ICO afbeelding" - -# -#~ msgid "XPM image" -#~ msgstr "XPM afbeelding" - -# -#~ msgid "XBM image" -#~ msgstr "XBM afbeelding" - -# -#~ msgid "Add archives recursively" -#~ msgstr "Archieven recursief toevoegen" - -# -#~ msgid "Double page mode as default" -#~ msgstr "Standaard dubbele pagina modus gebruiken" - -# -#~ msgid "Always view comments when opening a new file" -#~ msgstr "Bekijk altijd comentaar wanneer een nieuw bestand wordt geopend" - -# -#~ msgid "Hide menubar, scrollbars etc. in fullscreen mode" -#~ msgstr "Verberg menubar, scrollbalken enz. in volledig scherm modus" - -# -#~ msgid "Cache pages for faster forward flipping" -#~ msgstr "Cache pagina's om sneller vooruit te kunnen scrollen" - -# -#~ msgid "Scroll wheel scrolls horizontally at top and bottom of page" -#~ msgstr "" -#~ "Scrollwiel scrollt horizontaal aan de boven- en onderkant van de pagina" - -# -#~ msgid "Hide thumbnail scrollbar" -#~ msgstr "Verberg de voorbeeldenbalks scrollbalk" - -# -#~ msgid "Space key uses smart scrolling" -#~ msgstr "Spatietoets gebruikt intelligent scrollen" - -# -#~ msgid "Save window position and size for future sessions" -#~ msgstr "Sla venster positie en grootte op voor toekomstige sessies" - -# -#~ msgid "Go to the next archive in directory after last page" -#~ msgstr "Ga naar het volgende archief in de folder na de laatste pagina" - -# -#~ msgid "Hide cursor in fullscreen mode" -#~ msgstr "Verberg cursor in volledig scherm modus" - -# -#~ msgid "Always use smart scrolling as if in double page mode" -#~ msgstr "Altijd intelligent scrollen gebruiken zoals in dubbele pagina modus" - -# -#~ msgid "Use stored thumbnails for images in directories" -#~ msgstr "Gebruik opgeslagen voorbeelden voor afbeeldingen in folders" - -# -#~ msgid "Use stored thumbnails for images in archives" -#~ msgstr "Gebruik opgeslagen voorbeelden voor afbeeldingen in archieven" - -# -#~ msgid "Always go to this directory in the \"Open\" dialog:" -#~ msgstr "Ga altijd naar deze folder in het \"Open\" dialoogvenster:" - -# -#~ msgid "Always go to the latest directory in the \"Open\" dialog" -#~ msgstr "" -#~ "Ga altijd naar de laatst bezochte folder in het \"Open\" dialoogvenster" - -# -#~ msgid "Nearest (quickest, worst quality)" -#~ msgstr "Nearest (snelst, slechtste kwaliteit)" - -# -#~ msgid "Tiles" -#~ msgstr "Tiles" - -# -#~ msgid "Hyper (slowest, best quality)" -#~ msgstr "Hyper (langzaamst, best kwaliteit)" - -# -#~ msgid "Manual zoom mode as default" -#~ msgstr "Standaard handmatige zoom modus gebruiken" - -# -#~ msgid "Fit-to-screen mode as default" -#~ msgstr "Standaard fit-to-screen modus gebruiken" - -# -#~ msgid "Fit width mode as default" -#~ msgstr "Standaard rek naar breedte modus gebruiken" - -# -#~ msgid "Fit height mode as default" -#~ msgstr "Standaard rek naar hoogte modus gebruiken" - -# -#~ msgid "Background colour:" -#~ msgstr "Achtergrondkleur:" - -# -#~ msgid "Toolbar button labels:" -#~ msgstr "Werkbalkknoppen:" - -# -#~ msgid "Icons only" -#~ msgstr "Alleen iconen" - -# -#~ msgid "Text only" -#~ msgstr "Alleen tekst" - -# -#~ msgid "Icons and text" -#~ msgstr "Iconen en tekst" - -# -#~ msgid "Treat files with the following extensions as comments:" -#~ msgstr "Behandel bestanden met de volgende extensies als commentaar:" - -# -#~ msgid "of" -#~ msgstr "van" - -# -#~ msgid "Window size" -#~ msgstr "Venster grootte" - -# -#~ msgid "Page size" -#~ msgstr "Pagina groottte" - -# -#~ msgid "Lens size (px):" -#~ msgstr "Vergrootglas grootte (px):" - -# -#~ msgid "Update interval (milliseconds):" -#~ msgstr "Update interval (milliseconden):" - -# -#~ msgid "Lens" -#~ msgstr "Vergrootglas" - -# -#~ msgid "Library thumbnail sizes (px):" -#~ msgstr "Bibliotheekvoorbeelden grootte (px):" - -# -#~ msgid "Adjust colour" -#~ msgstr "Pas kleur aan" - -# -#~ msgid "Save values for future sessions" -#~ msgstr "Waarden opslaan voor volgende sessies." - -# -#~ msgid "Title" -#~ msgstr "Titel" - -# -#~ msgid "It reads ZIP, RAR and tar archives (also gzip or bzip2 compressed)" -#~ msgstr "" -#~ "Het kan zowel ZIP, RAR en tar archieven (inclusief gzip of bzip2 " -#~ "ingepakt) " - -# -#~ msgid "as well as plain image files." -#~ msgstr "als gewone afbeeldingen aan." - -# -#~ msgid "Developer and Swedish translation" -#~ msgstr "Ontwikkelaar en Zweedse vertaling" - -# -#~ msgid "Manage thumbnails" -#~ msgstr "Beheer voorbeelden" - -# -#~ msgid "Remove all stored thumbnails:" -#~ msgstr "Verwijder alle opgeslagen voorbeelden:" - -# -#~ msgid "Remove orphaned thumbnails:" -#~ msgstr "Verwijder verweesde voorbeelden:" - -# -#~ msgid "Convert" -#~ msgstr "Converteer" - -# -#~ msgid "Extension" -#~ msgstr "Extensie" - -# -#~ msgid "Zip archive" -#~ msgstr "Zip archief" - -# -#~ msgid "Delete old archive/directory" -#~ msgstr "Verwijder oude archief/folder" - -# -#~ msgid "Permission denied" -#~ msgstr "Permissie geweigerd" - -# -#~ msgid "Confirm operation" -#~ msgstr "Bevestig actie" - -# -#~ msgid "Permanently remove %s?" -#~ msgstr "%s permanent verwijderen?" - -# -#~ msgid "Perform lossless JPEG operation on %s?" -#~ msgstr "JPEG actie zonder kwaliteitsverlies toepassen op %s?" - -# -#~ msgid "Some images might be trimmed a bit during the operation." -#~ msgstr "" -#~ "Het kan zijn dat sommige afbeeldingen verknipt worden tijdens de " -#~ "transformatie." - -# -#~ msgid "Permanently convert %s to greyscale?" -#~ msgstr "%s permanent naar grijswaarden omzetten?" - -# -#~ msgid "Location:" -#~ msgstr "Locatie:" - -# -#~ msgid "Quantity:" -#~ msgstr "Hoeveelheid:" - -# -#~ msgid "Total size:" -#~ msgstr "Totale grootte:" - -# -#~ msgid "Removed:" -#~ msgstr "Verwijderd:" - -# -#~ msgid "Done!" -#~ msgstr "Klaar!" - -# -#~ msgid "pages" -#~ msgstr "pagina's" - -# -#~ msgid "comment" -#~ msgstr "commentaar" - -# -#~ msgid "comments" -#~ msgstr "commentaar" - -# -#~ msgid "In library" -#~ msgstr "In bibliotheek" - -# -#~ msgid "Yes" -#~ msgstr "Ja" - -# -#~ msgid "No" -#~ msgstr "Nee" - -# -#~ msgid "Bookmarked" -#~ msgstr "Bladwijzer gemaakt" - -# -#~ msgid "Yes, page" -#~ msgstr "Ja, pagina" - -# -#~ msgid "Mode" -#~ msgstr "Modus" - -# -#~ msgid "Pixel count" -#~ msgstr "Aantal pixels" - -# -#~ msgid "Pixel sum" -#~ msgstr "Pixel sum" - -# -#~ msgid "Extrema" -#~ msgstr "Extremen" - -# -#~ msgid "Mean" -#~ msgstr "Gemiddelde" - -# -#~ msgid "Median" -#~ msgstr "Mediaan" - -# -#~ msgid "Standard deviation" -#~ msgstr "Standaardafwijking" - -# -#~ msgid "Image 1" -#~ msgstr "Afbeelding 1" - -# -#~ msgid "Image 2" -#~ msgstr "Afbeelding 2" - -# -#~ msgid "Please check your permissions." -#~ msgstr "Controleer uw permissies alstublieft." - -# -#~ msgid "Adding library entries" -#~ msgstr "Bibliotheek referenties toevoegen" - -# -#~ msgid "Removing library entries" -#~ msgstr "Bibliotheek referenties verwijderen" - -# -#~ msgid "page" -#~ msgstr "pagina" - -# -#~ msgid "" -#~ "Could not find the unrar executable. Please install it if you wish to " -#~ "open RAR archives." -#~ msgstr "" -#~ "Kon de unrar executable niet vinden. Installeert u het alstublieft als u " -#~ "RAR archieven wil openen." - -# -#~ msgid "is not a file." -#~ msgstr "is niet een bestand." - -# -#~ msgid "does not exist." -#~ msgstr "bestaat niet." - -# -#~ msgid "Filetype of" -#~ msgstr "Bestandstype van" - -# -#~ msgid "not recognized." -#~ msgstr "wordt niet herkend." - -# -#~ msgid "_Best fit" -#~ msgstr "_Beste grootte" - -# -#~ msgid "Clear bookmarks" -#~ msgstr "Bladwijzers wissen" - -# -#~ msgid "_Manage thumbnails..." -#~ msgstr "_Beheer voorbeelden..." - -# -#~ msgid "Clear recent files" -#~ msgstr "Recente documenten wissen" - -# -#~ msgid "Open _library..." -#~ msgstr "Open _bibliotheek..." - -# -#~ msgid "Con_vert..." -#~ msgstr "Con_verteer..." - -# -#~ msgid "_Adjust colour..." -#~ msgstr "_Pas kleur aan..." - -# -#~ msgid "CW lossless JPEG rotation..." -#~ msgstr "JPEG rotatie zonder kwaliteitsverlies MKM..." - -# -#~ msgid "CCW lossless JPEG rotation..." -#~ msgstr "JPEG rotatie zonder kwaliteitsverlies TKI..." - -# -#~ msgid "Horizontal lossless JPEG flip..." -#~ msgstr "JPEG horizontaal spiegelen zonder kwaliteits verlies..." - -# -#~ msgid "Vertical lossless JPEG flip..." -#~ msgstr "JPEG verticaal spiegelen zonder kwaliteits verlies..." - -# -#~ msgid "Convert JPEG to greyscale..." -#~ msgstr "JPEG naar grijswaarden omzetten..." - -# -#~ msgid "File o_perations" -#~ msgstr "_Bestandstransformaties" - -# -#~ msgid "Enter fullscreen mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch volledig scherm modus gebruiken wanneer Comix wordt opgestart." - -# -#~ msgid "Enter double page mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch dubbele pagina modus gebruiken wanneer Comix wordt opgestart." - -# -#~ msgid "Enter manual zoom mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch handmatige zoom modus gebruik wanneer Comix wordt opgestart." - -# -#~ msgid "Enter fit-to-screen mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch fit-to-screen modus gebruiken wanneer Comix wordt opgestart." - -# -#~ msgid "Enter fit width mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch de rek naar breedte modus gebruiken wanneer Comix wordt " -#~ "gestart." - -# -#~ msgid "Enter fit height mode automatically when Comix is started." -#~ msgstr "" -#~ "Automatisch rek naar hoogte modus gebruik wanneer Comix gestart wordt." - -# -#~ msgid "" -#~ "Also scale images to a size that is larger than their original size in " -#~ "fit-to-screen mode, fit width mode and fit height mode." -#~ msgstr "" -#~ "..Afbeeldingen ook rekken naar een grootte groter dan hun originele " -#~ "grootte, wanneer in fit-to-screen modus, rek naar breedte modus en rek " -#~ "naar hoogte modus." - -# -#~ msgid "" -#~ "Scale the images independently when in double page mode and fit-to-screen " -#~ "mode. The smaller of the two images will scale up to fill any extra space " -#~ "that is given." -#~ msgstr "" -#~ "Schaal afbeeldingen onafhankelijk van elkaar in dubbele pagina en fit-to-" -#~ "screen modus. De kleinere van de twee afbeeldingen zal geschaald worden " -#~ "om extra ruimte op te vullen." - -# -#~ msgid "Automatically show any available comments when opening a new file." -#~ msgstr "" -#~ "Automatisch al het beschikbare commentaar tonen wanneer een nieuw bestand " -#~ "geopend wordt." - -# -#~ msgid "" -#~ "Cache the next page in the archive/directory to increase the perceived " -#~ "speed. This is generally recommended unless you are running low on RAM." -#~ msgstr "" -#~ "Cache de volgende pagina in het archief/de folder om de opgemerkte " -#~ "snelheid te verhogen. Dit wordt aangeraden, tenzij u weinig RAM heeft." - -# -#~ msgid "" -#~ "Move the horizontal scrollbar instead of the vertical when using the " -#~ "scroll wheel at the top or the bottom of the page. The direction will be " -#~ "determined by whether you use manga mode or not." -#~ msgstr "" -#~ "Scroll de horizontale scrollbalk in plaats van de verticale wanneer het " -#~ "scrollwiel aan de boven- of onderkant van de pagina wordt gebruikt. De " -#~ "richting wordt bepaald door (on)gebruik van manga modus." - -# -#~ msgid "" -#~ "Save the position and the size of the window for the next time you start " -#~ "Comix." -#~ msgstr "" -#~ "Sla de positie en grootte op van het venster voor de volgende keer dat " -#~ "Comix wordt gestart." - -# -#~ msgid "" -#~ "Automatically open the next archive in the directory when scrolling past " -#~ "the last page of the current archive, and automatically open the previous " -#~ "archive in the directory when scrolling past the first page of the " -#~ "current archive." -#~ msgstr "" -#~ "Open automatisch het volgende archief in de folder wanneer er voorbij de " -#~ "laatste pagina van het huidige archief wordt gescrolld en open " -#~ "automatisch het vorige archief in de folder wanneer er voorbij de eerste " -#~ "pagina van het huidige archief wordt gescrolld." - -# -#~ msgid "Hide the cursor when in fullscreen mode." -#~ msgstr "Verberg de cursor in volledig scherm modus." - -# -#~ msgid "" -#~ "Set the image scaling method. The best choice is often \"Tiles\", it is " -#~ "quite quick and produces almost as good results as \"Bilinear\" or \"Hyper" -#~ "\"." -#~ msgstr "" -#~ "Stel de afbeeldingsschalingsmethode in. De beste keuze is meestal \"Tiles" -#~ "\", het is vrij snel en produceert bijna net zulke goede resultaten als " -#~ "\"Bilinear\" en \"Hyper\"." - -# -#~ msgid "" -#~ "Treat files with the following extensions as comment files. Extensions " -#~ "should be separated by whitespaces. They are not case sensitive." -#~ msgstr "" -#~ "Behandel bestanden met deze extensies als commentaar. Extensies moeten " -#~ "van elkaar gescheiden worden met spaties. Extensies zijn niet " -#~ "hoofdlettergevoelig." - -# -#~ msgid "" -#~ "Use smart scrolling with the space key. Pressing the space key normally " -#~ "scrolls straight down one window height unless at the bottom of the page " -#~ "where it flips pages instead. When this option is set Comix automatically " -#~ "tries to follow the reading flow of the comic book. When pressing the " -#~ "space key it will not only scroll down but will also scroll horizontally " -#~ "to the edge of the page (left or right depending on whether you use manga " -#~ "mode). In double page mode it will go to the edge of the first page if it " -#~ "is in view, otherwise it will go to the edge of the second page. Also, in " -#~ "double page mode with this option, Comix will not flip pages unless at " -#~ "the bottom of the second page. At the bottom of the first page it will " -#~ "instead go to the top of the second page." -#~ msgstr "" -#~ "Gebruik intelligent scrollen met de spatietoets. Normaal scrollt u met de " -#~ "spatietoets 1 vensterhoogte naar beneden, tenzij u aan de onderkant van " -#~ "de pagina bent waar u naar de volgende pagina gaat. Met deze optie " -#~ "probeert Comix automatisch de leesstroom van het stripboek te volgen. " -#~ "Wanneer de spatie toets wordt ingedrukt, wordt er niet alleen verticaal " -#~ "gescrolld, maar ook horizontaal naar de rand van de pagina. In dubbele " -#~ "pagina modus wordt er ook naar de rand van de eerste pagina gescrolld als " -#~ "het in beeld is, zo niet gaat het naar de rand van de tweede pagina." - -# -#~ msgid "" -#~ "Automatically go to the same directory as last time when opening the " -#~ "\"Open\" dialog." -#~ msgstr "" -#~ "Ga automatisch naar dezelfde pagina als de vorige keer in het \"Open\" " -#~ "dialoogvenster." - -# -#~ msgid "Automatically go to this directory when opening the \"Open\" dialog." -#~ msgstr "Ga automatisch naar deze folder in het \"Open\" dialoogvenster." - -# -#~ msgid "Automatically restore these values the next time Comix is started." -#~ msgstr "" -#~ "Deze waarden de volgende keer weer gebruiken wanneer Comix gestart wordt." - -# -#~ msgid "Show the page number in the upper left corner of each thumbnail." -#~ msgstr "Toon pagina nummer in de linkerbovenhoek van elk voorbeeld." - -# -#~ msgid "" -#~ "Automatically adjust the contrast of the images so that the darkest pixel " -#~ "is completely black and the lightest pixel is completely white. This only " -#~ "works with images without an alpha channel." -#~ msgstr "" -#~ "Pas automatisch het contrast van afbeeldingen aan zodat de donkerste " -#~ "pixel helemaal zwart is en de lichtste helemaal wit is. Dit werkt alleen " -#~ "bij afbeeldingen zonder een alpha kanaal." - -# -#~ msgid "" -#~ "The space key uses smart scrolling as if in double page mode even when in " -#~ "single page mode. This can be useful for comics with two scanned pages in " -#~ "each image. The pages are assumed to be of equal size" -#~ msgstr "" -#~ "De spatietoets gebruikt intelligent scrollen zoals in de dubbele pagina " -#~ "modus, ook in de 1 pagina modus. Dit kan nuttig zijn voor stripboeken met " -#~ "twee gescande pagina's in elke afbeeldingen. Aangenomen is dat de " -#~ "pagina's even groot zijn." - -# -#~ msgid "Adjust the lens magnification factor." -#~ msgstr "Pas de vergrotingsfactor voor het vergrootglas aan." - -# -#~ msgid "" -#~ "Set the lens width and height in pixels. A larger lens will use more CPU " -#~ "resources than a small one." -#~ msgstr "" -#~ "Stel de hoogte en breedte van het vergrootglas in in pixels. Een groter " -#~ "vergrootglas gebruikt meer CPU resources dan een kleine." - -# -#~ msgid "" -#~ "Set the maximum update frequency for the magnification lens in " -#~ "milliseconds. Setting the value too low can cause the lens to lag behind " -#~ "when moving the mouse quickly. Setting the value too high can cause the " -#~ "lens to appear choppy." -#~ msgstr "" -#~ "Stel de maximale update frequentie voor het vergrootglas in in " -#~ "milliseconden. Wanneer de waarde te laag is, zal het vergrootglas " -#~ "achterlopen als de muis te snel bewogen wordt. Is de waarde te hoog. dan " -#~ "is het vergrootglas houterig." - -# -#~ msgid "" -#~ "Read and write thumbnails in the ~/.thumbnails directory as proposed by " -#~ "the freedesktop.org standard. With this preference set, Comix will use " -#~ "the thumbnails already stored there to speed up thumbnail loading. If " -#~ "there are no thumbnails, Comix will create them and save them there. This " -#~ "is a standard that many applications conform to, thumbnails created by " -#~ "other applications can be used by Comix and vice versa. If this " -#~ "preference is not set, Comix will create thumbnails on the fly every time " -#~ "a directory is opened." -#~ msgstr "" -#~ "Lees voorbeelden uit en schrijf voorbeelden naar de ~/.thumbnails folder " -#~ "zoals voorgesteld door de freedesktop.org standaard. Met deze instelling " -#~ "aan gebruikt Comix al aangemaakte voorbeelden wat een snellere ervaring " -#~ "oplevert. Zijn er nog geen voorbeelden, dan maakt Comix ze en slaat ze " -#~ "daar op. Dit is een standaard waar veel programma's mee werken, " -#~ "voorbeelden gemaakt door andere programmma's kunnen door Comix gebruikt " -#~ "worden en andersom. Is deze instelling uigezet, dan maakt Comix elke keer " -#~ "dat een archief geopend is voorbeelden opnieuw aan." - -# -#~ msgid "" -#~ "Also use stored thumbnails for images in archives in a similiar way. Due " -#~ "to restrictions in the freedesktop.org standard, these thumbnails will be " -#~ "stored in ~/.comix and will only be used by Comix. If this preference is " -#~ "not set, Comix will create thumbnails on the fly every time an archive is " -#~ "opened." -#~ msgstr "" -#~ "Sla ook voorbeelden voor afbeeldingen in archieven op. Wegens beperkingen " -#~ "van de freedektop.org standaard, worden deze voorbeelden in ~/.comix " -#~ "opgeslagen en alleen gebruikt door Comix. Is deze instelling uigezet, dan " -#~ "maakt Comix elke keer dat een archief geopend is voorbeelden opnieuw aan." - -# -#~ msgid "" -#~ "Only display a single image in double page mode if the image consists of " -#~ "two pages. An image is assumed to consist of two pages if its width is " -#~ "greater than its height." -#~ msgstr "" -#~ "Toon slechts 1 afbeelding in dubbele pagina modus wanneer de de " -#~ "afbeelding uit 2 pagina's bestaat. Het wordt aangenomen dat een " -#~ "afbeelding uit 2 pagina's bestaat wanneer ie wijder is dan dat ie hoog is." - -# -#~ msgid "Filter out archives with regular expressions." -#~ msgstr "Filter archieven met gebruikelijke expressies." - -# -#~ msgid "Apply filters on full paths rather than filenames." -#~ msgstr "" -#~ "Pas filters op volledige paden toe, in plaats van slechts bestandsnamen." - -# -#~ msgid "" -#~ "Store a list of the 10 last opened files that can be accessed through the " -#~ "menus." -#~ msgstr "" -#~ "Gebruik een lijst van de 10 laatste geopende bestanden welke geopend kan " -#~ "worden via de menu's." - -# -#~ msgid "No viewable files in" -#~ msgstr "Geen bekijkbare bestand in" - -# -#~ msgid "No images in" -#~ msgstr "Geen afbeeldingen in" - -# -#~ msgid "Save saturation and contrast for future sessions" -#~ msgstr "Sla saturatie en contrast op voor toekomstige sessies" - -# -#~ msgid "Saturation (default 1.0):" -#~ msgstr "Saturatie (standaard 1.0):" - -# -#~ msgid "Contrast (default 1.0):" -#~ msgstr "Contrast (standaard 1.0):" - -# -#~ msgid "Clear" -#~ msgstr "Verwijder" - -# -#~ msgid "" -#~ "Automatically restore the saturation and contrast values the next time " -#~ "Comix is started." -#~ msgstr "" -#~ "Volgende keer dat Comix wordt gestart, automatisch saturatie en contrast " -#~ "waarden hertoepassen." - -# -#~ msgid "Permanently remove" -#~ msgstr "Permanent verwijderen" - -# -#~ msgid "Perform lossless JPEG rotation on" -#~ msgstr "Pas JPEG rotatie zonder kwaliteitsverlies toe op" - -# -#~ msgid "Some images might be trimmed a bit during the rotation." -#~ msgstr "" -#~ "Het kan zijn dat sommige afbeeldingen verknipt worden tijdens het roteren." - -# -#~ msgid "Stretch small images in fit-to-screen mode" -#~ msgstr "Strek kleine afbeeldingen in fit-to-screen modus" - -# -#~ msgid "Manga mode (read right-to-left etc.)" -#~ msgstr "Manga modus (van rechts naar links enz.)" - -# -#~ msgid "" -#~ "Also scale images to a size that is larger than their original size in " -#~ "fit-to-screen mode." -#~ msgstr "Afbeeldingen ook groter schalen dan ze zijn in fit-to-screen modus." - -# -#~ msgid "" -#~ "View comics in manga mode. This means that the pages will be aligned " -#~ "right-to-left in double page mode and that the scrollbars will behave " -#~ "more convenient for right-to-left reading." -#~ msgstr "" -#~ "Stripboeken in manga modus bekijken. Dit betekent dat pagina's van rechts " -#~ "naar links in dubbele pagina modus worden uitgelijnd en dat scrollbalken " -#~ "zich beter zullen gedragen voor het van rechts naar links lezen." - -# -#~ msgid "Select new archive type:" -#~ msgstr "Selecteer nieuw archief type:" - -# -#~ msgid "New filename:" -#~ msgstr "Nieuwe bestandsnaam:" - -# -#~ msgid "Overwrite" -#~ msgstr "Overschrijven" - -# -#~ msgid "File exists" -#~ msgstr "Bestand bestaat" - -# -#~ msgid "" -#~ "already exists.\n" -#~ "Overwrite?" -#~ msgstr "" -#~ "Bestaat al.\n" -#~ "Overschrijven?" - -# -#~ msgid "" -#~ "is not a valid filename.\n" -#~ "File was not created." -#~ msgstr "" -#~ "is niet een geldige bestandsnaam.\n" -#~ "Bestand was niet aagemaakt." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/pl/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/pl/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/pl/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/pl/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3617 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-02-02 14:19+0100\n" -"Last-Translator: Dariusz Jakoniuk \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Comix czyta archiwa ZIP, RAR i tar, jak również zwykłe obrazy." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Imię" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Strona" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Umiejscowienie" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Uwagi" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Nie mozna odczytać %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Należy zauwazyć, że jedynymi plikami jakie są automatycznie dodawane do tej " -"listy, są pliki w archiwach, które Comix rozpoznaje jako komentarze." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Rozmiar" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Usuń z archiwum" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Edytuj archiwum" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Obrazki" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Uwagi" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Nowe archiwum nie może być zapisane!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Oryginalne pliki nie zostały usunięte." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Archiwa są przechowywane jako pliki zip." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Popraw obrazek" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Jasność" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Kontrast" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Nasycenie" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Ostrość" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Automatycznie dostosuj kontrast." - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Automatycznie dostosuj kontrast (jasość i ciemność), oddzielnie dla każdego " -"koloru." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Otwórz" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Zapisz" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Wszystkie pliki" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Wszystkie archiwa" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Archiwa %s" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Wszystkie obrazki" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Obrazy %s" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Plik o nazwie „%s“ już istnieje. Czy chcesz go nadpisać?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Nadpisanie pliku zmieni jego zawartość." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Dodaj książki" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Brak obrazów w „%s“" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Nie można otworzyć %s: Brak pliku." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Nie można otworzyć %s: Brak dostępu." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Nieznany typ pliku" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Poprzednia strona" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Następna strona" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Ostatnia strona" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Poprzednia strona" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Następna strona" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Poprzednia strona" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Następna strona" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Pierwsza strona" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Ostatnia strona" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Następna strona" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Edytuj archiwum" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Poprzednia strona" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Przewiń" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Przybliż" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Utrzymaj transformację" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Utrzymaj transformację" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "Obróć o 90° w kierunku ruchu wskazówek zegara" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Obróć o 180°" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Obróć o 90° przeciwnie do ruchu wskazówek zegara" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Przewróć w poziomie" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Przewróć w pionie" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Tryb dwóch stron" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Tryb dopasowania szerokości" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Tryb manga" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lupa" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Tryb najlepszego dopasowania" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Tryb dopasowania szerokości" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Tryb dopasowania wysokości" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Dopasuj na szerokość" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Ręczny tryb zoomu" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Pełen ekran" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "_Pasek stanu" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "_Paski przesuwania" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniatury" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "_Ukryj wszystkie" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Pokaz slajdów" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Pliki" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Inne pliki" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Zamknij" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Wyjdź" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Zapisz" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Archiwum" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Właściwości" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferencje" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteka" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Edytuj zakładki" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Nie mozna odczytać %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "POKAZ SLAJDÓW" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Archiwa są przechowywane jako pliki zip." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Archiwa są przechowywane jako pliki zip." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Uwagi" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Uwagi" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Poprzednia strona" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Uwagi" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Katalog miniatur" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Archiwa TAR" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Edytuj zakładki" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Przejdź" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Pamięć podręczna" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Wygląd" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Zachowanie" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Wyświetlanie" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Tło" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Użyj tego koloru jako tła" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Zawsze używaj tego wybranego koloru, jako koloru tła." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Używaj dynamicznego koloru tła." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "Automatycznie wybierz kolor tła, który pasuje do ogladanego obrazka." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Zawsze używaj tego wybranego koloru, jako koloru tła." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "Automatycznie wybierz kolor tła, który pasuje do ogladanego obrazka." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Pokaż numery stron w miniaturach." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Wielkośc miniatury (w pikselach)" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Przeźroczystość" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Użyj szachownicy jako tła dla przeźroczystych obrazów." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Użyj szarej szachownicy jako tła dla przeźroczystych obrazów. Jeśli ta opcja " -"nie jest wybrana, tło jest białe." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Użyj sprytnego przewijania klawiszem spacji." - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Użyj sprytnego przewijania klawiszem spacji. Normalnie klawisz spacji " -"przewija tylko do dołu (albo w górę, kiedy klawisz shift jest wciśnięty), " -"ale z ta opcją włączoną klawisz ten przesuwa obraz na bok, starając się " -"podążać za naturalnym porządkiem czytania komiksów." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "" -"Przeskocz do nastepnej strony, kiedy zakończono przegladanie bieżącej " - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Przeskocz do nastepnej strony, kiedy przewijając myszką lub strzałkami " -"natrafiono na koniec strony. Wymaga trzech kolejnych \"kroków\" kółkiem " -"myszki lub klawiszami strzałek, aby przeskoczyć do nastepnej strony." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Automatycznie otwórz następne archiwum." - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Automatycznie otwórz następne archiwum w katalogu, kiedy ukończono " -"przeglądanie ostatniej strony, albo poprzednie archiwum, jeśli ukończono " -"przeglądanie pierwszej ze stron." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Automatycznie otwórz następne archiwum." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Przeglądaj po dwie strony na raz w trybie dwóch stron." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Przeglądaj po dwie strony, zamiast po jednej, za każdym razem, gdy " -"przejdziesz do następnej strony, w trybie dwóch stron." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Pliki" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Podczas startu automatycznie otwórz ostatnio ogladany plik." - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Automatycznie otwórz podczas startu plik, który był otwarty, kiedy zamknięto " -"Comix" - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Przechowuj informację o ostatnio otwieranych plikach." - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Użyj trybu pełen ekran jako domyślnego." - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "" -"Automatycznie schowaj wszystkie paski narzędzi w trybie pełnego ekranu." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Tryb dopasowania szerokości" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Tryb dopasowania szerokości" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Dopasuj na szerokość" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Pokaz slajdów" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Opóźnienie pokazu slajdów (w sekundach)" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Opóźnienie pokazu slajdów (w sekundach)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Automatycznie otwórz następne archiwum." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Obrót" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "" -"Automatycznie obróć obrazy, stosownie do informacji zawartych w oglądanym " -"pliku grafiki." - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Automatycznie obróc obrazy, kiedy orjentacja jest określona w informacjach " -"obrazu, takich jak tagi Exif." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Skalowanie obrazu." - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Tryb manga" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Archiwa TAR" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Przechowuj miniatury dla otwartych plików." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Przechowuj miniatury dla otwartych plików zgodnie ze specyfikacją " -"freedesktop.org. Te miniatury są współdzielone przez wiele innych programów, " -"takich jak wiekszość menadżerów plików." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lupa" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Wielkość lupy (w pikselach)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Ustaw wielkość lupy. Lupa jest kwadratem z bokiem o tej ilości pikseli." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Współczynnik powiększenia" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Ustaw współczynnik lupy." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Rozszerzenia komentarzy" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Popraw obrazek" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Tryb dopasowania szerokości" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Tryb dopasowania wysokości" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Dodaj informację o wszystkich plikach otwieranych w Comix do listy ostatnio " -"otwieranych plików." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Przechowuj informację o ostatnio otwieranych plikach." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Traktuj wszystkie pliki znalezione wewnątrz archiwów, jeśli mają jedno z " -"tych zakończeń, jako komentarze." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Archiwum" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Obraz" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d stron" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d komentarze" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Użyty" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Zmieniony" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Uprawnienia" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Właściciel" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Pokaz slajdów" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Archiwum ZIP" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Archiwum RAR" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Archiwum tar" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Archiwum tar skopresowane przy użyciu gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Archiwum tar skopresowane przy użyciu bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Archiwum tar skopresowane przy użyciu gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Tłumaczenie na uproszczony chinski" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Tłumaczenie na hiszpański" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Tłumaczenie na portugalski brazylijski" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Tłumaczenie na niemiecki i thumbnailer w Nautilusie" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Tłumaczenie na perski" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Tłumaczenie na włoski" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Tłumaczenie na holenderski" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Tłumaczenie na francuski" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Tłumaczenie na polski" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Tłumaczenie na polski" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Tłumaczenie na grecki" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Tłumaczenie na kataloński" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Tłumaczenie na tradycyjny chiński" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Tłumaczenie na japoński" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Tłumaczenie na węgierski" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Tłumaczenie na rosyjski" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Tłumaczenie na chorwacki" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Tłumaczenie na kareański" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Tłumaczenie na perski" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Tłumaczenie na indonezyjski" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Tłumaczenie na czeski" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Tłumaczenie na włoski" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Tłumaczenie na grecki" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Tłumaczenie na włoski" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Projekt ikon" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Kopia)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Nastepna strona" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Poprzednia strona" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "Pierwsza strona" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "Ostatnia strona" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Zamknij" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Wyjdź" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Obróć o 90° w kierunku ruchu wskazówek zegara" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Obróć o 180°" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Obróć o 90° przeciwnie do ruchu wskazówek zegara" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Przewróć w poziomie" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Przewróć w pionie" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Zakładki" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Paski narzędziowe" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Edycja" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Otwórz ostatnie" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Plik" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Widok" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Pasek narzędzi" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Pomoc" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Pełen ekran" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Tryb podwójnej strony" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Pasek narzędzi" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Pasek menu" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "_Pasek stanu" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "_Paski przesuwania" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Miniatury" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Ukryj wszystkie" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Tryb manga" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Utrzymaj transformację" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "_Uruchom pokaz" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Lupa" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Tryb optymalnego przybliżenia" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Dopasuj na szerokość" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Dopasuj na wysokość" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Dopasuj na szerokość" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Tryb ręcznego przybliżenia" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_O programie" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Ustawienia" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "Edytuj archiwum" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Otwórz…" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Biblioteka" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Dodawanie książek" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Dodane książki" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Dodawanie „%s“…" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Kopia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Wszystkie książki" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Dodaj więcej książek do biblioteki." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Otwórz zaznaczoną książkę." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Usuń %(num)d książkę(książki) z „%(collection)s“." -msgstr[1] "Usuń %(num)d książkę(książki) z „%(collection)s“." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Usuń książki z biblioteki?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Wybrane książki zostaną usunięte z biblioteki (oryginalne pliki pozostaną " -"nietknięte). Czy jesteś pewny, że chcesz kontynuować?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Dodaj nowa pustą kolekcję." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Dodać nową kolekcję?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Proszę wstawić nazwę nowej kolekcji." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Nie można dodać nowej kolekcji o nazwie „%s“." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Kolekcja o tej nazwie już istnieje." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Zmienić nazwę kolekcji?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Wpisz nową nazwę dla wybranej kolekcji. " - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Nie można zmienić nazwy na „%s“." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Nie można zduplikować kolekcji." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Korzeń" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "Umieść kolekcję „%(subcollection)s“ w kolekcji „%(supercollection)s“." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Dodaj książki do „%s“." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Przenieś książki z „%(source collection)s“ do „%(destination collection)s“." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Szukaj" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Wyświetlaj tylko te książki, które mają speczyficzny tekst w swojej pełnej " -"ścieżce. Szukaj nie rozróżnia wielkich i małych liter." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Otwórz ostatnie" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Otwórz zaznaczoną książkę." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Usuń %(num)d książkę(książki) z „%(collection)s“." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nowa kolekcja" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Automatycznie dodaj ksiązki do tej kolekcji" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Katalog miniatur" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Archiwa TAR" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "Archiwa RAR" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "Obrazy JPEG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "Obrazy PNG" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Obrazy PNG" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Obrazki" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Obrazy PNG" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Nie można otworzyć %s: Nieznany typ pliku." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Użyj tego koloru jako tła" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Pamięć podręczna" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Dodaj kolekcję" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Katalog miniatur" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Katalog miniatur" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Archiwa są przechowywane jako pliki zip." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Archiwum" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Archiwum" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Archiwum" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Poprzednia strona" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Pokazuj tylko jeden szeroki obraz w trybie dwóch stron." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Pokazuj tylko jeden obraz w trybie dwóch stron, jeśli szerokość obrazu " -#~ "przekracza jego wysokość. Skutkuje to tym, że obrazowania, które obejmują " -#~ "dwie strony, są wyświetlane poprawnie (t.j. jako jeden obraz), również w " -#~ "trybie dwóch stron." - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Używaj dynamicznego koloru tła." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Domyślne tryby" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Użyj trybu dwóch stron jako domyślnego." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Użyj trybu manga jako domyślnego." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Rozciągnij obrazy do rozmiaru, który jest większy od ich oryginalnych " -#~ "wymiarów, jeżeli bieżący tryb zoomu tego wymaga. Jeśli ta opcja nie jest " -#~ "wybrana, obrazy nigdy nie są skalowane do rozmiaru większego, niż ich " -#~ "oryginalny rozmiar." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Wybrane książki zostaną usunięte z biblioteki (oryginalne pliki pozostaną " -#~ "nietknięte). Czy jesteś pewny, że chcesz kontynuować?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Czy usuńąć kolekcję z biblioteki?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Wybrana kolekcja zostanie usunięta z biblioteki (książki i podkolekcje w " -#~ "tej kolekcji pozostaną nadal w bibliotece). Czy jesteś pewny, że chcesz " -#~ "kontynuawać?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Usunięto %d książek z biblioteki." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Zmień nazwę…" - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Zduplikuj kolekcję" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Usuń kolekcję…" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "O programie" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix jest przegladarką obrazów stworzoną specjalnie do ogladania " -#~ "komiksów." - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix jest rozpowszechniany na licencji GNU General Public License." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Podziękowania" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Nie można znaleźć ekstraktora RAR!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Nie można znaleźć ekstraktora RAR!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Do odczytu RAR (.cbr) potrzebujesz mieć zainstalowany program rar " -#~ "albo unrar." - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Nie można zmienić nazwy na „%s“." - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Dodaj zakładkę" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Edytuj zakładki…" - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Usuń zakładki…" - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Usunąć wszystkie zakładki?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Wszystkie zakładki zostaną usunięte. Czy jesteś pewien, że chcesz " -#~ "kontynuować?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Na komputerze są przestarzałe pliki." - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Na komputerze znaleziono przestarzałe pliki (używane do przechowywania " -#~ "ustawień, biblioteki, ulubionych zakładek dla starszych wersji programu " -#~ "Comix). Jeżeli nie planujesz używać starszej wersji programu Comix, " -#~ "powinieneś usunąć te pliki, aby oszczędzić miejsce na dysku. Czy chcesz " -#~ "usunąć te pliki?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Nie mozna odczytać %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Importuj" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Ustawienia domyślne" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Nie można otworzyć %s: Jest katalogiem." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Nie mozna odczytać %s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Nie można zmienić nazwy na „%s“." - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Nie mozna odczytać %s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Usuń z biblioteki…" - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Nie można zduplikować kolekcji." - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Nie można zduplikować kolekcji." - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "Usuń z tej kolekcji" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "Usuń z biblioteki…" - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Wielkość okładki" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Strona" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Rozciągnij małe obrazy." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Domyślny tryb zoomu" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Pokaż numery stron w miniaturach." - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Edytuj archiwum" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Poprzednia strona" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "_Oddal" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "Rozmiar oryginalny" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "_Ręczny zoom" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "_Przekształć" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "_Obejrzyj komentarze…" - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Właściwości" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "_Ulepsz obraz" - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Programista" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Użyj pamięci podręcznej, aby przyśpieszyć przeglądanie." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Ładuj do pamięci obrazy, które będą wkrótce oglądane, aby przyśpieszyć " -#~ "ich przeglądanie. Odkąd poprawiono prędkości działania komputerów, " -#~ "rekomenduje się, aby zaznaczyć tę opcję, chybaże komputer jest wyposażony " -#~ "w małą ilość pamięci RAM." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Zarządzanie miniaturami" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Wyczyść" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Wyczyść miniatury" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Miniatury plików (takie jak pliki obrazów i archiwów komiksów) są " -#~ "przechowywane w Twoim katalogu domowym. Wiele róznych aplikacji używa i " -#~ "tworzy te miniatury, czasem pozostają mimo usunięcia oryginalnych plików " -#~ "- zajmując niepotrzebnie przestrzeń dysku. Można wyczyścić Twoje podglądy " -#~ "plików przez usunięcie osieroconych i porzuconych miniatur." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Całkowita ilość miniatur" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Obliczanie…" - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Całkowity rozmiar miniatur" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Czy chcesz usunąć teraz osierocone i przedawnione miniatury?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Usuwanie miniatur" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Ilość usuniętych miniatur" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Całkowita wielkość usuniętych miniatur" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Usunięta miniatura dla „%s“" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Zarządzanie podglądem" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2877 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: Marcelo Góes \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Ele lê arquivos ZIP, RAR e tar, bem como imagens normais." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Nome" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Página" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Local" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Comentários" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Não foi possível ler %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Por favor, note que os únicos arquivos adicionados automaticamente nesta " -"lista são os arquivos que o Comix reconhece como comentários." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Tamanho" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Remover do arquivo" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Editar arquivo" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Imagens" - -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Comentários" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "O novo arquivo não pôde ser gravado!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Os arquivos originais não foram removidos." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Arquivos são gravados em formato ZIP." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Melhorar imagem" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Brilho" - -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Contraste" - -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Saturação" - -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Nitidez" - -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Ajustar contraste automaticamente." - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Ajustar contraste (tanto claro quanto escuro) automaticamente, de maneira " -"separada para cada banda de cor." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Abrir" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Salvar" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Todos os arquivos avulsos" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Todos os arquivos" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "Arquivos %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Todas as imagens" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "Imagens %s" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Um arquivo com o nome '%s' já existe. Deseja substituí-lo?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "A substituição sobreescreverá seu conteúdo." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Adicionar livros" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Não há imagens em '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Impossível abrir %s: Arquivo não existe." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Impossível abrir %s: Permissão negada." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Tipo de arquivo desconhecido" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Página anterior" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Próxima página" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Última página" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Página anterior" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Próxima página" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Página anterior" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Próxima página" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Primeira página" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Última página" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Próxima página" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Editar arquivo" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Página anterior" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Rolagem" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "_Aumentar zoom" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "Manter transformação" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "Manter transformação" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "Ro_tação de 90 graus horários" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Rotação de 180 graus" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Ro_tação de 90 graus anti-horários" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Inverter _horizontalmente" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Inverter _verticalmente" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Modo de página dupla" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Modo ajustar largura" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Modo mangá" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Lente de aumento" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Modo de melhor encaixe" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Modo ajustar largura" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Modo ajustar altura" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Modo ajuste de largura" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Modo de zoom manual" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Tela cheia" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "Barra de status" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "Barra de rolagem" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniaturas" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Esconder todos" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Apresentação de slides" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Arquivos" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Outros arquivos" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Fechar" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "_Sair" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Salvar" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Arquivo" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Propriedades" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Preferências" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Biblioteca" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Editar favoritos" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Não foi possível ler %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "Apresentação de slides" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Arquivos são gravados em formato ZIP." - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Arquivos são gravados em formato ZIP." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Comentários" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Comentários" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "Pá_gina anterior" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Comentários" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Diretório de miniaturas" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Arquivos tar" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Editar favoritos" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Ir" - -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Cache" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Aparência" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Comportamento" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Tela" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Tela de fundo" - -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Usar essa cor na tela de fundo" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Sempre usar essa cor como cor de fundo." - -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Usar cor de fundo dinâmica." - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Escolher uma cor de fundo compatível com a imagem visualizada " -"automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Sempre usar essa cor como cor de fundo." - -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Escolher uma cor de fundo compatível com a imagem visualizada " -"automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Mostrar números de página nas miniaturas." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Tamanho da miniatura (em pixels)" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparência" - -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Usar fundo quadriculado para imagens transparentes." - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Usar fundo quadriculado cinza para imagens transparentes. Se esta " -"preferência não estiver marcada, o fundo usado é branco." - -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Usar rolagem inteligente com tecla de espaço." - -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Usar rolagem inteligente com telca de espaço. Normalmente, a tecla de espaço " -"só rola para baixo (ou para cima quando shift é apertado). No entanto, com " -"esta perferência também rola para os lados e tenta seguir a ordem natural de " -"leitura de uma história em quadrinhos." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Virar páginas quando rolar para fora da borda da página." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Virar páginas quando rolar \"para fora da página\" com a roda de roladagem " -"ou teclas de seta. São necessários três \"passos\" consecutivos com a roda " -"de rolagem ou teclas de seta para que as páginas sejam viradas." - -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Abre o próximo arquivo do diretório automaticamente quando virar após a " -"última página, ou o arquivo anterior quando virar antes da primeira página." - -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Virar duas páginas em modo de página dupla." - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Virar duas páginas, ao invés de uma, cada vez que virar página em modo de " -"página dupla." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Arquivos" - -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Abrir o último arquivo visto automaticamente quando abrir." - -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Abre, quando inicia, o arquivo que estava aberto quando o Comix foi fechado " -"da última vez." - -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Guarda informações sobre arquivos abertos recentemente." - -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Usar tela cheia por padrão." - -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Esconder todas as barras de ferramenta por padrão em tela cheia." - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Modo ajustar largura" - -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Modo ajustar largura" - -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Modo ajuste de largura" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Apresentação de slides" - -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Espera da apresentação de slides (em segundos)" - -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Espera da apresentação de slides (em segundos)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Abrir o próximo arquivo automaticamente." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Escala da imagem" - -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Modo mangá" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Arquivos tar" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Guardar miniaturas para arquivos abertos." - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Guarda miniaturas de arquivos abertos de acordo com a especificação do " -"freedesktop.org. Essas miniaturas são compartilhadas por vários outros " -"aplicativos, como a maior parte dos gerenciadores de arquivos." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Lente de aumento" - -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Tamanho da lente de aumento (em pixels)" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Ajustar o tamanho da lente de aumento. É um quadrado com esse tamanho de " -"pixels." - -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Fator de aumento" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Ajustar o fator de aumento da lente de aumento." - -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Comentar extensões" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Melhorar imagem" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Modo ajustar largura" - -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Modo ajustar altura" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Adicionar informações sobre todos os arquivos abertos dentro do Comix para a " -"lista de arquivos compartilhados recentes." - -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Guarda informações sobre arquivos abertos recentemente." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Tratar todos os arquivos avulsos dentro de arquivos, incluindo os que tem " -"terminação de arquivo, como comentários." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arquivo" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Imagem" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d páginas" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d comentários" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Acessado" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modificado" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Permissões" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Dono" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Apresentação de slides" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "Arquivo ZIP" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "Arquivo RAR" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Arquivo tar" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Arquivo tar comprimido com gzip" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Arquivo tar comprimido com bzip2" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Arquivo tar comprimido com gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Tradução para chinês simplificado" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Tradução para espanhol" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Tradução para português do Brasil" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Tradução para alemão e thumbnailer do Nautilus" - -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Tradução para persa" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Tradução para italiano" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Tradução para holandês" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Tradução para francês" - -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Tradução para polonês" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Tradução para polonês" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Tradução para grego" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Tradução para catalão" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Tradução para chinês tradicional" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Tradução para japonês" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Tradução para húngaro" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Tradução para russo" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Tradução para croata" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Tradução para coreano" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Tradução para persa" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Tradução para língua indonésia" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Tradução para checo" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "" - -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Tradução para italiano" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Tradução para grego" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Tradução para italiano" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Desenho dos ícones" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Cópia)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Próxima página" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "Pá_gina anterior" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "P_rimeira página" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Última página" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Fechar" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Sair" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Ro_tação de 90 graus horários" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotação de 180 graus" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Ro_tação de 90 graus anti-horários" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Inverter _horizontalmente" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Inverter _verticalmente" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "Favoritos" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "Barra de ferramentas" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "Editar" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Abrir recente" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Arquivo" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Exibir" - -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "Barra de ferramentas" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "A_juda" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "Tela cheia" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Modo de página dupla" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "Barra de ferramentas" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "Barra de menu" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "Barra de status" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "Barra de rolagem" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniaturas" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Esconder todos" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "Modo mangá" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Manter transformação" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Rodar apresentação de slides" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Lente de aumento" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "Modo de melhor ajuste" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Modo ajuste de largura" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Modo ajuste de altura" - -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Modo ajuste de largura" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "Modo de zoom manual" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "Sobre" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Preferências" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "Editar arquivo..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "Abrir..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "Biblioteca..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Adicionando livros." - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Livros adicionados" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Adicionando '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Cópia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Todos os livros" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Adicionar mais livros à biblioteca." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Abrir o livro selecionado." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Foram removidos %(num)d livro(s) de '%(collection)s'." -msgstr[1] "Foram removidos %(num)d livro(s) de '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Remover livros desta biblioteca?" - -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Os livros selecionados serão removidos da biblioteca (mas os arquivos " -"originais não serão modificados). Tem certeza de que deseja continuar?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Adicionar nova coleção vazia." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Adicionar nova coleção?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Por favor, digite o nome da nova coleção." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Impossível adicionar uma nova coleção chamada '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Uma coleção com esse nome já existe." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Renomear coleção?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Por favor, digite um novo nome para a coleção selecionada." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Impossível renomear para '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Impossível duplicar coleção." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Raiz" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Coloque a coleção '%(subcollection)s' na coleção '%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Adicionar livros para '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Mover livros de '%(source collection)s' para '%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Busca" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Mostrar só os livros que têm o texto especificado no seu caminho completo. A " -"busca não é sensível a maiúscula e minúscula." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Abrir recente" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Abrir o livro selecionado." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Foram removidos %(num)d livro(s) de '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Nova coleção" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Adicionar livros a esta coleção automaticamente" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Diretório de miniaturas" - -#~ msgid "Tar archives" -#~ msgstr "Arquivos tar" - -#~ msgid "RAR archives" -#~ msgstr "Arquivos RAR" - -#~ msgid "JPEG images" -#~ msgstr "Imagens JPEG" - -#~ msgid "PNG images" -#~ msgstr "Imagens PNG" - -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "Imagens PNG" - -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Imagens" - -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "Imagens PNG" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Impossível abrir %s: Tipo de arquivo desconhecido." - -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Usar essa cor na tela de fundo" - -#~ msgid "Cache" -#~ msgstr "Cache" - -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Adicionar coleção" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Diretório de miniaturas" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Diretório de miniaturas" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Arquivos são gravados em formato ZIP." - -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arquivo" - -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Página anterior" - -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Mostrar só uma imagem larga em modo de página dupl.a" - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Mostra só uma imagem em modo de página dupla, se a largura da imagem " -#~ "exceder sua altura. O resultado disto é que scans que passem de duas " -#~ "páginas são mostrados adequadamente (isto é, sozinhos) também em modo de " -#~ "página dupla." - -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Usar cor de fundo dinâmica." - -#~ msgid "Default modes" -#~ msgstr "Modos padrão" - -#~ msgid "Use double page mode by default." -#~ msgstr "Usar página dupla por padrão." - -#~ msgid "Use manga mode by default." -#~ msgstr "Usar modo mangá por padrão." - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Esticar imagens para um tamanho que é maior que seu tamanho original se o " -#~ "modo de zoom atual pedir. Se esta preferência não estiver marcada, as " -#~ "imagens nunca serão vistas maior que seu tamanho original." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Os livros selecionados serão removidos da biblioteca (mas os arquivos " -#~ "originais não serão modificados). Tem certeza de que deseja continuar?" - -#~ msgid "Remove collection from the library?" -#~ msgstr "Remover coleção da biblioteca?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "A coleção selecionada será removida da biblioteca (mas os livros e as sub-" -#~ "coleção dentro dela permanecerão). Tem certeza de que deseja continuar?" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Foram removidos %d livro(s) da biblioteca." - -#~ msgid "Rename..." -#~ msgstr "Renomear..." - -#~ msgid "Duplicate collection" -#~ msgstr "Coleção duplicada" - -#~ msgid "Remove collection..." -#~ msgstr "Remover coleção..." - -#~ msgid "About" -#~ msgstr "Sobre" - -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix é um visualizador de imagens desenhado especificamente para lidar " -#~ "com histórias em quadrinhos." - -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix é licenciado pela GNU General Public License." - -#~ msgid "Credits" -#~ msgstr "Créditos" - -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Não foi possível encontrar programa para extração de arquivo RAR!" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Não foi possível encontrar programa para extração de arquivo RAR!" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Você precisa do programa rar ou unrar instalado para poder " -#~ "ler arquivos RAR (.cbr)." - -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Impossível renomear para '%s'." - -#~ msgid "_Add bookmark" -#~ msgstr "_Adicionar favorito" - -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Editar favoritos..." - -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Limpar favoritos..." - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Limpar todos os favoritos?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Todos os favoritos gravados serão removidos. Tem certeza de que deseja " -#~ "continuar?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Existem arquivos antigos remanescentes no seu computador." - -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Alguns arquivos antigos (que eram usados para salvar preferências, a " -#~ "biblioteca, favoritos e outros, em versões antigas do Comix) foram " -#~ "encontrados em seu computador. Se você não planeja usar as versões " -#~ "antigas do Comix novamente, você deve remover esses arquivos para " -#~ "economizar espaço em disco. Deseja que esses arquivos sejam removidos " -#~ "para você agora?" - -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Não foi possível ler %s" - -#~ msgid "Import" -#~ msgstr "Importar" - -#~ msgid "Defaults" -#~ msgstr "Padrões" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Impossível abrir %s: É um diretório." - -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Não foi possível ler %s" - -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Impossível renomear para '%s'." - -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Não foi possível ler %s" - -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Remover da biblioteca..." - -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Impossível duplicar coleção." - -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Impossível duplicar coleção." - -#~ msgid "Remove from this collection" -#~ msgstr "Remover desta coleção" - -#~ msgid "Remove from the library..." -#~ msgstr "Remover da biblioteca..." - -#~ msgid "Cover size" -#~ msgstr "Tamanho da capa" - -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Página" - -#~ msgid "Stretch small images." -#~ msgstr "Esticar imagens pequenas." - -#~ msgid "Default zoom mode" -#~ msgstr "Modo de zoom padrão" - -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Mostrar números de página nas miniaturas." - -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Editar arquivo" - -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "Pá_gina anterior" - -#~ msgid "Zoom _out" -#~ msgstr "_Diminuir zoom" - -#~ msgid "O_riginal size" -#~ msgstr "Tamanho _original" - -#~ msgid "Manual _Zoom" -#~ msgstr "Zoom _manual" - -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "Transformar" - -#~ msgid "_View comments..." -#~ msgstr "Ver comentários..." - -#~ msgid "_Properties" -#~ msgstr "Propriedades" - -#~ msgid "_Enhance image..." -#~ msgstr "Melhorar imagem..." - -#~ msgid "Developer" -#~ msgstr "Desenvolvedor" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Usar um cache para aumentar velocidade de navegação." - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Faz cache das imagens que estão próximas a imagem vista atualmente para " -#~ "acelerar a navegação. Já que a melhoria de velocidade é grande, é " -#~ "recomendável ter esta preferência marcada, a menos que você esteja com " -#~ "pouca memória RAM." - -#~ msgid "Thumbnail maintenance" -#~ msgstr "Manutenção de miniatura" - -#~ msgid "Cleanup" -#~ msgstr "Limpar" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "Limpar miniaturas" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Miniaturas para arquivos avulsos (como arquivos de imagem e histórias em " -#~ "quadrinhos) são guardadas em seu diretório de usuário. Muitos aplicativos " -#~ "diferentes usam e criam essas miniaturas, mas algumas vezes as miniaturas " -#~ "permanecem apesar de os arquivos originais terem sido removidos - " -#~ "despediçando espaço. Este diálogo pode limpar miniaturas ao remover " -#~ "minaturas órfãs e ultrapassadas." - -#~ msgid "Total number of thumbnails" -#~ msgstr "Número total de miniaturas" - -#~ msgid "Calculating..." -#~ msgstr "Calculando..." - -#~ msgid "Total size of thumbnails" -#~ msgstr "Tamanho total das miniaturas" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Deseja limpar miniaturas órfãs ou ultrapassadas agora?" - -#~ msgid "Removing thumbnails" -#~ msgstr "Removendo miniaturas" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "Número de miniaturas removidas" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Tamanho total das miniaturas removidas" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Removida a miniatura de '%s'" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "Manutenção de miniaturas..." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ru/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/ru/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/ru/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/ru/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3668 +0,0 @@ -# Russian translation for MComix -# Translated by Artyom Smirnov , 2007. -# Евгений Лежнин (zlv) , 2011. -msgid "" -msgstr "" -"Project-Id-Version: MComix 0.90.4\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2016-01-10 18:09+0200\n" -"Last-Translator: Ulyanich Michael \n" -"Language-Team: Russian \n" -"Language: ru_RU\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 1.8.6\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" -"%s это программа просмотра изображений, ориентированная на чтение комиксов." - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"Она читает ZIP, RAR и tar архивы также хорошо, как обыкновенные файлы " -"изображений." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Не поддерживаемый формат архива: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Ошибка извлечения: %s" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Невозможно создать архив в \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, fuzzy, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Не удалось добавить файл %(sourcefile) в архив %(archivefile), отмена " -"действия..." - -# File: src/comment.py, line: 53 -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! Невозможно прочитать %s" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Не удалось прочитать файл закладок %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Редактировать закладки" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Тип" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Имя" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Страница" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Расположение" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "Добавить закладку" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "Управление закладками" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Комментарии" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Не удалось прочитать %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Заметьте, в этом списке изначально только те файлы, которые MComix считает " -"комментариями." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Размер" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Удалить из архива" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Редактировать архив" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "Импортировать" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Изображения" - -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "Комментировать файлы" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Новый архив не может быть сохранён!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Оригинальные файлы не были удалены." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Архивы сохраняются как ZIP файлы." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Улучшение изображения" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "Яркость:" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "Контрастность:" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "Насыщенность:" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "Резкость:" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "Автоматически подстроить контрастность" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Автоматически подстраивать контрастность (светлые и темные участки), " -"отдельно для каждой цветовой полосы." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Открыть" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Сохранить" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Все файлы" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "Все архивы" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "%s архивы" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Все изображения" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "%s изображения" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Файл с именем '%s' уже существует. Вы хотите заменить его?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Замена перепишет его содержимое." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Добавить книги" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Нет изображений в '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Не удалось открыть %s: Нет такого файла." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Не удалось открыть %s: Не хватает прав." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "Продолжить чтение со страницы %d?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Повреждённый конфигурационный файл \"%s\", удаляется..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Неверный путь: '%s'" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! Не удалось прочитать значок \"%s\"" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Неизвестный тип файла" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Предыдущая страница" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Следующая страница" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Назад на 10 страниц" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Вперёд на 10 страниц" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Предыдущая страница" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Следующая страница" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "Предыдущая страница (всегда одна страница)" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "Следующая страница (всегда одна страница)" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Первая страница" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Последняя страница" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Перейти на страницу" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Следующий архив" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Предыдущий архив" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Следующий каталог" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Предыдущий каталог" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Прокрутка" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Увеличить масштаб" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "Масштаб" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Уменьшить масштаб" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Нормальный размер" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "_Сохранить преобразования" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "_Сохранить преобразования" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "Повернуть на 90 градусов по _часовой стрелке" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "П_овернуть на 180 градусов" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "Повернуть на 90 градусов _против часовой стрелки" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "Отразить по _горизонтали" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "Отразить по _вертикали" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Двухстраничный режим" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "Режим просмотра" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Режим манги" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Лупа" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Наилучший режим масштабирования" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Растянуть по ширине" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Растянуть по высоте" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "Реальный размер" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Ручное масштабирование" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Выйти из полноэкранного режима" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Пользовательский интерфейс" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "Свернуть" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Полноэкранный режим" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "Показать/скрыть панель инструментов" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "Показать/скрыть панель меню" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "Показать/скрыть строку состояния" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "Показать/скрыть полосы прокрутки" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Миниатюры" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "Показать/скрыть всё" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Начать слайдшоу" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "Удалить" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "Файл" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "Обновить" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "Закрыть" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "Выйти" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "Сохранить и выйти" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "Сохранить как..." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Архив" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Свойства" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Параметры" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Библиотека" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "Выполнить внешнюю команду" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "Внешние команды" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "Клавиша %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! Требуется установить pysqlite2 или sqlite3." - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! Не удалось удалить файл \"%s\"" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "СЛАЙДШОУ" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Сохранить страницу как" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "Удалить \"%s\"?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "Файл будет удалён с вашего жёсткого диска." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Не спрашивать снова." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "'%s' отмечена неприменимой к архивам." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "Не получается выполнить команду %(cmdlabel)s: %(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "Команда на указана." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "Редактировать внешние команды" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "Добавить разделитель" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "Выполнить команду" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "Разделитель (псевдокоманда)." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "Метка (название)" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "Команда" - -# -# File: src/thumbremover.py, line: 58 -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "Рабочий каталог" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "Не применять к архивам" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "Редактировать команды" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "Перейти" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "Отменить" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " из %s" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Внешний вид" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Поведение" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Отображение" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Продвинутые" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Язык (потребуется перезапуск):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "Закрывать программу нажатием Escape" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"Когда активно, нажатие на клавишу Escape закрывает программу, вместо " -"выполнения выхода из полноэкранного режима." - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Фон" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Использовать этот цвет в качестве фона:" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Всегда использовать выбранный цвет в качестве фона." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Использовать динамический фоновый цвет" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Автоматически подбирать цвет фона, который подходит к показываемому " -"изображению." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Всегда использовать выбранный цвет, как цвет фона для миниатюр." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Автоматически подбирать цвет фона миниатюр, который подходит к показываемому " -"изображению." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Показывать номера страниц возле миниатюр" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Использовать обложку в качестве иконки программы" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"Когда эта опция включена, первая страница комикса устанавливается в качестве " -"иконки программы вместо стандартной иконки." - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Размер миниатюры (в пикселях):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Прозрачность" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Использовать клетчатый фон для прозрачных изображений." - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Использовать серый клетчатый фон для прозрачных изображений. Если это опция " -"отключена, в качестве фона будет использоваться сплошной белый цвет." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Использовать умную прокрутку" - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Обычно пробел и колесо мыши прокручивает только вниз и вверх (если нажата " -"клавиша Shift). С этой опцией они будут прокручивать и горизонтально, следуя " -"естественному порядку чтения страниц комикса." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Перелистывать при прокручивании за край страницы" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Перелистывать при прокручивании \"за страницу\" колёсиком мыши или " -"стрелками. Чтобы перелистнуть страницу, нужно будет сделать несколько " -"нажатий на стрелки или некоторое время крутить колёсико." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Автоматически открывать следующий архив" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Автоматически открывать следующий архив в текущем каталоге, при прокрутке " -"вниз последней страницы, или предыдущий архив, при прокрутке вверх первой " -"страницы." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Автоматически открывать следующую директорию" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Автоматически переходить в следующую директорию (на том же уровне " -"вложенности) при прокрутке вниз последней страницы последнего файла в " -"текущей директории, или, наоборот, в предыдущую директорию при прокрутке " -"вверх первой страницы первого файла в текущей директории." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "Количество пикселей, прокручиваемых нажатием на стрелку:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "Установить количество пикселей, прокручиваемых при нажатии на стрелки." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Количество пикселей, прокручиваемых поворотом колёсика мыши:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" -"Установить количество пикселей, прокручиваемых при использовании колёсика " -"мыши." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" -"Количество пикселей, прокручиваемых при нажатии на пробел (в процентах):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -#, fuzzy -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Количество \"шагов\" на страницу" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Установить количество \"шагов\", необходимых для перелистывания страницы. " -"Меньшее количество шагов позволит переворачивать страницы быстрее, " -"увеличивая шанс случайно перелистнуть страницу." - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Перелистывать по две страницы в двухстраничном режиме." - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -#, fuzzy -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "Перелистывать две страницы вместо одной в двухстраничном режиме." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Файлы" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "Автоматически открывать последний просмотренный файл при запуске" - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Автоматически при запуске открывать тот файл, который был открыт при выходе " -"из MComix в последний раз." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Сохранять информацию о недавно открытых файлах:" - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Использовать полноэкранный режим по умолчанию" - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Автоматически скрывать все панели в полноэкранном режиме" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Растянуть по ширине" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Растянуть по ширине" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Растянуть по _ширине" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Слайдшоу" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Задержка слайдшоу (в секундах):" - -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Шаг слайдшоу (в пикселях):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Указывает количество пикселей для прокрутки в режиме слайдшоу. Положительное " -"значение означает прокрутку вперёд, отрицательное — назад, 0 — прокрутка на " -"целую страницу." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Автоматически открывать следующий архив во время слайдшоу" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "В режиме слайдшоу следующий архив будет открыт автоматически." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Поворот" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "Автоматически разворачивать изображения в соответствии с метаданными" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Автоматически разворачивать изображения, если ориентация указана в " -"метаданных, например в Exif теге." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Качество изображений" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Режим масштабирования" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Порядок файлов" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "Сортировать файлы и каталоги по:" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "Сортировать архивы по:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "Максимальное количество страниц, хранимое в кеше" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Сохранять миниатюры для открытых файлов." - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Сохранять миниатюры открываемых файлов согласно спецификации freedesktop." -"org. Эти миниатюры используются многими другими приложениями, например, " -"большинством файловых менеджеров." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Максимальное количество страниц, хранимое в кеше:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Установить количество страниц в кеше. -1 означает сохранение всего архива." - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Лупа" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Размер лупы (в пикселях)" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "Устанавливает размер стороны квадратной лупы." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Коэффициент увеличения:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Устанавливает коэффициент увеличения лупы." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Расширения комментариев" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Улучшение изображения" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Авто-определение (По умолчанию)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Никогда" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Всегда" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"Показывать только одну страницу при просмотре первой страницы архива или " -"изображения, у которого ширина больше высоты." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Растянуть по ширине" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Растянуть по высоте" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Имя файла" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Размер файла" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Добавлять информацию о файлах открытых MComix в общий список недавно " -"использовавшихся документов." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "Удалить информацию о недавно открытых файлах?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Считать все файлы, найденные внутри архивов, которые имеют эти расширения, " -"комментариями" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Архив" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Изображение" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d страниц" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d комментариев" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Доступ" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Модифицирован" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Права" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Владелец" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[ПАРАМЕТРЫ...] [ПУТЬ]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Просмотр изображений и архивов комиксов." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Показать эту помощь и выйти." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Запустить приложение в режиме слайдшоу." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Открыть библиотеку при запуске." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Показать номер версии и выйти." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Режимы просмотра" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Запустить приложение в полноэкранном режиме." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Запустить приложение в режиме манги." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Запустить приложение в двухстраничном режиме." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Режимы масштаба." - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Параметры отладки" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "У вас не установлена нужная версия GTK+ и/или PyGTK." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "PyGTK не установлена." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "Эта ошибка может быть вызвана отсутствием библиотек GTK+." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "Нужная версия библиотеки PIL не найдена в системе." - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "Библиотека PIL установлена." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "Установленная версия PIL: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "Необходимая версия PIL: 1.1.5 и выше" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "Необходима библиотека PIL версии 1.1.5 и выше" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "Не найдена библиотека PIL" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Остановить слайдшоу" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Размер файла" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP архив" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR архивы" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar архив" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Tar архив сжатый gzip" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Tar архив сжатый bzip2" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Tar архив сжатый gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "PDF документ" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z архив" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA архив" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Разработчик Comix, оригинальной версии программы" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Разработчик MComix" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Упрощенный Китайский перевод" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Испанский перевод" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Бразильский Португальский перевод" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Немецкий перевод и генератор миниатюр для Nautilus" - -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "Немецкий перевод" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Итальянский перевод" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Голландский перевод" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Французский перевод" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "Польский перевод" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Польский перевод" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Греческий перевод" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Каталанский перевод" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Традиционный Китайский перевод" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Японский перевод" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Венгерский перевод" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Русский перевод" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Хорватский перевод" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Корейский перевод" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Персидский перевод" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Индонезийский перевод" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Чешский перевод" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Украинский перевод" - -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "Галисийский перевод" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "Шведский перевод" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "Перевод на Иврит" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Итальянский перевод" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Дизайн значков" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, fuzzy, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! Не удалось сохранить миниатюру \"%(thumbpath)\": %(error)" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "_Копировать" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Копировать текущую страницу в буфер обмена." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "Удалить" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Удалить текущий файл или архив с диска." - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "Следующая страница" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "П_редыдущая страница" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "Первая страница" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "П_оследняя страница" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "Перейти на _страницу..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Перейти на страницу..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "Обновить" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Переоткрыть текущие файлы или архив" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Следующий архив" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Предыдущий архив" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "Увеличить масштаб" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "Уменьшить масштаб" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "Нормальный размер" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Свернуть" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "Закрыть" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "В_ыход" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "Сохранить и выйти" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Повернуть на 90 градусов по _часовой стрелке" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "П_овернуть на 180 градусов" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Повернуть на 90 градусов _против часовой стрелки" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Отразить по _горизонтали" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Отразить по _вертикали" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "Сохранить как..." - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "Масштаб" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "Последние открытые" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Закладки" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Инструменты" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Редактировать" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "Открыть с помощью" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "Файл" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "Вид" - -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "П_анель инструментов" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "Помо_щь" - -# -# File: src/ui.py, line: 71 -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "Преобразовать изображение" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "Автоповорот изображения" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "... когда ширина больше высоты" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "... когда высота больше ширины" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "В полный _экран" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Полноэкранный режим" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "Двухстраничный режим" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "П_анель инструментов" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Меню" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "_Строка состояния" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "С_кроллеры" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Ми_ниатюры" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Скрыть _всё" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "Режим _манги" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "_Сохранить преобразования" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "Начать слайд_шоу" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "_Лупа" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Наилучший масштаб" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Растянуть по _ширине" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Растянуть по _высоте" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Растянуть по _ширине" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "_Ручное масштабирование" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_О программе" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "Комментарии..." - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Сво_йства" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Параметры" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Редактировать архив..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Открыть..." - -# -# File: src/ui.py, line: 123 -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "_Улучшение изображения..." - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Библиотека..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! Невозможно создать процесс \"%(command)\": %(error)" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "Архив защищён паролем:" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Добавление книг" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Добавленные книги:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Добавление '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! Книга #%i не существует" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! Не удалось загрузить обложку для книги \"%s\"" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! Не удалось добавить книгу \"%s\" в библиотеку" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! Не удалось добавить коллекцию \"%s\"" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "Невозможно добавить книгу %(book)s в коллекцию %(collection)s" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! Невозможно переименовать коллекцию на \"%s\"" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Копия)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "Последние" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Все книги" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "_Открыть" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "Открыть, _не закрывая библиотеку" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Добавить еще книг в библиотеку." - -# -# File: src/library.py, line: 492 -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Удалит_ь из коллекции" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -# -# File: src/library.py, line: 495 -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Удали_ть из библиотеки" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Открыть выбранную книгу." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Удалено %(num) книга из '%(collection)'." -msgstr[1] "Удалено %(num) книга из '%(collection)'." -msgstr[2] "Удалено %(num) книга из '%(collection)'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Удалить книги из библиотеки?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Выбранные книги будут удалены не только из библиотеки но и с жёсткого диска. " -"Вы уверены, что хотите продолжить?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Добавить новую пустую коллекцию." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "Переименовать" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Добавить новую коллекцию?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Пожалуйста, введите имя для новой коллекции." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Не удалось добавить новую коллекцию '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Коллекция с таким именем уже существует." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Переименовать коллекцию?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Пожалуйста, введите новое имя для выбранной коллекции." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Невозможно изменить имя на '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Не удалось скопировать коллекцию." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Корень" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Поместить коллекцию '%(subcollection)s' в коллекцию '%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Добавить книги в '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, fuzzy, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Переместить книги из '%(source collection)' в '%(destination collection)'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "Поиск:" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Показывать только те книги, в полном пути которых есть указанная строка. " -"Поиск нечувствителен к регистру." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Открыть с помощью" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Открыть выбранную книгу." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -#, fuzzy -msgid "Scanning for new books..." -msgstr "Поиск архивов..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Удалено %(num) книга из '%(collection)'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! Для использования библиотеки необходим sqlite." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Каталог" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Коллекция" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Автоматически добавить книги в эту коллекцию." - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "Установленная версия GTK+ : %s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "Необходимая версия GTK+ : 2.12.0 и выше\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "Установленная версия PyGTK : %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "Необходимая версия PyGTK : 2.12.0 и выше" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Каталог миниатюр" - -# -# File: src/filechooser.py, line: 82 -#~ msgid "ZIP archives" -#~ msgstr "ZIP архивы" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Tar архивы" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "RAR архивы" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "JPEG изображения" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "PNG изображения" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "GIF images" -#~ msgstr "GIF изображения" - -# -# File: src/edit.py, line: 50 -#~ msgid "TIFF images" -#~ msgstr "TIFF Изображения" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "BMP images" -#~ msgstr "BMP изображения" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Не удалось открыть %s: Неизвестный тип файла." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Использовать этот цвет как фон для миниатюр" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Кеш" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Добавить коллекцию" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Каталог миниатюр" - -# -# File: src/thumbremover.py, line: 58 -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Каталог миниатюр" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Архивы сохраняются как ZIP файлы." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Архив" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Архив" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Архив" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Предыдущий архив" - -#~ msgid "! Deleting corrupt bookmarks file." -#~ msgstr "! Удаление повреждённого файла закладок." - -#, fuzzy -#~ msgid "Delay thumbnail generation" -#~ msgstr "Задержка генерации миниатюр." - -#~ msgid "" -#~ "Thumbnails are generated only when required, instead of directly after " -#~ "opening a new file." -#~ msgstr "" -#~ "Миниатюры создаются создаются только при необходимости, а не после " -#~ "открытия файла." - -#~ msgid "Lead developer of MComix" -#~ msgstr "Ведущий разработчик MComix" - -# -# File: src/library.py, line: 271 -#~ msgid "! Non-supported archive format: %s" -#~ msgstr "! Формат архива не поддерживается: %s" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Показывать только одно широкое изображение в двухстраничном режиме." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Показывать только одно изображение в двухстраничном режиме, если его " -#~ "ширина больше высоты. В этом случае сканы, которые захватывают две " -#~ "страницы, будут отображаться корректно (т. е. по одному) в двухстраничном " -#~ "режиме." - -# -# File: src/preferences.py, line: 102 -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Использовать динамический цвет фона для миниатюр." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Режимы по умолчанию" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Двухстраничный режим по умолчанию." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Режим манги по умолчанию." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Растягивать изображения на размеры большие оригинальных, если текущий " -#~ "режим масштабирования предусматривает это. Если эта опция отключена, " -#~ "изображение никогда не будет растянуто больше чем на свой размер." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Выбранные книги будут удалены из библиотеки (но оригинальные файлы " -#~ "останутся не тронутыми). Вы уверены, что хотите продолжить?" - -# -# File: src/library.py, line: 597 -#~ msgid "Do you want to remove non-existent books from the library?" -#~ msgstr "Вы хотите удалить несуществующие книги из библиотеки?" - -#~ msgid "" -#~ "Books that appear in your library, but no longer exist at their original " -#~ "path, will be removed from the library. This clears books that have been " -#~ "moved or deleted outside of MComix." -#~ msgstr "" -#~ "Книги, которые есть в библиотеке, но были перемещены или удалены вне " -#~ "MComix, будут удалены из библиотеки." - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Удалить коллекцию из библиотеки?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Выбранная коллекция будет удалена из библиотеки (но книги и подколлекции " -#~ "в ней останутся). Вы уверены, что хотите продолжить?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Удалено %d книг(и) из библиотеки." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Переименовать..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Копировать коллекцию" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Удалить коллекцию..." - -# -# File: src/library.py, line: 597 -#~ msgid "Removes no longer existing books from the library." -#~ msgstr "Удаление несуществующих книг из библиотеки." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "О программе" - -# File: src/about.py, line: 55 -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "MComix — это просмотрщик, ориентированный на комиксы." - -# -# File: src/about.py, line: 59 -#~ msgid "MComix is released to the public domain." -#~ msgstr "MComix распространяется, как общественное достояние." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "О нас" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Добавить закладку" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Редактировать закладки..." - -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks" -#~ msgstr "_Очистить закладки" - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Очистить все закладки?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Все сохранённые закладки будут удалены. Вы уверены, что хотите продолжить?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "На вашем компьютере остались устаревшие файлы." - -# -# File: src/deprecated.py, line: 22 -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Некоторые устаревшие файлы (которые использовались для сохранения " -#~ "параметров, библиотеки, закладок и т. д. в старой версии MComix) были " -#~ "найдены на вашем компьютере. Если вы не планируете использовать старые " -#~ "версии Comix, вы можете удалить эти файлы и освободить немного места на " -#~ "диске. Вы хотите, чтобы эти файлы были удалены сейчас?" - -# -# File: src/comment.py, line: 53 -#~ msgid "! Could not remove %s" -#~ msgstr "! Не удалось прочитать %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Импорт" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "По умолчанию" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Не удалось открыть %s: Это каталог." - -# -# File: src/comment.py, line: 53 -#~ msgid "Completey _remove" -#~ msgstr "Полное _удаление" - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Размер обложки" - -#~ msgid "Add folder" -#~ msgstr "Добавить каталог" - -# -# File: src/library.py, line: 495 -#~ msgid "Clean library" -#~ msgstr "Очистить библиотеку" - -# -# File: src/bookmark.py, line: 256 -#~ msgid "Usage:" -#~ msgstr "Использование:" - -#~ msgid "" -#~ "\n" -#~ "View images and comic book archives.\n" -#~ msgstr "" -#~ "\n" -#~ "Просмотр картинок и архивов комиксов.\n" - -#~ msgid "Options:" -#~ msgstr "Параметры:" - -#~ msgid " -h, --help Show this help and exit." -#~ msgstr " -h, --help Показать эту справку и выйти." - -#~ msgid " -f, --fullscreen Start the application in fullscreen mode." -#~ msgstr "" -#~ " -f, --fullscreen Запустить приложение в полноэкранном режиме." - -#~ msgid " -l, --library Show the library on startup." -#~ msgstr " -l, --library Показывать библиотеку при старте." - -#~ msgid "PyGTK version 2.12.0 or higher is required to run MComix." -#~ msgstr "Для запуска MComix необходима PyGTK версии 2.12.0 и выше." - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Растягивать небольшие изображения." - -#~ msgid "Avoid possibly unintentional page flips." -#~ msgstr "Избегать непреднамеренных перелистываний." - -#~ msgid "Only flip to a new page if MComix is the top window. " -#~ msgstr "" -#~ "Перелистывать на следующую страницу, только если MComix главное окно." - -#~ msgid "This prevents the possibility of \"accidental\" page flips when " -#~ msgstr "Предотвращает возможность перелистывания при" - -#~ msgid "" -#~ "clicking on the MComix window surface while trying to make MComix the " -#~ msgstr "щелчке в области окна MComix, когда MComix становится" - -#~ msgid "top window." -#~ msgstr "главным окном." - -#~ msgid "Crash Recovery" -#~ msgstr "Восстановление после ошибок" - -#~ msgid "Enable crash recovery." -#~ msgstr "Включить восстановление после ошибок." - -#~ msgid "" -#~ "Crash recovery saves the current configuration information every " -#~ "specified seconds. In case of a crash the previous file will be re-" -#~ "loaded." -#~ msgstr "" -#~ "Конфигурация сохраняется каждые n секунд, и в случае критической ошибки " -#~ "конфигурация будет восстановлена." - -#~ msgid "Save the current configuration information every n seconds" -#~ msgstr "Сохранять конфигурация каждые n секунд" - -#~ msgid "" -#~ "Every n seconds the current configuration will be saved to disk. Choose " -#~ "a lower number if crashes are frequent on your machine. 30 seconds " -#~ "(default)" -#~ msgstr "" -#~ "Каждые n секунд текущая конфигурация будет сохраняться на диск. Выберите " -#~ "меньшее число, если сбои в работе вашего компьютера происходят часто. " -#~ "n=30 секунд по умолчанию." - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Режим масштабирования по умолчанию" - -#~ msgid "Page Numbers" -#~ msgstr "Количество страниц" - -# -# File: src/preferences.py, line: 117 -#~ msgid "Show page numbers." -#~ msgstr "Показывать номера страниц." - -#~ msgid "" -#~ "Show page numbers in the Title bar and the status bar. If unset the page " -#~ "numbers will be hidden." -#~ msgstr "" -#~ "Показывать номера страниц в заголовке окна и строке состояния. Номера не " -#~ "будут показываться, если опция отключена." - -#~ msgid "_Refresh file" -#~ msgstr "_Обновить файл" - -# -# File: src/edit.py, line: 28 -#~ msgid "_Next archive" -#~ msgstr "_Следующий архив" - -# -# File: src/ui.py, line: 36 -#~ msgid "_Previous archive" -#~ msgstr "П_редыдущий архив" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "_Отдалить" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "О_ригинальный размер" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Ручное масш_табирование" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "_Показать комментарии..." - -# -# File: src/archive.py, line: 66 -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "! Не могу найти разархиватор RAR файлов." - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Не могу найти разархиватор RAR файлов!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Вам необходимо установить программу rar или unrar, для " -#~ "чтения RAR (.cbr) файлов." - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "_Свойства" - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "Разработчик" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Использовать кэш для ускорения просмотра." - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Кэшировать следующее изображение, для увеличения скорости. Улучшение " -#~ "производительности заметно, поэтому рекомендуется включить эту опцию, но " -#~ "только если у вас достаточно свободной памяти." - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "Управление миниатюрами" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "Очистить" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "Очистить миниатюры" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Миниатюры для файлов (например изображений и архивов комиксов) хранятся в " -#~ "вашей домашней директории. Много различных приложений использует и " -#~ "создает эти миниатюры, но иногда миниатюры остаются, даже когда " -#~ "оригинальные файлы удалены, и занимают место на диске. Этот диалог " -#~ "очищает сохраненные миниатюры, удаляя осиротевшие и устаревшие." - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "Общее количество миниатюр" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "Подсчет..." - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "Общий размер миниатюр" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Вы хотите удалить осиротевшие и устаревшие миниатюры?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "Удаление миниатюр" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "Количество удаленных миниатюр" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Общий размер удаленных миниатюр" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Удалена миниатюра для '%s'" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Управление миниатюрами... " diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/sv/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/sv/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/sv/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/sv/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3559 +0,0 @@ -# Svensk katalog. -# -msgid "" -msgstr "" -"Project-Id-Version: MComix 0.90.4\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2018-02-24 08:43+0100\n" -"Last-Translator: Jonatan Nyberg \n" -"Language-Team: Swedish \n" -"Language: sv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s är en bildvisare speciellt utformad för att hantera serietidningar." - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "Den läser ZIP-, RAR- och tar-arkiv, samt vanliga bildfiler." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "% s är licensierad enligt villkoren i GNU General Public License." - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "En kopia av denna licens kan erhållas från %s" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "Arkivformat som inte stöds: %s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! Extraktionsfel: %s" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! Kunde inte skapa arkivet i sökvägen: \"%s\"" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! Kunde inte lägga till fil %(sourcefile)s till arkiv %(archivefile)s, " -"avbryter..." - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! Kunde inte läsa %s" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! Kunde inte parsa bokmärkesfil %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "Ersätt befintligt bokmärke på sidan %s?" -msgstr[1] "Ersätt befintliga bokmärken på sidorna %s?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" -"Den aktuella boken innehåller redan märkta sidor. Vill du ersätta dem med " -"ett nytt bokmärke på sidan %d? " - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" -"Om du väljer \"Nej\" skapas ett nytt bokmärke utan att påverka andra " -"bokmärken." - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "Redigera bokmärken" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "Typ" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Namn" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Sida" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Plats" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "Tillagd" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "Lägg till _bokmärke" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "_Redigera bokmärken..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! Återanrop %(function)r misslyckades: %(error)s" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Kommentarer" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Kunde inte läsa %s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Notera att de enda filer som automatiskt läggs till i denna lista är de " -"filer i arkiv som MComix känner igen som kommentarer." - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Storlek" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Ta bort från arkiv" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Redigera arkiv" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "_Importera" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Bilder" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "Kommentarer" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Det nya arkivet kunde inte sparas!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Originalfilerna har inte tagits bort." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Arkiven sparas i ZIP-format." - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Förbättra bild" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "Återställ till standardinställningar." - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "Spara de valda värdena som standard för framtida filer." - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "_Ljusstyrka:" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "_Kontrast:" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "F_ärgmättnad:" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "S_kärpa:" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "Justera kontrast _automatiskt" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Justera kontrast automatiskt (både ljushet och mörkhet), separat för varje " -"färgkomponent." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Öppna" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Spara" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Alla filer" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -msgid "All archives" -msgstr "Alla arkiv" - -# -# File: src/filechooser.py, line: 82 -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, python-format -msgid "%s archives" -msgstr "%s arkiv" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Alla bildfiler" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, python-format -msgid "%s images" -msgstr "%s bilder" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "En fil med namnet '%s' finns redan. Vill du ersätta den?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Ersätts filen så kommer dess innehåll att skrivas över." - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Lägg till böcker" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Inga bilder i '%s'" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Kunde inte öppna %s: Filen finns inte." - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Kunde inte öppna %s: Otillräckliga rättigheter." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "Fortsätt läsa från sidan %d?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"Du slutade läsa här den %(date) s, %(time)s. Om du väljer \"Ja\", kommer " -"läsningen att fortsätta på sidan %(page)d. I annat fall laddas den första " -"sidan." - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! Korrupt preferensfil \"%s\", raderar..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "Ogiltig sökväg: \"%s\"" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! Kunde inte ladda ikon \"%s\"" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Okänd filtyp" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Föregående sida" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "Navigering" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Nästa sida" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "Tillbaka tio sidor" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "Framåt tio sidor" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "Föregående sida (dynamisk)" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "Nästa sida (dynamisk)" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -msgid "Previous page (always one page)" -msgstr "Föregående sida (alltid en sida)" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -msgid "Next page (always one page)" -msgstr "Nästa sida (alltid en sida)" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Första sidan" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Sista sidan" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "Gå till sida" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "Nästa arkiv" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "Föregående arkiv" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "Nästa katalog" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "Föregående katalog" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "Rulla till nedre vänstra" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Scrollning" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "Rulla till botten centrum" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "Rulla till botten höger" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "Rulla till mellan vänster" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "Rulla till centrum" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "Rulla till mellan höger" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "Rulla till toppen vänster" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "Rulla till toppen centrum" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "Rulla till toppen höger" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "Rulla nedåt" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "Rulla uppåt" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "Rulla höger" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "Rulla vänster" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "Smart rulla uppåt" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "Smart rulla nedåt" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "Zooma in" - -# -# File: src/ui.py, line: 42 -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "Zooma" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "Zooma ut" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "Normal storlek" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "Behåll transformation" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "Transformation" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "Rotera 90 grader medurs" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "Rotera 180 grader" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "Rotera 90 grader moturs" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "Spegelvänd horisontellt" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "Spegelvänd vertikalt" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "Rotera aldrig automatiskt" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "Rotera automatiskt efter bredd" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "Rotera automatiskt efter höjd" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Dubbelsidesläge" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "Visningsläge" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Mangaläge" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "Vänd smart rullning" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Förstoringsglas" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "Sträck ut små bilder" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Bästa anpassningsläge" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Breddanpassningsläge" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Höjdanpassningsläge" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "Anpassa storleksläge" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Manuellt zoomläge" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "Avsluta fullskärm" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "Användargränssnitt" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "Visa OSD-panelen" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "Minimera" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Helskärm" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "Visa/dölj verktygsfältet" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "Visa / dölj menyfältet" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "Visa/dölj statusfältet" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "Visa/dölj rullningslister" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Miniatyrbilder" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "Visa/dölj alla" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "Starta bildspel" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "Ta bort" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "Fil" - -# -# File: src/edit.py, line: 51 -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "Uppdatera" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "Stäng" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "Avsluta" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "Spara och avsluta" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "Spara som" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "Arkiv kommentarer" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Egenskaper" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Inställningar" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Bibliotek" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "Utför externt kommando" - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "Externa kommandon" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" -"Tangentbindning för \"%(action)s\" åsidosätter snabbtangent för en annan " -"åtgärd." - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "Det gick inte att läsa tangentbindningar: %s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "Tangent %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! Kunde inte hitta varken pysqlite2 eller sqlite3." - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "Kunde inte ta bort filen \"%s\"" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "BILDSPEL" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "Spara sidan som" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "Ta bort \"%s\"?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "Filen kommer att tas bort från hårddisken." - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "Fråga inte igen." - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "'%s' är inaktiverat för arkiv." - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "Kunde inte köra kommandot %(cmdlabel)s: %(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "Kommandoraden är tom." - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "Ofullständig flyktsekvens. För en bokstavlig '%', använd '%%'." - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "Ofullständig citatsekvens. För en bokstavlig '\"', använd '%\"'." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "Filrelaterade variabler kan bara användas för filer." - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "Arkivrelaterade variabler kan bara användas för arkiv." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "Ogiltig flyktsekvens: %%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "Redigera externa kommandon" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "Lägg till _avskiljare" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "Kör _kommando" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "Detta är ett avskiljar-pseudo-kommando." - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "\"%s\" har inte en giltig arbetsmapp." - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "\"%s\" verkar inte ha en giltig exekverbar." - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "Kommandotikett" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "Förhandsvisning:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"Se extern kommando-dokumentation för en lista över " -"användbara variabler och andra tips." - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "Etikett" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "Kommando" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "Arbetsmapp" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "Inaktiverad i arkiv" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "Spara ändringar i kommandon?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"Du har gjort ändringar i listan över externa kommandon som inte har sparats " -"än. Tryck på \"Ja\" för att spara alla ändringar, eller \"Nej\" för att " -"kassera dem." - -# -# File: src/bookmark.py, line: 229 -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "_Redigera kommandon" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "_Gå" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "Avbryt" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " av %s" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Utseende" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Beteende" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Visning" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "Avancerat" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "Kortkommandon" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "Språk (kräver omstart):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "Tangenten Escape stänger programmet" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" -"När den är aktiv stänger tangenten ESC programmet, istället för att endast " -"inaktivera helskärmsläge." - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Bakgrundsfärg" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "Använd denna färg som bakgrund:" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Använd alltid denna valda färg som bakgrundsfärg." - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "Använd dynamisk bakgrundsfärg" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "Välj automatiskt en bakgrundsfärg som passar den visade bilden." - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Använd alltid denna valda färg som bakgrundsfärg till miniatyrbilder." - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Välj automatiskt en bakgrundsfärg som passar den visade miniatyrbilden." - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "Visa sidnummer på miniatyrbilder" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "Använd arkivminiatyrbild som applikationsikon" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" -"Genom att aktivera denna inställning kommer första sidan i en bok att " -"användas som applikationsikon istället för standardikonen." - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "Miniatyrbildsstorlek (i pixlar):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Transparens" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "Använd rutig bakgrund för transparenta bilder" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Använd en grårutig bakgrund till transparenta bilder. Om den här " -"inställningen är avaktiverad så används en helvit bakgrund istället." - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "Använd smart rullning" - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Med denna inställningsuppsättning rullar inte mellanslags- och mushjulet ner " -"eller uppåt, utan även sidledes och så försöker du följa serietidningens " -"naturliga läsorder." - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Vänd blad vid rullning förbi sidans kanter" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"Vänd blad när du scrollar \"bortom sidan\" med scrollhjulet eller med " -"piltangenterna. Det krävs tre på varandra följande \"steg\" med scrollhjulet " -"eller piltangenterna för att sidan ska vändas." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "Öppna automatiskt nästa arkivet" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Öppna automatiskt nästa arkiv i katalogen när vi bläddrar förbi den sista " -"sidan, eller det föregående arkivet när vi bläddrar förbi den första sidan." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "Öppna automatiskt nästa katalog" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"Öppna den första filen automatiskt i nästa broschyrkatalog när du bläddrar " -"över den sista sidan i den sista filen i en katalog eller i den tidigare " -"katalogen när du bläddrar över första sidan av den första filen." - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "Antal pixlar att rulla med piltangenterna:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "Ange antal pixlar att scrolla på en sida med piltangenterna." - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "Antal pixlar att rulla med mushjulet:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "Ange antal pixlar att scrolla på en sida med mushjulet." - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "Antal pixlar att rulla med piltangenterna:" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" -"Ställer in den procentandel som sidan ska rullas ner eller uppåt när " -"mellanslagstangenten trycks ned." - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "Antal nödvändiga \"steg\" innan bladet vänds:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"Ange antal nödvändiga \"steg\" som krävs för att bläddra till nästa eller " -"föregående blad. Färre steg medför snabbare vändning av blad men kan " -"innebära att du bläddrar av misstag." - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "Bläddra två sidor i dubbelsidesläge" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "" -"Bläddra två sidor, istället för en, varje gång vi byter sida i " -"dubbelsidesläge." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "Visa endast en sida där det är lämpligt:" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Filer" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "Öppna automatiskt den senast lästa filen vid uppstart" - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Öppna automatiskt, vid uppstart, den fil som var öppnad när MComix " -"avslutades senast." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "Lagra information om de senast öppnade filerna:" - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "Använd helskärm som standard" - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Göm automatiskt alla verktygsrader i helskärmsläge" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "Anpassa till storleksläge" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "Anpassa till bredd eller höjd:" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "Fast storlek för det här läget:" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Bildspel" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "Bildspelsfördröjning (i sekunder):" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "Bildspelssteg (i pixlar):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"Specificera antal pixlar att scrolla i bildspelsläge. En positiv siffra " -"kommer scrolla frammåt, en negativa siffra kommer scrolla bakåt och siffran " -"0 kommer göra att bildspelet alltid bläddrar till en ny sida." - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "Under ett bildspel öppnas automatiskt nästa arkiv" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "Vid bildspelsläge kommer nästa arkiv automatiskt öppnas." - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Rotation" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "Rotera bilder automatiskt enligt deras metadata" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Rotera bilder automatisk om en orientering finns specificerad i bildens " -"metadata, exempelvis i en Exif-tagg." - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "Bildkvalitet" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "Skaleringsläge" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "Filordning" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "Sortera filer och kataloger efter:" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "Sortera arkiv efter:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "Extraction och cacheminne" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "Maximalt antal samtidiga extraktionsgängor:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "Ange det maximala antalet samtidiga trådar för format som stöder det." - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "Lagra miniatyrbilder för öppnade filer" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Lagra miniatyrbilder för filer som öppnas, i enlighet med freedesktop.org-" -"specifikationen. Dessa miniatyrbilder delas av många andra program, " -"exempelvis de flesta filhanterare." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "Maximalt antal sidor att lagra i cacheminnet:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" -"Ange maximalt antal sidor att cacha. Ett värde av -1 kommer att cacha hela " -"arkivet." - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Förstoringsglas" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "Förstoringslenstorlek (i pixlar):" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "" -"Ange storleken på förstoringsglaset. Det är en kvadrat vars sida är så här " -"många pixlar bred." - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "Förstoringsfaktor:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Ange förstoringsfaktorn för förstoringsglaset." - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "Kommentarsfiländelser:" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -msgid "Animated images" -msgstr "Animerade bilder" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "Animeringsläge:" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "_Återställ tangenter" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "Återställer alla tangentbordskortkommandon till standardvärdena." - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "Rensa _dialogval" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "Rensar alla dialogval som du tidigare valt att inte bli ombedd igen." - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "Automatisk detektering (standard)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "Aldrig" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "Endast för titelsidor" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "Endast för breda bilder" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "Alltid" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" -"När du visar den första sidan i ett arkiv eller en bilds bredd överstiger " -"dess höjd visas bara en enda sida." - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "Passa till bredd" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "Passa till höjd" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "Ingen sortering" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "Filnamn" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "Filstorlek" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "Senast ändrad" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "Stigande" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "Fallande" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"Filerna öppnas och visas enligt den sorteringsordning som anges här. Det här " -"alternativet påverkar inte ordningen inom arkiv." - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "Naturlig ordning" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "Bokstavsordning" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"Filer inom arkiv sorteras baserat på ordning som anges här. Naturlig ordning " -"kommer att sortera numrerade filer baserat på deras naturliga ordning, dvs " -"1, 2, ..., 10, medan bokstavsordning använder standard C-sortering, d.v.s. " -"1, 2, 34, 5." - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Lägg till information om alla filer som öppnas inifrån MComix till den " -"delade listan med senast öppnade filer." - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "Ta bort information om nyligen öppnade filer?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"Detta tar bort alla poster från menyn \"Senaste\" och raderar information om " -"senaste lästa sidor." - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "Normal (snabb)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "Bilinjär" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "Hyperbolisk (långsam)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"Ändrar hur bilderna skalas. Långsammare algoritmer resulterar i högre " -"kvalitet storleksändring, men längre sidladdningstider." - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "Normal" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "Kontrollerar hur animerade bilder ska visas." - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Behandla alla filer funna i arkiv, som har en av dessa filändelser, som " -"kommentarer." - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Arkiv" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Bild" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d sidor" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d kommentarer" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Åtkomsttid" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Modifieringstid" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Rättigheter" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Ägare" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[ALTERNATIV...][SÖKVÄG]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "Visa bilder och serietidningsarkiv." - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "Visa den här hjälpen och avsluta." - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "Starta programmet i bildspelsläge." - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "Visa biblioteket vid uppstart." - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "Visa versionsnummer och avsluta." - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "Visa lägen" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "Starta programmet i helskärmsläge." - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "Starta programmet i mangaläge." - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "Starta programmet i dubbelsidigt läge." - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "Zoomlägen" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "Starta programmet med zoominställningen till bästa passform." - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "Starta programmet med zoominställningen för att passa bredden." - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "Starta programmet med zoominställningen för att passa höjden." - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "Felsökningsalternativ" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "Ställer in önskad utgångsloggnivå." - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "Du har inte de nödvändiga versionerna av GTK+ och PyGTK installerade." - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "Ingen version av PyGTK funnen på ditt system." - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "Det här felet kan orsakas av saknade GTK+-bibliotek." - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "Du saknar den nödvändiga versionen av Python Imaging" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "Biblioteket (PIL) installerat." - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "Installerad PIL-version är: %s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "Nödvändig PIL-version är: 1.1.5 eller högre" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "Python Imaging Library (PIL) 1.1.5 eller högre krävs." - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "Ingen version av Python Imaging Library funnet på ditt system." - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "Stoppa bildspel" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "Visa sidnummer" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "Visa filnummer" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "Visa upplösning" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "Visa sökväg" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "Visa filnamn" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "Visa filnamn" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP-arkiv" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR-arkiv" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar-arkiv" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Gzip-komprimerat tar-arkiv" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Bzip2-komprimerat tar-arkiv" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -msgid "XZ compressed tar archive" -msgstr "XZ-komprimerat tar-arkiv" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "PDF-dokument" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z-arkiv" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA-arkiv" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Första utvecklaren av Comix" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "MComix utvecklare" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Förenklad kinesisk översättning" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Spansk översättning" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Brasiliansk-portugisisk översättning" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Tysk översättning och miniatyrbildsskapare för Nautilus" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "Tysk översättning" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Italiensk översättning" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Nederländsk översättning" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Fransk översättning" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "Polsk översättning" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Polsk översättning" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Grekisk översättning" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Katalansk översättning" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Traditionell kinesisk översättning" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Japansk översättning" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Ungersk översättning" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Rysk översättning" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Kroatisk översättning" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Koreansk översättning" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Persisk översättning" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Indonesisk översättning" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Tjeckisk översättning" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Ukrainsk översättning" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "Galicisk översättning" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "Svensk översättning" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "Hebreisk översättning" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -msgid "Lithuanian translation" -msgstr "Litauisk översättning" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Ikondesign" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! Kunde inte spara miniatyrbild \"%(thumbpath)s\": %(error)s" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "Kopiera" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "Kopierar den aktuella sidan till Urklipp." - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "_Ta bort" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "Tar bort aktuell fil eller arkiv från disken." - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Nästa sida" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "F_öregående sida" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "_Första sidan" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Sista sidan" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "_Gå till sida..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "Gå till sida..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "_Uppdatera" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "Uppdaterar de för tillfället öppnade filerna eller arkivet." - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "Nästa _arkiv" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "Föregående a_rkiv" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "Zooma _in" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "Zooma _ut" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "_Normal storlek" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "Mi_nimera" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Stäng" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "Stänger alla öppna filer." - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "_Avsluta" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "_Spara och avsluta" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" -"Avslutar och återställer den öppnade filen nästa gång programmet startar." - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "_Rotera 90 grader medsols" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Rotera 180 _grader" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Rot_era 90 grader motsols" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "S_pegelvänd horisontellt" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Spegelvänd _vertikalt" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "Spara _som" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "_Zooma" - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "Senaste" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Bokmärken" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "_Verktygsrader" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Redigera" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "Öppna _med" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Arkiv" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Visa" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "_Verktyg" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Hjälp" - -# -# File: src/ui.py, line: 71 -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "_Transformera bild" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "_Automatisk rotera bild" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "... när bredden överstiger höjden" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "... när höjden överstiger bredden" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "_Helskärmsläge" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "Fullskärmsläge" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Dubbelsidesläge" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Verktygsrad" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Menyrad" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "St_atusrad" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "_Rullningslister" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "Miniat_yrbilder" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "_Göm alla" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "_Mangaläge" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "Invertera smart rullningsriktning." - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "Behåll transf_ormation" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" -"Behåller den för närvarande valda transformationen för de följande sidorna." - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "Starta _bildspel" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Förstorings_glas" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "Sträck ut bilder för att passa skärmen, beroende på zoomläge." - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Bästa anpassningsläge" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Br_eddanpassningsläge" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "H_öjdanpassningsläge" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "Passa _storleksläge" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "M_anuellt zoomläge" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Om" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "Ko_mmentarer..." - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "Egensk_aper" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "Inst_ällningar" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "R_edigera arkiv..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "Öppnar arkivredigeraren." - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Öppna..." - -# -# File: src/ui.py, line: 123 -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "Fö_rbättra bild..." - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "Bib_liotek..." - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! Arbetstråd bearbetning %(function)r misslyckades: %(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "Arkivet är lösenordsskyddat:" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"%(filename)ss extraherade storlek är %(actual_size)d bytes, men borde vara " -"%(expected_size)d bytes. Arkivet kan vara skadat eller i ett format som inte " -"stöds." - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Lägger till böcker" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "Tillagda böcker:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Lägger till '%s'..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! Ickeexisterande bok #%i" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! Kunde inte hämta omslag för boken \"%s\"" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! Kunde inte lägga till boken \"%s\" till biblioteket" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "Kunde inte lägga till samling \"%s\"" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "! Kunde inte lägga till boken %(book)s till samlingen %(collection)s" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "Kunde inte döpa om samlingen till \"%s\"" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Kopia)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "Kunde inte bestämma biblioteksdatabasversionen!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "Uppgradering av biblioteksdatabasversionen från %(from)d till %(to)d." - -# -# File: src/ui.py, line: 63 -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "Senaste" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Alla böcker" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "Biblioteksböcker" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "Öppna" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "Öppnar de valda böckerna för visning." - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "_Öppna utan att stänga bibliotek" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "Öppnar de valda böckerna, men håller biblioteksfönstret öppet." - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "_Lägg till..." - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Lägg till fler böcker till biblioteket." - -# -# File: src/library.py, line: 492 -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "Ta bort från den här _samlingen" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "Tar bort de valda böckerna från den aktuella samlingen." - -# -# File: src/library.py, line: 495 -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "Ta bort från biblioteket" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "Tar helt bort de valda böckerna från biblioteket." - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "_Radera och ta bort från disk" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "Tar bort de valda böckerna från disken." - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "Kopierar den valda bokens väg till urklipp." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "_Sortera" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "Ändrar sorteringsordning för biblioteket." - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "Omslagssto_rlek" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "Ändrar bokomslagets storlek." - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "Boknamn" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "Fullständig sökväg" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "Datum tillagd" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "Jättestor" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "Stor" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "Liten" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "Mycket liten" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "Anpassa..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "Ställ in bibliotekets omslagsstorlek" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Tog bort %(num)d bokr från '%(collection)s'." -msgstr[1] "Tog bort %(num)d böcker från '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "Tog bort %d bok från biblioteket." -msgstr[1] "Tog bort %d böcker från biblioteket." - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Ta bort böcker från biblioteket?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"De valda böckerna tas bort från biblioteket och tas bort permanent. Är du " -"säker på att du vill fortsätta?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "Bibliotekssamlingar" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "Ny" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Lägg till en ny tom samling." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "Dö_pa om" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "Döper om den valda samlingen." - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "_Duplicera" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "Skapar en kopia av den valda samlingen." - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "_Städa upp" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "Tar bort inte längre befintliga böcker från samlingen." - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "_Ta bort" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "Tar bort den valda samlingen." - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Lägg till ny samling?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Ange ett namn åt den nya samlingen." - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Kunde inte lägga till en ny samling med namnet '%s'." - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "En samling med det namnet finns redan." - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Döp om samling?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Ange ett nytt namn för den markerade samlingen." - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Kunde inte ändra namnet till '%s'." - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Kunde inte duplicera samling." - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Rot" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "Lägg samlingen '%(subcollection)s' i samlingen '%(supercollection)s'." - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Lägg till böcker i '%s'." - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Flytta böcker från '%(source collection)s' till '%(destination collection)s'." - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "_Sök:" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Visa endast de böcker där den angivna textsträngen förekommer i deras " -"sökväg. Sökningen är oberoende av gemener och versaler." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "_Bevakningslista" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "Öppna hanteringsdialogruta för bevakningslistans." - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Öppna _med" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Öppna den markerade boken." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "Avslutade läsning den %(date)s, %(time)s" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "Letar efter nya böcker..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "Lade till ny bok '%(bookname)s' från katalogen '%(directory)s'." - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Lade till %(count)d nya böcker från katalogen '%(directory)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "Inga nya böcker hittades i katalogen '%s'." - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! Du behöver en sqlite wrapper för att använda biblioteket." - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "Bevakningslista för bibliotek" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "_Skanna nu" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "Katalog" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "Samling" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "Med underkataloger" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "_Lägg till" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "Skanna automatiskt efter nya böcker när biblioteket _öppnas" - -#~ msgid "Don't update fontconfig cache at startup." -#~ msgstr "Uppdatera inte fontconfig-cachen vid uppstart." - -#~ msgid "Update fontconfig cache at startup." -#~ msgstr "Uppdatera fontconfig-cachen vid uppstart." - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "Installerad GTK+ version är: %s" - -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "Krävd GTK+ version är: 2.12.0 eller högre" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "Installerad PyGTK version är: %s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "Nödvändig PyGTK version är: 2.12.0 eller högre" - -# -# File: src/filechooser.py, line: 82 -#~ msgid "ZIP archives" -#~ msgstr "ZIP-arkiv" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Tar-arkiv" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "RAR-arkiv" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "JPEG-bilder" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "PNG-bilder" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "GIF images" -#~ msgstr "GIF-bilder" - -# -# File: src/edit.py, line: 50 -#~ msgid "TIFF images" -#~ msgstr "TIFF-bilder" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "BMP images" -#~ msgstr "BMP-bilder" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Kunde inte öppna %s: Okänd filtyp." - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Använd denna färg som bakgrund för miniatyrbilder" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "Cache" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Lägg till samling" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Arkiven sparas i ZIP-format." - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Arkiv" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Arkiv" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Arkiv" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Föregående arkiv" - -#~ msgid "! Deleting corrupt bookmarks file." -#~ msgstr "! Raderar korrupt bokmärkesfil." - -#, fuzzy -#~ msgid "Delay thumbnail generation" -#~ msgstr "Fördröj generering av miniatyrbilder." - -#~ msgid "" -#~ "Thumbnails are generated only when required, instead of directly after " -#~ "opening a new file." -#~ msgstr "" -#~ "Miniatyrbilder är genererade när de behövs, istället för omgående efter " -#~ "att en ny fil har öppnats." - -#~ msgid "Lead developer of MComix" -#~ msgstr "Huvudutvecklaren av MComix" - -# -# File: src/library.py, line: 271 -#~ msgid "! Non-supported archive format: %s" -#~ msgstr "! Stödjer inte akrivformatet: %s" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Visa endast en bred bild i dubbelsidesläge." - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Visa endast en bild i dubbelsidesläge, om bildens bredd överstiger dess " -#~ "höjd. Effekten av detta är att en scan som innehåller två sidor visas " -#~ "ensam också i dubbelsidesläge." - -# -# File: src/preferences.py, line: 102 -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Använd dynamisk bakgrundsfärg till miniatyrbilder." - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "Standardlägen" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "Använd dubbelsidesläge som standard." - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "Använd mangaläge som standard." - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Dra ut bilder till en storlek som är större än deras originalstorlek om " -#~ "zoomningsläget kräver det. Om denna inställning är avaktiverad så blir " -#~ "bilder aldrig skalade till en storlek som övergår deras originalstorlek." - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "De markerade böckerna kommer att tas bort från biblioteket (men " -#~ "originalfilerna kommer att förbli orörda). Är du säker på att du vill " -#~ "fortsätta?" - -# -# File: src/library.py, line: 597 -#~ msgid "Do you want to remove non-existent books from the library?" -#~ msgstr "Vill du ta bort icke-existerande böcker från biblioteket?" - -#~ msgid "" -#~ "Books that appear in your library, but no longer exist at their original " -#~ "path, will be removed from the library. This clears books that have been " -#~ "moved or deleted outside of MComix." -#~ msgstr "" -#~ "Böcker som finns i ditt bibliotek men utan att existera i den " -#~ "ursprungliga sökvägen kommer att tas bort från biblioteket." - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "Ta bort samling från biblioteket?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Den markerade samlingen kommer att tas bort från biblioteket (men " -#~ "böckerna och undersamlingarna i den kommer att vara kvar). Är du säker på " -#~ "att du vill fortsätta?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Tog bort %d antal böcker från biblioteket." - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "Döp om..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "Duplicera samling" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "Ta bort samling..." - -# -# File: src/library.py, line: 597 -#~ msgid "Removes no longer existing books from the library." -#~ msgstr "Ta bort icke-existerande böcker från biblioteket?" - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "Om" - -# -# File: src/about.py, line: 55 -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "MComix är en bildvisare som är särskilt designad för att visa " -#~ "serietidningar." - -# -# File: src/about.py, line: 59 -#~ msgid "MComix is released to the public domain." -#~ msgstr "MComix är licensierat under General Public License." - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "Tack" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "_Lägg till bokmärke" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "R_edigera bokmärken..." - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks" -#~ msgstr "_Töm bokmärken" - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "Töm alla bokmärken?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Alla lagrade bokmärken kommer att tas bort. Är du säker på att du vill " -#~ "fortsätta?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "Det finns föråldrade filer kvarlämnade på din dator." - -# -# File: src/deprecated.py, line: 22 -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Några gamla filer (som användes för att lagra inställningar, biblioteket, " -#~ "bokmärken etc. för äldre versioner av MComix) har hittats på din dator. " -#~ "Om du inte planerar att använda de äldre versionerna av MComix igen, så " -#~ "bör du ta bort dessa filer för att spara diskutrymme. Vill du att dessa " -#~ "filer tas bort åt dig nu?" - -# -# File: src/comment.py, line: 53 -#~ msgid "! Could not remove %s" -#~ msgstr "! Kunde inte ta bort %s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "Importera" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "Återställ" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Kunde inte öppna %s: Är en katalog." - -# -# File: src/comment.py, line: 53 -#~ msgid "Completey _remove" -#~ msgstr "Fullständig borttagning" - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "Omslagsstorlek" - -#~ msgid "Add folder" -#~ msgstr "Lägg till mapp" - -# -# File: src/library.py, line: 495 -#~ msgid "Clean library" -#~ msgstr "Rensa biblioteket" - -# -# File: src/bookmark.py, line: 256 -#~ msgid "Usage:" -#~ msgstr "Användning: " - -#~ msgid "" -#~ "\n" -#~ "View images and comic book archives.\n" -#~ msgstr "" -#~ "\n" -#~ "Visa bilder och serietidningsarkiv.\n" - -#~ msgid "Options:" -#~ msgstr "Alternativ:" - -#~ msgid " -h, --help Show this help and exit." -#~ msgstr " -h, --help Visa den här hjälpen och avsluta." - -#~ msgid " -f, --fullscreen Start the application in fullscreen mode." -#~ msgstr " -f, --fullscreen Starta programmet i fullskärmsläge." - -#~ msgid " -l, --library Show the library on startup." -#~ msgstr " -l, --library Visa biblioteket vid uppstart." - -#~ msgid "You don't have the required versions of GTK+ and/or PyGTK installed." -#~ msgstr "" -#~ "Du har inte de rätta versionerna av GTK+ och/eller PyGTK installerade." - -#~ msgid "PyGTK version 2.12.0 or higher is required to run MComix." -#~ msgstr "PyGTK version 2.12.0 krävs för att köra MComix." - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "Dra ut små bilder." - -#~ msgid "Avoid possibly unintentional page flips." -#~ msgstr "Undvik oönskad bladvändning." - -#~ msgid "Only flip to a new page if MComix is the top window. " -#~ msgstr "Vänd endast blad om MComix är toppfönster." - -#~ msgid "This prevents the possibility of \"accidental\" page flips when " -#~ msgstr "" -#~ "Det här förhindrar möjligheten till \"oavsiktlig\" bladvändning när " - -#~ msgid "" -#~ "clicking on the MComix window surface while trying to make MComix the " -#~ msgstr "ett musklick används för att göra MComix till ett " - -#~ msgid "top window." -#~ msgstr "toppfönster." - -#~ msgid "Crash Recovery" -#~ msgstr "Kraschåterhämtning" - -#~ msgid "Enable crash recovery." -#~ msgstr "Möjliggör kraschåterhämtning." - -#~ msgid "" -#~ "Crash recovery saves the current configuration information every " -#~ "specified seconds. In case of a crash the previous file will be re-" -#~ "loaded." -#~ msgstr "" -#~ "Kraschåterhämtning sparar den nuvarande konfigurationsinformationen vid " -#~ "specificerat sekundintervall. Vid en krasch kommer föregående fil att " -#~ "återladdas." - -#~ msgid "Save the current configuration information every n seconds" -#~ msgstr "Spara den nuvarande konfigurationsinformationen var n sekund" - -#~ msgid "" -#~ "Every n seconds the current configuration will be saved to disk. Choose " -#~ "a lower number if crashes are frequent on your machine. 30 seconds " -#~ "(default)" -#~ msgstr "" -#~ "Var n sekund kommer den nuvarande konfigurationen att bli sparad till " -#~ "disk. Välj en lägre siffra om krascher är vanliga på din maskin. 30 " -#~ "sekunder (standard)" - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "Standardzoomläge" - -#~ msgid "Page Numbers" -#~ msgstr "Sidnummer" - -# -# File: src/preferences.py, line: 117 -#~ msgid "Show page numbers." -#~ msgstr "Visa sidnummer." - -#~ msgid "" -#~ "Show page numbers in the Title bar and the status bar. If unset the page " -#~ "numbers will be hidden." -#~ msgstr "Visa sidnummer i namnlisten och i statusfältet." - -#~ msgid "_Refresh file" -#~ msgstr "_Uppdatera fil" - -# -# File: src/edit.py, line: 28 -#~ msgid "_Next archive" -#~ msgstr "Nästa arkiv" - -# -# File: src/ui.py, line: 36 -#~ msgid "_Previous archive" -#~ msgstr "Föregående arkiv" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "Zooma _ut" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "O_riginalstorlek" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "Manuell _zoom" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "Visa _kommentarer..." - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Kunde inte hitta RAR-filsuppackare!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Kunde inte hitta RAR-filsuppackare!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Du behöver antingen programmet rar eller unrar installerat " -#~ "för att kunna läsa RAR-filer (.cbr)." diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/uk/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/uk/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/uk/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/uk/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2873 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-05-04 23:52+0300\n" -"Last-Translator: Oleksandr Zaiats \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Ukrainian\n" -"X-Poedit-Country: UKRAINE\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"Він читає ZIP, RAR та tar архіви так само, як і звичайні файли зображень." - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "Ім’я" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "Сторінка" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "Розташування" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "" - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "Коментарі" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "Не можу прочитати %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"Будь ласка зауважте, що до цього списку автоматично додаються лише ті файли " -"в архівах, які Comix розпізнає як коментарі." - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "Розмір" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "Видалити з архіву" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "Редагувати архів" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "Зображення" - -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "Коментарі" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "Не можу зберегти новий архів!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "Оригінальні файли не були видалені." - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "Архіви зберігаються як ZIP файли." - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "Покращення зображення" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "" - -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "Яскравість" - -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "Контраст" - -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "Насиченість" - -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "Різкість" - -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "Автоматично підлаштувати контраст." - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "" -"Автоматично підлаштувати контраст (світлі та темні ділянки), окремо для " -"кожної колірної смуги." - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "Відкрити" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "Зберезти" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "Усі файли" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "Усі архіви" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s архіви" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "Усі зображення" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s зображення" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "Файл з ім’ям '%s' вже існує. Хочете його замінити?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "Заміна перепише його вміст." - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "Додати книжки" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "Немає зображень у '%s'" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "Не можу відкрити %s: Нема такого файла." - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "Не можу відкрити %s: Доступ заборонено." - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "" - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "Невідомий тип файлу" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "Попередня сторінка" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "Наступна сторінка" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "Остання сторінка" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "Попередня сторінка" - -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "Наступна сторінка" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "Попередня сторінка" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "Наступна сторінка" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "Перша сторінка" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "Остання сторінка" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "Наступна сторінка" - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "Редагувати архів" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "Попередня сторінка" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "Прокручування" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "З_більшити" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "" - -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "З_берегти перетворення" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "З_берегти перетворення" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "Обернути на 90° _за годинниковою стрілкою" - -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "Обернути на 180°" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "Обернути на 90° п_роти годинникової стрілки" - -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "Віддзеркалити _горизонтально" - -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "Віддзеркалити _вертикально" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "Двосторінковий режим" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "Прилаштувати за шириною" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "Режим манги" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "Збільшуюче скло" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "Найкращій масштаб" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "Прилаштувати за шириною" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "Пришалтувати за висотою" - -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "Пришалтувати за _шириною" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "Ручне масштабування" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "Повноекранний режим" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "_Статус" - -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "_Прокручування" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "Мініатюри" - -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "Сховати _все" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "Слайдшоу" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "Файли" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "Інші файли" - -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "_Закрити" - -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "Ви_хід" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "Зберезти" - -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "Архів" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "Властивості" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "Параметри" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "Бібліотека" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "Впорядкувати закладки" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "Не можу прочитати %s" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "СЛАЙДШОУ" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "Архіви зберігаються як ZIP файли." - -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "Архіви зберігаються як ZIP файли." - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "Коментарі" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "Коментарі" - -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "_Попередня сторінка" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "Коментарі" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "Каталог мініатюр" - -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Tar архіви" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "Впорядкувати закладки" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "Пере_йти" - -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "Кеш" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "Вигляд" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "Поведінка" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "Показ" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "Тло" - -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "Використовувати цей колір як тло" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "Завжди використовувати обраний колір, як колір тла." - -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "Використовувати динамічний колір тла." - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "" -"Автоматично обирати колір тла, який підходить до зображення, що " -"відображається." - -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "Завжди використовувати обраний колір, як колір тла." - -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "" -"Автоматично обирати колір тла, який підходить до зображення, що " -"відображається." - -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "Показувати номери сторінок на мініатюрах." - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "Розмір мініатюр (в пікселах)" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "Прозорість" - -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "Використовувати клітчастий фон для прозорих зображень." - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"Використовувати сірий клітчастий фон для прозорих зображень. Якщо цей " -"параметр не встановленно, для тла буде використовуватися білий колір." - -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "Використовувати розумне прокручування клавішею пробілу." - -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"Зазвичай, пробіл прокручує лише вниз (або вгору, якщо натиснут Shift), але з " -"цією опцією пробіл буде також прокручувати вбік, імітуючи звичний порядок " -"читання коміксу." - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "Гортати сторінки коли досягнуто край сторінки." - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "Гортати при прокручуванні \"за сторінку\" колесом або стрілками." - -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "Автоматично відкривати наступний архів." - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"Автоматично відкривати наступний архів у каталозі після перегортування " -"останньої сторінки, або попередній архів після перегортування першої " -"сторінки." - -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "Автоматично відкривати наступний архів." - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "Віддзеркалювати сторінки" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "Гортати дві сторінки замість однієї в двосторінковому режимі." - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "Файли" - -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "Після запуску автоматично відкривати файл, який переглядався останнім." - -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "" -"Після запуску відкривати файл, що був відкритий під час виходу з Comix в " -"останнє." - -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "Зберігати інформацію про останні відкриті файли." - -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "Повноекранний режим." - -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "Автоматично ховати панелі в повноекранному режимі." - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "Прилаштувати за шириною" - -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "Прилаштувати за шириною" - -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "Пришалтувати за _шириною" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "Слайдшоу" - -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "Затримка слайдшоу (в секундах)" - -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "Затримка слайдшоу (в секундах)" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "Автоматично відкривати наступний архів." - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "Обертання" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "Автоматично обертати зображення відповідно до метеданих." - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "" -"Автоматично обертати зображення, якщо орієнтація вказана метаданих, " -"наприклад у Exif тазі." - -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "Масштабування зображень" - -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "Режим манги" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar архіви" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -msgid "Maximum number of concurrent extraction threads:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "Зберігати мініатюри для відкритих файлів." - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"Зберігати мініатюри для відкритих файлів, відповідно до специфікації " -"freedesktop.org. Ці мініатюри використовуються багатьма іншими додатками, " -"наприклад більшістю файлових менеджерів." - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "Збільшуюче Скло" - -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "Розмір збільшуючого скла (в пікселах)" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "Встановити розмір сторони квадратного збільшуючого скла." - -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "Коефіцієнт збільшення" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "Встановлює коефіцієнт збільшення для збільшуючого скла." - -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "Розшир коментарів" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "Покращення зображення" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -msgid "Clear _dialog choices" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "Прилаштувати за шириною" - -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "Пришалтувати за висотою" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "" -"Додавати інформацію про всі файли відкриті Comix до загального списку " -"недавніх документів." - -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "Зберігати інформацію про останні відкриті файли." - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "" -"Вважати усі файли всередені архівів, які мають один з цих суфіксів, " -"коментарями." - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "Архів" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "Зображення" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d сторінок" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d коментар(я, ів)" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "Доступ" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "Змінений" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "Права" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "Власник" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "" - -#: mcomix/mcomix/run.py:131 -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "" - -#: mcomix/mcomix/run.py:135 -msgid "No version of GObject was found on your system." -msgstr "" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "" - -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "Слайдшоу" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "" - -#: mcomix/mcomix/status.py:51 -msgid "Show filesize" -msgstr "" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP архів" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR архів" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar архів" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "Tar архів стиснений gzip" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "Tar архів стиснений bzip2" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "Tar архів стиснений gzip" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "Переклад спрощеною китайською" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "Переклад іспанською" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "Переклад бразильською" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "Переклад німецькою та ґенератор мініатюр для Nautilus" - -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "Переклад перською" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "Переклад італійською" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "Переклад голандською" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "Переклад французькою" - -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "Переклад польською" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "Переклад польською" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "Переклад грецькою" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "Переклад каталонською" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "Переклад традиційною китайською" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "Переклад японською" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "Переклад угорською" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "Переклад російською" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "Переклад хорватською" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "Переклад корейською" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "Переклад перською" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "Переклад індонезійською" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "Переклад чеською" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "Переклад українською" - -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "Переклад італійською" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "" - -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "Переклад грецькою" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "Переклад італійською" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "Дизайн іконок" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "(Копія)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "_Наступна сторінка" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "_Попередня сторінка" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "П_ерша сторінка" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "_Остання сторінка" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "" - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "_Закрити" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "Ви_хід" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "Обернути на 90° _за годинниковою стрілкою" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "Обернути на 180°" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "Обернути на 90° п_роти годинникової стрілки" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "Віддзеркалити _горизонтально" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "Віддзеркалити _вертикально" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "_Закладки" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "П_анелі" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "_Правка" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "Відкрити _нещодавні" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "_Файл" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "_Вигляд" - -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "_Панелі" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "_Довідка" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "Повно_екранний режим" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "_Двосторінковий режим" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "_Панелі" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "_Меню" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "_Статус" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "_Прокручування" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "_Мініатюри" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "Сховати _все" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "Режим _манги" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "З_берегти перетворення" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "" - -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "Почати _слайдшоу" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "Збільшуюче _скло" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "_Найкращій масштаб" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "Пришалтувати за _шириною" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "Пришалтувати за _висотою" - -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "Пришалтувати за _шириною" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "_Ручне масштабування" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "_Про програму" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "" - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "_Параметри" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "_Редагувати архів…" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "_Відкрити…" - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "" - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "_Бібліотека…" - -#: mcomix/mcomix/worker_thread.py:73 -#, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "" - -#: mcomix/mcomix/archive/__init__.py:13 -msgid "The archive is password-protected:" -msgstr "" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "Додавання книжок" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "Книжки додані" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "Додаю '%s'…" - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(Копія)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "Усі книжки" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "Додати ще книжок до бібліотеки." - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "Відкрити обрану книгу." - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "" - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "" - -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "Видалено %(num)d книг(а, и) з '%(collection)s'." -msgstr[1] "Видалено %(num)d книг(а, и) з '%(collection)s'." - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "" -msgstr[1] "" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "Видалити книжки з колекції?" - -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "" -"Обрані книжки будуть видалені з бібліотеки (але оригінальні файли залишаться " -"нетронутими). Ви впевнені, що бажаєте продовжити?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "Додати нову порожню колекцію." - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "Додати нову колекцію?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "Будь ласка введіть ім’я для нової колекції." - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "Не можу додати нову колекцію з ім’ям '%s'." - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "Колекція з таким ім’ям вже існує." - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "Перейменувати колекцію?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "Будь ласка введіть нове ім’я для обраної колекції." - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "Не можу змінити ім’я на '%s'." - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "Не можу скопіювати колекцію." - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Корінь" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "" -"Покласти колекцію '%(subcollection)s' в колекцію '%(supercollection)s'." - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "Додати книжки до '%s'." - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "" -"Перемістити книжки з '%(source collection)s' до '%(destination collection)s'." - -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "Пошук" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "" -"Показувати лише ті книжки, в повному шляху яких є вказаний текст. Пошук не " -"враховує регістр." - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "Відкрити _нещодавні" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "Відкрити обрану книгу." - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "Видалено %(num)d книг(а, и) з '%(collection)s'." - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "Нова колекція" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "" - -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "Автоматично додати книжки до цієї колекції" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "Каталог мініатюр" - -#~ msgid "Tar archives" -#~ msgstr "Tar архіви" - -#~ msgid "RAR archives" -#~ msgstr "RAR архіви" - -#~ msgid "JPEG images" -#~ msgstr "JPEG зображення" - -#~ msgid "PNG images" -#~ msgstr "PNG зображення" - -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "PNG зображення" - -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "Зображення" - -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "PNG зображення" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "Не можу відкрити %s: Невідомий тип файлу" - -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "Використовувати цей колір як тло" - -#~ msgid "Cache" -#~ msgstr "Кеш" - -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "Додати колекцію" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "Каталог мініатюр" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "Каталог мініатюр" - -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "Архіви зберігаються як ZIP файли." - -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "Архів" - -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "Архів" - -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "Архів" - -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "Попередня сторінка" - -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "Показувати лише одне зображення в двосторінковому режимі." - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "" -#~ "Показувати лише одне зображення, якщо його ширине більша за висоту. В " -#~ "цьому випадку скани, що містять дві сторінки, будуть відображатися " -#~ "належним чином (тобто по одному) в двосторінковому режимі." - -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "Використовувати динамічний колір тла." - -#~ msgid "Default modes" -#~ msgstr "Режими за замовченням" - -#~ msgid "Use double page mode by default." -#~ msgstr "Двосторінковий режим." - -#~ msgid "Use manga mode by default." -#~ msgstr "Режим манги." - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "Розтягувари зображення до розміру, більшого за оригінальний, якщо " -#~ "поточний режим збільшення цього потребує. Якщо цей параметр не " -#~ "встановлено, зображення ніколи не масштабуються для збільшення розміру." - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "" -#~ "Обрані книжки будуть видалені з бібліотеки (але оригінальні файли " -#~ "залишаться нетронутими). Ви впевнені, що бажаєте продовжити?" - -#~ msgid "Remove collection from the library?" -#~ msgstr "Видалити колекцію з бібліотеки?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Обрану колекцію буде виделено з бібліотеки (але книжки та підколекції в " -#~ "ній залишаться). Ви впевнені, що бажаєте продовжити?" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "Видалено %d книг(а, и) з бібліотеки." - -#~ msgid "Rename..." -#~ msgstr "Перейменувати…" - -#~ msgid "Duplicate collection" -#~ msgstr "Скопіювати колекцію" - -#~ msgid "Remove collection..." -#~ msgstr "Видалити колекцію…" - -#~ msgid "About" -#~ msgstr "Про програму" - -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "" -#~ "Comix — це переглядач, спроектований спеціально для перегляду коміксів." - -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "" -#~ "Comix поширюється відповідно до ліцензії GNU General Public License." - -#~ msgid "Credits" -#~ msgstr "Подяки" - -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "Не можу знайти розпаковувач RAR файлів!" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "Не можу знайти розпаковувач RAR файлів!" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "Вам треба встановити програму rar або unrar, аби мати змогу " -#~ "переглядати RAR (.cbr) файли." - -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "Не можу змінити ім’я на '%s'." - -#~ msgid "_Add bookmark" -#~ msgstr "_Додати закладку" - -#~ msgid "_Edit bookmarks..." -#~ msgstr "_Редагувати закладки…" - -#~ msgid "_Clear bookmarks..." -#~ msgstr "_Видалити закладки…" - -#~ msgid "Clear all bookmarks?" -#~ msgstr "Видалити усі закладки?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "Усі збережені закладки будуть видалені. Ви впевнені, що бажаєте " -#~ "продовжити?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "На комп’ютері знайдено застарілі файли" - -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "Деякі старі файли (які використовувалися для зберігання налаштувань, " -#~ "бібліотеки, закладок тощо в старій версії Comix) були знайдені на вашому " -#~ "комп’ютері. Якщо ви не плануєте використовувати стару версію Comix знову, " -#~ "ви можете видалити ці файли та звільнити трохи місця. Бажаєте, аби ці " -#~ "файли були видалені зараз?" - -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "Не можу прочитати %s" - -#~ msgid "Import" -#~ msgstr "Імпорт" - -#~ msgid "Defaults" -#~ msgstr "За замовченням" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "Не можу відкрити %s: Є каталогом." - -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "Не можу прочитати %s" - -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "Не можу змінити ім’я на '%s'." - -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "Не можу прочитати %s" - -#, fuzzy -#~ msgid " to the library" -#~ msgstr "Видалити з бібліотеки…" - -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "Не можу скопіювати колекцію." - -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "Не можу скопіювати колекцію." - -#~ msgid "Remove from this collection" -#~ msgstr "Видалити з цієї колекції" - -#~ msgid "Remove from the library..." -#~ msgstr "Видалити з бібліотеки…" - -#~ msgid "Cover size" -#~ msgstr "Розмір обкдадинки" - -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "Сторінка" - -#~ msgid "Stretch small images." -#~ msgstr "Розтягувати маленькі зображення." - -#~ msgid "Default zoom mode" -#~ msgstr "Режим збільшення за замовченням" - -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "Показувати номери сторінок на мініатюрах." - -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "Редагувати архів" - -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "_Попередня сторінка" - -#~ msgid "Zoom _out" -#~ msgstr "З_меншити" - -#~ msgid "O_riginal size" -#~ msgstr "_Оригінальний розмір" - -#~ msgid "Manual _Zoom" -#~ msgstr "Ручне _збільшення" - -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "Пере_творення" - -#~ msgid "_View comments..." -#~ msgstr "_Показати коментарі…" - -#~ msgid "_Properties" -#~ msgstr "В_ластивості" - -#~ msgid "_Enhance image..." -#~ msgstr "_Покращити зображення…" - -#~ msgid "Developer" -#~ msgstr "Розробник" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "Використовувати кеш для пришвидшення перегляду." - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "Кешувати наступне зображення, для збільшення швидкості перегляду. " -#~ "Оскільки збільшення швидкості помітне, рекомендовано увімкнути цю опцію, " -#~ "але тільки якщо у вас достатньо вільної пам’яті." - -#~ msgid "Thumbnail maintenance" -#~ msgstr "Керування мініатюрами" - -#~ msgid "Cleanup" -#~ msgstr "Очистити" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "Очистити мініатюри" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "Мініатюри для файлів (як то файли зображень та архівів коміксів) " -#~ "зберігаються у вашому домашньому каталозі. Багато різних додатків " -#~ "створюють та використовують ці мініатюри, але інколи мініатюри " -#~ "залишаються, навіть після видалення оригінальних файлів та витрачають " -#~ "місце на диску. Цей діалог очищує збережені мініатюри, видаляючи " -#~ "осиротілі та застарілі мініатюри." - -#~ msgid "Total number of thumbnails" -#~ msgstr "Загальна кількість мініатюр" - -#~ msgid "Calculating..." -#~ msgstr "Підраховую…" - -#~ msgid "Total size of thumbnails" -#~ msgstr "Загальний розмір мініатюр" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "Ви бажаєте видалити осиротілі та застарілі мініатюри зараз?" - -#~ msgid "Removing thumbnails" -#~ msgstr "Видаляю мініатюри" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "Кількість видалених мініатюр" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "Загальний розмір видалених мініатюр" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "Видалена мініатюра для '%s'" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "_Керування мініатюрами…" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,3659 +0,0 @@ -# MComix zh_CN translation. -# Copyright (C) 2006 Emfox Zhou -# Emfox Zhou , 2006. -# Xie Yanbo , 2006. -# -msgid "" -msgstr "" -"Project-Id-Version: Comix 4.0.1\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2009-01-28 13:36+0800\n" -"Last-Translator: Xie Yanbo \n" -"Language-Team: Xie Yanbo \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Poedit-Language: Chinese\n" -"X-Poedit-Basepath: /Users/xyb/Desktop/comix-4.0.1-rc1/\n" -"X-Poedit-Country: CHINA\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s 是专门设计适用于漫画阅读的看图程序" - -# -# File: src/about.py, line: 57 -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "它可以像读取普通图片文件一样读取ZIP、RAR以及tar等文件包。" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s 采用 GNU/GPL 授权协议" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "该协议的副本可从 %s 获得" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "不支持的文件包格式:%s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! 解压缩错误:%s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! 无法在 “%s” 路径下创建文件包" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "! 无法添加文件 %(sourcefile)s 到 文件包 %(archivefile)s,取消中..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! 无法读取 %s" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! 无法解析书签文件 %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "是否覆盖在第 %s 页已存在的书签?" -msgstr[1] "是否覆盖在第 %s 页已存在的书签?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "当前文件已存在书签页,是否覆盖为第 %d 页的新书签?" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "选中“否”将创建新书签,不影响当前其他书签。" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "编辑书签" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "输入" - -# -# File: src/bookmark.py, line: 255 -# File: src/edit.py, line: 267 -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "名称" - -# -# File: src/bookmark.py, line: 256 -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "页面" - -# -# File: src/properties.py, line: 124 -# File: src/properties.py, line: 159 -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "位置" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "添加时间" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "添加书签(_B)" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "编辑书签(_E)..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! 调用 %(function)r 失败:%(error)s" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "注释" - -# -# File: src/comment.py, line: 53 -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "无法读取%s" - -# -# File: src/edit.py, line: 255 -#: mcomix/mcomix/edit_comment_area.py:20 -#, fuzzy -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "请注意,只有被MComix认为是注释的文件,才会被自动添加到这个列表中。" - -# -# File: src/edit.py, line: 270 -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "大小" - -# -# File: src/edit.py, line: 168 -# File: src/edit.py, line: 285 -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "从文件包中删除" - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "编辑文件包" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "导入(_I)" - -# -# File: src/edit.py, line: 50 -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "图像文件" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/edit_dialog.py:55 -#, fuzzy -msgid "Comment files" -msgstr "注释文件" - -# -# File: src/edit.py, line: 99 -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "无法保存新的文件包!" - -# -# File: src/edit.py, line: 101 -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "原始文件没有被删除。" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "文件包以ZIP格式保存。" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "增强图像" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "重置为默认值。" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "保存为默认值。" - -# -# File: src/enhance.py, line: 79 -#: mcomix/mcomix/enhance_dialog.py:70 -#, fuzzy -msgid "_Brightness:" -msgstr "亮度(_B):" - -# -# File: src/enhance.py, line: 90 -#: mcomix/mcomix/enhance_dialog.py:71 -#, fuzzy -msgid "_Contrast:" -msgstr "对比度(_C):" - -# -# File: src/enhance.py, line: 101 -#: mcomix/mcomix/enhance_dialog.py:72 -#, fuzzy -msgid "S_aturation:" -msgstr "饱和度(_A):" - -# -# File: src/enhance.py, line: 112 -#: mcomix/mcomix/enhance_dialog.py:73 -#, fuzzy -msgid "S_harpness:" -msgstr "锐度(_H):" - -# -# File: src/enhance.py, line: 126 -#: mcomix/mcomix/enhance_dialog.py:78 -#, fuzzy -msgid "_Automatically adjust contrast" -msgstr "自动调整对比度(_A)" - -# -# File: src/enhance.py, line: 128 -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "分别为每一个颜色通道自动调整对比度(包括亮度和暗度)。" - -# -# File: src/filechooser.py, line: 35 -# File: src/library.py, line: 489 -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "打开" - -# -# File: src/filechooser.py, line: 39 -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "保存" - -# -# File: src/filechooser.py, line: 75 -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "所有文件" - -# -# File: src/filechooser.py, line: 78 -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "所有文件包" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s 文件包" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "所有图像文件" - -# -# File: src/filechooser.py, line: 171 -# File: src/filechooser.py, line: 249 -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s 图像文件" - -# -# File: src/filechooser.py, line: 125 -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "名为“%s”的文件已经存在,您想要覆盖它吗?" - -# -# File: src/filechooser.py, line: 128 -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "覆盖它会覆写它的文件内容" - -# -# File: src/library.py, line: 789 -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "添加书" - -# -# File: src/filehandler.py, line: 285 -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "“%s”中没有图像文件" - -# -# File: src/filehandler.py, line: 213 -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "无法打开%s:没有此文件。" - -# -# File: src/filehandler.py, line: 217 -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "无法打开%s:权限不足。" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "继续从 %d 页读取文件?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"您在 %(date)s,%(time)s 阅读到第 %(page)d 页,如果选中“是”将从该页开始继续阅" -"读,否则将从首页开始读取。" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! 设置文件 %s 损坏,删除中..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "无效路径:%s" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! 无法加载图标 %s" - -# -# File: src/filehandler.py, line: 411 -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "未知的文件格式" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "上一页" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "下一页" - -#: mcomix/mcomix/keybindings.py:42 -#, fuzzy -msgid "Back ten pages" -msgstr "页面另存为" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:44 -#, fuzzy -msgid "Previous page (dynamic)" -msgstr "上一页" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:45 -#, fuzzy -msgid "Next page (dynamic)" -msgstr "下一页" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "上一页" - -# -# File: src/ui.py, line: 285 -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "下一页" - -# -# File: src/ui.py, line: 282 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "第一页" - -# -# File: src/ui.py, line: 286 -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "最后一页" - -#: mcomix/mcomix/keybindings.py:51 -#, fuzzy -msgid "Go to page" -msgstr "跳至第几页..." - -# -# File: src/edit.py, line: 28 -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -#, fuzzy -msgid "Next archive" -msgstr "下一个文件包" - -# -# File: src/ui.py, line: 284 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -#, fuzzy -msgid "Previous archive" -msgstr "上一个文件包" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "下一个目录" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "上一个目录" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "滚动至底部左侧" - -# -# File: src/preferences.py, line: 167 -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "滚动" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "滚动至底部中央" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "滚动至底部右侧" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "滚动至中央左侧" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "滚动至正中央" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "滚动至中央右侧" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "滚动至顶部左侧" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "滚动至顶部中央" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "滚动至顶部右侧" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "下移" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "上移" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "右移" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "左移" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "智能向上滚动" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "智能向下滚动" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "放大" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -#, fuzzy -msgid "Zoom" -msgstr "缩放(_Z)" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "缩小" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "正常大小" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 -#, fuzzy -msgid "Keep transformation" -msgstr "保持变换(_K)" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -#, fuzzy -msgid "Transformation" -msgstr "保持变换(_K)" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -#, fuzzy -msgid "Rotate 90 degrees CW" -msgstr "顺时针旋转90度(_R)" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/keybindings.py:86 -#, fuzzy -msgid "Rotate 180 degrees" -msgstr "旋转180度(_G)" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -#, fuzzy -msgid "Rotate 90 degrees CCW" -msgstr "逆时针旋转90度(_E)" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/keybindings.py:88 -#, fuzzy -msgid "Flip horizontally" -msgstr "水平翻转(_P)" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/keybindings.py:89 -#, fuzzy -msgid "Flip vertically" -msgstr "垂直翻转(_V)" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "" - -# -# File: src/preferences.py, line: 177 -# File: src/ui.py, line: 296 -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "双页模式" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -#, fuzzy -msgid "View mode" -msgstr "查看模式" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "漫画模式" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "反向智能滚动" - -# -# File: src/ui.py, line: 298 -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "放大镜" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "伸展小图片" - -# -# File: src/preferences.py, line: 262 -# File: src/ui.py, line: 288 -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "最佳适应模式" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "适应宽度模式" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "适应高度模式" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/keybindings.py:107 -#, fuzzy -msgid "Fit size mode" -msgstr "适应尺寸模式(_S)" - -# -# File: src/preferences.py, line: 265 -# File: src/ui.py, line: 294 -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "手动缩放模式" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "退出全屏模式" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "用户界面" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "显示嵌入消息面板" - -#: mcomix/mcomix/keybindings.py:114 -#, fuzzy -msgid "Minimize" -msgstr "最小化(_N)" - -# -# File: src/preferences.py, line: 271 -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "全屏" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "" - -#: mcomix/mcomix/keybindings.py:117 -#, fuzzy -msgid "Show/hide menubar" -msgstr "显示文件数" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/keybindings.py:118 -#, fuzzy -msgid "Show/hide statusbar" -msgstr "状态栏(_A)" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/keybindings.py:119 -#, fuzzy -msgid "Show/hide scrollbars" -msgstr "滚动条(_C)" - -# -# File: src/preferences.py, line: 109 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "缩略图" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/keybindings.py:121 -#, fuzzy -msgid "Show/hide all" -msgstr "隐藏所有(_I)" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -#, fuzzy -msgid "Start slideshow" -msgstr "开始幻灯片放映" - -#: mcomix/mcomix/keybindings.py:125 -#, fuzzy -msgid "Delete" -msgstr "删除(_D)" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -#, fuzzy -msgid "File" -msgstr "文件" - -#: mcomix/mcomix/keybindings.py:126 -#, fuzzy -msgid "Refresh" -msgstr "刷新(_F)" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/keybindings.py:127 -#, fuzzy -msgid "Close" -msgstr "关闭(_C)" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/keybindings.py:128 -#, fuzzy -msgid "Quit" -msgstr "退出(_Q)" - -#: mcomix/mcomix/keybindings.py:129 -#, fuzzy -msgid "Save and quit" -msgstr "保存并退出(_S)" - -#: mcomix/mcomix/keybindings.py:130 -#, fuzzy -msgid "Save As" -msgstr "另存为(_A)" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/keybindings.py:132 -#, fuzzy -msgid "Archive comments" -msgstr "文件" - -# -# File: src/properties.py, line: 89 -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "属性" - -# -# File: src/preferences.py, line: 78 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "首选项" - -# -# File: src/library.py, line: 38 -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "收藏库" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "" - -#: mcomix/mcomix/keybindings.py:146 -#, fuzzy -msgid "External commands" -msgstr "编辑书签" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "“%(action)s”的快捷键将覆盖原有功能" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "无法加载快捷键设置:%s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! 无法找到 pysqlite2 或 sqlite3。" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! 无法删除文件 %s" - -# -# File: src/main.py, line: 666 -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "幻灯片播放" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "页面另存为" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "确定删除 %s ?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "该文件将从硬盘上删除。" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "不再询问。" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:195 -#, fuzzy -msgid "File-related variables can only be used for files." -msgstr "文件包以ZIP格式保存。" - -# -# File: src/edit.py, line: 115 -#: mcomix/mcomix/openwith.py:199 -#, fuzzy -msgid "Archive-related variables can only be used for archives." -msgstr "文件包以ZIP格式保存。" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:285 -#, fuzzy -msgid "Run _command" -msgstr "注释" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:371 -#, fuzzy -msgid "Command label" -msgstr "注释文件" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/openwith.py:464 -#, fuzzy -msgid "Preview:" -msgstr "上一页(_P)" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "" - -# -# File: src/comment.py, line: 16 -# File: src/preferences.py, line: 288 -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Command" -msgstr "注释" - -#: mcomix/mcomix/openwith.py:480 -#, fuzzy -msgid "Working directory" -msgstr "上一个目录" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/openwith.py:494 -#, fuzzy -msgid "Disabled in archives" -msgstr "Tar 文件包" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" - -#: mcomix/mcomix/openwith_menu.py:22 -#, fuzzy -msgid "_Edit commands" -msgstr "编辑书签" - -# -# File: src/ui.py, line: 69 -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "跳转(_G)" - -# -# File: src/preferences.py, line: 230 -#: mcomix/mcomix/pageselect.py:20 -#, fuzzy -msgid "_Cancel" -msgstr "取消(_C)" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " / %s" - -# -# File: src/preferences.py, line: 161 -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "外观" - -# -# File: src/preferences.py, line: 237 -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "行为" - -# -# File: src/preferences.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "显示" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "高级" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "语言 (需重启程序):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "退出键关闭程序" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "开启后退出键关闭程序,而不仅仅是退出全屏模式。" - -# -# File: src/preferences.py, line: 93 -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "背景" - -# -# File: src/preferences.py, line: 95 -#: mcomix/mcomix/preferences_dialog.py:78 -#, fuzzy -msgid "Use this colour as background:" -msgstr "使用该颜色作为背景:" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "总是使用选中的该颜色作为背景色。" - -# -# File: src/preferences.py, line: 102 -#: mcomix/mcomix/preferences_dialog.py:81 -#, fuzzy -msgid "Use dynamic background colour" -msgstr "使用动态背景色" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "自动选中适合观看中图片的背景色。" - -# -# File: src/preferences.py, line: 97 -#: mcomix/mcomix/preferences_dialog.py:92 -#, fuzzy -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "总是使用选中的该颜色作为缩略图背景色。" - -# -# File: src/preferences.py, line: 106 -#: mcomix/mcomix/preferences_dialog.py:95 -#, fuzzy -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "自动选中适合观看中缩略图的背景色。" - -# -# File: src/preferences.py, line: 117 -#: mcomix/mcomix/preferences_dialog.py:100 -#, fuzzy -msgid "Show page numbers on thumbnails" -msgstr "在缩略图上显示页码" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "适用文件包缩略图作为应用图标" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "启用该设置后,书籍的第一页将取代默认图标作为应用图标。" - -# -# File: src/preferences.py, line: 110 -#: mcomix/mcomix/preferences_dialog.py:108 -#, fuzzy -msgid "Thumbnail size (in pixels):" -msgstr "缩略图大小 (像素):" - -# -# File: src/preferences.py, line: 151 -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "透明度" - -# -# File: src/preferences.py, line: 153 -#: mcomix/mcomix/preferences_dialog.py:115 -#, fuzzy -msgid "Use checkered background for transparent images" -msgstr "使用棋盘格图像做透明图片的背景" - -# -# File: src/preferences.py, line: 159 -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "" -"使用灰色跳棋格图案作为透明图像的背景。如果不设置该选项,则使用纯白背景。" - -# -# File: src/preferences.py, line: 169 -#: mcomix/mcomix/preferences_dialog.py:130 -#, fuzzy -msgid "Use smart scrolling" -msgstr "使用智能化滚动" - -# -# File: src/preferences.py, line: 174 -#: mcomix/mcomix/preferences_dialog.py:132 -#, fuzzy -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"设置该选项后,空格键和鼠标滚轮不仅可以向上滚动或向下滚动,同时可以向两侧滚" -"动,以配合一般的漫画书阅读顺序。" - -#: mcomix/mcomix/preferences_dialog.py:137 -#, fuzzy -msgid "Flip pages when scrolling off the edges of the page" -msgstr "当滚动出页面边界时翻页" - -#: mcomix/mcomix/preferences_dialog.py:139 -#, fuzzy -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"当使用鼠标滚轮或者键盘方向键滚动出页面时翻页。在翻页之前,需要连续滚动滚轮或" -"者按方向键数次。" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:142 -#, fuzzy -msgid "Automatically open the next archive" -msgstr "自动打开下一个文件包" - -# -# File: src/preferences.py, line: 203 -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"当翻过最后一页时,自动打开当前目录的下一个文件包;或翻过第一页时,自动打开上" -"一个文件包。" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:147 -#, fuzzy -msgid "Automatically open next directory" -msgstr "自动打开下一个目录" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"当翻过所在目录下最后一个文件的最后一页时自动打开下一目录的第一个文件当翻过所" -"在目录下第一个文件的第一页时自动打开上移目录。" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "方向键按动时滚动的像素:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "设置使用方向键滚动时在页面上的滚动像素。" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "鼠标滚轮滚动的像素:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "设置使用鼠标滚轮滚动时在页面上的滚动像素。" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "空格键按动时页面滚动的百分比:" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "设置使用空格键时页面滚动的百分比。" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "滚动超出页面时,需要再滚动几次才翻页:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"设置需要再滚动几次才下翻一页或上翻一页,次数少可以快速翻页,不过容易引起意外" -"翻页。" - -# -# File: src/preferences.py, line: 179 -#: mcomix/mcomix/preferences_dialog.py:176 -#, fuzzy -msgid "Flip two pages in double page mode" -msgstr "双页模式时一次翻两页" - -# -# File: src/preferences.py, line: 184 -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "在双页模式时,每次翻两页,而不是一页。" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "在特殊情况下只显示一页:" - -# -# File: src/preferences.py, line: 196 -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "文件" - -# -# File: src/preferences.py, line: 206 -#: mcomix/mcomix/preferences_dialog.py:186 -#, fuzzy -msgid "Automatically open the last viewed file on startup" -msgstr "启动时,自动打开最后查看过的文件" - -# -# File: src/preferences.py, line: 211 -#: mcomix/mcomix/preferences_dialog.py:188 -#, fuzzy -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "启动时,自动打开上次MComix关闭时查看的文件。" - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:190 -#, fuzzy -msgid "Store information about recently opened files:" -msgstr "保存最近打开的文件的信息:" - -# -# File: src/preferences.py, line: 250 -#: mcomix/mcomix/preferences_dialog.py:204 -#, fuzzy -msgid "Use fullscreen by default" -msgstr "默认使用全屏模式" - -# -# File: src/preferences.py, line: 273 -#: mcomix/mcomix/preferences_dialog.py:208 -#, fuzzy -msgid "Automatically hide all toolbars in fullscreen" -msgstr "全屏时自动隐藏所有工具条" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -#, fuzzy -msgid "Fit to size mode" -msgstr "适应大小模式" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:213 -#, fuzzy -msgid "Fit to width or height:" -msgstr "适应宽度或高度模式" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/preferences_dialog.py:216 -#, fuzzy -msgid "Fixed size for this mode:" -msgstr "固定当前模式的大小:" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "幻灯片放映" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:222 -#, fuzzy -msgid "Slideshow delay (in seconds):" -msgstr "幻灯片延迟 (秒):" - -# -# File: src/preferences.py, line: 280 -#: mcomix/mcomix/preferences_dialog.py:226 -#, fuzzy -msgid "Slideshow step (in pixels):" -msgstr "幻灯片移动量 (像素):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"设置幻灯片模式下滚动的像素值。正数值向前滚动,负数值向后滚动,0则总是翻到新的" -"一页。" - -# -# File: src/preferences.py, line: 198 -#: mcomix/mcomix/preferences_dialog.py:232 -#, fuzzy -msgid "During a slideshow automatically open the next archive" -msgstr "幻灯片模式下自动打开下一个文件包" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "幻灯片模式下允许自动打开下一个文件包。" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "旋转" - -#: mcomix/mcomix/preferences_dialog.py:239 -#, fuzzy -msgid "Automatically rotate images according to their metadata" -msgstr "按照元数据描述自动旋转图像" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "如果图像文件中包含Exif等元数据,依照元数据的描述自动旋转图像。" - -# -# File: src/preferences.py, line: 143 -#: mcomix/mcomix/preferences_dialog.py:243 -#, fuzzy -msgid "Image quality" -msgstr "图像质量" - -# -# File: src/ui.py, line: 297 -#: mcomix/mcomix/preferences_dialog.py:245 -#, fuzzy -msgid "Scaling mode" -msgstr "缩放模式" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "文件顺序" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "" - -# -# File: src/filechooser.py, line: 86 -#: mcomix/mcomix/preferences_dialog.py:262 -#, fuzzy -msgid "Sort archives by:" -msgstr "Tar 文件包" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "缓存中存储的最大页面数:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -# -# File: src/preferences.py, line: 222 -#: mcomix/mcomix/preferences_dialog.py:273 -#, fuzzy -msgid "Store thumbnails for opened files" -msgstr "存储已经打开过的文件的缩略图" - -# -# File: src/preferences.py, line: 227 -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"按照 freedesktop.org 规范,保存已经打开过的文件的缩略图。这些缩略图会与其他程" -"序(例如大多数文件管理器)共享使用。" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "缓存中存储的最大页面数:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "设置要缓存的页面数最大值,-1将缓存整个文件包。" - -# -# File: src/preferences.py, line: 124 -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "放大镜" - -# -# File: src/preferences.py, line: 125 -#: mcomix/mcomix/preferences_dialog.py:284 -#, fuzzy -msgid "Magnifying lens size (in pixels):" -msgstr "放大镜大小 (像素):" - -# -# File: src/preferences.py, line: 131 -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "设置放大镜的大小。将显示为指定像素数边长的正方形。" - -# -# File: src/preferences.py, line: 133 -#: mcomix/mcomix/preferences_dialog.py:289 -#, fuzzy -msgid "Magnification factor:" -msgstr "放大倍数:" - -# -# File: src/preferences.py, line: 140 -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "设置放大镜的放大倍数。" - -# -# File: src/preferences.py, line: 289 -#: mcomix/mcomix/preferences_dialog.py:296 -#, fuzzy -msgid "Comment extensions:" -msgstr "注释后缀:" - -# -# File: src/enhance.py, line: 51 -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "增强图像" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "清除对话框选项" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "清除所有之前设置的对话框选项,不再询问。" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "自动侦测(默认)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "从不" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "仅限第一页" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "仅限较宽的图片" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "总是" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "当是文件包的第一页或图片较宽时只显示一页。" - -# -# File: src/preferences.py, line: 263 -# File: src/ui.py, line: 290 -#: mcomix/mcomix/preferences_dialog.py:423 -#, fuzzy -msgid "Fit to width" -msgstr "适应宽度模式" - -# -# File: src/preferences.py, line: 264 -# File: src/ui.py, line: 292 -#: mcomix/mcomix/preferences_dialog.py:424 -#, fuzzy -msgid "Fit to height" -msgstr "适应高度模式" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "不排序" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "文件名" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "文件大小" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "最后修改时间" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "递增" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "递减" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "文件将按指定的排序打开和显示,但不影响文件包内部原来的文件顺序。" - -#: mcomix/mcomix/preferences_dialog.py:494 -#, fuzzy -msgid "Natural order" -msgstr "文件顺序" - -#: mcomix/mcomix/preferences_dialog.py:495 -#, fuzzy -msgid "Literal order" -msgstr "文件顺序" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" - -# -# File: src/preferences.py, line: 219 -#: mcomix/mcomix/preferences_dialog.py:555 -#, fuzzy -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "把所有 MComix 打开过的文件信息添加到最近文件列表中。" - -# -# File: src/preferences.py, line: 214 -#: mcomix/mcomix/preferences_dialog.py:578 -#, fuzzy -msgid "Delete information about recently opened files?" -msgstr "删除最近打开的文件的信息?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "这将删除所有“最近打开的文件”目录下记录,并清除相应的最后阅读页信息。" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "正常 (快)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "双线性" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "双曲线 (慢)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "图片缩放设置:较慢的算法带来更高质量的图片缩放但更长的加载时间。" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "正常" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -# -# File: src/preferences.py, line: 295 -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "把文件包中任何包含以下一个文件结尾的文件,视作注释。" - -# -# File: src/properties.py, line: 135 -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "文件" - -# -# File: src/properties.py, line: 169 -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "图像" - -# -# File: src/library.py, line: 832 -# File: src/properties.py, line: 113 -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "共%d页" - -# -# File: src/properties.py, line: 114 -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d 个注释" - -# -# File: src/properties.py, line: 126 -# File: src/properties.py, line: 160 -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "访问" - -# -# File: src/properties.py, line: 128 -# File: src/properties.py, line: 162 -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "修改" - -# -# File: src/properties.py, line: 130 -# File: src/properties.py, line: 164 -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "权限" - -# -# File: src/properties.py, line: 131 -# File: src/properties.py, line: 165 -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "属主" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[选项...] [路径]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "查看图片和漫画文件包。" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "显示该帮助后退出。" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "启动程序后进入幻灯片模式。" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "启动后显示收藏库。" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "显示版本号后退出。" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "查看模式" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "启动程序后进入全屏模式。" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "启动程序后进入漫画模式。" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "启动程序后进入双页显示模式。" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "缩放模式" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "启动程序后进入最佳适应模式。" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "启动程序后进入适合宽度模式。" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "启动程序后进入适合高度模式。" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "调试选项" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "设置输出日志等级。" - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "您没有安装所需要的 GTK+ 和 PyGTK 版本。" - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "在您的系统上找不到任何版本的 PyGTK。" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "该错误可能由缺失 GTK+ 库引起。" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "您没有安装所需的 Python Imaging 版本" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "已安装 PIL 库。" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "安装的 PIL 版本为:%s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "所需的 PIL 版本为:1.1.5 或更新版" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "需要 Python Imaging Library (PIL) 1.1.5 版或更新版。" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "在您的系统上找不到任何版本的 Python Imaging Library。" - -# -# File: src/preferences.py, line: 279 -#: mcomix/mcomix/slideshow.py:43 -#, fuzzy -msgid "Stop slideshow" -msgstr "停止幻灯片放映" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "显示页数" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "显示文件数" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "显示分辨率" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "显示路径" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "显示文件名" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "显示文件名" - -# -# File: src/archive.py, line: 301 -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP 文件包" - -# -# File: src/archive.py, line: 305 -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR 文件包" - -# -# File: src/archive.py, line: 302 -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "Tar 文件包" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "以 Gzip 压缩的 tar 文件包" - -# -# File: src/archive.py, line: 304 -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "以 Bzip2 压缩的 tar 文件包" - -# -# File: src/archive.py, line: 303 -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "以 Gzip 压缩的 tar 文件包" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7z 文件包" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA 文件包" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Comix的原始版本及开发者" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "Mcomix开发者" - -# -# File: src/about.py, line: 77 -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "简体中文译者" - -# -# File: src/about.py, line: 78 -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "西班牙语译者" - -# -# File: src/about.py, line: 79 -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "巴西语、葡萄牙语译者" - -# -# File: src/about.py, line: 81 -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "德语译者与 Nautilus 缩略图功能作者" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:36 -#, fuzzy -msgid "German translation" -msgstr "德语译者" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "意大利语译者" - -# -# File: src/about.py, line: 83 -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "荷兰语译者" - -# -# File: src/about.py, line: 84 -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "法语译者" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:45 -#, fuzzy -msgid "Polish translatin" -msgstr "波兰语译者" - -# -# File: src/about.py, line: 85 -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "波兰语译者" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "希腊语译者" - -# -# File: src/about.py, line: 87 -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "加泰罗尼亚语译者" - -# -# File: src/about.py, line: 88 -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "繁体中文译者" - -# -# File: src/about.py, line: 89 -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "日语译者" - -# -# File: src/about.py, line: 90 -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "匈牙利语译者" - -# -# File: src/about.py, line: 91 -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "俄语译者" - -# -# File: src/about.py, line: 92 -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "克罗地亚语译者" - -# -# File: src/about.py, line: 93 -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "韩语译者" - -# -# File: src/about.py, line: 94 -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "波斯语译者" - -# -# File: src/about.py, line: 95 -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "印尼语译者" - -# -# File: src/about.py, line: 96 -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "捷克语译者" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "乌克兰语译者" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:65 -#, fuzzy -msgid "Galician translation" -msgstr "加利西亚语译者" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "瑞典语译者" - -# -# File: src/about.py, line: 86 -#: mcomix/mcomix/strings.py:67 -#, fuzzy -msgid "Hebrew translation" -msgstr "希腊语译者" - -# -# File: src/about.py, line: 82 -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "意大利语译者" - -# -# File: src/about.py, line: 97 -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "图标设计" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! 无法保存缩略图 “%(thumbpath)s”:%(error)s" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -#, fuzzy -msgid "_Copy" -msgstr "复制(_C)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "复制当前页面到剪切板。" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "删除(_D)" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "从硬盘上删除当前文件或文件包。" - -# -# File: src/ui.py, line: 34 -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "下一页(_N)" - -# -# File: src/ui.py, line: 36 -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "上一页(_P)" - -# -# File: src/ui.py, line: 38 -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "第一页(_F)" - -# -# File: src/ui.py, line: 40 -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "最后一页(_L)" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "跳至第几页(_G)..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "跳至第几页..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "刷新(_F)" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "重新加载当前打开的文件或文件包。" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "下一个文件包(_A)" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "上一个文件包(_R)" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "放大(_I)" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "缩小(_O)" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "正常大小(_N)" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "最小化(_N)" - -# -# File: src/ui.py, line: 48 -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "关闭(_C)" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "关闭所有打开文件。" - -# -# File: src/ui.py, line: 50 -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "退出(_Q)" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "保存并退出(_S)" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "退出并在下次打开程序时恢复当前打开的文件。" - -# -# File: src/ui.py, line: 52 -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "顺时针旋转90度(_R)" - -# -# File: src/ui.py, line: 54 -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "旋转180度(_G)" - -# -# File: src/ui.py, line: 56 -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "逆时针旋转90度(_E)" - -# -# File: src/ui.py, line: 58 -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "水平翻转(_P)" - -# -# File: src/ui.py, line: 60 -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "垂直翻转(_V)" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "另存为(_A)" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "缩放(_Z)" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "最近打开的文件(_R)" - -# -# File: src/ui.py, line: 64 -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "书签(_B)" - -# -# File: src/ui.py, line: 65 -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "工具条 (_O)" - -# -# File: src/ui.py, line: 66 -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "编辑(_E)" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -#, fuzzy -msgid "Open _with" -msgstr "打开(_O)" - -# -# File: src/ui.py, line: 67 -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "文件(_F)" - -# -# File: src/ui.py, line: 68 -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "查看(_V)" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:102 -#, fuzzy -msgid "_Tools" -msgstr "工具(_T)" - -# -# File: src/ui.py, line: 70 -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "帮助(_H)" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "图形变换(_T)" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "" - -# -# File: src/ui.py, line: 75 -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "全屏(_F)" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "全屏模式" - -# -# File: src/ui.py, line: 77 -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "双页模式(_D)" - -# -# File: src/ui.py, line: 79 -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "工具栏(_T)" - -# -# File: src/ui.py, line: 81 -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "菜单栏(_M)" - -# -# File: src/ui.py, line: 83 -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "状态栏(_A)" - -# -# File: src/ui.py, line: 85 -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "滚动条(_C)" - -# -# File: src/ui.py, line: 87 -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "缩略图(_U)" - -# -# File: src/ui.py, line: 89 -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "隐藏所有(_I)" - -# -# File: src/ui.py, line: 91 -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "漫画模式(_M)" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "反方向智能滚动" - -# -# File: src/ui.py, line: 93 -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "保持变换(_K)" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "保持当前选中的变换设置。" - -# -# File: src/ui.py, line: 95 -#: mcomix/mcomix/ui.py:134 -#, fuzzy -msgid "Start _slideshow" -msgstr "开始放映幻灯片(_S)" - -# -# File: src/ui.py, line: 97 -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "放大镜(_G)" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "配合缩放模式,将图片伸展到符合屏幕大小。" - -# -# File: src/ui.py, line: 101 -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "最佳适应模式(_B)" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "适应宽度模式(_W)" - -# -# File: src/ui.py, line: 105 -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "适应高度模式(_H)" - -# -# File: src/ui.py, line: 103 -#: mcomix/mcomix/ui.py:151 -#, fuzzy -msgid "Fit _size mode" -msgstr "适应尺寸模式(_S)" - -# -# File: src/ui.py, line: 107 -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "手动缩放模式(_A)" - -# -# File: src/ui.py, line: 113 -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "关于(_A)" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "注释(_M)..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "属性(_T)" - -# -# File: src/ui.py, line: 128 -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "首选项(_E)" - -# -# File: src/ui.py, line: 117 -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "编辑文件包(_E)…" - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "打开文件包编辑器。" - -# -# File: src/ui.py, line: 119 -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "打开(_O)..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "增强图片(_H)..." - -# -# File: src/ui.py, line: 132 -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "收藏库(_L)..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! 调用 %(function)r 失败:%(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "该文件包有密码保护。" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"%(filename)s 的大小为 %(actual_size)dB,但应该为 %(expected_size)dB。该文件包" -"有可能已经损毁或是不支持的文件格式。" - -# -# File: src/library.py, line: 910 -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "正在添加书籍" - -# -# File: src/library.py, line: 930 -#: mcomix/mcomix/library/add_progress_dialog.py:42 -#, fuzzy -msgid "Added books:" -msgstr "已添加的书籍:" - -# -# File: src/library.py, line: 952 -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "正在添加“%s”..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! #%i 不存在" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! 无法获取“%s”的封页" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! 无法将“%s”添加到收藏库" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! 无法添加收藏库“%s”" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "! 无法将“%(book)s”添加到“%(collection)s”收藏库" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! 无法将收藏库重命名为“%s”" - -# -# File: src/librarybackend.py, line: 272 -# File: src/librarybackend.py, line: 274 -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(复制)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "无法确定收藏库的数据库版本!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "将收藏库数据库版本从 %(from)d 升级到 %(to)d 。" - -#: mcomix/mcomix/library/backend.py:661 -#, fuzzy -msgid "Recent" -msgstr "最近打开的文件(_R)" - -# -# File: src/library.py, line: 202 -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "所有书籍" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "收藏库书籍" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "打开(_O)" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "打开选中的书。" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "打开书但不关闭收藏库(_W)" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "打开选中的书但不关闭收藏库窗口。" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "添加(_A)..." - -# -# File: src/library.py, line: 793 -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "添加更多书到收藏库。" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "从该收藏中删除(_C)" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "从当前收藏中删除选中的书。" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "从收藏库中删除(_L)" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "从该收藏库中完全删除选中的书。" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "删除并从硬盘上删除(_R)" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "从硬盘上删除选中的书。" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/book_area.py:165 -#, fuzzy -msgid "Copies the selected book's path to clipboard." -msgstr "复制选中的书的路径到剪切板。" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "排序(_S)" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "更改该收藏库的排列顺序。" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "封面大小(_Z)" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "更改该书的封面大小。" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "书名" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "完整路径" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "加入时间" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "极大" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "较大" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "较小" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "极小" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "自定义..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "设置收藏库封面大小" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/book_area.py:516 -#, fuzzy, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "从“%(collection)s”中删除了%(num)d本书。" -msgstr[1] "从“%(collection)s”中删除了%(num)d本书。" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "从该收藏库删除了 %d 本书。" -msgstr[1] "从该收藏库删除了 %d 本书。" - -# -# File: src/library.py, line: 597 -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "是否要从该收藏库中删除这些书?" - -# -# File: src/library.py, line: 599 -#: mcomix/mcomix/library/book_area.py:557 -#, fuzzy -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "这些书将从该收藏库删除并彻底删除。您确定要继续吗?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "收藏库的收藏" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "新增" - -# -# File: src/library.py, line: 800 -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "添加一个空的收藏。" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "重命名(_N)" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "重命名选中的收藏。" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "副本(_D)" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "为选中的收藏创建一个副本。" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "清除(_C)" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "从该收藏中删除已经不存在的书。" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "删除(_R)" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "删除选中的收藏。" - -# -# File: src/library.py, line: 854 -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "添加新的收藏?" - -# -# File: src/library.py, line: 856 -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "请输入新收藏的名称。" - -# -# File: src/library.py, line: 876 -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "无法添加名为“%s”的新收藏。" - -# -# File: src/library.py, line: 275 -# File: src/library.py, line: 881 -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "已经存在使用该名称的收藏。" - -# -# File: src/library.py, line: 251 -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "重命名收藏?" - -# -# File: src/library.py, line: 253 -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "请输入选中的收藏的新名称。" - -# -# File: src/library.py, line: 271 -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "无法修改名称为“%s”。" - -# -# File: src/library.py, line: 285 -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "无法创建收藏的副本。" - -# -# File: src/library.py, line: 382 -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "根" - -# -# File: src/library.py, line: 386 -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "把收藏“%(subcollection)s”放入收藏“%(supercollection)s”中。" - -# -# File: src/library.py, line: 407 -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "添加书到“%s”中。" - -# -# File: src/library.py, line: 411 -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "把书从“%(source collection)s”移动到“%(destination collection)s”。" - -# -# File: src/library.py, line: 769 -#: mcomix/mcomix/library/control_area.py:69 -#, fuzzy -msgid "_Search:" -msgstr "搜索(_S):" - -# -# File: src/library.py, line: 774 -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "只显示在完整路径名中包含指定字符串的书。搜索不区分字母大小写。" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "观看清单(_W)" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "打开观看清单管理对话框。" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "打开(_O)" - -# -# File: src/library.py, line: 806 -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "打开选中的书。" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "正在扫描新书..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "已从 %(directory)s 目录下添加新书 %(bookname)s。" - -# -# File: src/library.py, line: 588 -#: mcomix/mcomix/library/main_dialog.py:101 -#, fuzzy, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "已从 %(directory)s 目录下添加 %(count)d 本新书。" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "在 %s 目录下没有找到新书。" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! 你必须有 sqlite wrapper 才能使用该收藏库。" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "收藏库观看列表" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "立即扫描(_S)" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "目录" - -# -# File: src/library.py, line: 862 -#: mcomix/mcomix/library/watchlist.py:55 -#, fuzzy -msgid "Collection" -msgstr "收藏" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "包含子目录" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "添加(_A)" - -# -# File: src/filechooser.py, line: 195 -#: mcomix/mcomix/library/watchlist.py:87 -#, fuzzy -msgid "Automatically scan for new books when library is _opened" -msgstr "当打开收藏库时自动扫描新书" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "安装的 GTK+ 版本为:%s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "所需 GTK+ 版本为:2.12.0 或更新版\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "安装的 PyGTK 版本为:%s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "所需 PyGTK 版本为:2.12.0 或更新版" - -#, fuzzy -#~ msgid "Invalid working directory." -#~ msgstr "上一个目录" - -# -# File: src/filechooser.py, line: 82 -#~ msgid "ZIP archives" -#~ msgstr "ZIP 文件包" - -# -# File: src/filechooser.py, line: 86 -#~ msgid "Tar archives" -#~ msgstr "Tar 文件包" - -# -# File: src/filechooser.py, line: 84 -#~ msgid "RAR archives" -#~ msgstr "RAR 文件包" - -#~ msgid "LHA archives" -#~ msgstr "LHA 文件包" - -# -# File: src/filechooser.py, line: 173 -# File: src/filechooser.py, line: 251 -#~ msgid "JPEG images" -#~ msgstr "JPEG 图像文件" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#~ msgid "PNG images" -#~ msgstr "PNG 图像文件" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "GIF images" -#~ msgstr "GIF 图像文件" - -# -# File: src/edit.py, line: 50 -#, fuzzy -#~ msgid "TIFF images" -#~ msgstr "TIFF 图像文件" - -# -# File: src/filechooser.py, line: 174 -# File: src/filechooser.py, line: 252 -#, fuzzy -#~ msgid "BMP images" -#~ msgstr "BMP 图像文件" - -# -# File: src/filehandler.py, line: 222 -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "无法打开%s:未知的文件格式。" - -# -# File: src/preferences.py, line: 95 -#, fuzzy -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "使用该颜色作为缩略图背景色:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! 执行“%(command)s”时发生错误:%(error)s。" - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "“%(command)s” 必须能在系统变量 PATH 的路径下找到。" - -#~ msgid "Please enter the password to continue:" -#~ msgstr "请输入密码:" - -# -# File: src/preferences.py, line: 230 -#~ msgid "Cache" -#~ msgstr "缓存" - -#~ msgid "Toggle fullscreen" -#~ msgstr "切换全屏模式" - -# -# File: src/library.py, line: 795 -#, fuzzy -#~ msgid "Add to this collection:" -#~ msgstr "添加到该收藏:" - -#~ msgid "Reading" -#~ msgstr "读取中" - -#~ msgid "Page orientation and zoom" -#~ msgstr "页面定位和缩放" - -#~ msgid "User Interface" -#~ msgstr "用户界面" - -#, fuzzy -#~ msgid "File path" -#~ msgstr "完整路径" - -#, fuzzy -#~ msgid "Image directory path" -#~ msgstr "下一个目录" - -#, fuzzy -#~ msgid "Image directory name" -#~ msgstr "下一个目录" - -# -# File: src/edit.py, line: 115 -#, fuzzy -#~ msgid "Archive-related variables" -#~ msgstr "文件包以ZIP格式保存。" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive path" -#~ msgstr "文件" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory path" -#~ msgstr "文件" - -# -# File: src/properties.py, line: 135 -#, fuzzy -#~ msgid "Archive's directory name" -#~ msgstr "文件" - -#, fuzzy -#~ msgid "Literal quote" -#~ msgstr "文件顺序" - -#, fuzzy -#~ msgid "Literal % character" -#~ msgstr "文件顺序" - -#, fuzzy -#~ msgid "Directory name" -#~ msgstr "目录" - -# -# File: src/ui.py, line: 284 -#, fuzzy -#~ msgid "Preview area" -#~ msgstr "上一个文件包" - -#~ msgid "Order files by:" -#~ msgstr "文件排序:" - -#~ msgid "Only file names" -#~ msgstr "仅限文件名" - -#~ msgid "File names and last read page" -#~ msgstr "文件名和最后阅读页" - -# -# File: src/preferences.py, line: 187 -#, fuzzy -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "双页模式时只显示一张宽图片。" - -# -# File: src/preferences.py, line: 193 -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "在双页模式时,如果图片的宽度大于高度,只显示一张图片。" - -# -# File: src/preferences.py, line: 102 -#, fuzzy -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "使用动态背景色。" - -# -# File: src/preferences.py, line: 243 -#~ msgid "Default modes" -#~ msgstr "默认模式" - -# -# File: src/preferences.py, line: 245 -#~ msgid "Use double page mode by default." -#~ msgstr "默认使用双页模式。" - -# -# File: src/preferences.py, line: 255 -#~ msgid "Use manga mode by default." -#~ msgstr "默认使用 Manga 模式" - -# -# File: src/edit.py, line: 51 -#, fuzzy -#~ msgid "Refresh file" -#~ msgstr "其他文件" - -# -# File: src/preferences.py, line: 148 -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "" -#~ "如果当前缩放模式需要,把图片放大到超过自己的原始大小。如果这个选项没有选" -#~ "中,图片不会缩放到超过原始大小。" - -# -# File: src/library.py, line: 599 -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "从收藏库中删除选中的书(不会影响原始文件)。您确定要继续吗?" - -# -# File: src/library.py, line: 231 -#~ msgid "Remove collection from the library?" -#~ msgstr "要从收藏库中删除收藏吗?" - -# -# File: src/library.py, line: 233 -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "" -#~ "从收藏库中删除选中的收藏,但不删除其中的书和子收藏。您确定要继续吗?" - -# -# File: src/library.py, line: 609 -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "从收藏库中删除了%d本书。" - -# -# File: src/library.py, line: 150 -#~ msgid "Rename..." -#~ msgstr "重命名..." - -# -# File: src/library.py, line: 152 -#~ msgid "Duplicate collection" -#~ msgstr "复制收藏" - -# -# File: src/library.py, line: 154 -#~ msgid "Remove collection..." -#~ msgstr "删除收藏..." - -# -# File: src/about.py, line: 18 -# File: src/about.py, line: 67 -#~ msgid "About" -#~ msgstr "关于" - -# -# File: src/about.py, line: 55 -#, fuzzy -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "Comix 是一个为漫画书而特别设计的图像浏览器。" - -# -# File: src/about.py, line: 59 -#, fuzzy -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix 遵循 GNU 通用公共许可证分发。" - -# -# File: src/about.py, line: 106 -#~ msgid "Credits" -#~ msgstr "致谢" - -# -# File: src/archive.py, line: 66 -#, fuzzy -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "无法找到RAR文件解压缩程序!" - -# -# File: src/archive.py, line: 66 -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "无法找到RAR文件解压缩程序!" - -# -# File: src/archive.py, line: 68 -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "您需要安装用来读取RAR(.cbr)文件的rarunrar程序。" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not create archive at " -#~ msgstr "无法修改名称为“%s”。" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add file " -#~ msgstr "无法读取%s" - -# -# File: src/bookmark.py, line: 229 -#~ msgid "Edit bookmarks" -#~ msgstr "编辑书签" - -# -# File: src/bookmark.py, line: 27 -#~ msgid "_Add bookmark" -#~ msgstr "增加书签(_A)" - -# -# File: src/bookmark.py, line: 29 -#~ msgid "_Edit bookmarks..." -#~ msgstr "编辑书签(_E)..." - -# -# File: src/bookmark.py, line: 31 -#~ msgid "_Clear bookmarks..." -#~ msgstr "清空书签(_C)..." - -# -# File: src/bookmark.py, line: 77 -#~ msgid "Clear all bookmarks?" -#~ msgstr "要清空所有书签吗?" - -# -# File: src/bookmark.py, line: 79 -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "所有保存的书签将会被删除。您确定要这么做吗?" - -# -# File: src/deprecated.py, line: 16 -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "在您的计算机里留有一些已经不再被使用的文件。" - -# -# File: src/deprecated.py, line: 22 -#, fuzzy -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "在您的计算机中还留有一些旧文件,在以前版本的Comix中用来保存设置、收藏库、" -#~ "书签等。如果您以后不再使用旧版本的Comix,可以把它们删掉节省存储空间。您像" -#~ "现在就删除这些文件吗?" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not remove" -#~ msgstr "无法读取%s" - -# -# File: src/edit.py, line: 36 -#~ msgid "Import" -#~ msgstr "导入" - -# -# File: src/enhance.py, line: 52 -#~ msgid "Defaults" -#~ msgstr "默认" - -# -# File: src/filehandler.py, line: 209 -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "无法打开%s:它是一个目录。" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not load icon \"" -#~ msgstr "无法读取%s" - -# -# File: src/library.py, line: 271 -#, fuzzy -#~ msgid "! Could not get cover for " -#~ msgstr "无法修改名称为“%s”。" - -# -# File: src/comment.py, line: 53 -#, fuzzy -#~ msgid "! Could not add book " -#~ msgstr "无法读取%s" - -# -# File: src/library.py, line: 495 -#, fuzzy -#~ msgid " to the library" -#~ msgstr "从收藏库中删除…" - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not add collection" -#~ msgstr "无法创建收藏的副本。" - -# -# File: src/library.py, line: 285 -#, fuzzy -#~ msgid "! Could not rename collection to " -#~ msgstr "无法创建收藏的副本。" - -# -# File: src/library.py, line: 492 -#~ msgid "Remove from this collection" -#~ msgstr "从这个收藏中山促" - -# -# File: src/library.py, line: 495 -#~ msgid "Remove from the library..." -#~ msgstr "从收藏库中删除…" - -# -# File: src/library.py, line: 776 -#~ msgid "Cover size" -#~ msgstr "封面大小" - -# -# File: src/bookmark.py, line: 256 -#, fuzzy -#~ msgid "Usage:" -#~ msgstr "页面" - -# -# File: src/preferences.py, line: 144 -#~ msgid "Stretch small images." -#~ msgstr "放大小图片。" - -# -# File: src/preferences.py, line: 260 -#~ msgid "Default zoom mode" -#~ msgstr "默认的缩放模式" - -# -# File: src/preferences.py, line: 117 -#, fuzzy -#~ msgid "Show page numbers." -#~ msgstr "在缩略图上显示页码。" - -# -# File: src/edit.py, line: 28 -#, fuzzy -#~ msgid "_Next archive" -#~ msgstr "编辑文件包" - -# -# File: src/ui.py, line: 36 -#, fuzzy -#~ msgid "_Previous archive" -#~ msgstr "上一页(_P)" - -# -# File: src/ui.py, line: 42 -#~ msgid "_Zoom in" -#~ msgstr "放大(_Z)" - -# -# File: src/ui.py, line: 44 -#~ msgid "Zoom _out" -#~ msgstr "缩小(_O)" - -# -# File: src/ui.py, line: 46 -#~ msgid "O_riginal size" -#~ msgstr "原始大小 (_R)" - -# -# File: src/ui.py, line: 62 -#~ msgid "Manual _Zoom" -#~ msgstr "手动缩放(_Z)" - -# -# File: src/ui.py, line: 63 -#~ msgid "Open _recent" -#~ msgstr "打开最近的 (_R)" - -# -# File: src/ui.py, line: 71 -#, fuzzy -#~ msgid "_Transform image..." -#~ msgstr "变换(_T)" - -# -# File: src/ui.py, line: 115 -#~ msgid "_View comments..." -#~ msgstr "查看注释… (_V)" - -# -# File: src/ui.py, line: 121 -#~ msgid "_Properties" -#~ msgstr "属性 (_P)" - -# -# File: src/ui.py, line: 123 -#~ msgid "_Enhance image..." -#~ msgstr "美化图像… (_E)" - -# -# File: src/about.py, line: 75 -#~ msgid "Developer" -#~ msgstr "开发者" - -# -# File: src/preferences.py, line: 231 -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "使用缓存加速浏览。" - -# -# File: src/preferences.py, line: 235 -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "缓存当前查看图片的后续图片,以提高浏览的速度。除非您的可用内存非常紧张,考" -#~ "虑到这个措施对速度提升有很大的优化,建议设置使用这个功能。" - -# -# File: src/thumbremover.py, line: 22 -#~ msgid "Thumbnail maintenance" -#~ msgstr "缩略图管理" - -# -# File: src/thumbremover.py, line: 24 -#~ msgid "Cleanup" -#~ msgstr "清除" - -# -# File: src/thumbremover.py, line: 36 -#~ msgid "Cleanup thumbnails" -#~ msgstr "清除缩略图" - -# -# File: src/thumbremover.py, line: 46 -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "漫画书和图像文件的缩略图存放在您的用户目录中。各种程序都会使用和创建缩略" -#~ "图,当如果原始图片已经被删掉,还保留缩略图只是对存储空间的浪费。这个对话框" -#~ "可以帮助您清理过期的缩略图文件。" - -# -# File: src/thumbremover.py, line: 58 -#~ msgid "Thumbnail directory" -#~ msgstr "缩略图目录" - -# -# File: src/thumbremover.py, line: 65 -#~ msgid "Total number of thumbnails" -#~ msgstr "缩略图总数" - -# -# File: src/thumbremover.py, line: 68 -# File: src/thumbremover.py, line: 75 -#~ msgid "Calculating..." -#~ msgstr "正在计算…" - -# -# File: src/thumbremover.py, line: 72 -#~ msgid "Total size of thumbnails" -#~ msgstr "缩略图总大小" - -# -# File: src/thumbremover.py, line: 80 -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "您确定要清除过期的缩略图吗?" - -# -# File: src/thumbremover.py, line: 116 -#~ msgid "Removing thumbnails" -#~ msgstr "正在删除缩略图" - -# -# File: src/thumbremover.py, line: 135 -#~ msgid "Number of removed thumbnails" -#~ msgstr "删除缩略图总数" - -# -# File: src/thumbremover.py, line: 142 -#~ msgid "Total size of removed thumbnails" -#~ msgstr "删除缩略图总大小" - -# -# File: src/thumbremover.py, line: 193 -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "删除“%s”的缩略图" - -# -# File: src/ui.py, line: 126 -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "缩略图管理… (_T)" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.po mcomix-2.1.0/mcomix/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.po --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.po 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.po 1970-01-01 00:00:00.000000000 +0000 @@ -1,2930 +0,0 @@ -# -# Traditional Chinese (zh_TW) translation for mcomix. -# -# Hsin-lin Cheng 2006. -# Wayne Su , 2008-2013. -# -# Please give any advice here: -# http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?topic_id=12432&forum=15 -# -msgid "" -msgstr "" -"Project-Id-Version: MComix zh_TW\n" -"Report-Msgid-Bugs-To: NAME@HO.ST\n" -"POT-Creation-Date: 2018-12-07 10:35+0100\n" -"PO-Revision-Date: 2013-07-05 21:37+0800\n" -"Last-Translator: Wayne Su \n" -"Language-Team: \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=1;\n" -"X-Poedit-Language: Chinese\n" -"X-Poedit-Country: TAIWAN\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: mcomix/mcomix/about_dialog.py:28 -#, python-format -msgid "%s is an image viewer specifically designed to handle comic books." -msgstr "%s 是特別設計適用於漫畫書籍的看圖程式。" - -#: mcomix/mcomix/about_dialog.py:30 -msgid "It reads ZIP, RAR and tar archives, as well as plain image files." -msgstr "" -"可以讀取一般圖片檔,又能讀取 ZIP、RAR、TAR 壓縮檔 (包含以 gzip、bzip2 壓縮處" -"理的)。" - -#: mcomix/mcomix/about_dialog.py:34 -#, python-format -msgid "%s is licensed under the terms of the GNU General Public License." -msgstr "%s 依據 GNU 的 GPL 相關條款提供授權。" - -#: mcomix/mcomix/about_dialog.py:36 -#, python-format -msgid "A copy of this license can be obtained from %s" -msgstr "可以在 %s 取得授權協定的複製本" - -#: mcomix/mcomix/archive_extractor.py:44 -#, python-format -msgid "Non-supported archive format: %s" -msgstr "不支援的壓縮檔格式:%s" - -#: mcomix/mcomix/archive_extractor.py:188 -#: mcomix/mcomix/archive_extractor.py:206 -#, python-format -msgid "! Extraction error: %s" -msgstr "! 解壓縮錯誤:%s" - -#: mcomix/mcomix/archive_packer.py:58 -#, python-format -msgid "! Could not create archive at path \"%s\"" -msgstr "! 無法在 %s 路徑下建立壓縮檔" - -#: mcomix/mcomix/archive_packer.py:72 mcomix/mcomix/archive_packer.py:97 -#, python-format -msgid "" -"! Could not add file %(sourcefile)s to archive %(archivefile)s, aborting..." -msgstr "" -"! 無法將檔案 %(sourcefile)s 加入壓縮檔 %(archivefile)s 中,正在取消..." - -#: mcomix/mcomix/archive_tools.py:169 -#, python-format -msgid "! Could not read %s" -msgstr "! 無法讀取 %s" - -#: mcomix/mcomix/bookmark_backend.py:147 -#, python-format -msgid "! Could not parse bookmarks file %s" -msgstr "! 無法解析書籤檔 %s" - -#: mcomix/mcomix/bookmark_backend.py:201 -#, python-format -msgid "Replace existing bookmark on page %s?" -msgid_plural "Replace existing bookmarks on pages %s?" -msgstr[0] "要替換掉設在第 %s 頁的書籤嗎?" -msgstr[1] "要替換掉設在第 %s 頁的書籤嗎?" - -#: mcomix/mcomix/bookmark_backend.py:206 -#, python-format -msgid "" -"The current book already contains marked pages. Do you want to replace them " -"with a new bookmark on page %d? " -msgstr "目前這本書已經有標記在其他頁的書籤在,你想要以第 %d 頁的書籤替換掉嗎?" - -#: mcomix/mcomix/bookmark_backend.py:209 -msgid "" -"Selecting \"No\" will create a new bookmark without affecting the other " -"bookmarks." -msgstr "選擇「否」就可以建立不影響其他書籤的新書籤。" - -#: mcomix/mcomix/bookmark_dialog.py:16 -msgid "Edit Bookmarks" -msgstr "編輯書籤" - -#: mcomix/mcomix/bookmark_dialog.py:50 -msgid "Type" -msgstr "類型" - -#: mcomix/mcomix/bookmark_dialog.py:51 mcomix/mcomix/edit_comment_area.py:33 -#: mcomix/mcomix/keybindings_editor.py:35 -msgid "Name" -msgstr "檔案名稱" - -#: mcomix/mcomix/bookmark_dialog.py:52 mcomix/mcomix/main.py:1087 -#: mcomix/mcomix/library/control_area.py:140 -msgid "Page" -msgstr "頁次" - -#: mcomix/mcomix/bookmark_dialog.py:53 mcomix/mcomix/properties_dialog.py:113 -msgid "Location" -msgstr "位置" - -#. TRANSLATORS: "Added" as in "Date Added" -#: mcomix/mcomix/bookmark_dialog.py:55 -msgid "Added" -msgstr "新增時間" - -#: mcomix/mcomix/bookmark_menu.py:24 -msgid "Add _Bookmark" -msgstr "新增書籤(_B)" - -#: mcomix/mcomix/bookmark_menu.py:26 -msgid "_Edit Bookmarks..." -msgstr "編輯書籤(_E)..." - -#: mcomix/mcomix/callback.py:86 -#, python-format -msgid "! Callback %(function)r failed: %(error)s" -msgstr "! 呼叫 %(function)r 失敗:%(error)s" - -#: mcomix/mcomix/comment_dialog.py:11 mcomix/mcomix/preferences_dialog.py:294 -msgid "Comments" -msgstr "註解" - -#: mcomix/mcomix/comment_dialog.py:92 -#, python-format -msgid "Could not read %s" -msgstr "無法讀取 %s" - -#: mcomix/mcomix/edit_comment_area.py:20 -msgid "" -"Please note that the only files that are automatically added to this list " -"are those files in archives that MComix recognizes as comments." -msgstr "" -"請注意:只有壓縮檔內被 MComix 認為是註解的檔案,才會被自動加入這個清單。" - -#: mcomix/mcomix/edit_comment_area.py:37 mcomix/mcomix/properties_dialog.py:125 -msgid "Size" -msgstr "大小" - -#: mcomix/mcomix/edit_comment_area.py:54 mcomix/mcomix/edit_image_area.py:68 -msgid "Remove from archive" -msgstr "從壓縮檔移除" - -#: mcomix/mcomix/edit_dialog.py:27 mcomix/mcomix/keybindings.py:136 -msgid "Edit archive" -msgstr "編輯壓縮檔" - -#: mcomix/mcomix/edit_dialog.py:39 -msgid "_Import" -msgstr "匯入(_I)" - -#: mcomix/mcomix/edit_dialog.py:54 -msgid "Images" -msgstr "圖片" - -#: mcomix/mcomix/edit_dialog.py:55 -msgid "Comment files" -msgstr "註解檔" - -#: mcomix/mcomix/edit_dialog.py:133 -msgid "The new archive could not be saved!" -msgstr "無法儲存新壓縮檔!" - -#: mcomix/mcomix/edit_dialog.py:134 -msgid "The original files have not been removed." -msgstr "原始檔案沒有被移除。" - -#: mcomix/mcomix/edit_dialog.py:152 -msgid "Archives are stored as ZIP files." -msgstr "已儲存為 ZIP 壓縮檔。" - -#: mcomix/mcomix/enhance_dialog.py:18 mcomix/mcomix/keybindings.py:138 -msgid "Enhance image" -msgstr "強化圖片" - -#: mcomix/mcomix/enhance_dialog.py:23 -msgid "Reset to defaults." -msgstr "重設為預設值。" - -#: mcomix/mcomix/enhance_dialog.py:26 -msgid "Save the selected values as default for future files." -msgstr "儲存選取的數值當以後檔案的預設值。" - -#: mcomix/mcomix/enhance_dialog.py:70 -msgid "_Brightness:" -msgstr "亮度(_B):" - -#: mcomix/mcomix/enhance_dialog.py:71 -msgid "_Contrast:" -msgstr "對比(_C):" - -#: mcomix/mcomix/enhance_dialog.py:72 -msgid "S_aturation:" -msgstr "飽和度(_A):" - -#: mcomix/mcomix/enhance_dialog.py:73 -msgid "S_harpness:" -msgstr "清晰度(_H):" - -#: mcomix/mcomix/enhance_dialog.py:78 -msgid "_Automatically adjust contrast" -msgstr "自動調整對比(_A)" - -#: mcomix/mcomix/enhance_dialog.py:80 -msgid "" -"Automatically adjust contrast (both lightness and darkness), separately for " -"each colour band." -msgstr "分別為每個色頻自動調整明暗對比。" - -#: mcomix/mcomix/file_chooser_base_dialog.py:43 -#: mcomix/mcomix/keybindings.py:137 -msgid "Open" -msgstr "開啟" - -#: mcomix/mcomix/file_chooser_base_dialog.py:48 -msgid "Save" -msgstr "儲存" - -#: mcomix/mcomix/file_chooser_base_dialog.py:85 -msgid "All files" -msgstr "所有檔案" - -#: mcomix/mcomix/file_chooser_base_dialog.py:128 -#, fuzzy -msgid "All archives" -msgstr "所有壓縮檔" - -#: mcomix/mcomix/file_chooser_base_dialog.py:134 -#, fuzzy, python-format -msgid "%s archives" -msgstr "%s 壓縮檔" - -#: mcomix/mcomix/file_chooser_base_dialog.py:144 -msgid "All images" -msgstr "所有圖片" - -#: mcomix/mcomix/file_chooser_base_dialog.py:150 -#, fuzzy, python-format -msgid "%s images" -msgstr "%s 圖片" - -#: mcomix/mcomix/file_chooser_base_dialog.py:232 -#, python-format -msgid "A file named '%s' already exists. Do you want to replace it?" -msgstr "檔案 %s 已經存在,你要替換掉它嗎?" - -#: mcomix/mcomix/file_chooser_base_dialog.py:234 -msgid "Replacing it will overwrite its contents." -msgstr "替換後將會覆蓋掉原有內容。" - -#: mcomix/mcomix/file_chooser_library_dialog.py:17 -msgid "Add books" -msgstr "新增書籍" - -#: mcomix/mcomix/file_handler.py:148 -#, python-format -msgid "No images in '%s'" -msgstr "%s 裏沒有圖片" - -#: mcomix/mcomix/file_handler.py:266 -#, python-format -msgid "Could not open %s: No such file." -msgstr "無法開啟 %s:沒有這個檔案。" - -#: mcomix/mcomix/file_handler.py:269 mcomix/mcomix/file_provider.py:134 -#, python-format -msgid "Could not open %s: Permission denied." -msgstr "無法開啟 %s:沒有權限。" - -#: mcomix/mcomix/file_handler.py:367 -#, python-format -msgid "Continue reading from page %d?" -msgstr "要從第%d頁開始繼續讀嗎?" - -#: mcomix/mcomix/file_handler.py:368 -#, python-format -msgid "" -"You stopped reading here on %(date)s, %(time)s. If you choose \"Yes\", " -"reading will resume on page %(page)d. Otherwise, the first page will be " -"loaded." -msgstr "" -"你在 %(date)s %(time)s 時讀到這裏就停了。如果你選「是」,可以從第 %(page)d 頁" -"開始讀;否則就會載入第一頁。" - -#: mcomix/mcomix/file_handler.py:653 -#, python-format -msgid "! Corrupt preferences file \"%s\", deleting..." -msgstr "! 設定檔 %s 損壞,正在刪除..." - -#: mcomix/mcomix/file_provider.py:104 -#, python-format -msgid "Invalid path: '%s'" -msgstr "不正確的路徑:%s" - -#: mcomix/mcomix/icons.py:58 -#, python-format -msgid "! Could not load icon \"%s\"" -msgstr "! 無法載入「%s」圖示" - -#: mcomix/mcomix/image_tools.py:555 -msgid "Unknown filetype" -msgstr "不明的檔案類型" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/ui.py:44 -msgid "Previous page" -msgstr "上一頁" - -#: mcomix/mcomix/keybindings.py:40 mcomix/mcomix/keybindings.py:41 -#: mcomix/mcomix/keybindings.py:42 mcomix/mcomix/keybindings.py:43 -#: mcomix/mcomix/keybindings.py:44 mcomix/mcomix/keybindings.py:45 -#: mcomix/mcomix/keybindings.py:46 mcomix/mcomix/keybindings.py:47 -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/keybindings.py:50 -#: mcomix/mcomix/keybindings.py:51 mcomix/mcomix/keybindings.py:53 -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/keybindings.py:55 -#: mcomix/mcomix/keybindings.py:56 -msgid "Navigation" -msgstr "導覽" - -#: mcomix/mcomix/keybindings.py:41 mcomix/mcomix/ui.py:42 -msgid "Next page" -msgstr "下一頁" - -#: mcomix/mcomix/keybindings.py:42 -msgid "Back ten pages" -msgstr "往後十頁" - -#: mcomix/mcomix/keybindings.py:43 -msgid "Forward ten pages" -msgstr "往前十頁" - -#: mcomix/mcomix/keybindings.py:44 -msgid "Previous page (dynamic)" -msgstr "上一頁 (動態)" - -#: mcomix/mcomix/keybindings.py:45 -msgid "Next page (dynamic)" -msgstr "下一頁 (動態)" - -#: mcomix/mcomix/keybindings.py:46 -#, fuzzy -msgid "Previous page (always one page)" -msgstr "上一頁 (動態)" - -#: mcomix/mcomix/keybindings.py:47 -#, fuzzy -msgid "Next page (always one page)" -msgstr "下一頁 (動態)" - -#: mcomix/mcomix/keybindings.py:49 mcomix/mcomix/ui.py:46 -msgid "First page" -msgstr "第一頁" - -#: mcomix/mcomix/keybindings.py:50 mcomix/mcomix/ui.py:48 -msgid "Last page" -msgstr "最後一頁" - -#: mcomix/mcomix/keybindings.py:51 -msgid "Go to page" -msgstr "指定頁數..." - -#: mcomix/mcomix/keybindings.py:53 mcomix/mcomix/ui.py:55 -msgid "Next archive" -msgstr "下一個壓縮檔" - -#: mcomix/mcomix/keybindings.py:54 mcomix/mcomix/ui.py:57 -msgid "Previous archive" -msgstr "上一個壓縮檔" - -#: mcomix/mcomix/keybindings.py:55 mcomix/mcomix/ui.py:58 -#: mcomix/mcomix/ui.py:59 -msgid "Next directory" -msgstr "下一個目錄" - -#: mcomix/mcomix/keybindings.py:56 mcomix/mcomix/ui.py:60 -#: mcomix/mcomix/ui.py:61 -msgid "Previous directory" -msgstr "上一個目錄" - -#: mcomix/mcomix/keybindings.py:59 -msgid "Scroll to bottom left" -msgstr "捲動到底部左側" - -#: mcomix/mcomix/keybindings.py:59 mcomix/mcomix/keybindings.py:60 -#: mcomix/mcomix/keybindings.py:61 mcomix/mcomix/keybindings.py:63 -#: mcomix/mcomix/keybindings.py:64 mcomix/mcomix/keybindings.py:65 -#: mcomix/mcomix/keybindings.py:67 mcomix/mcomix/keybindings.py:68 -#: mcomix/mcomix/keybindings.py:69 mcomix/mcomix/keybindings.py:71 -#: mcomix/mcomix/keybindings.py:72 mcomix/mcomix/keybindings.py:73 -#: mcomix/mcomix/keybindings.py:74 mcomix/mcomix/keybindings.py:76 -#: mcomix/mcomix/keybindings.py:77 mcomix/mcomix/preferences_dialog.py:127 -msgid "Scroll" -msgstr "捲動" - -#: mcomix/mcomix/keybindings.py:60 -msgid "Scroll to bottom center" -msgstr "捲動到底部中央" - -#: mcomix/mcomix/keybindings.py:61 -msgid "Scroll to bottom right" -msgstr "捲動到底部右側" - -#: mcomix/mcomix/keybindings.py:63 -msgid "Scroll to middle left" -msgstr "捲動到中央左側" - -#: mcomix/mcomix/keybindings.py:64 -msgid "Scroll to center" -msgstr "捲動到正中央" - -#: mcomix/mcomix/keybindings.py:65 -msgid "Scroll to middle right" -msgstr "捲動到中央右側" - -#: mcomix/mcomix/keybindings.py:67 -msgid "Scroll to top left" -msgstr "捲動到頂部左側" - -#: mcomix/mcomix/keybindings.py:68 -msgid "Scroll to top center" -msgstr "捲動到頂部中央" - -#: mcomix/mcomix/keybindings.py:69 -msgid "Scroll to top right" -msgstr "捲動到頂部右側" - -#: mcomix/mcomix/keybindings.py:71 -msgid "Scroll down" -msgstr "下移" - -#: mcomix/mcomix/keybindings.py:72 -msgid "Scroll up" -msgstr "上移" - -#: mcomix/mcomix/keybindings.py:73 -msgid "Scroll right" -msgstr "右移" - -#: mcomix/mcomix/keybindings.py:74 -msgid "Scroll left" -msgstr "左移" - -#: mcomix/mcomix/keybindings.py:76 -msgid "Smart scroll up" -msgstr "智慧型向上捲" - -#: mcomix/mcomix/keybindings.py:77 -msgid "Smart scroll down" -msgstr "智慧型向下捲" - -#: mcomix/mcomix/keybindings.py:80 -msgid "Zoom in" -msgstr "放大" - -#: mcomix/mcomix/keybindings.py:80 mcomix/mcomix/keybindings.py:81 -#: mcomix/mcomix/keybindings.py:82 -msgid "Zoom" -msgstr "縮放" - -#: mcomix/mcomix/keybindings.py:81 -msgid "Zoom out" -msgstr "縮小" - -#: mcomix/mcomix/keybindings.py:82 -msgid "Normal size" -msgstr "正常大小" - -#: mcomix/mcomix/keybindings.py:84 -msgid "Keep transformation" -msgstr "保持形變設定" - -#: mcomix/mcomix/keybindings.py:84 mcomix/mcomix/keybindings.py:85 -#: mcomix/mcomix/keybindings.py:86 mcomix/mcomix/keybindings.py:87 -#: mcomix/mcomix/keybindings.py:88 mcomix/mcomix/keybindings.py:89 -#: mcomix/mcomix/keybindings.py:90 -msgid "Transformation" -msgstr "形變設定" - -#: mcomix/mcomix/keybindings.py:85 mcomix/mcomix/keybindings.py:92 -#: mcomix/mcomix/keybindings.py:94 -msgid "Rotate 90 degrees CW" -msgstr "順時針旋轉 90 度" - -#: mcomix/mcomix/keybindings.py:86 -msgid "Rotate 180 degrees" -msgstr "旋轉 180 度" - -#: mcomix/mcomix/keybindings.py:87 mcomix/mcomix/keybindings.py:93 -#: mcomix/mcomix/keybindings.py:95 -msgid "Rotate 90 degrees CCW" -msgstr "逆時針旋轉 90 度" - -#: mcomix/mcomix/keybindings.py:88 -msgid "Flip horizontally" -msgstr "水平翻轉" - -#: mcomix/mcomix/keybindings.py:89 -msgid "Flip vertically" -msgstr "垂直翻轉" - -#: mcomix/mcomix/keybindings.py:90 -msgid "Never autorotate" -msgstr "永遠不自動旋轉" - -#: mcomix/mcomix/keybindings.py:92 mcomix/mcomix/keybindings.py:93 -msgid "Autorotate by width" -msgstr "依據寬度自動旋轉" - -#: mcomix/mcomix/keybindings.py:94 mcomix/mcomix/keybindings.py:95 -msgid "Autorotate by height" -msgstr "依據高度自動旋轉" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/preferences_dialog.py:173 -#: mcomix/mcomix/ui.py:114 -msgid "Double page mode" -msgstr "雙頁模式" - -#: mcomix/mcomix/keybindings.py:97 mcomix/mcomix/keybindings.py:98 -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/keybindings.py:101 -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/keybindings.py:104 -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/keybindings.py:106 -#: mcomix/mcomix/keybindings.py:107 mcomix/mcomix/keybindings.py:108 -msgid "View mode" -msgstr "檢視模式" - -#: mcomix/mcomix/keybindings.py:98 mcomix/mcomix/ui.py:128 -msgid "Manga mode" -msgstr "漫畫模式" - -#: mcomix/mcomix/keybindings.py:99 mcomix/mcomix/ui.py:129 -msgid "Invert smart scroll" -msgstr "反向智慧型捲動" - -#: mcomix/mcomix/keybindings.py:101 mcomix/mcomix/ui.py:137 -msgid "Magnifying lens" -msgstr "放大鏡" - -#: mcomix/mcomix/keybindings.py:102 mcomix/mcomix/ui.py:138 -msgid "Stretch small images" -msgstr "伸展小圖片" - -#: mcomix/mcomix/keybindings.py:104 mcomix/mcomix/ui.py:146 -msgid "Best fit mode" -msgstr "最佳大小模式" - -#: mcomix/mcomix/keybindings.py:105 mcomix/mcomix/ui.py:148 -msgid "Fit width mode" -msgstr "符合寬度模式" - -#: mcomix/mcomix/keybindings.py:106 mcomix/mcomix/ui.py:150 -msgid "Fit height mode" -msgstr "符合高度模式" - -#: mcomix/mcomix/keybindings.py:107 -msgid "Fit size mode" -msgstr "符合大小模式" - -#: mcomix/mcomix/keybindings.py:108 mcomix/mcomix/ui.py:154 -msgid "Manual zoom mode" -msgstr "手動縮放模式" - -#: mcomix/mcomix/keybindings.py:111 -msgid "Exit from fullscreen" -msgstr "離開全螢幕模式" - -#: mcomix/mcomix/keybindings.py:111 mcomix/mcomix/keybindings.py:113 -#: mcomix/mcomix/keybindings.py:114 mcomix/mcomix/keybindings.py:115 -#: mcomix/mcomix/keybindings.py:116 mcomix/mcomix/keybindings.py:117 -#: mcomix/mcomix/keybindings.py:118 mcomix/mcomix/keybindings.py:119 -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/keybindings.py:121 -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/preferences_dialog.py:65 -msgid "User interface" -msgstr "使用者介面" - -#: mcomix/mcomix/keybindings.py:113 -msgid "Show OSD panel" -msgstr "顯示嵌入訊息面板" - -#: mcomix/mcomix/keybindings.py:114 -msgid "Minimize" -msgstr "縮到最小" - -#: mcomix/mcomix/keybindings.py:115 mcomix/mcomix/preferences_dialog.py:201 -msgid "Fullscreen" -msgstr "全螢幕" - -#: mcomix/mcomix/keybindings.py:116 -msgid "Show/hide toolbar" -msgstr "顯示/隱藏工具列" - -#: mcomix/mcomix/keybindings.py:117 -msgid "Show/hide menubar" -msgstr "顯示/隱藏選單列" - -#: mcomix/mcomix/keybindings.py:118 -msgid "Show/hide statusbar" -msgstr "顯示/隱藏狀態列" - -#: mcomix/mcomix/keybindings.py:119 -msgid "Show/hide scrollbars" -msgstr "顯示/隱藏捲軸" - -#: mcomix/mcomix/keybindings.py:120 mcomix/mcomix/preferences_dialog.py:87 -msgid "Thumbnails" -msgstr "預覽縮圖" - -#: mcomix/mcomix/keybindings.py:121 -msgid "Show/hide all" -msgstr "全部顯示/隱藏" - -#: mcomix/mcomix/keybindings.py:122 mcomix/mcomix/slideshow.py:47 -#: mcomix/mcomix/ui.py:135 -msgid "Start slideshow" -msgstr "開始投影片放映" - -#: mcomix/mcomix/keybindings.py:125 -msgid "Delete" -msgstr "刪除" - -#: mcomix/mcomix/keybindings.py:125 mcomix/mcomix/keybindings.py:126 -#: mcomix/mcomix/keybindings.py:127 mcomix/mcomix/keybindings.py:128 -#: mcomix/mcomix/keybindings.py:129 mcomix/mcomix/keybindings.py:130 -#: mcomix/mcomix/keybindings.py:132 mcomix/mcomix/keybindings.py:133 -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/keybindings.py:136 -#: mcomix/mcomix/keybindings.py:137 mcomix/mcomix/keybindings.py:138 -#: mcomix/mcomix/keybindings.py:139 -msgid "File" -msgstr "檔案" - -#: mcomix/mcomix/keybindings.py:126 -msgid "Refresh" -msgstr "重新整理" - -#: mcomix/mcomix/keybindings.py:127 -msgid "Close" -msgstr "關閉" - -#: mcomix/mcomix/keybindings.py:128 -msgid "Quit" -msgstr "離開" - -#: mcomix/mcomix/keybindings.py:129 -msgid "Save and quit" -msgstr "儲存後離開" - -#: mcomix/mcomix/keybindings.py:130 -msgid "Save As" -msgstr "另存為" - -#: mcomix/mcomix/keybindings.py:132 -msgid "Archive comments" -msgstr "壓縮檔註解" - -#: mcomix/mcomix/keybindings.py:133 mcomix/mcomix/properties_dialog.py:23 -msgid "Properties" -msgstr "屬性" - -#: mcomix/mcomix/keybindings.py:134 mcomix/mcomix/preferences_dialog.py:25 -msgid "Preferences" -msgstr "偏好設定" - -#: mcomix/mcomix/keybindings.py:139 mcomix/mcomix/library/main_dialog.py:35 -msgid "Library" -msgstr "書庫" - -#: mcomix/mcomix/keybindings.py:145 -msgid "Execute external command" -msgstr "執行外部指令" - -#: mcomix/mcomix/keybindings.py:146 -msgid "External commands" -msgstr "外部指令" - -#: mcomix/mcomix/keybindings.py:182 -#, python-format -msgid "Keybinding for \"%(action)s\" overrides hotkey for another action." -msgstr "以「%(action)s」功能的快速鍵替換掉原有功能。" - -#: mcomix/mcomix/keybindings.py:292 -#, python-format -msgid "Couldn't load keybindings: %s" -msgstr "無法載入快速鍵設定:%s" - -#: mcomix/mcomix/keybindings_editor.py:42 -#, python-format -msgid "Key %d" -msgstr "按鍵 %d" - -#: mcomix/mcomix/last_read_page.py:13 mcomix/mcomix/library/backend.py:18 -#, fuzzy -msgid "! Could neither find sqlite3." -msgstr "! 無法找到 pysqlite2 或 sqlite3。" - -#: mcomix/mcomix/last_read_page.py:206 mcomix/mcomix/thumbnail_tools.py:113 -#: mcomix/mcomix/library/book_area.py:581 -#, python-format -msgid "! Could not remove file \"%s\"" -msgstr "! 無法移除檔案 %s" - -#: mcomix/mcomix/main.py:985 -msgid "SLIDESHOW" -msgstr "投影片放映" - -#: mcomix/mcomix/main.py:1012 -msgid "Save page as" -msgstr "頁面另存為" - -#: mcomix/mcomix/main.py:1033 -#, python-format -msgid "Delete \"%s\"?" -msgstr "要刪除 %s ?" - -#: mcomix/mcomix/main.py:1034 -msgid "The file will be deleted from your harddisk." -msgstr "檔案將會從你的硬碟中刪除。" - -#: mcomix/mcomix/message_dialog.py:32 -msgid "Do not ask again." -msgstr "不要再問了。" - -#: mcomix/mcomix/openwith.py:69 -#, python-format -msgid "'%s' is disabled for archives." -msgstr "「%s」不用於壓縮檔。" - -#: mcomix/mcomix/openwith.py:84 -#, python-format -msgid "Could not run command %(cmdlabel)s: %(exception)s" -msgstr "無法執行 %(cmdlabel)s 指令:%(exception)s" - -#: mcomix/mcomix/openwith.py:132 -msgid "Command line is empty." -msgstr "指令列是空的。" - -#: mcomix/mcomix/openwith.py:175 -msgid "Incomplete escape sequence. For a literal '%', use '%%'." -msgstr "不完整的跳脫字元。若要輸入「%」,請使用「%%」。" - -#: mcomix/mcomix/openwith.py:179 -msgid "Incomplete quote sequence. For a literal '\"', use '%\"'." -msgstr "不完整的轉義字元。若要輸入「\\」,請使用「%\\」。" - -#: mcomix/mcomix/openwith.py:195 -msgid "File-related variables can only be used for files." -msgstr "檔案相關變數只能用於檔案。" - -#: mcomix/mcomix/openwith.py:199 -msgid "Archive-related variables can only be used for archives." -msgstr "壓縮檔相關變數只能用於壓縮檔。" - -#: mcomix/mcomix/openwith.py:241 -#, python-format -msgid "Invalid escape sequence: %%%s" -msgstr "變數字元不正確:%%%s" - -#: mcomix/mcomix/openwith.py:264 -msgid "Edit external commands" -msgstr "編輯外部指令" - -#: mcomix/mcomix/openwith.py:274 -msgid "Add _separator" -msgstr "插入分隔行(_S)" - -#: mcomix/mcomix/openwith.py:285 -msgid "Run _command" -msgstr "執行指令(_C)" - -#: mcomix/mcomix/openwith.py:348 -msgid "This is a separator pseudo-command." -msgstr "這是做分隔用的假指令。" - -#: mcomix/mcomix/openwith.py:359 -#, python-format -msgid "\"%s\" does not have a valid working directory." -msgstr "「%s」沒有可用的工作目錄。" - -#: mcomix/mcomix/openwith.py:362 -#, python-format -msgid "\"%s\" does not appear to have a valid executable." -msgstr "「%s」無法正確執行。" - -#: mcomix/mcomix/openwith.py:371 -msgid "Command label" -msgstr "指令標題" - -#: mcomix/mcomix/openwith.py:464 -msgid "Preview:" -msgstr "預覽:" - -#: mcomix/mcomix/openwith.py:472 -#, python-format -msgid "" -"Please refer to the external command documentation for a " -"list of usable variables and other hints." -msgstr "" -"請到「external command documentation」查閱可用變數清單和其" -"他說明。" - -#: mcomix/mcomix/openwith.py:480 -msgid "Label" -msgstr "標題" - -#: mcomix/mcomix/openwith.py:480 -msgid "Command" -msgstr "指令" - -#: mcomix/mcomix/openwith.py:480 -msgid "Working directory" -msgstr "工作目錄" - -#: mcomix/mcomix/openwith.py:494 -msgid "Disabled in archives" -msgstr "不用於壓縮檔" - -#: mcomix/mcomix/openwith.py:549 -msgid "Save changes to commands?" -msgstr "儲存指令變更?" - -#: mcomix/mcomix/openwith.py:550 -msgid "" -"You have made changes to the list of external commands that have not been " -"saved yet. Press \"Yes\" to save all changes, or \"No\" to discard them." -msgstr "" -"你已經變更了外部指令清單而還沒有儲存,請按「是」儲存所有設定、按「否」放棄變" -"更。" - -#: mcomix/mcomix/openwith_menu.py:22 -msgid "_Edit commands" -msgstr "編輯指令(_E)" - -#: mcomix/mcomix/pageselect.py:19 mcomix/mcomix/ui.py:100 -#: mcomix/mcomix/ui.py:101 -msgid "_Go" -msgstr "前往(_G)" - -#: mcomix/mcomix/pageselect.py:20 -msgid "_Cancel" -msgstr "取消(_C)" - -#: mcomix/mcomix/pageselect.py:39 -#, python-format -msgid " of %s" -msgstr " / %s" - -#: mcomix/mcomix/preferences_dialog.py:43 -msgid "Appearance" -msgstr "外觀" - -#: mcomix/mcomix/preferences_dialog.py:45 -msgid "Behaviour" -msgstr "行為" - -#: mcomix/mcomix/preferences_dialog.py:47 -msgid "Display" -msgstr "顯示" - -#: mcomix/mcomix/preferences_dialog.py:49 -msgid "Advanced" -msgstr "進階" - -#: mcomix/mcomix/preferences_dialog.py:51 -msgid "Shortcuts" -msgstr "快速鍵" - -#: mcomix/mcomix/preferences_dialog.py:67 -msgid "Language (needs restart):" -msgstr "語系 (要重新啟動程式):" - -#: mcomix/mcomix/preferences_dialog.py:71 -msgid "Escape key closes program" -msgstr "ESC 鍵關閉程式" - -#: mcomix/mcomix/preferences_dialog.py:72 -msgid "" -"When active, the ESC key closes the program, instead of only disabling " -"fullscreen mode." -msgstr "啟用後,按 ESC 鍵就關閉這個程式,而不是只用來停用全螢幕模式。" - -#: mcomix/mcomix/preferences_dialog.py:75 -msgid "Background" -msgstr "背景" - -#: mcomix/mcomix/preferences_dialog.py:78 -msgid "Use this colour as background:" -msgstr "用這個顏色當背景:" - -#: mcomix/mcomix/preferences_dialog.py:80 -msgid "Always use this selected colour as the background colour." -msgstr "永遠使用選取的顏色當背景顏色。" - -#: mcomix/mcomix/preferences_dialog.py:81 -msgid "Use dynamic background colour" -msgstr "使用動態背景顏色" - -#: mcomix/mcomix/preferences_dialog.py:83 -msgid "Automatically pick a background colour that fits the viewed image." -msgstr "自動挑選適合觀看中圖片的背景顏色。" - -#: mcomix/mcomix/preferences_dialog.py:92 -msgid "Always use this selected colour as the thumbnail background colour." -msgstr "永遠使用選取的顏色當預覽縮圖的背景顏色。" - -#: mcomix/mcomix/preferences_dialog.py:95 -msgid "" -"Automatically use the colour that fits the viewed image for the thumbnail " -"background." -msgstr "自動挑選適合的顏色當觀看中圖片的預覽縮圖背景顏色。" - -#: mcomix/mcomix/preferences_dialog.py:100 -msgid "Show page numbers on thumbnails" -msgstr "在預覽縮圖上顯示頁碼" - -#: mcomix/mcomix/preferences_dialog.py:104 -msgid "Use archive thumbnail as application icon" -msgstr "使用壓縮檔的預覽縮圖當程式的圖示" - -#: mcomix/mcomix/preferences_dialog.py:106 -msgid "" -"By enabling this setting, the first page of a book will be used as " -"application icon instead of the standard icon." -msgstr "啟用這個設定後,書籍的第一頁會被當作應用程式圖示,取代標準圖示。" - -#: mcomix/mcomix/preferences_dialog.py:108 -msgid "Thumbnail size (in pixels):" -msgstr "預覽縮圖大小 (像素):" - -#: mcomix/mcomix/preferences_dialog.py:112 -msgid "Transparency" -msgstr "透明度" - -#: mcomix/mcomix/preferences_dialog.py:115 -msgid "Use checkered background for transparent images" -msgstr "透明色圖片使用方格背景" - -#: mcomix/mcomix/preferences_dialog.py:117 -msgid "" -"Use a grey checkered background for transparent images. If this preference " -"is unset, the background is plain white instead." -msgstr "透明色圖片使用灰色方格背景。如果未設定這個項目,則將使用白色背景。" - -#: mcomix/mcomix/preferences_dialog.py:130 -msgid "Use smart scrolling" -msgstr "使用智慧型捲動" - -#: mcomix/mcomix/preferences_dialog.py:132 -msgid "" -"With this preference set, the space key and mouse wheel do not only scroll " -"down or up, but also sideways and so try to follow the natural reading order " -"of the comic book." -msgstr "" -"通常按空白鍵和滾動滑鼠滾輪時只會上下捲動,但設定這個項目後,也會側向捲動,以" -"儘量配合一般漫畫書的閱讀順序。" - -#: mcomix/mcomix/preferences_dialog.py:137 -msgid "Flip pages when scrolling off the edges of the page" -msgstr "當捲動到頁面的頂端或底部時翻頁" - -#: mcomix/mcomix/preferences_dialog.py:139 -msgid "" -"Flip pages when scrolling \"off the page\" with the scroll wheel or with the " -"arrow keys. It takes n consecutive \"steps\" with the scroll wheel or the " -"arrow keys for the pages to be flipped." -msgstr "" -"以滾輪或方向鍵捲動到「超出本頁」時翻頁。要翻頁時,需要連續滾動滑鼠滾輪或按方" -"向鍵數次。" - -#: mcomix/mcomix/preferences_dialog.py:142 -msgid "Automatically open the next archive" -msgstr "自動開啟下一個壓縮檔" - -#: mcomix/mcomix/preferences_dialog.py:144 -msgid "" -"Automatically open the next archive in the directory when flipping past the " -"last page, or the previous archive when flipping past the first page." -msgstr "" -"當在目前壓縮檔翻頁離開最後一頁時,自動開啟目錄中的下一個壓縮檔;當翻頁跳出第" -"一頁時,則自動開啟上一個壓縮檔。" - -#: mcomix/mcomix/preferences_dialog.py:147 -msgid "Automatically open next directory" -msgstr "自動開啟下一個目錄" - -#: mcomix/mcomix/preferences_dialog.py:149 -msgid "" -"Automatically open the first file in the next sibling directory when " -"flipping past the last page of the last file in a directory, or the previous " -"directory when flipping past the first page of the first file." -msgstr "" -"於所在目錄最後一頁時向後翻頁,則自動開啟下一個目錄的第一個檔案;於第一個檔案" -"的第一頁時向前翻頁,則自動開啟上一個目錄。" - -#: mcomix/mcomix/preferences_dialog.py:151 -msgid "Number of pixels to scroll per arrow key press:" -msgstr "按方向鍵時捲動的像數:" - -#: mcomix/mcomix/preferences_dialog.py:154 -msgid "Set the number of pixels to scroll on a page when using the arrow keys." -msgstr "設定在檢視頁面時每按方向鍵就要捲動多少像數。" - -#: mcomix/mcomix/preferences_dialog.py:156 -msgid "Number of pixels to scroll per mouse wheel turn:" -msgstr "使用滑鼠滾輪時要捲動的像數:" - -#: mcomix/mcomix/preferences_dialog.py:159 -msgid "Set the number of pixels to scroll on a page when using a mouse wheel." -msgstr "設定在檢視頁面時每滾動滑鼠滾輪就要捲動多少像數。" - -#: mcomix/mcomix/preferences_dialog.py:161 -msgid "Fraction of page to scroll per space key press (in percent):" -msgstr "按空白鍵時的捲動量 (百分比):" - -#: mcomix/mcomix/preferences_dialog.py:165 -msgid "" -"Sets the percentage by which the page will be scrolled down or up when the " -"space key is pressed." -msgstr "設定按空白鍵後頁面捲動量的百分比。" - -#: mcomix/mcomix/preferences_dialog.py:168 -msgid "Number of \"steps\" to take before flipping the page:" -msgstr "已捲動到超出頁面時,要再捲動幾次才翻頁:" - -#: mcomix/mcomix/preferences_dialog.py:171 -msgid "" -"Set the number of \"steps\" needed to flip to the next or previous page. " -"Less steps will allow for very fast page turning but you might find yourself " -"accidentally turning pages." -msgstr "" -"設定要滾動多少次才翻回上一頁或翻到下一頁,次數少則可以快速瀏覽;你可以多試幾" -"次找出適合自己的設定。" - -#: mcomix/mcomix/preferences_dialog.py:176 -msgid "Flip two pages in double page mode" -msgstr "雙頁模式時一次翻兩頁" - -#: mcomix/mcomix/preferences_dialog.py:178 -msgid "" -"Flip two pages, instead of one, each time we flip pages in double page mode." -msgstr "雙頁模式時一次翻兩頁,而不是只翻一頁。" - -#: mcomix/mcomix/preferences_dialog.py:180 -msgid "Show only one page where appropriate:" -msgstr "在特殊的狀況時只顯示一頁:" - -#: mcomix/mcomix/preferences_dialog.py:183 -msgid "Files" -msgstr "檔案" - -#: mcomix/mcomix/preferences_dialog.py:186 -msgid "Automatically open the last viewed file on startup" -msgstr "啟動時自動開啟最後檢視的檔案" - -#: mcomix/mcomix/preferences_dialog.py:188 -msgid "" -"Automatically open, on startup, the file that was open when MComix was last " -"closed." -msgstr "當 MComix 啟動時,自動開啟上次最後開啟過的檔案。" - -#: mcomix/mcomix/preferences_dialog.py:190 -msgid "Store information about recently opened files:" -msgstr "儲存「最近開啟過的檔案」資訊:" - -#: mcomix/mcomix/preferences_dialog.py:204 -msgid "Use fullscreen by default" -msgstr "預設使用全螢幕模式" - -#: mcomix/mcomix/preferences_dialog.py:208 -msgid "Automatically hide all toolbars in fullscreen" -msgstr "全螢幕時模式自動隱藏所有工具列" - -#: mcomix/mcomix/preferences_dialog.py:211 mcomix/mcomix/ui.py:152 -msgid "Fit to size mode" -msgstr "符合大小模式" - -#: mcomix/mcomix/preferences_dialog.py:213 -msgid "Fit to width or height:" -msgstr "符合寬度或高度:" - -#: mcomix/mcomix/preferences_dialog.py:216 -msgid "Fixed size for this mode:" -msgstr "這個模式下的固定大小:" - -#: mcomix/mcomix/preferences_dialog.py:220 -msgid "Slideshow" -msgstr "投影片放映" - -#: mcomix/mcomix/preferences_dialog.py:222 -msgid "Slideshow delay (in seconds):" -msgstr "投影片放映停留時間 (秒):" - -#: mcomix/mcomix/preferences_dialog.py:226 -msgid "Slideshow step (in pixels):" -msgstr "投影片放映移動量 (像數):" - -#: mcomix/mcomix/preferences_dialog.py:229 -msgid "" -"Specify the number of pixels to scroll while in slideshow mode. A positive " -"value will scroll forward, a negative value will scroll backwards, and a " -"value of 0 will cause the slideshow to always flip to a new page." -msgstr "" -"設定在投影片模式時捲動的像數,正值則向前捲動、負值則向後捲動、0 則翻到下一" -"頁。" - -#: mcomix/mcomix/preferences_dialog.py:232 -msgid "During a slideshow automatically open the next archive" -msgstr "投影片放映時自動開啟下一個壓縮檔" - -#: mcomix/mcomix/preferences_dialog.py:234 -msgid "" -"While in slideshow mode allow the next archive to automatically be opened." -msgstr "在投影片模式下允許自動開啟下一個壓縮檔。" - -#: mcomix/mcomix/preferences_dialog.py:236 -msgid "Rotation" -msgstr "旋轉" - -#: mcomix/mcomix/preferences_dialog.py:239 -msgid "Automatically rotate images according to their metadata" -msgstr "根據內建資料自動旋轉圖片" - -#: mcomix/mcomix/preferences_dialog.py:241 -msgid "" -"Automatically rotate images when an orientation is specified in the image " -"metadata, such as in an Exif tag." -msgstr "當圖片內建的資料 (如 EXTIF) 中有指定方向時,自動旋轉圖片。" - -#: mcomix/mcomix/preferences_dialog.py:243 -msgid "Image quality" -msgstr "圖片品質" - -#: mcomix/mcomix/preferences_dialog.py:245 -msgid "Scaling mode" -msgstr "縮放模式" - -#: mcomix/mcomix/preferences_dialog.py:257 -msgid "File order" -msgstr "檔案順序" - -#: mcomix/mcomix/preferences_dialog.py:259 -msgid "Sort files and directories by:" -msgstr "檔案與目錄排序:" - -#: mcomix/mcomix/preferences_dialog.py:262 -msgid "Sort archives by:" -msgstr "壓縮檔排序:" - -#: mcomix/mcomix/preferences_dialog.py:265 -msgid "Extraction and cache" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:267 -#, fuzzy -msgid "Maximum number of concurrent extraction threads:" -msgstr "儲存在快取的最大頁數:" - -#: mcomix/mcomix/preferences_dialog.py:270 -msgid "" -"Set the maximum number of concurrent threads for formats that support it." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:273 -msgid "Store thumbnails for opened files" -msgstr "儲存開啟過的檔案的預覽縮圖" - -#: mcomix/mcomix/preferences_dialog.py:275 -msgid "" -"Store thumbnails for opened files according to the freedesktop.org " -"specification. These thumbnails are shared by many other applications, such " -"as most file managers." -msgstr "" -"依據 freedesktop.org 的規定方式,儲存開啟過的檔案的預覽縮圖。這些預覽縮圖也可" -"由各種檔案管理程式等其他許多應用程式分享共用。" - -#: mcomix/mcomix/preferences_dialog.py:277 -msgid "Maximum number of pages to store in the cache:" -msgstr "儲存在快取的最大頁數:" - -#: mcomix/mcomix/preferences_dialog.py:280 -msgid "" -"Set the max number of pages to cache. A value of -1 will cache the entire " -"archive." -msgstr "設定快取最大頁數,-1 表示整個壓縮檔都要。" - -#: mcomix/mcomix/preferences_dialog.py:282 -msgid "Magnifying Lens" -msgstr "放大鏡" - -#: mcomix/mcomix/preferences_dialog.py:284 -msgid "Magnifying lens size (in pixels):" -msgstr "放大鏡大小 (像素):" - -#: mcomix/mcomix/preferences_dialog.py:287 -msgid "" -"Set the size of the magnifying lens. It is a square with a side of this many " -"pixels." -msgstr "設定放大鏡的大小,請填入正方形的邊長。" - -#: mcomix/mcomix/preferences_dialog.py:289 -msgid "Magnification factor:" -msgstr "放大倍率" - -#: mcomix/mcomix/preferences_dialog.py:292 -msgid "Set the magnification factor of the magnifying lens." -msgstr "設定放大鏡的放大倍率。" - -#: mcomix/mcomix/preferences_dialog.py:296 -msgid "Comment extensions:" -msgstr "註解檔的副檔名:" - -#: mcomix/mcomix/preferences_dialog.py:299 -#, fuzzy -msgid "Animated images" -msgstr "強化圖片" - -#: mcomix/mcomix/preferences_dialog.py:301 -msgid "Animation mode:" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:319 -msgid "_Reset keys" -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:321 -msgid "Resets all keyboard shortcuts to their default values." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:324 -#, fuzzy -msgid "Clear _dialog choices" -msgstr "清除確認選項" - -#: mcomix/mcomix/preferences_dialog.py:326 -msgid "" -"Clears all dialog choices that you have previously chosen not to be asked " -"again." -msgstr "清除你之前已選過的確認選項,不要再重問。" - -#: mcomix/mcomix/preferences_dialog.py:354 -msgid "Auto-detect (Default)" -msgstr "自動偵測 (預設)" - -#: mcomix/mcomix/preferences_dialog.py:397 -#: mcomix/mcomix/preferences_dialog.py:542 -#: mcomix/mcomix/preferences_dialog.py:616 mcomix/mcomix/ui.py:159 -msgid "Never" -msgstr "永遠不要" - -#: mcomix/mcomix/preferences_dialog.py:398 -msgid "Only for title pages" -msgstr "只限第一頁" - -#: mcomix/mcomix/preferences_dialog.py:399 -msgid "Only for wide images" -msgstr "只限較寬的圖片" - -#: mcomix/mcomix/preferences_dialog.py:400 -#: mcomix/mcomix/preferences_dialog.py:543 -msgid "Always" -msgstr "永遠都要" - -#: mcomix/mcomix/preferences_dialog.py:407 -msgid "" -"When showing the first page of an archive, or an image's width exceeds its " -"height, only a single page will be displayed." -msgstr "遇到壓縮檔的第一頁或比較寬的圖片時,只會單獨顯示一頁。" - -#: mcomix/mcomix/preferences_dialog.py:423 -msgid "Fit to width" -msgstr "符合寬度" - -#: mcomix/mcomix/preferences_dialog.py:424 -msgid "Fit to height" -msgstr "符合高度" - -#: mcomix/mcomix/preferences_dialog.py:445 -#: mcomix/mcomix/preferences_dialog.py:493 -msgid "No sorting" -msgstr "不排序" - -#: mcomix/mcomix/preferences_dialog.py:446 -msgid "File name" -msgstr "檔案名稱" - -#: mcomix/mcomix/preferences_dialog.py:447 -#: mcomix/mcomix/library/book_area.py:176 -msgid "File size" -msgstr "檔案大小" - -#: mcomix/mcomix/preferences_dialog.py:448 -msgid "Last modified" -msgstr "最後修改時間" - -#: mcomix/mcomix/preferences_dialog.py:454 -#: mcomix/mcomix/preferences_dialog.py:501 -#: mcomix/mcomix/library/book_area.py:180 -msgid "Ascending" -msgstr "遞增" - -#: mcomix/mcomix/preferences_dialog.py:455 -#: mcomix/mcomix/preferences_dialog.py:502 -#: mcomix/mcomix/library/book_area.py:182 -msgid "Descending" -msgstr "遞減" - -#: mcomix/mcomix/preferences_dialog.py:465 -msgid "" -"Files will be opened and displayed according to the sort order specified " -"here. This option does not affect ordering within archives." -msgstr "" -"檔案開啟與顯示的順序都會依據這裏的設定決定,但不會影響到壓縮檔裏面原本的檔案" -"順序。" - -#: mcomix/mcomix/preferences_dialog.py:494 -msgid "Natural order" -msgstr "自然順序" - -#: mcomix/mcomix/preferences_dialog.py:495 -msgid "Literal order" -msgstr "文字順序" - -#: mcomix/mcomix/preferences_dialog.py:512 -msgid "" -"Files within archives will be sorted according to the order specified here. " -"Natural order will sort numbered files based on their natural order, i.e. 1, " -"2, ..., 10, while literal order uses standard C sorting, i.e. 1, 2, 34, 5." -msgstr "" -"壓縮檔理的檔案會安照這裏指定的順序排序。自然順序會依據數字大小:1、2、....、" -"10、34;文字順序會依據標準 C 語言次序:1、2、34、5。" - -#: mcomix/mcomix/preferences_dialog.py:555 -msgid "" -"Add information about all files opened from within MComix to the shared " -"recent files list." -msgstr "將 MComix 開啟過的檔案資訊加入共享的「最近開啟過的的檔案」清單中。" - -#: mcomix/mcomix/preferences_dialog.py:578 -msgid "Delete information about recently opened files?" -msgstr "要刪除「最近開啟過的檔案」資訊?" - -#: mcomix/mcomix/preferences_dialog.py:579 -msgid "" -"This will remove all entries from the \"Recent\" menu, and clear information " -"about last read pages." -msgstr "" -"這樣將會移除「最近開啟過的檔案」選單裏的項目、並清除最後讀取頁數的資訊。" - -#: mcomix/mcomix/preferences_dialog.py:590 -msgid "Normal (fast)" -msgstr "正常 (快)" - -#: mcomix/mcomix/preferences_dialog.py:591 -msgid "Bilinear" -msgstr "雙線性" - -#: mcomix/mcomix/preferences_dialog.py:592 -msgid "Hyperbolic (slow)" -msgstr "雙曲線 (慢)" - -#: mcomix/mcomix/preferences_dialog.py:598 -msgid "" -"Changes how images are scaled. Slower algorithms result in higher quality " -"resizing, but longer page loading times." -msgstr "" -"變更圖片縮放設定:較慢的演算法可以有較高品質,但頁面載入時間也會比較久。" - -#: mcomix/mcomix/preferences_dialog.py:617 -#: mcomix/mcomix/library/book_area.py:192 -msgid "Normal" -msgstr "正常" - -#: mcomix/mcomix/preferences_dialog.py:623 -msgid "Controls how animated images should be displayed." -msgstr "" - -#: mcomix/mcomix/preferences_dialog.py:684 -msgid "" -"Treat all files found within archives, that have one of these file endings, " -"as comments." -msgstr "壓縮檔內檔名結尾相符的檔案,將被認定為註解。" - -#: mcomix/mcomix/properties_dialog.py:36 -msgid "Archive" -msgstr "壓縮檔" - -#: mcomix/mcomix/properties_dialog.py:38 -msgid "Image" -msgstr "圖片" - -#: mcomix/mcomix/properties_dialog.py:77 -#: mcomix/mcomix/library/control_area.py:142 -#, python-format -msgid "%d pages" -msgstr "%d 頁" - -#: mcomix/mcomix/properties_dialog.py:78 -#, python-format -msgid "%d comments" -msgstr "%d 個註解" - -#: mcomix/mcomix/properties_dialog.py:126 -msgid "Accessed" -msgstr "存取時間" - -#: mcomix/mcomix/properties_dialog.py:128 -msgid "Modified" -msgstr "修改時間" - -#: mcomix/mcomix/properties_dialog.py:130 -msgid "Permissions" -msgstr "權限" - -#: mcomix/mcomix/properties_dialog.py:131 -msgid "Owner" -msgstr "擁有者" - -#: mcomix/mcomix/run.py:41 -msgid "[OPTION...] [PATH]" -msgstr "[選項...] [路徑]" - -#: mcomix/mcomix/run.py:42 -msgid "View images and comic book archives." -msgstr "檢視圖片和漫畫書壓縮檔。" - -#: mcomix/mcomix/run.py:45 -msgid "Show this help and exit." -msgstr "顯示這個說明後退出。" - -#: mcomix/mcomix/run.py:47 -msgid "Start the application in slideshow mode." -msgstr "啟動程式後進入投影片放映模式。" - -#: mcomix/mcomix/run.py:49 -msgid "Show the library on startup." -msgstr "啟動時顯示這個書庫。" - -#: mcomix/mcomix/run.py:51 -msgid "Show the version number and exit." -msgstr "顯示這個版本號碼後退出。" - -#: mcomix/mcomix/run.py:53 -msgid "View modes" -msgstr "檢視模式" - -#: mcomix/mcomix/run.py:55 -msgid "Start the application in fullscreen mode." -msgstr "啟動程式後進入全螢幕模式。" - -#: mcomix/mcomix/run.py:57 -msgid "Start the application in manga mode." -msgstr "啟動程式後進入漫畫模式。" - -#: mcomix/mcomix/run.py:59 -msgid "Start the application in double page mode." -msgstr "啟動程式後進入雙頁模式。" - -#: mcomix/mcomix/run.py:62 -msgid "Zoom modes" -msgstr "縮放模式" - -#: mcomix/mcomix/run.py:65 -msgid "Start the application with zoom set to best fit mode." -msgstr "啟動程式後進入最佳大小模式。" - -#: mcomix/mcomix/run.py:68 -msgid "Start the application with zoom set to fit width." -msgstr "啟動程式後進入符合寬度模式。" - -#: mcomix/mcomix/run.py:71 -msgid "Start the application with zoom set to fit height." -msgstr "啟動程式後進入符合高度模式。" - -#: mcomix/mcomix/run.py:74 -msgid "Debug options" -msgstr "除錯選項" - -#: mcomix/mcomix/run.py:78 -msgid "Sets the desired output log level." -msgstr "設定需要的紀錄檔輸出等級。" - -#: mcomix/mcomix/run.py:131 -#, fuzzy -msgid "" -"You do not have the required versions of GTK+ 3.0 and PyGObject installed." -msgstr "你沒有安裝所需要的 GTK+ 和 PyGTK 版本。" - -#: mcomix/mcomix/run.py:135 -#, fuzzy -msgid "No version of GObject was found on your system." -msgstr "在你的系統中找不到任何版本的 PyGTK。" - -#: mcomix/mcomix/run.py:136 -msgid "This error might be caused by missing GTK+ libraries." -msgstr "這個錯誤可能是因為有 GTK+ 的程式庫不見了。" - -#: mcomix/mcomix/run.py:144 -msgid "You don't have the required version of the Python Imaging" -msgstr "你沒有安裝所需要的 Python Imaging 版本" - -#: mcomix/mcomix/run.py:145 -msgid "Library (PIL) installed." -msgstr "已安裝程式庫 (PIL)。" - -#: mcomix/mcomix/run.py:146 -#, python-format -msgid "Installed PIL version is: %s" -msgstr "安裝的 PIL 版本:%s" - -#: mcomix/mcomix/run.py:147 -msgid "Required PIL version is: 1.1.5 or higher" -msgstr "需要的 PIL 版本:1.1.5 或更新版" - -#: mcomix/mcomix/run.py:151 -msgid "Python Imaging Library (PIL) 1.1.5 or higher is required." -msgstr "需要 Python Imaging 程式庫 (PIL) 1.1.5 版或更新的版本。" - -#: mcomix/mcomix/run.py:152 -msgid "No version of the Python Imaging Library was found on your system." -msgstr "在你的系統裏找不到任何版本的 Python Imaging 程式庫。" - -#: mcomix/mcomix/slideshow.py:43 -msgid "Stop slideshow" -msgstr "停止投影片放映" - -#: mcomix/mcomix/status.py:41 -msgid "Show page numbers" -msgstr "顯示頁碼" - -#: mcomix/mcomix/status.py:43 -msgid "Show file numbers" -msgstr "顯示檔案號碼" - -#: mcomix/mcomix/status.py:45 -msgid "Show resolution" -msgstr "顯示解析度" - -#: mcomix/mcomix/status.py:47 -msgid "Show path" -msgstr "顯示路徑" - -#: mcomix/mcomix/status.py:49 -msgid "Show filename" -msgstr "顯示檔案名稱" - -#: mcomix/mcomix/status.py:51 -#, fuzzy -msgid "Show filesize" -msgstr "顯示檔案名稱" - -#: mcomix/mcomix/strings.py:9 mcomix/mcomix/strings.py:18 -msgid "ZIP archive" -msgstr "ZIP 壓縮檔" - -#: mcomix/mcomix/strings.py:10 -msgid "RAR archive" -msgstr "RAR 壓縮檔" - -#: mcomix/mcomix/strings.py:11 -msgid "Tar archive" -msgstr "TAR 壓縮檔" - -#: mcomix/mcomix/strings.py:12 -msgid "Gzip compressed tar archive" -msgstr "以 GZIP 壓縮的 TAR 壓縮檔" - -#: mcomix/mcomix/strings.py:13 -msgid "Bzip2 compressed tar archive" -msgstr "以 BZIP2 壓縮的 TAR 壓縮檔" - -#: mcomix/mcomix/strings.py:14 -#, fuzzy -msgid "XZ compressed tar archive" -msgstr "以 GZIP 壓縮的 TAR 壓縮檔" - -#: mcomix/mcomix/strings.py:15 -msgid "PDF document" -msgstr "" - -#: mcomix/mcomix/strings.py:16 -msgid "7z archive" -msgstr "7Z 壓縮檔" - -#: mcomix/mcomix/strings.py:17 -msgid "LHA archive" -msgstr "LHA 壓縮檔" - -#: mcomix/mcomix/strings.py:22 -msgid "Original vision/developer of Comix" -msgstr "Comix 的原始設計開發者" - -#: mcomix/mcomix/strings.py:23 mcomix/mcomix/strings.py:24 -#: mcomix/mcomix/strings.py:25 mcomix/mcomix/strings.py:26 -msgid "MComix developer" -msgstr "MComix 開發者" - -#: mcomix/mcomix/strings.py:29 mcomix/mcomix/strings.py:30 -#: mcomix/mcomix/strings.py:31 -msgid "Simplified Chinese translation" -msgstr "簡體中文翻譯" - -#: mcomix/mcomix/strings.py:32 mcomix/mcomix/strings.py:33 -msgid "Spanish translation" -msgstr "西班牙文翻譯" - -#: mcomix/mcomix/strings.py:34 -msgid "Brazilian Portuguese translation" -msgstr "巴西葡萄牙文翻譯" - -#: mcomix/mcomix/strings.py:35 -msgid "German translation and Nautilus thumbnailer" -msgstr "德文翻譯與 Nautilus 預覽縮圖功能作者" - -#: mcomix/mcomix/strings.py:36 -msgid "German translation" -msgstr "德文翻譯" - -#: mcomix/mcomix/strings.py:37 mcomix/mcomix/strings.py:38 -#: mcomix/mcomix/strings.py:39 -msgid "Italian translation" -msgstr "義大利文翻譯" - -#: mcomix/mcomix/strings.py:40 -msgid "Dutch translation" -msgstr "荷蘭文翻譯" - -#: mcomix/mcomix/strings.py:41 mcomix/mcomix/strings.py:42 -#: mcomix/mcomix/strings.py:43 mcomix/mcomix/strings.py:44 -msgid "French translation" -msgstr "法文翻譯" - -#: mcomix/mcomix/strings.py:45 -msgid "Polish translatin" -msgstr "波蘭文翻譯" - -#: mcomix/mcomix/strings.py:46 -msgid "Polish translation" -msgstr "波蘭文翻譯" - -#: mcomix/mcomix/strings.py:47 -msgid "Greek translation" -msgstr "希臘文翻譯" - -#: mcomix/mcomix/strings.py:48 -msgid "Catalan translation" -msgstr "加泰羅尼亞文翻譯" - -#: mcomix/mcomix/strings.py:49 mcomix/mcomix/strings.py:50 -msgid "Traditional Chinese translation" -msgstr "正體中文翻譯" - -#: mcomix/mcomix/strings.py:51 mcomix/mcomix/strings.py:52 -#: mcomix/mcomix/strings.py:53 -msgid "Japanese translation" -msgstr "日文翻譯" - -#: mcomix/mcomix/strings.py:54 -msgid "Hungarian translation" -msgstr "匈牙利文翻譯" - -#: mcomix/mcomix/strings.py:55 mcomix/mcomix/strings.py:56 -msgid "Russian translation" -msgstr "俄文翻譯" - -#: mcomix/mcomix/strings.py:57 -msgid "Croatian translation" -msgstr "克羅埃西亞文翻譯" - -#: mcomix/mcomix/strings.py:58 mcomix/mcomix/strings.py:59 -#: mcomix/mcomix/strings.py:60 -msgid "Korean translation" -msgstr "韓文翻譯" - -#: mcomix/mcomix/strings.py:61 -msgid "Persian translation" -msgstr "波斯文翻譯" - -#: mcomix/mcomix/strings.py:62 -msgid "Indonesian translation" -msgstr "印尼文翻譯" - -#: mcomix/mcomix/strings.py:63 -msgid "Czech translation" -msgstr "捷克文翻譯" - -#: mcomix/mcomix/strings.py:64 -msgid "Ukrainian translation" -msgstr "烏克蘭文翻譯" - -#: mcomix/mcomix/strings.py:65 -msgid "Galician translation" -msgstr "加里西亞文翻譯" - -#: mcomix/mcomix/strings.py:66 -msgid "Swedish translation" -msgstr "瑞典文翻譯" - -#: mcomix/mcomix/strings.py:67 -msgid "Hebrew translation" -msgstr "希伯來文翻譯" - -#: mcomix/mcomix/strings.py:68 -#, fuzzy -msgid "Lithuanian translation" -msgstr "義大利文翻譯" - -#: mcomix/mcomix/strings.py:71 -msgid "Icon design" -msgstr "圖示設計" - -#: mcomix/mcomix/thumbnail_tools.py:215 -#, python-format -msgid "! Could not save thumbnail \"%(thumbpath)s\": %(error)s" -msgstr "! 無法儲存預覽縮圖「%(thumbpath)s」:%(error)s" - -#: mcomix/mcomix/ui.py:35 mcomix/mcomix/library/book_area.py:164 -msgid "_Copy" -msgstr "複製(_C)" - -#: mcomix/mcomix/ui.py:36 -msgid "Copies the current page to clipboard." -msgstr "將目前這頁複製到剪貼簿。" - -#: mcomix/mcomix/ui.py:38 -msgid "_Delete" -msgstr "刪除(_D)" - -#: mcomix/mcomix/ui.py:39 -msgid "Deletes the current file or archive from disk." -msgstr "從磁碟刪除目前這個檔案或壓縮檔。" - -#: mcomix/mcomix/ui.py:41 -msgid "_Next page" -msgstr "下一頁(_N)" - -#: mcomix/mcomix/ui.py:43 -msgid "_Previous page" -msgstr "上一頁(_P)" - -#: mcomix/mcomix/ui.py:45 -msgid "_First page" -msgstr "第一頁(_F)" - -#: mcomix/mcomix/ui.py:47 -msgid "_Last page" -msgstr "最後一頁(_L)" - -#: mcomix/mcomix/ui.py:49 -msgid "_Go to page..." -msgstr "指定頁數(_G)..." - -#: mcomix/mcomix/ui.py:50 -msgid "Go to page..." -msgstr "指定頁數..." - -#: mcomix/mcomix/ui.py:51 -msgid "Re_fresh" -msgstr "重新整理(_F)" - -#: mcomix/mcomix/ui.py:52 -msgid "Reloads the currently opened files or archive." -msgstr "重新載入目前開啟的檔案或壓縮檔。" - -#: mcomix/mcomix/ui.py:54 -msgid "Next _archive" -msgstr "下一個壓縮檔(_A)" - -#: mcomix/mcomix/ui.py:56 -msgid "Previous a_rchive" -msgstr "上一個壓縮檔(_R)" - -#: mcomix/mcomix/ui.py:62 -msgid "Zoom _In" -msgstr "放大(_I)" - -#: mcomix/mcomix/ui.py:64 -msgid "Zoom _Out" -msgstr "縮小(_O)" - -#: mcomix/mcomix/ui.py:66 -msgid "_Normal Size" -msgstr "正常大小(_N)" - -#: mcomix/mcomix/ui.py:68 -msgid "Mi_nimize" -msgstr "縮到最小(_N)" - -#: mcomix/mcomix/ui.py:70 -msgid "_Close" -msgstr "關閉(_C)" - -#: mcomix/mcomix/ui.py:71 -msgid "Closes all opened files." -msgstr "關閉所有開啟的檔案。" - -#: mcomix/mcomix/ui.py:72 -msgid "_Quit" -msgstr "離開(_Q)" - -#: mcomix/mcomix/ui.py:74 -msgid "_Save and quit" -msgstr "儲存後離開(_S)" - -#: mcomix/mcomix/ui.py:75 -msgid "" -"Quits and restores the currently opened file next time the program starts." -msgstr "離開並在下次啟動程式時自動載入目前開啟的檔案。" - -#: mcomix/mcomix/ui.py:77 mcomix/mcomix/ui.py:161 mcomix/mcomix/ui.py:165 -msgid "_Rotate 90 degrees CW" -msgstr "順時針旋轉 90 度(_R)" - -#: mcomix/mcomix/ui.py:79 -msgid "Rotate 180 de_grees" -msgstr "旋轉 180 度(_G)" - -#: mcomix/mcomix/ui.py:81 mcomix/mcomix/ui.py:163 mcomix/mcomix/ui.py:167 -msgid "Rotat_e 90 degrees CCW" -msgstr "逆時針旋轉 90 度(_E)" - -#: mcomix/mcomix/ui.py:83 -msgid "Fli_p horizontally" -msgstr "水平翻轉(_P)" - -#: mcomix/mcomix/ui.py:85 -msgid "Flip _vertically" -msgstr "垂直翻轉(_V)" - -#: mcomix/mcomix/ui.py:87 -msgid "Save _As" -msgstr "另存為(_A)" - -#: mcomix/mcomix/ui.py:89 -msgid "_Zoom" -msgstr "縮放(_Z)" - -#: mcomix/mcomix/ui.py:90 -msgid "_Recent" -msgstr "最近開啟過的(_R)" - -#: mcomix/mcomix/ui.py:91 mcomix/mcomix/ui.py:92 -msgid "_Bookmarks" -msgstr "書籤(_B)" - -#: mcomix/mcomix/ui.py:93 -msgid "T_oolbars" -msgstr "工具列(_O)" - -#: mcomix/mcomix/ui.py:94 -msgid "_Edit" -msgstr "編輯(_E)" - -#: mcomix/mcomix/ui.py:95 mcomix/mcomix/ui.py:96 -msgid "Open _with" -msgstr "用其他工具開啟(_W)" - -#: mcomix/mcomix/ui.py:97 -msgid "_File" -msgstr "檔案(_F)" - -#: mcomix/mcomix/ui.py:98 mcomix/mcomix/ui.py:99 -msgid "_View" -msgstr "檢視(_V)" - -#: mcomix/mcomix/ui.py:102 -msgid "_Tools" -msgstr "工具(_T)" - -#: mcomix/mcomix/ui.py:103 -msgid "_Help" -msgstr "說明(_H)" - -#: mcomix/mcomix/ui.py:104 -msgid "_Transform image" -msgstr "圖片形變(_T)" - -#: mcomix/mcomix/ui.py:105 -msgid "_Auto-rotate image" -msgstr "自動旋轉圖片(_A)" - -#: mcomix/mcomix/ui.py:106 -msgid "...when width exceeds height" -msgstr "...寬度大於高度時" - -#: mcomix/mcomix/ui.py:107 -msgid "...when height exceeds width" -msgstr "...高度大於寬度時" - -#: mcomix/mcomix/ui.py:111 -msgid "_Fullscreen" -msgstr "全螢幕(_F)" - -#: mcomix/mcomix/ui.py:112 -msgid "Fullscreen mode" -msgstr "全螢幕模式" - -#: mcomix/mcomix/ui.py:113 -msgid "_Double page mode" -msgstr "雙頁模式(_D)" - -#: mcomix/mcomix/ui.py:115 -msgid "_Toolbar" -msgstr "工具列(_T)" - -#: mcomix/mcomix/ui.py:117 -msgid "_Menubar" -msgstr "選單列(_M)" - -#: mcomix/mcomix/ui.py:119 -msgid "St_atusbar" -msgstr "狀態列(_A)" - -#: mcomix/mcomix/ui.py:121 -msgid "S_crollbars" -msgstr "捲軸(_C)" - -#: mcomix/mcomix/ui.py:123 -msgid "Th_umbnails" -msgstr "預覽縮圖(_U)" - -#: mcomix/mcomix/ui.py:125 -msgid "H_ide all" -msgstr "全部隱藏(_I)" - -#: mcomix/mcomix/ui.py:127 -msgid "_Manga mode" -msgstr "漫畫模式(_M)" - -#: mcomix/mcomix/ui.py:130 -msgid "Invert smart scrolling direction." -msgstr "反方向智慧型捲動。" - -#: mcomix/mcomix/ui.py:131 -msgid "_Keep transformation" -msgstr "保持形變設定(_K)" - -#: mcomix/mcomix/ui.py:132 -msgid "Keeps the currently selected transformation for the next pages." -msgstr "下張圖片也保持目前選取的形變設定。" - -#: mcomix/mcomix/ui.py:134 -msgid "Start _slideshow" -msgstr "開始投影片放映(_S)" - -#: mcomix/mcomix/ui.py:136 -msgid "Magnifying _lens" -msgstr "放大鏡(_L)" - -#: mcomix/mcomix/ui.py:139 -msgid "Stretch images to fit to the screen, depending on zoom mode." -msgstr "配合縮放模式,將圖片伸展到符合螢幕大小。" - -#: mcomix/mcomix/ui.py:145 -msgid "_Best fit mode" -msgstr "最佳大小模式(_B)" - -#: mcomix/mcomix/ui.py:147 -msgid "Fit _width mode" -msgstr "符合寬度模式(_W)" - -#: mcomix/mcomix/ui.py:149 -msgid "Fit _height mode" -msgstr "符合高度模式(_H)" - -#: mcomix/mcomix/ui.py:151 -msgid "Fit _size mode" -msgstr "符合大小模式(_S)" - -#: mcomix/mcomix/ui.py:153 -msgid "M_anual zoom mode" -msgstr "手動縮放模式(_A)" - -#: mcomix/mcomix/ui.py:172 -msgid "_About" -msgstr "關於(_A)" - -#: mcomix/mcomix/ui.py:176 -msgid "Co_mments..." -msgstr "註解(M)..." - -#: mcomix/mcomix/ui.py:180 -msgid "Proper_ties" -msgstr "屬性(_T)" - -#: mcomix/mcomix/ui.py:184 -msgid "Pr_eferences" -msgstr "偏好設定(_E)" - -#: mcomix/mcomix/ui.py:189 -msgid "_Edit archive..." -msgstr "編輯壓縮檔(_E)..." - -#: mcomix/mcomix/ui.py:190 -msgid "Opens the archive editor." -msgstr "開啟壓縮檔編輯程式。" - -#: mcomix/mcomix/ui.py:192 -msgid "_Open..." -msgstr "開啟(_O)..." - -#: mcomix/mcomix/ui.py:194 -msgid "En_hance image..." -msgstr "圖片強化(_H)..." - -#: mcomix/mcomix/ui.py:198 -msgid "_Library..." -msgstr "書庫(_L)..." - -#: mcomix/mcomix/worker_thread.py:73 -#, fuzzy, python-format -msgid "! Worker thread processing %(function)r failed: %(error)s" -msgstr "! 呼叫 %(function)r 失敗:%(error)s" - -#: mcomix/mcomix/archive/__init__.py:13 -#, fuzzy -msgid "The archive is password-protected:" -msgstr "這個壓縮檔有密碼保護。" - -#: mcomix/mcomix/archive/zip.py:48 -#, python-format -msgid "" -"%(filename)s's extracted size is %(actual_size)d bytes, but should be " -"%(expected_size)d bytes. The archive might be corrupt or in an unsupported " -"format." -msgstr "" -"%(filename)s 的大小是 %(actual_size)dB,但應該是 %(expected_size)dB 才對。這" -"個壓縮檔可能有損壞或是不支援的格式。" - -#: mcomix/mcomix/library/add_progress_dialog.py:21 -msgid "Adding books" -msgstr "正在加入書籍" - -#: mcomix/mcomix/library/add_progress_dialog.py:42 -msgid "Added books:" -msgstr "已經加入的書籍:" - -#: mcomix/mcomix/library/add_progress_dialog.py:71 -#, python-format -msgid "Adding '%s'..." -msgstr "正在加入 %s ..." - -#: mcomix/mcomix/library/backend.py:131 mcomix/mcomix/library/backend.py:144 -#, python-format -msgid "! Non-existant book #%i" -msgstr "! 不存在的書籍 #%i" - -#: mcomix/mcomix/library/backend.py:162 -#, python-format -msgid "! Could not get cover for book \"%s\"" -msgstr "! 無法取得 %s 的封面" - -#: mcomix/mcomix/library/backend.py:340 -#, python-format -msgid "! Could not add book \"%s\" to the library" -msgstr "! 無法將 %s 加入這個書庫" - -#: mcomix/mcomix/library/backend.py:379 -#, python-format -msgid "! Could not add collection \"%s\"" -msgstr "! 無法新增 %s 書集" - -#: mcomix/mcomix/library/backend.py:392 -#, python-format -msgid "! Could not add book %(book)s to collection %(collection)s" -msgstr "!無法將書籍 %(book)s 加入到書集 %(collection)s" - -#: mcomix/mcomix/library/backend.py:419 -#, python-format -msgid "! Could not rename collection to \"%s\"" -msgstr "! 無法將書集重新命名為 %s" - -#: mcomix/mcomix/library/backend.py:430 mcomix/mcomix/library/backend.py:432 -msgid "(Copy)" -msgstr "(複製)" - -#: mcomix/mcomix/library/backend.py:532 -msgid "Could not determine library database version!" -msgstr "無法偵測書庫的資料版本!" - -#: mcomix/mcomix/library/backend.py:561 -#, python-format -msgid "Upgrading library database version from %(from)d to %(to)d." -msgstr "將書庫的資料庫版本從 %(from)d 升級到 %(to)d 。" - -#: mcomix/mcomix/library/backend.py:661 -msgid "Recent" -msgstr "最近開啟過的" - -#: mcomix/mcomix/library/backend_types.py:197 -#: mcomix/mcomix/library/collection_area.py:141 -msgid "All books" -msgstr "所有書籍" - -#: mcomix/mcomix/library/book_area.py:139 -msgid "Library books" -msgstr "書庫的書" - -#: mcomix/mcomix/library/book_area.py:141 -msgid "_Open" -msgstr "開啟(_O)" - -#: mcomix/mcomix/library/book_area.py:142 -msgid "Opens the selected books for viewing." -msgstr "開啟選取的書。" - -#: mcomix/mcomix/library/book_area.py:145 -msgid "Open _without closing library" -msgstr "開啟但不關閉書庫(_W)" - -#: mcomix/mcomix/library/book_area.py:146 -msgid "Opens the selected books, but keeps the library window open." -msgstr "開啟選取的書,但不關閉書庫視窗。" - -#: mcomix/mcomix/library/book_area.py:148 -#: mcomix/mcomix/library/collection_area.py:76 -msgid "_Add..." -msgstr "加入(_A)..." - -#: mcomix/mcomix/library/book_area.py:149 -#: mcomix/mcomix/library/collection_area.py:77 -msgid "Add more books to the library." -msgstr "將更多書籍加入書庫中。" - -#: mcomix/mcomix/library/book_area.py:152 -msgid "Remove from this _collection" -msgstr "從這個書集中移除(_C)" - -#: mcomix/mcomix/library/book_area.py:153 -msgid "Removes the selected books from the current collection." -msgstr "從目前這個書集中移除選取的書。" - -#: mcomix/mcomix/library/book_area.py:156 -msgid "Remove from the _library" -msgstr "從這個書庫中移除(_L)" - -#: mcomix/mcomix/library/book_area.py:157 -msgid "Completely removes the selected books from the library." -msgstr "從這個書庫中完全移除選取的書。" - -#: mcomix/mcomix/library/book_area.py:160 -msgid "_Remove and delete from disk" -msgstr "移除並從磁碟中刪除(_R)" - -#: mcomix/mcomix/library/book_area.py:161 -msgid "Deletes the selected books from disk." -msgstr "從硬碟刪除選取的書籍。" - -#: mcomix/mcomix/library/book_area.py:165 -msgid "Copies the selected book's path to clipboard." -msgstr "將選取的書的路徑複製到剪貼簿。" - -#: mcomix/mcomix/library/book_area.py:167 -msgid "_Sort" -msgstr "排序(_S)" - -#: mcomix/mcomix/library/book_area.py:168 -msgid "Changes the sort order of the library." -msgstr "變更這個書庫的排列順序。" - -#: mcomix/mcomix/library/book_area.py:169 -msgid "Cover si_ze" -msgstr "封面大小(_Z)" - -#: mcomix/mcomix/library/book_area.py:170 -msgid "Changes the book cover size." -msgstr "變更書籍封面大小。" - -#: mcomix/mcomix/library/book_area.py:174 -msgid "Book name" -msgstr "書籍名稱" - -#: mcomix/mcomix/library/book_area.py:175 -msgid "Full path" -msgstr "完整路徑" - -#: mcomix/mcomix/library/book_area.py:177 -msgid "Date added" -msgstr "加入的時間" - -#: mcomix/mcomix/library/book_area.py:188 -msgid "Huge" -msgstr "極大" - -#: mcomix/mcomix/library/book_area.py:190 -msgid "Large" -msgstr "較大" - -#: mcomix/mcomix/library/book_area.py:194 -msgid "Small" -msgstr "較小" - -#: mcomix/mcomix/library/book_area.py:196 -msgid "Tiny" -msgstr "極小" - -#: mcomix/mcomix/library/book_area.py:198 -msgid "Custom..." -msgstr "自訂..." - -#: mcomix/mcomix/library/book_area.py:398 -msgid "Set library cover size" -msgstr "設定書庫封面大小" - -#: mcomix/mcomix/library/book_area.py:516 -#, python-format -msgid "Removed %(num)d book from '%(collection)s'." -msgid_plural "Removed %(num)d books from '%(collection)s'." -msgstr[0] "已經移除 %(num)d 本 %(collection)s 書集的書。" -msgstr[1] "已經移除 %(num)d 本 %(collection)s 書集的書。" - -#: mcomix/mcomix/library/book_area.py:538 -#: mcomix/mcomix/library/collection_area.py:189 -#, python-format -msgid "Removed %d book from the library." -msgid_plural "Removed %d books from the library." -msgstr[0] "已經從這個書庫移除 %d 本書。" -msgstr[1] "已經從這個書庫移除 %d 本書。" - -#: mcomix/mcomix/library/book_area.py:556 -msgid "Remove books from the library?" -msgstr "從這個書庫移除書籍?" - -#: mcomix/mcomix/library/book_area.py:557 -msgid "" -"The selected books will be removed from the library and permanently deleted. " -"Are you sure that you want to continue?" -msgstr "這些書將從書庫中移除並被永遠刪除,你確定要繼續嗎?" - -#: mcomix/mcomix/library/collection_area.py:74 -msgid "Library collections" -msgstr "書庫的書集" - -#: mcomix/mcomix/library/collection_area.py:79 -msgid "New" -msgstr "新增" - -#: mcomix/mcomix/library/collection_area.py:80 -msgid "Add a new empty collection." -msgstr "新增新的空白書集。" - -#: mcomix/mcomix/library/collection_area.py:82 -msgid "Re_name" -msgstr "重新命名(_N)" - -#: mcomix/mcomix/library/collection_area.py:83 -msgid "Renames the selected collection." -msgstr "將選取的書集重新命名。" - -#: mcomix/mcomix/library/collection_area.py:85 -msgid "_Duplicate" -msgstr "備份(_D)" - -#: mcomix/mcomix/library/collection_area.py:86 -msgid "Creates a duplicate of the selected collection." -msgstr "建立選取的書集的備份。" - -#: mcomix/mcomix/library/collection_area.py:88 -msgid "_Clean up" -msgstr "清除(_C)" - -#: mcomix/mcomix/library/collection_area.py:89 -msgid "Removes no longer existant books from the collection." -msgstr "從書集中移除已不存在的書。" - -#: mcomix/mcomix/library/collection_area.py:91 -#: mcomix/mcomix/library/watchlist.py:70 -msgid "_Remove" -msgstr "移除(_R)" - -#: mcomix/mcomix/library/collection_area.py:92 -msgid "Deletes the selected collection." -msgstr "刪除選取的書集。" - -#: mcomix/mcomix/library/collection_area.py:153 -msgid "Add new collection?" -msgstr "要新增書集嗎?" - -#: mcomix/mcomix/library/collection_area.py:154 -msgid "Please enter a name for the new collection." -msgstr "請輸入新書集的名稱。" - -#: mcomix/mcomix/library/collection_area.py:173 -#, python-format -msgid "Could not add a new collection called '%s'." -msgstr "無法新增 %s 書集。" - -#: mcomix/mcomix/library/collection_area.py:178 -#: mcomix/mcomix/library/collection_area.py:271 -msgid "A collection by that name already exists." -msgstr "已有相同名稱的書集。" - -#: mcomix/mcomix/library/collection_area.py:247 -msgid "Rename collection?" -msgstr "重新命名書集?" - -#: mcomix/mcomix/library/collection_area.py:248 -msgid "Please enter a new name for the selected collection." -msgstr "請輸入這個書集的新名稱。" - -#: mcomix/mcomix/library/collection_area.py:267 -#, python-format -msgid "Could not change the name to '%s'." -msgstr "無法重新命名為 %s 。" - -#: mcomix/mcomix/library/collection_area.py:281 -msgid "Could not duplicate collection." -msgstr "無法備份書集。" - -#: mcomix/mcomix/library/collection_area.py:408 -msgid "Root" -msgstr "Root" - -#: mcomix/mcomix/library/collection_area.py:412 -#, python-format -msgid "" -"Put the collection '%(subcollection)s' in the collection " -"'%(supercollection)s'." -msgstr "將 %(subcollection)s 書集放到 %(supercollection)s 書集。" - -#: mcomix/mcomix/library/collection_area.py:433 -#, python-format -msgid "Add books to '%s'." -msgstr "將書籍加入 %s 。" - -#: mcomix/mcomix/library/collection_area.py:437 -#, python-format -msgid "" -"Move books from '%(source collection)s' to '%(destination collection)s'." -msgstr "將書籍從 %(source collection)s 移到 %(destination collection)s 。" - -#: mcomix/mcomix/library/control_area.py:69 -msgid "_Search:" -msgstr "搜尋(_S):" - -#: mcomix/mcomix/library/control_area.py:75 -msgid "" -"Display only those books that have the specified text string in their full " -"path. The search is not case sensitive." -msgstr "只顯示完整路徑中有指定關鍵字的書籍,搜尋時不區分大小寫。" - -#: mcomix/mcomix/library/control_area.py:84 -msgid "_Watch list" -msgstr "觀看清單(_W)" - -#: mcomix/mcomix/library/control_area.py:91 -msgid "Open the watchlist management dialog." -msgstr "開啟觀看清單管理視窗。" - -#: mcomix/mcomix/library/control_area.py:94 -#, fuzzy -msgid "_Open list" -msgstr "用其他工具開啟(_W)" - -#: mcomix/mcomix/library/control_area.py:100 -msgid "Open the selected book." -msgstr "開啟選取的書籍。" - -#: mcomix/mcomix/library/control_area.py:149 -#, python-format -msgid "Finished reading on %(date)s, %(time)s" -msgstr "在 %(date)s %(time)s 讀完" - -#: mcomix/mcomix/library/main_dialog.py:83 -msgid "Scanning for new books..." -msgstr "正在掃描新書..." - -#: mcomix/mcomix/library/main_dialog.py:98 -#, python-format -msgid "Added new book '%(bookname)s' from directory '%(directory)s'." -msgstr "已經將新書「%(bookname)s」從 %(directory)s 目錄加到書庫了。" - -#: mcomix/mcomix/library/main_dialog.py:101 -#, python-format -msgid "Added %(count)d new books from directory '%(directory)s'." -msgstr "已經從 %(directory)s 目錄新增 %(count)d 本新書了。" - -#: mcomix/mcomix/library/main_dialog.py:108 -#, python-format -msgid "No new books found in directory '%s'." -msgstr "在 %s 目錄裏沒有找到新書。" - -#: mcomix/mcomix/library/main_dialog.py:168 -msgid "! You need an sqlite wrapper to use the library." -msgstr "! 你必須有 sqlite wrapper 才能使用這個書庫。" - -#: mcomix/mcomix/library/watchlist.py:25 -msgid "Library watch list" -msgstr "書庫觀看清單" - -#: mcomix/mcomix/library/watchlist.py:27 -msgid "_Scan now" -msgstr "立即掃描(_S)" - -#: mcomix/mcomix/library/watchlist.py:43 -msgid "Directory" -msgstr "目錄" - -#: mcomix/mcomix/library/watchlist.py:55 -msgid "Collection" -msgstr "書集" - -#: mcomix/mcomix/library/watchlist.py:63 -msgid "With subdirectories" -msgstr "含子目錄" - -#: mcomix/mcomix/library/watchlist.py:68 -msgid "_Add" -msgstr "加入(_A)..." - -#: mcomix/mcomix/library/watchlist.py:87 -msgid "Automatically scan for new books when library is _opened" -msgstr "書庫開啟時自動搜尋新書(_O)" - -#~ msgid "Installed GTK+ version is: %s" -#~ msgstr "安裝的 GTK+ 版本:%s" - -#, fuzzy -#~ msgid "Required GTK+ version is: 2.12.0 or higher" -#~ msgstr "需要的 GTK+ 版本:2.12.0 或更新版\n" - -#~ msgid "Installed PyGTK version is: %s" -#~ msgstr "安裝的 PyGTK 版本:%s" - -#~ msgid "Required PyGTK version is: 2.12.0 or higher" -#~ msgstr "需要的 PyGTK 版本:2.12.0 或更新版" - -#~ msgid "Invalid working directory." -#~ msgstr "工作目錄不正確。" - -#~ msgid "ZIP archives" -#~ msgstr "ZIP 壓縮檔" - -#~ msgid "Tar archives" -#~ msgstr "TAR 壓縮檔" - -#~ msgid "RAR archives" -#~ msgstr "RAR 壓縮檔" - -#~ msgid "LHA archives" -#~ msgstr "LHA 壓縮檔" - -#~ msgid "JPEG images" -#~ msgstr "JPEG 圖片" - -#~ msgid "PNG images" -#~ msgstr "PNG 圖片" - -#~ msgid "GIF images" -#~ msgstr "GIF 圖片" - -#~ msgid "TIFF images" -#~ msgstr "TIFF 圖片" - -#~ msgid "BMP images" -#~ msgstr "BMP 圖片" - -#~ msgid "Could not open %s: Unknown file type." -#~ msgstr "無法開啟 %s:不明的檔案類型。" - -#~ msgid "Use this colour as the thumbnail background:" -#~ msgstr "用這個顏色當預覽縮圖背景:" - -#~ msgid "! Error spawning process \"%(command)s\": %(error)s." -#~ msgstr "! 執行「%(command)s」時發生錯誤:%(error)s" - -#~ msgid "\"%(command)s\" must be on your system PATH to be found." -#~ msgstr "「%(command)s」必須能在系統變數 PATH 的路徑裏找得到。" - -#~ msgid "Please enter the password to continue:" -#~ msgstr "請輸入密碼才能繼續:" - -#~ msgid "Cache" -#~ msgstr "快取" - -#~ msgid "Toggle fullscreen" -#~ msgstr "切換全螢幕模式" - -#~ msgid "File path" -#~ msgstr "檔案路徑" - -#~ msgid "Image directory path" -#~ msgstr "圖片目錄路徑" - -#~ msgid "Image directory name" -#~ msgstr "圖片目錄名稱" - -#~ msgid "Archive-related variables" -#~ msgstr "壓縮檔相關變數" - -#~ msgid "Archive path" -#~ msgstr "壓縮檔路徑" - -#~ msgid "Archive's directory path" -#~ msgstr "壓縮檔的目錄路徑" - -#~ msgid "Archive's directory name" -#~ msgstr "壓縮檔的目錄名稱" - -#~ msgid "Literal quote" -#~ msgstr "文字引號字元" - -#~ msgid "Literal % character" -#~ msgstr "文字 % 字元" - -#~ msgid "Directory name" -#~ msgstr "目錄名稱" - -#~ msgid "Preview area" -#~ msgstr "上一個區域" - -#~ msgid "Add to this collection:" -#~ msgstr "加到這個書集:" - -#~ msgid "Reading" -#~ msgstr "正在讀取" - -#~ msgid "Page orientation and zoom" -#~ msgstr "頁面定位與縮放" - -#~ msgid "User Interface" -#~ msgstr "使用者介面" - -#~ msgid "Order files by:" -#~ msgstr "檔案排序:" - -#~ msgid "Delay thumbnail generation" -#~ msgstr "延遲產生預覽縮圖" - -#~ msgid "" -#~ "Thumbnails are generated only when required, instead of directly after " -#~ "opening a new file." -#~ msgstr "只在要求時才產生預覽縮圖,而不是每次開啟新檔案時都產生。" - -#~ msgid "Lead developer of MComix" -#~ msgstr "MComix 的首席開發者" - -#~ msgid "Show only one page where appropriate" -#~ msgstr "在特殊的狀況時只顯示一頁" - -#~ msgid "Show only one wide image in double page mode" -#~ msgstr "雙頁模式時只顯示單張的寬幅圖片" - -#~ msgid "" -#~ "Display only one image in double page mode, if the image's width exceeds " -#~ "its height. The result of this is that scans that span two pages are " -#~ "displayed properly (i.e. alone) also in double page mode." -#~ msgstr "如果圖片寬度大於高度,則在雙頁模式時仍只顯示單張圖片。" - -#~ msgid "Use the dynamic background colour for the thumbnail background." -#~ msgstr "預覽縮圖使用動態背景顏色。" - -#~ msgid "Default modes" -#~ msgstr "預設模式" - -#~ msgid "Use double page mode by default." -#~ msgstr "預設使用雙頁模式。" - -#~ msgid "Use manga mode by default." -#~ msgstr "預設使用漫畫模式。" - -#~ msgid "Refresh file" -#~ msgstr "更新檔案" - -#~ msgid "" -#~ "Stretch images to a size that is larger than their original size if the " -#~ "current zoom mode requests it. If this preference is unset, images are " -#~ "never scaled to be larger than their original size." -#~ msgstr "配合目前的縮放模式,將圖片伸展放大到設定的大小。" - -#~ msgid "" -#~ "The selected books will be removed from the library (but the original " -#~ "files will be untouched). Are you sure that you want to continue?" -#~ msgstr "這些書籍將從書庫中移除,但原始檔案不會受影響。你確定要繼續嗎?" - -#~ msgid "Remove collection from the library?" -#~ msgstr "要從書庫中移除書集嗎?" - -#~ msgid "" -#~ "The selected collection will be removed from the library (but the books " -#~ "and subcollections in it will remain). Are you sure that you want to " -#~ "continue?" -#~ msgstr "這些書集將從書庫中移除,但書籍與子書集仍會留著。你確定要繼續嗎?" - -#~ msgid "Removed %d book(s) from the library." -#~ msgstr "已從書庫移除 %d 本書籍。" - -#~ msgid "Rename..." -#~ msgstr "重新命名..." - -#~ msgid "Duplicate collection" -#~ msgstr "備份書集" - -#~ msgid "Remove collection..." -#~ msgstr "移除書集..." - -#~ msgid "About" -#~ msgstr "關於" - -#~ msgid "" -#~ "MComix is an image viewer specifically designed to handle comic books." -#~ msgstr "Comix 是一個圖片檢視器,特別設計用於觀看漫畫書。" - -#~ msgid "MComix is released to the public domain." -#~ msgstr "Comix 是屬公眾領域釋出。" - -#~ msgid "Credits" -#~ msgstr "致謝" - -#~ msgid "! Could not find RAR file extractor." -#~ msgstr "! 找不到 RAR 檔解壓縮程式。" - -#~ msgid "Could not find RAR file extractor!" -#~ msgstr "無法找到 RAR 檔解壓縮程式!" - -#~ msgid "" -#~ "You need either the rar or the unrar program installed in " -#~ "order to read RAR (.cbr) files." -#~ msgstr "" -#~ "你需要安裝 rarunrar 程式,才能讀取 RAR (.cbr) 檔。" - -#~ msgid "! Could not create archive at " -#~ msgstr "! 無法建立壓縮擋於" - -#~ msgid "! Could not add file " -#~ msgstr "! 無法新增檔案" - -#~ msgid "Edit bookmarks" -#~ msgstr "編輯書籤" - -#~ msgid "_Add bookmark" -#~ msgstr "加入書籤(_A)" - -#~ msgid "_Edit bookmarks..." -#~ msgstr "編輯書籤...(_E)" - -#~ msgid "_Clear bookmarks..." -#~ msgstr "清除書籤...(_C)" - -#~ msgid "Clear all bookmarks?" -#~ msgstr "要清除所有書籤嗎?" - -#~ msgid "" -#~ "All stored bookmarks will be removed. Are you sure that you want to " -#~ "continue?" -#~ msgstr "所有保存的書籤都會被移除,你確定要這樣做嗎?" - -#~ msgid "There are deprecated files left on your computer." -#~ msgstr "你的電腦中有一些已不再使用的檔案。" - -#~ msgid "" -#~ "Some old files (that were used for storing preferences, the library, " -#~ "bookmarks etc. for older versions of MComix) were found on your computer. " -#~ "If you do not plan on using the older versions of MComix again, you " -#~ "should remove these files in order to save some disk space. Do you want " -#~ "these files to be removed for you now?" -#~ msgstr "" -#~ "在你的電腦中找到舊版本 MComix 的設定、書庫、書籤等檔案。如果你以後不會再使" -#~ "用舊版 MComix,可以刪除它們以節省磁碟空間。你想要現在就刪除這些檔案嗎?" - -#~ msgid "! Could not remove" -#~ msgstr "! 無法移除" - -#~ msgid "Import" -#~ msgstr "匯入" - -#~ msgid "Defaults" -#~ msgstr "預設值" - -#~ msgid "Could not open %s: Is a directory." -#~ msgstr "無法開啟 %s:它是目錄。" - -#~ msgid "! Could not load icon \"" -#~ msgstr "! 無法載入圖示 \"" - -#~ msgid "! Could not get cover for " -#~ msgstr "! 無法取得封面 (" - -#~ msgid "! Could not add book " -#~ msgstr "! 無法新增書籍" - -#~ msgid " to the library" -#~ msgstr "到這個書庫" - -#~ msgid "! Could not add collection" -#~ msgstr "! 無法新增書集" - -#~ msgid "! Could not rename collection to " -#~ msgstr "! 無法重新命名書集為" - -#~ msgid "Remove from this collection" -#~ msgstr "從這個書集移除" - -#~ msgid "Remove from the library..." -#~ msgstr "從這個書庫移除..." - -#~ msgid "Cover size" -#~ msgstr "封面大小" - -#~ msgid "Usage:" -#~ msgstr "用法:" - -#~ msgid "Stretch small images." -#~ msgstr "伸展較小圖片。" - -#~ msgid "Default zoom mode" -#~ msgstr "預設縮放模式" - -#~ msgid "Show page numbers." -#~ msgstr "顯示頁碼。" - -#~ msgid "_Next archive" -#~ msgstr "下一個壓縮檔(_N)" - -#~ msgid "_Previous archive" -#~ msgstr "上一個壓縮擋(_P)" - -#~ msgid "_Zoom in" -#~ msgstr "放大(_Z)" - -#~ msgid "Zoom _out" -#~ msgstr "縮小(_o)" - -#~ msgid "O_riginal size" -#~ msgstr "正常大小(_r)" - -#~ msgid "Manual _Zoom" -#~ msgstr "手動縮放(_Z)" - -#~ msgid "Open _recent" -#~ msgstr "最近存取的檔案(_r)" - -#~ msgid "_Transform image..." -#~ msgstr "變換影像...(_T)" - -#~ msgid "_View comments..." -#~ msgstr "檢視註解...(_V)" - -#~ msgid "_Properties" -#~ msgstr "屬性(_P)" - -#~ msgid "_Enhance image..." -#~ msgstr "強化圖片...(_E)" - -#~ msgid "Developer" -#~ msgstr "開發者" - -#~ msgid "Use a cache to speed up browsing." -#~ msgstr "使用快取以加速瀏覽。" - -#~ msgid "" -#~ "Cache the images that are next to the currently viewed image in order to " -#~ "speed up browsing. Since the speed improvements are quite big, it is " -#~ "recommended that you have this preference set, unless you are running " -#~ "short on free RAM." -#~ msgstr "" -#~ "替下一張圖片建立快取以增加瀏覽速度。由於效果非常優異,除非是在記憶體較不足" -#~ "的系統上,不然建議你啟用這個功能。" - -#~ msgid "Thumbnail maintenance" -#~ msgstr "縮圖管理" - -#~ msgid "Cleanup" -#~ msgstr "清理" - -#~ msgid "Cleanup thumbnails" -#~ msgstr "清理縮圖" - -#~ msgid "" -#~ "Thumbnails for files (such as image files and comic book archives) are " -#~ "stored in your home directory. Many different applications use and create " -#~ "these thumbnails, but sometimes thumbnails remain even though the " -#~ "original files have been removed - wasting space. This dialog can cleanup " -#~ "your stored thumbnails by removing orphaned and outdated thumbnails." -#~ msgstr "" -#~ "各種應用程式儲存了許多圖片檔、壓縮檔的縮圖在你的個人目錄中,但很可能縮圖還" -#~ "在而原始檔案已經被移除了,因而浪費許多空間。這個項目可以清理、移除失效與過" -#~ "期的縮圖。" - -#~ msgid "Thumbnail directory" -#~ msgstr "縮圖目錄" - -#~ msgid "Total number of thumbnails" -#~ msgstr "縮圖總數" - -#~ msgid "Calculating..." -#~ msgstr "計算中..." - -#~ msgid "Total size of thumbnails" -#~ msgstr "縮圖總大小" - -#~ msgid "Do you want to cleanup orphaned and outdated thumbnails now?" -#~ msgstr "你要立即清理失效與過期的縮圖嗎?" - -#~ msgid "Removing thumbnails" -#~ msgstr "正在移除縮圖" - -#~ msgid "Number of removed thumbnails" -#~ msgstr "已移除的縮圖數量" - -#~ msgid "Total size of removed thumbnails" -#~ msgstr "已移除的縮圖總大小" - -#~ msgid "Removed thumbnail for '%s'" -#~ msgstr "已移除 %s 的縮圖" - -#~ msgid "_Thumbnail maintenance..." -#~ msgstr "縮圖管理...(_T)" - -#~ msgid "Store information about recently opened files" -#~ msgstr "儲存最近開啟過的檔案資訊m" - -#~ msgid "Removed %(num)d book(s) from '%(collection)s'." -#~ msgstr "已經移除 %(num)d 本 %(collection)s 書集的書。" - -#~ msgid "New collection" -#~ msgstr "新書集" - -#~ msgid "Image scaling" -#~ msgstr "圖片縮放" - -#~ msgid "Only file names" -#~ msgstr "只有檔案名稱" - -#~ msgid "File names and last read page" -#~ msgstr "檔案名稱和最後讀取頁數" - -#~ msgid "Catalan" -#~ msgstr "加泰隆尼亞" - -#~ msgid "Czech" -#~ msgstr "捷克文" - -#~ msgid "German" -#~ msgstr "德文" - -#~ msgid "Greek" -#~ msgstr "希臘文" - -#~ msgid "English" -#~ msgstr "英文" - -#~ msgid "Spanish" -#~ msgstr "西班牙文" - -#~ msgid "Persian" -#~ msgstr "波斯文" - -#~ msgid "French" -#~ msgstr "法文" - -#~ msgid "Galician" -#~ msgstr "加里西亞文" - -#~ msgid "Croatian" -#~ msgstr "克羅埃西亞文" - -#~ msgid "Hungarian" -#~ msgstr "匈牙利文" - -#~ msgid "Indonesian" -#~ msgstr "印尼文" - -#~ msgid "Italian" -#~ msgstr "義大利文" - -#~ msgid "Japanese" -#~ msgstr "日文" - -#~ msgid "Korean" -#~ msgstr "韓文" - -#~ msgid "Dutch" -#~ msgstr "荷蘭文" - -#~ msgid "Polish" -#~ msgstr "坡欄文" - -#~ msgid "Portuguese" -#~ msgstr "葡萄牙文" - -#~ msgid "Russian" -#~ msgstr "俄文" - -#~ msgid "Swedish" -#~ msgstr "瑞典文" - -#~ msgid "Ukrainian" -#~ msgstr "烏克蘭文" - -#~ msgid "Chinese (simplified)" -#~ msgstr "簡體中文" - -#~ msgid "Chinese (traditional)" -#~ msgstr "正體中文" - -#~ msgid "! Deleting corrupt bookmarks file." -#~ msgstr "! 正在刪除損壞的書籤檔。" - -#~ msgid "User interface language" -#~ msgstr "使用者界面的語系" - -#~ msgid "Use smart space key scrolling" -#~ msgstr "使用智慧型空白鍵捲動" - -#~ msgid "" -#~ "Use smart scrolling with the space key. Normally the space key scrolls " -#~ "only right down (or up when shift is pressed), but with this preference " -#~ "set it also scrolls sideways and so tries to follow the natural reading " -#~ "order of the comic book." -#~ msgstr "" -#~ "使用智慧型的空白鍵捲動。通常按下空白鍵時只會向下捲動 (若按住 shift 時則是" -#~ "下上捲動),但設定這個項目後,也會側向捲動,以儘量配合一般的漫畫書閱讀順" -#~ "序。" diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/mimetypes.py mcomix-2.1.0/mcomix/mcomix/mimetypes.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/mimetypes.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/mimetypes.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -import mimetypes - -from mcomix import constants - -if not mimetypes.inited: - mimetypes.init() - for suffix,mime in constants.ARCHIVE_FORMATS: - if suffix not in mimetypes.types_map: - mimetypes.add_type(mime,suffix) - -def guess_type(*args,**kwargs): - return mimetypes.guess_type(*args,**kwargs) diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/openwith_menu.py mcomix-2.1.0/mcomix/mcomix/openwith_menu.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/openwith_menu.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/openwith_menu.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -''' openwith_menu.py - Menu shell for the Open with... menu. ''' - -from gi.repository import Gtk - -from mcomix import openwith - -# Reference to the OpenWith command manager -_openwith_manager = openwith.OpenWithManager() -# Reference to the edit dialog (to keep only one instance) -_openwith_edit_diag = None - -class OpenWithMenu(Gtk.Menu): - def __init__(self, ui, window): - ''' Constructor. ''' - super(OpenWithMenu, self).__init__() - - self._window = window - self._openwith_manager = _openwith_manager - - actiongroup = Gtk.ActionGroup(name='mcomix-openwith') - actiongroup.add_actions([ - ('edit_commands', Gtk.STOCK_EDIT, _('_Edit commands'), - None, None, self._edit_commands)]) - - action = actiongroup.get_action('edit_commands') - action.set_accel_group(ui.get_accel_group()) - self.edit_button = action.create_menu_item() - self.append(self.edit_button) - - self._construct_menu() - - self._window.filehandler.file_opened += self._set_sensitivity - self._window.filehandler.file_closed += self._set_sensitivity - self._openwith_manager.set_commands += self._construct_menu - - self.show_all() - - def _construct_menu(self, *args): - ''' Build the menu entries from scratch. ''' - for item in self.get_children(): - if item != self.edit_button: - self.remove(item) - - commandlist = self._openwith_manager.get_commands() - - if len(commandlist) > 0: - separator = Gtk.SeparatorMenuItem() - separator.show() - self.prepend(separator) - - for command in reversed(commandlist): - if not command.is_separator(): - menuitem = Gtk.MenuItem(label=command.get_label()) - menuitem.connect('activate', self._commandmenu_clicked, - command.get_command(), command.get_label(), - command.get_cwd(), command.is_disabled_for_archives()) - else: - menuitem = Gtk.SeparatorMenuItem() - - menuitem.show() - self.prepend(menuitem) - - self._set_sensitivity() - - def _set_sensitivity(self): - ''' Enables or disables menu items depending on files being loaded. ''' - sensitive = self._window.filehandler.file_loaded - for item in self.get_children(): - if item != self.edit_button: - item.set_sensitive(sensitive) - - def _commandmenu_clicked(self, menuitem, cmd, label, cwd, disabled_in_archives): - ''' Execute the command associated with the clicked menu. ''' - command = openwith.OpenWithCommand(label, cmd, cwd, disabled_in_archives) - command.execute(self._window) - - def _edit_commands(self, *args): - ''' When clicked, opens the command editor to set up the menu. Make - sure the dialog isn't opened more than once. ''' - global _openwith_edit_diag - if not _openwith_edit_diag: - _openwith_edit_diag = openwith.OpenWithEditor(self._window, - self._openwith_manager) - _openwith_edit_diag.connect_after('response', self._dialog_closed) - - _openwith_edit_diag.show_all() - _openwith_edit_diag.present() - - def _dialog_closed(self, *args): - ''' Watch for the dialog getting closed and unset the local instance. ''' - global _openwith_edit_diag - _openwith_edit_diag.destroy() - _openwith_edit_diag = None - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/openwith.py mcomix-2.1.0/mcomix/mcomix/openwith.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/openwith.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/openwith.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,553 +0,0 @@ -''' openwith.py - Logic and storage for Open with... commands. ''' -import os -import re -import shlex -import sys - -from gi.repository import Gtk -from gi.repository import GLib, GObject - -from mcomix.preferences import prefs -from mcomix import message_dialog -from mcomix import process -from mcomix import callback - - -DEBUGGING_CONTEXT, NO_FILE_CONTEXT, IMAGE_FILE_CONTEXT, ARCHIVE_CONTEXT = -1, 0, 1, 2 - -class OpenWithException(Exception): pass - - -class OpenWithManager(object): - def __init__(self): - ''' Constructor. ''' - pass - - @callback.Callback - def set_commands(self, cmds): - prefs['external commands'] = [ - (cmd.get_label(), cmd.get_command(), - cmd.get_cwd(), cmd.is_disabled_for_archives()) - for cmd in cmds] - - def get_commands(self): - try: - return [OpenWithCommand(label, command, cwd, disabled_for_archives) - for label, command, cwd, disabled_for_archives - in prefs['external commands']] - except ValueError as e: - OpenWithException(_('external commands error: {}.').format(e)) - - -class OpenWithCommand(object): - def __init__(self, label, command, cwd, disabled_for_archives): - self.label = label - self.command = command.strip() - self.cwd = cwd.strip() - self.disabled_for_archives = bool(disabled_for_archives) - - def get_label(self): - return self.label - - def get_command(self): - return self.command - - def get_cwd(self): - return self.cwd - - def is_disabled_for_archives(self): - return self.disabled_for_archives - - def is_separator(self): - return bool(re.match(r'^-+$', self.get_label().strip())) - - def execute(self, window): - ''' Spawns a new process with the given executable - and arguments. ''' - if (self.is_disabled_for_archives() and - window.filehandler.archive_type is not None): - window.osd.show(_('"%s" is disabled for archives.') % \ - self.get_label()) - return - - current_dir = os.getcwd() - try: - if self.is_valid_workdir(window): - workdir = self.parse(window, text=self.get_cwd())[0] - os.chdir(workdir) - - args = self.parse(window) - process.call_thread(args) - - except Exception as e: - text = _('Could not run command %(cmdlabel)s: %(exception)s') % \ - {'cmdlabel': self.get_label(), 'exception': str(e)} - window.osd.show(text) - finally: - os.chdir(current_dir) - - def is_executable(self, window): - ''' Check if a name is executable. This name can be either - a relative path, when the executable is in PATH, or an - absolute path. ''' - args = self.parse(window) - if len(args) == 0: - return False - - if self.is_valid_workdir(window): - workdir = self.parse(window, text=self.get_cwd())[0] - else: - workdir = os.getcwd() - - exe = process.find_executable((args[0],), workdir=workdir) - - return exe is not None - - def is_valid_workdir(self, window, allow_empty=False): - ''' Check if the working directory is valid. ''' - cwd = self.get_cwd().strip() - if not cwd: - return allow_empty - - args = self.parse(window, text=cwd) - if len(args) > 1: - return False - - dir = args[0] - if os.path.isdir(dir) and os.access(dir, os.X_OK): - return True - - return False - - def parse(self, window, text='', check_restrictions=True): - ''' Parses the command string and replaces special characters - with their respective variable contents. Returns a list of - arguments. - If check_restrictions is False, no checking will be done - if one of the variables isn't valid in the current file context. ''' - if not text: - text = self.get_command() - if not text.strip(): - raise OpenWithException(_('Command line is empty.')) - - args = self._commandline_to_arguments( - text, window, - self._get_context_type(window, check_restrictions) - ) - return args - - def _commandline_to_arguments(self, line, window, context_type): - ''' New parser for commandline using shlex and new style formatter. - ''' - result = shlex.split(line) - variables = self._create_format_dict(window, context_type) - for i, arg in enumerate(result): - result[i]=self._format_argument(arg, variables) - return result - - def _create_format_dict(self, window, context_type): - variables = {} - if context_type == NO_FILE_CONTEXT: - # dummy variables for preview if no file opened - variables.update((head+tail,'{{{}{}}}'.format(head, tail)) - for head in ('image', 'archive', 'container') - for tail in ('', 'dir', 'base', 'dirbase')) - return variables - variables.update(( - ('image', os.path.normpath(window.imagehandler.get_path_to_page())), # %F - ('imagebase', window.imagehandler.get_page_filename()), # %f - )) - variables['imagedir'] = os.path.dirname(variables['image']) # %D - variables['imagedirbase'] = os.path.basename(variables['imagedir']) # %d - if context_type & ARCHIVE_CONTEXT: - variables.update(( - ('archive', window.filehandler.get_path_to_base()), # %A - ('archivebase', window.filehandler.get_base_filename()), # %a - )) - variables['archivedir'] = os.path.dirname(variables['archive']) # %C - variables['archivedirbase'] = os.path.basename(variables['archivedir']) # %c - container = 'archive' # currently opened archive - else: - container = 'imagedir' # directory containing the currently opened image file - variables.update(( - ('container', variables[container]), # %B - ('containerbase', variables[container+'base']), # %b - )) - variables['containerdir'] = os.path.dirname(variables['container']) # %S - variables['containerdirbase'] = os.path.basename(variables['containerdir']) # %s - return variables - - def _format_argument(self, string, variables): - try: - # Also add system environment here. - return string.format(**variables, **os.environ) - except KeyError as e: - raise OpenWithException(_('Unknown variable: {}.').format(e)) - - def _get_context_type(self, window, check_restrictions=True): - if not check_restrictions: - return DEBUGGING_CONTEXT # ignore context, reflect variable name - context = 0 - if not window.filehandler.file_loaded: - context = NO_FILE_CONTEXT # no file loaded - elif window.filehandler.archive_type is not None: - context = IMAGE_FILE_CONTEXT|ARCHIVE_CONTEXT # archive loaded - else: - context = IMAGE_FILE_CONTEXT # image loaded (no archive) - if not window.imagehandler.get_current_page(): - context &= ~IMAGE_FILE_CONTEXT # empty archive - return context - - -class OpenWithEditor(Gtk.Dialog): - ''' The editor for changing and creating external commands. This window - keeps its own internal model once initialized, and will overwrite - the external model (i.e. preferences) only when properly closed. ''' - - def __init__(self, window, openwithmanager): - super(OpenWithEditor, self).__init__(title=_('Edit external commands')) - self.set_transient_for(window) - self.set_destroy_with_parent(True) - self._window = window - self._openwith = openwithmanager - self._changed = False - - self._command_tree = Gtk.TreeView() - self._command_tree.get_selection().connect('changed', self._item_selected) - self._add_button = Gtk.Button.new_from_stock(Gtk.STOCK_ADD) - self._add_button.connect('clicked', self._add_command) - self._add_sep_button = Gtk.Button.new_with_mnemonic(_('Add _separator')) - self._add_sep_button.connect('clicked', self._add_sep_command) - self._remove_button = Gtk.Button.new_from_stock(Gtk.STOCK_REMOVE) - self._remove_button.connect('clicked', self._remove_command) - self._remove_button.set_sensitive(False) - self._up_button = Gtk.Button.new_from_stock(Gtk.STOCK_GO_UP) - self._up_button.connect('clicked', self._up_command) - self._up_button.set_sensitive(False) - self._down_button = Gtk.Button.new_from_stock(Gtk.STOCK_GO_DOWN) - self._down_button.connect('clicked', self._down_command) - self._down_button.set_sensitive(False) - self._run_button = Gtk.Button.new_with_mnemonic(_('Run _command')) - self._run_button.connect('clicked', self._run_command) - self._run_button.set_sensitive(False) - self._test_field = Gtk.Entry() - self._test_field.set_property('editable', False) - self._exec_label = Gtk.Label() - self._exec_label.set_alignment(0, 0) - self._set_exec_text('') - self._save_button = self.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT) - self.set_default_response(Gtk.ResponseType.ACCEPT) - - self._layout() - self._setup_table() - - self.connect('response', self._response) - self._window.page_changed += self.test_command - self._window.filehandler.file_opened += self.test_command - self._window.filehandler.file_closed += self.test_command - - self.resize(600, 400) - - def save(self): - ''' Serializes the tree model into a list of OpenWithCommands - and passes these back to the Manager object for persistance. ''' - commands = self.get_commands() - self._openwith.set_commands(commands) - self._changed = False - - def get_commands(self): - ''' Retrieves a list of OpenWithCommand instances from - the list model. ''' - model = self._command_tree.get_model() - iter = model.get_iter_first() - commands = [] - while iter: - label, command, cwd, disabled_for_archives = model.get(iter, 0, 1, 2, 3) - commands.append(OpenWithCommand(label, command, cwd, disabled_for_archives)) - iter = model.iter_next(iter) - return commands - - def get_command(self): - ''' Retrieves the selected command object. ''' - selection = self._command_tree.get_selection() - if not selection: - return None - - model, iter = self._command_tree.get_selection().get_selected() - if (iter and model.iter_is_valid(iter)): - command = OpenWithCommand(*model.get(iter, 0, 1, 2, 3)) - return command - else: - return None - - def test_command(self): - ''' Parses the currently selected command and displays the output in the - text box next to the button. ''' - command = self.get_command() - self._run_button.set_sensitive(False) - if not command: - return - - # Test only if the selected field is a valid command - if command.is_separator(): - self._test_field.set_text(_('This is a separator pseudo-command.')) - self._set_exec_text('') - return - - try: - args = map(shlex.quote, command.parse(self._window)) - self._test_field.set_text(' '.join(args)) - self._run_button.set_sensitive(True) - - if not command.is_valid_workdir(self._window, allow_empty=True): - self._set_exec_text( - _('"%s" does not have a valid working directory.') % command.get_label()) - elif not command.is_executable(self._window): - self._set_exec_text( - _('"%s" does not appear to have a valid executable.') % command.get_label()) - else: - self._set_exec_text('') - except OpenWithException as e: - self._test_field.set_text(str(e)) - self._set_exec_text('') - - def _add_command(self, button): - ''' Add a new empty label-command line to the list. ''' - row = (_('Command label'), '', '', False, True) - selection = self._command_tree.get_selection() - if selection and selection.get_selected()[1]: - model, iter = selection.get_selected() - model.insert_before(iter, row) - else: - self._command_tree.get_model().append(row) - self._changed = True - - def _add_sep_command(self, button): - ''' Adds a new separator line. ''' - row = ('-', '', '', False, False) - selection = self._command_tree.get_selection() - if selection and selection.get_selected()[1]: - model, iter = selection.get_selected() - model.insert_before(iter, row) - else: - self._command_tree.get_model().append(row) - self._changed = True - - def _remove_command(self, button): - ''' Removes the currently selected command from the list. ''' - model, iter = self._command_tree.get_selection().get_selected() - if (iter and model.iter_is_valid(iter)): - model.remove(iter) - self._changed = True - - def _up_command(self, button): - ''' Moves the selected command up by one. ''' - model, iter = self._command_tree.get_selection().get_selected() - if (iter and model.iter_is_valid(iter)): - path = model.get_path(iter)[0] - - if path >= 1: - up = model.get_iter(path - 1) - model.swap(iter, up) - self._changed = True - - def _down_command(self, button): - ''' Moves the selected command down by one. ''' - model, iter = self._command_tree.get_selection().get_selected() - if (iter and model.iter_is_valid(iter)): - path = model.get_path(iter)[0] - - if path < len(self.get_commands()) - 1: - down = model.get_iter(path + 1) - model.swap(iter, down) - self._changed = True - - def _run_command(self, button): - ''' Executes the selected command in the current context. ''' - command = self.get_command() - if command and not command.is_separator(): - command.execute(self._window) - - def _item_selected(self, selection): - ''' Enable or disable buttons that depend on an item being selected. ''' - for button in (self._remove_button, self._up_button, - self._down_button): - button.set_sensitive(selection.count_selected_rows() > 0) - - if selection.count_selected_rows() > 0: - self.test_command() - else: - self._test_field.set_text('') - - def _set_exec_text(self, text): - self._exec_label.set_text(text) - - def _layout(self): - ''' Create and lay out UI components. ''' - # All these boxes basically are just for adding a 4px border - vbox = self.get_content_area() - hbox = Gtk.HBox() - vbox.pack_start(hbox, True, True, 4) - content = Gtk.VBox() - content.set_spacing(6) - hbox.pack_start(content, True, True, 4) - - scroll_window = Gtk.ScrolledWindow() - scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - scroll_window.add(self._command_tree) - content.pack_start(scroll_window, True, True, 0) - - buttonbox = Gtk.HBox() - buttonbox.pack_start(self._add_button, False, False, 0) - buttonbox.pack_start(self._add_sep_button, False, False, 0) - buttonbox.pack_start(self._remove_button, False, False, 0) - buttonbox.pack_start(self._up_button, False, False, 0) - buttonbox.pack_start(self._down_button, False, False, 0) - content.pack_start(buttonbox, False, False, 0) - - preview_box = Gtk.HBox() - preview_box.pack_start(Gtk.Label(label=_('Preview:')), False, False, 0) - preview_box.pack_start(self._test_field, True, True, 4) - preview_box.pack_start(self._run_button, False, False, 0) - content.pack_start(preview_box, False, False, 0) - - content.pack_start(self._exec_label, False, False, 0) - - hints_expander = Gtk.Expander.new(_('Hints of variables in command')) - content.pack_start(hints_expander, False, False, 0) - - hints_grid = Gtk.Grid() - hints_expander.add(hints_grid) - - hints_all = [( - ('{image}', _('Full path of the currently opened image file')), - ('{imagebase}', _('Base name of {}').format('"{image}"')), - ('{imagedir}', _('Full directory name of {}').format('"{image}"')), - ('{imagedirbase}', _('Base name of {}').format('"{imagedir}"')), - ('{container}', _('Full path of the currently opened directory or archive')), - ('{containerbase}', _('Base name of {}').format('"{container}"')), - ('{containerdir}', _('Full directory name of {}').format('"{container}"')), - ('{containerdirbase}', _('Base name of {}').format('"{containerdir}"')), - ), ( - ('{archive}', _('Full path of the currently opened archive')), - ('{archivebase}', _('Base name of {}').format('"{archive}"')), - ('{archivedir}', _('Full directory name of {}').format('"{archive}"')), - ('{archivedirbase}', _('Base name of {}').format('"{archivedir}"')), - ('{{', '{'), - ('}}', '}'), - ('{{{}}}'.format(_('')), _('System Environment')), - )] - - for x, hints in enumerate(hints_all): - for y, (key, desc) in enumerate(hints): - hints_grid.attach(Gtk.Label(label=key, halign=Gtk.Align.CENTER, margin=4), - x*2, y, 1, 1) - hints_grid.attach(Gtk.Label(label=desc, halign=Gtk.Align.START, margin=4), - x*2+1, y, 1, 1) - - return # keep infomations below for reference - linklabel = Gtk.Label() - linklabel.set_markup(_('Please refer to the external command documentation ' - 'for a list of usable variables and other hints.') % \ - 'https://sourceforge.net/p/mcomix/wiki/External_Commands') - linklabel.set_alignment(0, 0) - content.pack_start(linklabel, False, False, 4) - - def _setup_table(self): - ''' Initializes the TreeView with settings and data. ''' - for i, label in enumerate((_('Label'), _('Command'), _('Working directory'))): - renderer = Gtk.CellRendererText() - renderer.connect('edited', self._text_changed, i) - column = Gtk.TreeViewColumn(label, renderer) - column.set_property('resizable', True) - column.set_attributes(renderer, text=i, editable=4) - if (i == 1): - column.set_expand(True) # Command column should scale automatically - self._command_tree.append_column(column) - - # The 'Disabled in archives' field is shown as toggle button - renderer = Gtk.CellRendererToggle() - renderer.connect('toggled', self._value_changed, - len(self._command_tree.get_columns())) - column = Gtk.TreeViewColumn(_('Disabled in archives'), renderer) - column.set_attributes(renderer, active=len(self._command_tree.get_columns()), - activatable=4) - self._command_tree.append_column(column) - - # Label, command, working dir, disabled for archives, line is editable - model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, - GObject.TYPE_BOOLEAN, GObject.TYPE_BOOLEAN) - for command in self._openwith.get_commands(): - model.append((command.get_label(), command.get_command(), command.get_cwd(), - command.is_disabled_for_archives(), not command.is_separator())) - self._command_tree.set_model(model) - - self._command_tree.set_headers_visible(True) - self._command_tree.set_reorderable(True) - - def _text_changed(self, renderer, path, new_text, column): - ''' Called when the user edits a field in the table. ''' - # Prevent changing command to separator, and completely removing label - if column == 0 and (not new_text.strip() or re.match(r'^-+$', new_text)): - return - - model = self._command_tree.get_model() - iter = model.get_iter(path) - # Editing the model in the cellrenderercallback stops the editing - # operation, causing GTK warnings. Delay until callback is finished. - def delayed_set_value(): - old_value = model.get_value(iter, column) - model.set_value(iter, column, new_text) - self._changed = old_value != new_text - self.test_command() - GLib.idle_add(delayed_set_value) - - def _value_changed(self, renderer, path, column): - ''' Called when a toggle field is changed ''' - model = self._command_tree.get_model() - iter = model.get_iter(path) - # Editing the model in the cellrenderercallback stops the editing - # operation, causing GTK warnings. Delay until callback is finished. - def delayed_set_value(): - value = not renderer.get_active() - model.set_value(iter, column, value) - self._changed = True - - GLib.idle_add(delayed_set_value) - - def _response(self, dialog, response): - if response == Gtk.ResponseType.ACCEPT: - # The Save button is only enabled if all commands are valid - self.save() - self.hide() - else: - if self._changed: - confirm_diag = message_dialog.MessageDialog( - self, - flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.YES_NO) - confirm_diag.set_text( - _('Save changes to commands?'), - _('You have made changes to the list of external commands that ' - 'have not been saved yet. Press "Yes" to save all changes, ' - 'or "No" to discard them.')) - response = confirm_diag.run() - - if response == Gtk.ResponseType.YES: - self.save() - - def _quote_if_necessary(self, arg): - ''' Quotes a command line argument if necessary. ''' - if arg == '': - return '""' - # simplified version of - # http://www.gnu.org/software/bash/manual/bashref.html#Double-Quotes - arg = arg.replace('\\', '\\\\') - arg = arg.replace('"', '\\"') - if ' ' in arg: - return '"' + arg + '"' - return arg - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/osd.py mcomix-2.1.0/mcomix/mcomix/osd.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/osd.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/osd.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- -''' osd.py - Onscreen display showing currently opened file. ''' - -import textwrap - -from gi.repository import Gdk, Gtk, GLib -from gi.repository import Pango, PangoCairo - -from mcomix.preferences import prefs - - -class OnScreenDisplay(object): - - ''' The OSD shows information such as currently opened file, archive and - page in a black box drawn on the bottom end of the screen. - - The OSD will automatically be erased after 'osd timeout' seconds. - ''' - - def __init__(self, window): - #: MainWindow - self._window = window - #: Stores the last rectangle that was used to render the OSD - self._last_osd_rect = None - #: Timeout event ID registered while waiting to hide the OSD - self._timeout_event = None - - def show(self, text): - ''' Shows the OSD on the lower portion of the image window. ''' - - # Determine text to draw - text = self._wrap_text(text) - layout = self._window._image_box.create_pango_layout(text) - - # Set up font information - font = layout.get_context().get_font_description() - font.set_weight(Pango.Weight.BOLD) - layout.set_alignment(Pango.Alignment.CENTER) - - # Scale font to fit within the screen size - max_width, max_height = self._window.get_visible_area_size() - self._scale_font(font, layout, max_width, max_height) - - # Calculate surrounding box - layout_width, layout_height = layout.get_pixel_size() - pos_x = max(int(max_width // 2) - int(layout_width // 2) + - int(self._window._hadjust.get_value()), 0) - pos_y = max(int(max_height) - int(layout_height * 1.1) + - int(self._window._vadjust.get_value()), 0) - - rect = (pos_x - 10, pos_y - 20, - layout_width + 20, layout_height + 20) - - self._draw_osd(layout, rect) - - self._last_osd_rect = rect - if self._timeout_event: - GLib.source_remove(self._timeout_event) - self._timeout_event = GLib.timeout_add(prefs['osd timeout']*1000, self.clear) - - def clear(self): - ''' Removes the OSD. ''' - if self._timeout_event: - GLib.source_remove(self._timeout_event) - self._timeout_event = None - self._clear_osd() - return 0 # To unregister timer event - - def _wrap_text(self, text, width=70): - ''' Wraps the text to be C{width} characters at most. ''' - return '\n'.join(textwrap.fill(s, width=width) for s in text.splitlines()) - - def _clear_osd(self): - ''' Clear the last OSD region. ''' - - if not self._last_osd_rect: - return - - window = self._window._main_layout.get_bin_window() - gdk_rect = Gdk.Rectangle() - gdk_rect.x, gdk_rect.y, gdk_rect.width, gdk_rect.height = self._last_osd_rect - window.invalidate_rect(gdk_rect, True) - window.process_updates(True) - self._last_osd_rect = None - - def _scale_font(self, font, layout, max_width, max_height): - ''' Scales the font used by C{layout} until max_width/max_height is reached. ''' - - # hard limited from 8 to 60 - SIZE_MIN, SIZE_MAX = 8, min(prefs['osd max font size'], 60)+1 - for font_size in range(SIZE_MIN, SIZE_MAX): - old_size = font.get_size() - font.set_size(font_size * Pango.SCALE) - layout.set_font_description(font) - - if layout.get_pixel_size()[0] > max_width: - font.set_size(old_size) - layout.set_font_description(font) - break - - def _draw_osd(self, layout, rect): - ''' Draws the text specified in C{layout} into a box at C{rect}. ''' - - draw_region = Gdk.Rectangle() - draw_region.x, draw_region.y, draw_region.width, draw_region.height = rect - if self._last_osd_rect: - last_region = Gdk.Rectangle() - last_region.x, last_region.y, last_region.width, last_region.height = self._last_osd_rect - draw_region = Gdk.rectangle_union(draw_region, last_region) - - gdk_rect = Gdk.Rectangle() - gdk_rect.x = draw_region.x - gdk_rect.y = draw_region.y - gdk_rect.width = draw_region.width - gdk_rect.height = draw_region.height - window = self._window._main_layout.get_bin_window() - window.begin_paint_rect(gdk_rect) - - self._clear_osd() - - cr = window.cairo_create() - cr.set_source_rgba(*prefs['osd bg color']) - cr.rectangle(*rect) - cr.fill() - extents = layout.get_extents()[0] - cr.set_source_rgba(*prefs['osd color']) - cr.translate(rect[0] + extents.x / Pango.SCALE, - rect[1] + extents.y / Pango.SCALE) - PangoCairo.update_layout(cr, layout) - PangoCairo.show_layout(cr, layout) - - window.end_paint() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/pageselect.py mcomix-2.1.0/mcomix/mcomix/pageselect.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/pageselect.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/pageselect.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -'''pageselect.py - The dialog window for the page selector.''' - -from gi.repository import Gtk - -from mcomix.preferences import prefs -from mcomix.lib import mt -from mcomix import callback - - -class Pageselector(Gtk.Dialog): - - '''The Pageselector takes care of the popup page selector - ''' - - def __init__(self, window): - self._window = window - super(Pageselector, self).__init__(title=_('Go to page...'), - modal=True, - destroy_with_parent=True) - self.set_transient_for(window) - self.add_buttons(_('_Go'), Gtk.ResponseType.OK, - _('_Cancel'), Gtk.ResponseType.CANCEL,) - self.set_default_response(Gtk.ResponseType.OK) - self.connect('response', self._response) - self.set_resizable(True) - - self._number_of_pages = self._window.imagehandler.get_number_of_pages() - - self._selector_adjustment = Gtk.Adjustment( - value=self._window.imagehandler.get_current_page(), - lower=1, upper=self._number_of_pages, - step_increment=1, page_increment=1) - - self._page_selector = Gtk.VScale.new(self._selector_adjustment) - self._page_selector.set_draw_value(False) - self._page_selector.set_digits(0) - - self._page_spinner = Gtk.SpinButton.new(self._selector_adjustment, 0.0, 0) - self._page_spinner.connect('changed', self._page_text_changed) - self._page_spinner.set_activates_default(True) - self._page_spinner.set_numeric(True) - self._pages_label = Gtk.Label(label=_(' of %s') % self._number_of_pages) - self._pages_label.set_alignment(0, 0.5) - - self._image_preview = Gtk.Image() - self._image_preview.set_size_request( - prefs['thumbnail size'], prefs['thumbnail size']) - - self.connect('configure-event', self._size_changed_cb) - self.set_size_request(prefs['pageselector width'], - prefs['pageselector height']) - - # Group preview image and page selector next to each other - preview_box = Gtk.HBox() - preview_box.set_border_width(5) - preview_box.set_spacing(5) - preview_box.pack_start(self._image_preview, True, True, 0) - preview_box.pack_end(self._page_selector, False, True, 0) - # Below them, group selection spinner and current page label - selection_box = Gtk.HBox() - selection_box.set_border_width(5) - selection_box.pack_start(self._page_spinner, True, True, 0) - selection_box.pack_end(self._pages_label, False, True, 0) - - self.get_content_area().pack_start(preview_box, True, True, 0) - self.get_content_area().pack_end(selection_box, False, True, 0) - self.show_all() - - self._selector_adjustment.connect('value-changed', self._cb_value_changed) - - # Set focus on the input box. - self._page_spinner.select_region(0, -1) - self._page_spinner.grab_focus() - - # Currently displayed thumbnail page. - self._thumbnail_page = 0 - self._thread = mt.ThreadPool(name=self.__class__.__name__) - self._update_thumbnail(int(self._selector_adjustment.props.value)) - self._window.imagehandler.page_available += self._page_available - - def _cb_value_changed(self, *args): - ''' Called whenever the spinbox value changes. Updates the preview thumbnail. ''' - page = int(self._selector_adjustment.props.value) - if page != self._thumbnail_page: - self._update_thumbnail(page) - - def _size_changed_cb(self, *args): - # Window cannot be scaled down unless the size request is reset - self.set_size_request(-1, -1) - # Store dialog size - prefs['pageselector width'] = self.get_allocation().width - prefs['pageselector height'] = self.get_allocation().height - - self._update_thumbnail(int(self._selector_adjustment.props.value)) - - def _page_text_changed(self, control, *args): - ''' Called when the page selector has been changed. Used to instantly update - the preview thumbnail when entering page numbers by hand. ''' - if control.get_text().isdigit(): - page = int(control.get_text()) - if page > 0 and page <= self._number_of_pages: - control.set_value(page) - - def _response(self, widget, event, *args): - if event == Gtk.ResponseType.OK: - self._window.set_page(int(self._selector_adjustment.props.value)) - - self._window.imagehandler.page_available -= self._page_available - self._thread.renew() - self.destroy() - - def _update_thumbnail(self, page): - ''' Trigger a thumbnail update. ''' - width = self._image_preview.get_allocation().width - height = self._image_preview.get_allocation().height - self._thumbnail_page = page - self._thread.apply_async( - self._generate_thumbnail, args=(page, width, height), - callback=self._generate_thumbnail_cb) - - def _generate_thumbnail(self, page, width, height): - ''' Generate the preview thumbnail for the page selector. - A transparent image will be used if the page is not yet available. ''' - return page, self._window.imagehandler.get_thumbnail( - page, width=width, height=height, nowait=True) - - def _generate_thumbnail_cb(self, params): - page, pixbuf = params - return self._thumbnail_finished(page, pixbuf) - - @callback.Callback - def _thumbnail_finished(self, page, pixbuf): - # Don't bother if we changed page in the meantime. - if page == self._thumbnail_page: - self._image_preview.set_from_pixbuf(pixbuf) - - def _page_available(self, page): - if page == int(self._selector_adjustment.props.value): - self._update_thumbnail(page) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/portability.py mcomix-2.1.0/mcomix/mcomix/portability.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/portability.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/portability.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -'''Portability functions for MComix.''' - -import sys -import locale -import ctypes - -def uri_prefix(): - ''' The prefix used for creating file URIs. ''' - return 'file://' - -def normalize_uri(uri): - ''' Normalize URIs passed into the program by different applications, - normally via drag-and-drop. ''' - - if uri.startswith('file://localhost/'): # Correctly formatted. - return uri[16:] - elif uri.startswith('file:///'): # Nautilus etc. - return uri[7:] - elif uri.startswith('file:/'): # Xffm etc. - return uri[5:] - else: - return uri - -def invalid_filesystem_chars(): - ''' List of characters that cannot be used in filenames on the target platform. ''' - if sys.platform == 'win32': - return ':*?"<>|' + ''.join(chr(i) for i in range(32)) - else: - return '' - -def get_default_locale(): - ''' Gets the user's default locale. ''' - if sys.platform == 'win32': - windll = ctypes.windll.kernel32 - code = windll.GetUserDefaultUILanguage() - return locale.windows_locale[code] - else: - lang, _ = locale.getdefaultlocale(['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']) - if lang: - return lang - else: - return 'C' - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_dialog.py mcomix-2.1.0/mcomix/mcomix/preferences_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/preferences_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,1018 +0,0 @@ -# -*- coding: utf-8 -*- - -'''preferences_dialog.py - Preferences dialog.''' - -import sys - -from gi.repository import Gdk, GdkPixbuf, Gtk, GObject - -from mcomix.languages import languages -from mcomix.preferences import prefs -from mcomix import preferences_page -from mcomix import image_tools -from mcomix import constants -from mcomix import message_dialog -from mcomix import keybindings -from mcomix import keybindings_editor - -_dialog = None - -class _PreferencesDialog(Gtk.Dialog): - - '''The preferences dialog where most (but not all) settings that are - saved between sessions are presented to the user. - ''' - - def __init__(self, window): - super(_PreferencesDialog, self).__init__(title=_('Preferences')) - self.set_transient_for(window) - - # Button text is set later depending on active tab - self.reset_button = self.add_button('', constants.RESPONSE_REVERT_TO_DEFAULT) - self.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) - - self._window = window - self.set_resizable(True) - self.set_default_response(Gtk.ResponseType.CLOSE) - - self.connect('response', self._response) - - notebook = self.notebook = Gtk.Notebook() - self.vbox.pack_start(notebook, True, True, 0) - self.set_border_width(4) - notebook.set_border_width(6) - - appearance = self._init_appearance_tab() - notebook.append_page(appearance, Gtk.Label(label=_('Appearance'))) - onscrdisp = self._init_onscrdisp_tab() - notebook.append_page(onscrdisp, Gtk.Label(label=_('OSD'))) - behaviour = self._init_behaviour_tab() - notebook.append_page(behaviour, Gtk.Label(label=_('Behaviour'))) - display = self._init_display_tab() - notebook.append_page(display, Gtk.Label(label=_('Display'))) - animation = self._init_animation_tab() - notebook.append_page(animation, Gtk.Label(label=_('Animation'))) - advanced = self._init_advanced_tab() - notebook.append_page(advanced, Gtk.Label(label=_('Advanced'))) - shortcuts = self.shortcuts = self._init_shortcuts_tab() - notebook.append_page(shortcuts, Gtk.Label(label=_('Shortcuts'))) - - notebook.connect('switch-page', self._tab_page_changed) - # Update the Reset button's tooltip - self._tab_page_changed(notebook, None, 0) - - self.show_all() - - def _init_appearance_tab(self): - # ---------------------------------------------------------------- - # The "Appearance" tab. - # ---------------------------------------------------------------- - page = preferences_page._PreferencePage(None) - - page.new_section(_('User interface')) - - page.add_row(Gtk.Label(label=_('Language (needs restart):')), - self._create_language_control()) - - page.add_row(self._create_pref_check_button( - _('Escape key closes program'), 'escape quits', - _('When active, the ESC key closes the program, instead of only ' - 'disabling fullscreen mode.'))) - - page.add_row(Gtk.Label(label=_('User theme')), - self._create_pref_path_chooser('userstyle', default=None) - ) - - page.new_section(_('Background')) - - fixed_bg_button, dynamic_bg_button = self._create_binary_pref_radio_buttons( - _('Use this colour as background:'), - 'color box bg', - _('Always use this selected colour as the background colour.'), - _('Use dynamic background colour'), - 'smart bg', - _('Automatically pick a background colour that fits the viewed image.')) - page.add_row(fixed_bg_button, self._create_color_button('bg colour')) - page.add_row(dynamic_bg_button) - - page.new_section(_('Thumbnails')) - - thumb_fixed_bg_button, thumb_dynamic_bg_button = self._create_binary_pref_radio_buttons( - 'Use this colour as the thumbnail background:', - 'color box thumb bg', - _('Always use this selected colour as the thumbnail background colour.'), - 'Use dynamic background colour', - 'smart thumb bg', - _('Automatically use the colour that fits the viewed image for the thumbnail background.')) - page.add_row(thumb_fixed_bg_button, self._create_color_button('thumb bg colour')) - page.add_row(thumb_dynamic_bg_button) - - page.add_row(self._create_pref_check_button( - _('Show page numbers on thumbnails'), - 'show page numbers on thumbnails', None)) - - page.add_row(self._create_pref_check_button( - _('Use archive thumbnail as application icon'), - 'archive thumbnail as icon', - _('By enabling this setting, the first page of a book will be used as application icon instead of the standard icon.'))) - - page.add_row(Gtk.Label(label=_('Thumbnail size (in pixels):')), - self._create_pref_spinner('thumbnail size', - 1, 20, 500, 1, 10, 0, None)) - - page.add_row( - Gtk.Label(label=_('Maximum number of thumbnail threads:')), - self._create_pref_spinner( - 'max thumbnail threads', 1, 0, constants.CPU_COUNT, 1, 4, 0, - _('Set the maximum number of thumbnail generation threads (0 to use all available cores).'))) - - page.new_section(_('Transparency')) - - page.add_row(self._create_pref_check_button( - _('Use checkered background for transparent images'), - 'checkered bg for transparent images', - _('Use a grey checkered background for transparent images. If this preference is unset, the background is plain white instead.'))) - - return page - - def _init_onscrdisp_tab(self): - # ---------------------------------------------------------------- - # The "OSD" tab. - # ---------------------------------------------------------------- - page = preferences_page._PreferencePage(None) - - page.new_section(_('Onscreen display')) - - page.add_row(Gtk.Label(label=_('Timeout:')), - self._create_pref_spinner( - 'osd timeout', - 1.0, 0.5, 30.0, 0.5, 2.0, 1, - _('Erase OSD after timeout, in seconds.') - )) - - page.add_row(Gtk.Label(label=_('Max font size:')), - self._create_pref_spinner( - 'osd max font size', - 1, 8, 60, 1, 10, 0, - _('Font size in OSD, hard limited from 8 to 60.') - )) - - page.add_row(Gtk.Label(label=_('Font color:')), - self._create_color_button('osd color')) - - page.add_row(Gtk.Label(label=_('Background color:')), - self._create_color_button('osd bg color')) - - return page - - def _init_behaviour_tab(self): - # ---------------------------------------------------------------- - # The "Behaviour" tab. - # ---------------------------------------------------------------- - page = preferences_page._PreferencePage(None) - - page.new_section(_('Scroll')) - - page.add_row(self._create_pref_check_button( - _('Use smart scrolling'), - 'smart scroll', - _('With this preference set, the space key and mouse wheel ' - 'do not only scroll down or up, but also sideways and so ' - 'try to follow the natural reading order of the comic book.'))) - - page.add_row(self._create_pref_check_button( - _('Flip pages when scrolling off the edges of the page'), - 'flip with wheel', - _('Flip pages when scrolling "off the page" with the scroll wheel or with the arrow keys. It takes n consecutive "steps" with the scroll wheel or the arrow keys for the pages to be flipped.'))) - - page.add_row(self._create_pref_check_button( - _('Automatically open the next archive'), - 'auto open next archive', - _('Automatically open the next archive in the directory when flipping past the last page, or the previous archive when flipping past the first page.'))) - - page.add_row(self._create_pref_check_button( - _('Automatically open next directory'), - 'auto open next directory', - _('Automatically open the first file in the next sibling directory when flipping past the last page of the last file in a directory, or the previous directory when flipping past the first page of the first file.'))) - - page.add_row(self._create_pref_check_button( - _('Dive into subdirectories (restart required)'), - 'dive into subdir', - _('Dive into subdirectories when opening directory.'))) - - page.add_row(Gtk.Label(label=_('Number of pixels to scroll per arrow key press:')), - self._create_pref_spinner('number of pixels to scroll per key event', - 1, 1, 500, 1, 3, 0, - _('Set the number of pixels to scroll on a page when using the arrow keys.'))) - - page.add_row(Gtk.Label(label=_('Number of pixels to scroll per mouse wheel turn:')), - self._create_pref_spinner('number of pixels to scroll per mouse wheel event', - 1, 1, 500, 1, 3, 0, - _('Set the number of pixels to scroll on a page when using a mouse wheel.'))) - - page.add_row(Gtk.Label(label=_('Fraction of page to scroll ' - 'per space key press (in percent):')), - self._create_pref_spinner('smart scroll percentage', - 0.01, 1, 100, 1, 5, 0, - _('Sets the percentage by which the page ' - 'will be scrolled down or up when the space key is pressed.'))) - - page.add_row(Gtk.Label(label=_('Number of "steps" to take before flipping the page:')), - self._create_pref_spinner('number of key presses before page turn', - 1, 1, 100, 1, 3, 0, - _('Set the number of "steps" needed to flip to the next or previous page. Less steps will allow for very fast page turning but you might find yourself accidentally turning pages.'))) - - page.new_section(_('Double page mode')) - - page.add_row(self._create_pref_check_button( - _('Flip two pages in double page mode'), - 'double step in double page mode', - _('Flip two pages, instead of one, each time we flip pages in double page mode.'))) - - page.add_row(Gtk.Label(label=_('Show only one page where appropriate:')), - self._create_doublepage_as_one_control()) - - page.new_section(_('Files')) - - page.add_row(self._create_pref_check_button( - _('Automatically open the last viewed file on startup'), - 'auto load last file', - _('Automatically open, on startup, the file that was open when MComix was last closed.'))) - - page.add_row(Gtk.Label(label=_('Store information about recently opened files:')), - self._create_store_recent_combobox()) - - if constants.PORTABLE_MODE: - page.add_row(self._create_pref_check_button( - _('Accept file(s) from anywhere'), - 'portable allow abspath', - _('Accept file(s) from anywhere to be seved in bookmark and library. If not, only files(s) in the same disk with mcomix will be accepted.'))) - - return page - - def _init_display_tab(self): - # ---------------------------------------------------------------- - # The "Display" tab. - # ---------------------------------------------------------------- - page = preferences_page._PreferencePage(None) - - page.new_section(_('Fullscreen')) - - page.add_row(self._create_pref_check_button( - _('Use fullscreen by default'), - 'default fullscreen', None)) - - page.add_row(self._create_pref_check_button( - _('Automatically hide all toolbars in fullscreen'), - 'hide all in fullscreen', None)) - - page.new_section(_('Fit to size mode')) - - page.add_row(Gtk.Label(label=_('Fit to width or height:')), - self._create_fitmode_control()) - - page.add_row(Gtk.Label(label=_('Fixed size for this mode:')), - self._create_pref_spinner('fit to size px', - 1, 10, 10000, 10, 50, 0, None)) - - page.new_section(_('Slideshow')) - - page.add_row(Gtk.Label(label=_('Slideshow delay (in seconds):')), - self._create_pref_spinner('slideshow delay', - 1000.0, 0.01, 3600.0, 0.1, 1, 2, None)) - - page.add_row(Gtk.Label(label=_('Slideshow step (in pixels):')), - self._create_pref_spinner('number of pixels to scroll per slideshow event', - 1, -500, 500, 1, 1, 0, - _('Specify the number of pixels to scroll while in slideshow mode. A positive value will scroll forward, a negative value will scroll backwards, and a value of 0 will cause the slideshow to always flip to a new page.'))) - - page.add_row(self._create_pref_check_button( - _('During a slideshow automatically open the next archive'), - 'slideshow can go to next archive', - _('While in slideshow mode allow the next archive to automatically be opened.'))) - - page.new_section(_('Rotation')) - - page.add_row(self._create_pref_check_button( - _('Automatically rotate images according to their metadata'), - 'auto rotate from exif', - _('Automatically rotate images when an orientation is specified in the image metadata, such as in an Exif tag.'))) - - page.new_section(_('Image quality')) - - page.add_row(Gtk.Label(label=_('Scaling mode')), - self._create_scaling_quality_combobox()) - - return page - - def _init_animation_tab(self): - # ---------------------------------------------------------------- - # The "Animation" tab. - # ---------------------------------------------------------------- - page = preferences_page._PreferencePage(None) - - page.new_section(_('Animated images')) - - page.add_row(Gtk.Label(label=_('Animation mode')), - self._create_animation_mode_combobox()) - - page.add_row(self._create_pref_check_button( - _('Using background from the animation'), - 'animation background', - _('Using background from the animation,\n' - 'or follow the setting of Appearance -> Background'))) - - page.add_row(self._create_pref_check_button( - _('Enable transform on animation'), - 'animation transform', - _('Enable scale, rotate, flip and enhance operation on animation'))) - - return page - - def _init_advanced_tab(self): - # ---------------------------------------------------------------- - # The "Advanced" tab. - # ---------------------------------------------------------------- - - page = preferences_page._PreferencePage(None) - - page.new_section(_('File order')) - - page.add_row(Gtk.Label(label=_('Sort files and directories by:')), - self._create_sort_by_control()) - - page.add_row(Gtk.Label(label=_('Sort archives by:')), - self._create_archive_sort_by_control()) - - page.new_section(_('File detection')) - - page.add_row(self._create_pref_check_button( - _('Detect image file(s) by mimetypes'), - 'check image mimetype', - _('Detect image file(s) by mimetypes.'))) - - page.add_row(self._create_pref_check_button( - _('Try loading FLIF file(s) (restart required)'), - 'try FLIF support', - _('Try loading FLIF files if flif_dec or flif library is found in system.\n' - 'Since the official reference is still not stable, mcomix may failed to load FLIF even if library found.'))) - - page.new_section(_('Extraction and cache')) - - page.add_row( - Gtk.Label(label=_('Maximum number of concurrent extraction threads:')), - self._create_pref_spinner( - 'max extract threads', 1, 0, constants.CPU_COUNT, 1, 4, 0, - _('Set the maximum number of concurrent threads for formats that support it (0 to use all available cores).'))) - - page.add_row(self._create_pref_check_button( - _('Store thumbnails for opened files'), - 'create thumbnails', - _('Store thumbnails for opened files according to the freedesktop.org specification. These thumbnails are shared by many other applications, such as most file managers.'))) - - page.add_row(Gtk.Label(label=_('Temporary directory (restart required)')), - self._create_pref_path_chooser('temporary directory', folder=True, default=None) - ) - - page.add_row(Gtk.Label(label=_('Maximum number of pages to store in the cache:')), - self._create_pref_spinner('max pages to cache', - 1, -1, 500, 1, 3, 0, - _('Set the max number of pages to cache. A value of -1 will cache the entire archive.'))) - - if sys.platform=='linux': - page.add_row(self._create_pref_check_button( - _('Mount tar and squashfs.'), - 'mount', - _('Mount tar and squashfs by using archivemount or squashfuse.'))) - - page.new_section(_('Magnifying Lens')) - - page.add_row(Gtk.Label(label=_('Magnifying lens size (in pixels):')), - self._create_pref_spinner('lens size', - 1, 50, 400, 1, 10, 0, - _('Set the size of the magnifying lens. It is a square with a side of this many pixels.'))) - - page.add_row(Gtk.Label(label=_('Magnification factor:')), - self._create_pref_spinner('lens magnification', - 1, 1.1, 10.0, 0.1, 1.0, 1, - _('Set the magnification factor of the magnifying lens.'))) - - page.new_section(_('Comments')) - - page.add_row(Gtk.Label(label=_('Comment extensions:')), - self._create_extensions_entry()) - - return page - - def _init_shortcuts_tab(self): - # ---------------------------------------------------------------- - # The "Shortcuts" tab. - # ---------------------------------------------------------------- - km = keybindings.keybinding_manager(self._window) - page = keybindings_editor.KeybindingEditorWindow(km) - return page - - def _tab_page_changed(self, notebook, page_ptr, page_num): - ''' Dynamically switches the "Reset" button's text and tooltip - depending on the currently selected tab page. ''' - new_page = notebook.get_nth_page(page_num) - if new_page == self.shortcuts: - self.reset_button.set_label(_('_Reset keys')) - self.reset_button.set_tooltip_text( - _('Resets all keyboard shortcuts to their default values.')) - self.reset_button.set_sensitive(True) - else: - self.reset_button.set_label(_('Clear _dialog choices')) - self.reset_button.set_tooltip_text( - _('Clears all dialog choices that you have previously chosen not to be asked again.')) - self.reset_button.set_sensitive(len(prefs['stored dialog choices']) > 0) - - def _response(self, dialog, response): - if response == Gtk.ResponseType.CLOSE: - _close_dialog() - - elif response == constants.RESPONSE_REVERT_TO_DEFAULT: - if self.notebook.get_nth_page(self.notebook.get_current_page()) == self.shortcuts: - # "Shortcuts" page is active, reset all keys to their default value - km = keybindings.keybinding_manager(self._window) - km.clear_all() - self._window._event_handler.register_key_events() - km.save() - self.shortcuts.refresh_model() - else: - # Reset stored choices - prefs['stored dialog choices'] = {} - self.reset_button.set_sensitive(False) - - else: - # Other responses close the dialog, e.g. clicking the X icon on the dialog. - _close_dialog() - - def _create_language_control(self): - ''' Creates and returns the combobox for language selection. ''' - autolang = [(_('Auto-detect (Default)'), 'auto')] - box = self._create_combobox(autolang+languages, prefs['language'], - self._language_changed_cb) - - return box - - def _language_changed_cb(self, combobox, *args): - ''' Called whenever the language was changed. ''' - model_index = combobox.get_active() - if model_index > -1: - iter = combobox.get_model().iter_nth_child(None, model_index) - text, lang_code = combobox.get_model().get(iter, 0, 1) - prefs['language'] = lang_code - - def _create_doublepage_as_one_control(self): - ''' Creates the ComboBox control for selecting virtual double page options. ''' - items = ( - (_('Never'), 0), - (_('Only for title pages'), constants.SHOW_DOUBLE_AS_ONE_TITLE), - (_('Only for wide images'), constants.SHOW_DOUBLE_AS_ONE_WIDE), - (_('Always'), constants.SHOW_DOUBLE_AS_ONE_TITLE | constants.SHOW_DOUBLE_AS_ONE_WIDE)) - - box = self._create_combobox(items, - prefs['virtual double page for fitting images'], - self._double_page_changed_cb) - - box.set_tooltip_text( - _('When showing the first page of an archive, or an image\'s width ' - 'exceeds its height, only a single page will be displayed.')) - - return box - - def _double_page_changed_cb(self, combobox, *args): - ''' Called when a new option was selected for the virtual double page option. ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - prefs['virtual double page for fitting images'] = value - self._window.draw_image() - - def _create_fitmode_control(self): - ''' Combobox for fit to size mode ''' - items = ( - (_('Fit to width'), constants.ZOOM_MODE_WIDTH), - (_('Fit to height'), constants.ZOOM_MODE_HEIGHT)) - - box = self._create_combobox(items, - prefs['fit to size mode'], - self._fit_to_size_changed_cb) - - return box - - def _fit_to_size_changed_cb(self, combobox, *args): - ''' Change to 'Fit to size' pixels ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - - if prefs['fit to size mode'] != value: - prefs['fit to size mode'] = value - self._window.change_zoom_mode() - - def _create_sort_by_control(self): - ''' Creates the ComboBox control for selecting file sort by options. ''' - sortkey_items = ( - (_('No sorting'), 0), - (_('File name'), constants.SORT_NAME), - (_('File size'), constants.SORT_SIZE), - (_('Last modified'), constants.SORT_LAST_MODIFIED)) - - sortkey_box = self._create_combobox(sortkey_items, prefs['sort by'], - self._sort_by_changed_cb) - - sortorder_items = ( - (_('Ascending'), constants.SORT_ASCENDING), - (_('Descending'), constants.SORT_DESCENDING)) - - sortorder_box = self._create_combobox(sortorder_items, - prefs['sort order'], - self._sort_order_changed_cb) - - box = Gtk.HBox() - box.pack_start(sortkey_box, True, True, 0) - box.pack_start(sortorder_box, True, True, 0) - - label = _('Files will be opened and displayed according to the sort order ' - 'specified here. This option does not affect ordering within archives.') - sortkey_box.set_tooltip_text(label) - sortorder_box.set_tooltip_text(label) - - return box - - def _sort_by_changed_cb(self, combobox, *args): - ''' Called when a new option was selected for the virtual double page option. ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - prefs['sort by'] = value - - self._window.filehandler.refresh_file() - - def _sort_order_changed_cb(self, combobox, *args): - ''' Called when sort order changes (ascending or descending) ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - prefs['sort order'] = value - - self._window.filehandler.refresh_file() - - def _create_archive_sort_by_control(self): - ''' Creates the ComboBox control for selecting archive sort by options. ''' - sortkey_items = ( - (_('No sorting'), 0), - (_('Natural order'), constants.SORT_NAME), - (_('Literal order'), constants.SORT_NAME_LITERAL)) - - sortkey_box = self._create_combobox(sortkey_items, prefs['sort archive by'], - self._sort_archive_by_changed_cb) - - sortorder_items = ( - (_('Ascending'), constants.SORT_ASCENDING), - (_('Descending'), constants.SORT_DESCENDING)) - - sortorder_box = self._create_combobox(sortorder_items, - prefs['sort archive order'], - self._sort_archive_order_changed_cb) - - box = Gtk.HBox() - box.pack_start(sortkey_box, True, True, 0) - box.pack_start(sortorder_box, True, True, 0) - - label = _('Files within archives will be sorted according to the order specified here. ' - 'Natural order will sort numbered files based on their natural order, ' - 'i.e. 1, 2, ..., 10, while literal order uses standard C sorting, ' - 'i.e. 1, 2, 34, 5.') - sortkey_box.set_tooltip_text(label) - sortorder_box.set_tooltip_text(label) - - return box - - def _sort_archive_by_changed_cb(self, combobox, *args): - ''' Called when a new option was selected for the virtual double page option. ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - prefs['sort archive by'] = value - - self._window.filehandler.refresh_file() - - def _sort_archive_order_changed_cb(self, combobox, *args): - ''' Called when sort order changes (ascending or descending) ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - prefs['sort archive order'] = value - - self._window.filehandler.refresh_file() - - def _create_store_recent_combobox(self): - ''' Creates the combobox for "Store recently opened files". ''' - items = ( - (_('Never'), False), - (_('Always'), True)) - - # Map legacy 0/1/2 values: - if prefs['store recent file info'] == 0: - selection = False - elif prefs['store recent file info'] in (1, 2): - selection = True - else: - selection = prefs['store recent file info'] - - box = self._create_combobox(items, selection, self._store_recent_changed_cb) - box.set_tooltip_text( - _('Add information about all files opened from within MComix to the shared recent files list.')) - return box - - def _store_recent_changed_cb(self, combobox, *args): - ''' Called when option "Store recently opened files" was changed. ''' - iter = combobox.get_active_iter() - if not combobox.get_model().iter_is_valid(iter): - return - - value = combobox.get_model().get_value(iter, 1) - last_value = prefs['store recent file info'] - prefs['store recent file info'] = value - self._window.filehandler.last_read_page.set_enabled(value) - - # If "Never" was selected, ask to purge recent files. - if (bool(last_value) is True and value is False - and (self._window.uimanager.recent.count() > 0 - or self._window.filehandler.last_read_page.count() > 0)): - - dialog = message_dialog.MessageDialog( - self, - flags=Gtk.DialogFlags.MODAL, - message_type=Gtk.MessageType.INFO, - buttons=Gtk.ButtonsType.YES_NO) - dialog.set_default_response(Gtk.ResponseType.YES) - dialog.set_text( - _('Delete information about recently opened files?'), - _('This will remove all entries from the "Recent" menu,' - ' and clear information about last read pages.')) - response = dialog.run() - - if response == Gtk.ResponseType.YES: - self._window.uimanager.recent.remove_all() - self._window.filehandler.last_read_page.clear_all() - - def _create_scaling_quality_combobox(self): - ''' Creates combo box for image scaling quality ''' - items = ( - (_('Normal (fast)'), int(GdkPixbuf.InterpType.TILES)), - (_('Bilinear'), int(GdkPixbuf.InterpType.BILINEAR)), - (_('Hyperbolic (slow)'), int(GdkPixbuf.InterpType.HYPER))) - - selection = prefs['scaling quality'] - - box = self._create_combobox(items, selection, self._scaling_quality_changed_cb) - box.set_tooltip_text( - _('Changes how images are scaled. Slower algorithms result in higher quality resizing, but longer page loading times.')) - - return box - - def _scaling_quality_changed_cb(self, combobox, *args): - ''' Called whan image scaling quality changes. ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - last_value = prefs['scaling quality'] - prefs['scaling quality'] = value - - if value != last_value: - self._window.draw_image() - - def _create_animation_mode_combobox(self): - ''' Creates combo box for animation mode ''' - items = ( - (_('Never'), constants.ANIMATION_DISABLED), - (_('Normal'), constants.ANIMATION_NORMAL), - (_('Once'), constants.ANIMATION_ONCE), - (_('Infinity'), constants.ANIMATION_INF), - ) - - selection = prefs['animation mode'] - - box = self._create_combobox(items, selection, self._animation_mode_changed_cb) - box.set_tooltip_text( - _('Controls how animated images should be displayed.')) - - return box - - def _animation_mode_changed_cb(self, combobox, *args): - ''' Called whenever animation mode has been changed. ''' - iter = combobox.get_active_iter() - if combobox.get_model().iter_is_valid(iter): - value = combobox.get_model().get_value(iter, 1) - last_value = prefs['animation mode'] - prefs['animation mode'] = value - - if value != last_value: - self._window.filehandler.refresh_file() - - def _create_combobox(self, options, selected_value, change_callback): - ''' Creates a new dropdown combobox and populates it with the items - passed in C{options}. - - @param options: List of tuples: (Option display text, option value) - @param selected_value: One of the values passed in C{options} that will - be pre-selected when the control is created. - @param change_callback: Function that will be called when the 'changed' - event is triggered. - @returns Gtk.ComboBox - ''' - assert options and len(options[0]) == 2, 'Invalid format for options.' - - # Use the first list item to determine typing of model fields. - # First field is textual description, second field is value. - model = Gtk.ListStore(GObject.TYPE_STRING, type(options[0][1])) - for text, value in options: - model.append((text, value)) - - box = Gtk.ComboBox(model=model) - renderer = Gtk.CellRendererText() - box.pack_start(renderer, True) - box.add_attribute(renderer, 'text', 0) - - # Set active box option - iter = model.get_iter_first() - while iter: - if model.get_value(iter, 1) == selected_value: - box.set_active_iter(iter) - break - else: - iter = model.iter_next(iter) - - if change_callback: - box.connect('changed', change_callback) - - return box - - - def _create_extensions_entry(self): - entry = Gtk.Entry() - entry.set_size_request(200, -1) - entry.set_text(', '.join(prefs['comment extensions'])) - entry.connect('activate', self._entry_cb) - entry.connect('focus_out_event', self._entry_cb) - entry.set_tooltip_text( - _('Treat all files found within archives, that have one of these file endings, as comments.')) - return entry - - - def _create_pref_check_button(self, label, prefkey, tooltip_text): - button = Gtk.CheckButton(label=label) - button.set_active(prefs[prefkey]) - button.connect('toggled', self._check_button_cb, prefkey) - if tooltip_text: - button.set_tooltip_text(tooltip_text) - return button - - - def _create_binary_pref_radio_buttons(self, label1, prefkey1, tooltip_text1, - label2, prefkey2, tooltip_text2): - button1 = Gtk.RadioButton(label=label1) - button1.connect('toggled', self._check_button_cb, prefkey1) - if tooltip_text1: - button1.set_tooltip_text(tooltip_text1) - button2 = Gtk.RadioButton(group=button1, label=label2) - button2.connect('toggled', self._check_button_cb, prefkey2) - if tooltip_text2: - button2.set_tooltip_text(tooltip_text2) - button2.set_active(prefs[prefkey2]) - return button1, button2 - - - def _create_color_button(self, prefkey): - rgba = prefs[prefkey] - button = Gtk.ColorButton.new_with_rgba(Gdk.RGBA(*rgba)) - button.set_use_alpha(True) - button.connect('color_set', self._color_button_cb, prefkey) - return button - - - def _check_button_cb(self, button, preference): - '''Callback for all checkbutton-type preferences.''' - - prefs[preference] = button.get_active() - - if preference == 'color box bg' and button.get_active(): - - if not prefs['smart bg'] or not self._window.filehandler.file_loaded: - self._window.set_bg_color(prefs['bg colour']) - - elif preference == 'smart bg' and button.get_active(): - - # if the color is no longer using the smart background then return it to the chosen color - if not prefs[preference]: - self._window.set_bg_color(prefs['bg colour']) - else: - # draw_image() will set the main background to the smart background - self._window.draw_image() - - elif preference == 'color box thumb bg' and button.get_active(): - - if prefs[preference]: - prefs['smart thumb bg'] = False - prefs['thumbnail bg uses main colour'] = False - - self._window.thumbnailsidebar.change_thumbnail_background_color(prefs['thumb bg colour']) - else: - self._window.draw_image() - - elif preference == 'smart thumb bg' and button.get_active(): - - if prefs[preference]: - prefs['color box thumb bg'] = False - prefs['thumbnail bg uses main colour'] = False - - pixbuf = image_tools.static_image(image_tools.unwrap_image( - self._window.images[0])) # XXX transitional(double page limitation) - if pixbuf: - bg_color = image_tools.get_most_common_edge_color(pixbuf) - self._window.thumbnailsidebar.change_thumbnail_background_color(bg_color) - else: - self._window.draw_image() - - elif preference in ('checkered bg for transparent images', - 'no double page for wide images', 'auto rotate from exif'): - self._window.draw_image() - - elif (preference == 'hide all in fullscreen' and - self._window.is_fullscreen): - self._window.draw_image() - - elif preference == 'show page numbers on thumbnails': - self._window.thumbnailsidebar.toggle_page_numbers_visible() - - elif preference in ('animation background', 'animation transform'): - self._window.filehandler.refresh_file() - - elif preference in ('check image mimetype',): - self._window.filehandler.refresh_file() - - - def _color_button_cb(self, colorbutton, preference): - '''Callback for the background colour selection button.''' - - color = colorbutton.get_rgba() - prefs[preference] = color.red, color.green, color.blue, color.alpha - - if preference == 'bg colour': - if not prefs['smart bg'] or not self._window.filehandler.file_loaded: - self._window.set_bg_color(prefs['bg colour']) - - elif preference == 'thumb bg colour': - if not prefs['smart thumb bg'] or not self._window.filehandler.file_loaded: - self._window.thumbnailsidebar.change_thumbnail_background_color(prefs['thumb bg colour']) - - - def _create_pref_spinner(self, prefkey, scale, lower, upper, step_incr, - page_incr, digits, tooltip_text): - value = prefs[prefkey] / scale - adjustment = Gtk.Adjustment(value=value, lower=lower, upper=upper, step_increment=step_incr, page_increment=page_incr) - spinner = Gtk.SpinButton.new(adjustment, 0.0, digits) - spinner.set_size_request(80, -1) - spinner.connect('value_changed', self._spinner_cb, prefkey) - if tooltip_text: - spinner.set_tooltip_text(tooltip_text) - return spinner - - - def _spinner_cb(self, spinbutton, preference): - '''Callback for spinner-type preferences.''' - value = spinbutton.get_value() - - if preference == 'lens size': - prefs[preference] = int(value) - - elif preference == 'lens magnification': - prefs[preference] = value - - elif preference == 'slideshow delay': - prefs[preference] = int(round(value * 1000)) - self._window.slideshow.update_delay() - - elif preference == 'number of pixels to scroll per slideshow event': - prefs[preference] = int(value) - - elif preference == 'number of pixels to scroll per key event': - prefs[preference] = int(value) - - elif preference == 'number of pixels to scroll per mouse wheel event': - prefs[preference] = int(value) - - elif preference == 'smart scroll percentage': - prefs[preference] = value / 100.0 - - elif preference == 'thumbnail size': - prefs[preference] = int(value) - self._window.thumbnailsidebar.resize() - self._window.draw_image() - - elif preference == 'max pages to cache': - prefs[preference] = int(value) - self._window.imagehandler.do_cacheing() - - elif preference == 'number of key presses before page turn': - prefs[preference] = int(value) - self._window._event_handler._extra_scroll_events = 0 - - elif preference == 'fit to size px': - prefs[preference] = int(value) - self._window.change_zoom_mode() - - elif preference in ('max extract threads', 'max thumbnail threads'): - prefs[preference] = int(value) - - elif preference == 'osd max font size': - prefs[preference] = int(value) - - elif preference == 'osd timeout': - prefs[preference] = value - - - def _entry_cb(self, entry, event=None): - '''Callback for entry-type preferences.''' - text = entry.get_text() - extensions = [e.strip() for e in text.split(',')] - prefs['comment extensions'] = [e for e in extensions if e] - self._window.filehandler.update_comment_extensions() - - - def _create_pref_path_chooser(self, preference, folder=False, default=None): - ''' Select path as preference value ''' - box = Gtk.Box() - action = Gtk.FileChooserAction.SELECT_FOLDER if folder else Gtk.FileChooserAction.OPEN - - chooser = Gtk.Button() - chooser.set_label(prefs[preference] or default or _('(default)')) - chooser.connect('clicked', self._path_chooser_cb, - chooser, action, preference, default) - reset = Gtk.Button(label=_('reset')) - reset.connect('clicked', self._path_chooser_reset_cb, - chooser, preference, default) - box.add(chooser) - box.add(reset) - - return box - - - def _path_chooser_cb(self, widget, chooser, chooser_action, preference, default): - ''' Callback for path chooser ''' - dialog = Gtk.FileChooserDialog( - title=_('Please choose a folder'), - action=chooser_action - ) - dialog.set_transient_for(self) - dialog.add_buttons( - Gtk.STOCK_CANCEL, - Gtk.ResponseType.CANCEL, - _('Select'), - Gtk.ResponseType.OK - ) - - response = dialog.run() - if response == Gtk.ResponseType.OK: - prefs[preference]=dialog.get_filename() - chooser.set_label(prefs[preference]) - if preference=='userstyle': - self._window.load_style(path=prefs[preference]) - dialog.destroy() - - - def _path_chooser_reset_cb(self, widget, chooser, preference, default): - ''' Reset path chooser ''' - prefs[preference]=default - chooser.set_label(prefs[preference] or _('(default)')) - if preference=='userstyle': - self._window.load_style() - - -def open_dialog(action, window): - '''Create and display the preference dialog.''' - - global _dialog - - # if the dialog window is not created then create the window - if _dialog is None: - _dialog = _PreferencesDialog(window) - else: - # if the dialog window already exists bring it to the forefront of the screen - _dialog.present() - -def _close_dialog(): - - global _dialog - - # if the dialog window exists then destroy it - if _dialog is not None: - _dialog.destroy() - _dialog = None - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_page.py mcomix-2.1.0/mcomix/mcomix/preferences_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_page.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/preferences_page.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -'''preferences_page.py - MComix preference page.''' - -from gi.repository import Gtk - -from mcomix import preferences_section - -class _PreferencePage(Gtk.VBox): - - '''The _PreferencePage is a conveniece class for making one "page" - in a preferences-style dialog that contains one or more - _PreferenceSections. - ''' - - def __init__(self, right_column_width): - '''Create a new page where any possible right columns have the - width request . - ''' - super(_PreferencePage, self).__init__(homogeneous=False, spacing=12) - self.set_border_width(12) - self._right_column_width = right_column_width - self._section = None - - def new_section(self, header): - '''Start a new section in the page, with the header text from -
. - ''' - self._section = preferences_section._PreferenceSection(header, self._right_column_width) - self.pack_start(self._section, False, False, 0) - - def add_row(self, left_item, right_item=None): - '''Add a row to the page (in the latest section), containing one - or two items. If the left item is a label it is automatically - aligned properly. - ''' - if isinstance(left_item, Gtk.Label): - left_item.set_alignment(0, 0.5) - - if right_item is None: - self._section.contentbox.pack_start(left_item, True, True, 0) - else: - left_box, right_box = self._section.new_split_vboxes() - left_box.pack_start(left_item, True, True, 0) - right_box.pack_start(right_item, True, True, 0) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences.py mcomix-2.1.0/mcomix/mcomix/preferences.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/preferences.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ -''' preferences.py - Contains the preferences and the functions to read and -write them. ''' - -import os -import json - -from mcomix import constants -from mcomix import log - -# All the preferences are stored here. -prefs = { - 'comment extensions': constants.ACCEPTED_COMMENT_EXTENSIONS, - 'auto load last file': False, - 'page of last file': 1, - 'path to last file': '', - 'number of key presses before page turn': 3, - 'auto open next archive': True, - 'auto open next directory': True, - 'dive into subdir': False, - 'sort by': constants.SORT_NAME, # Normal files obtained by directory listing - 'sort order': constants.SORT_ASCENDING, - 'sort archive by': constants.SORT_NAME, # Files in archives - 'sort archive order': constants.SORT_ASCENDING, - 'bg colour': [0, 0, 0, 0], - 'thumb bg colour': [0, 0, 0, 0], - 'smart bg': False, - 'smart thumb bg': False, - 'thumbnail bg uses main colour': False, - 'checkered bg for transparent images': True, - 'cache': True, - 'stretch': False, - 'default double page': False, - 'default fullscreen': False, - 'zoom mode': constants.ZOOM_MODE_BEST, - 'default manga mode': False, - 'lens magnification': 2, - 'lens size': 200, - 'virtual double page for fitting images': constants.SHOW_DOUBLE_AS_ONE_TITLE | \ - constants.SHOW_DOUBLE_AS_ONE_WIDE, - 'double step in double page mode': True, - 'show page numbers on thumbnails': True, - 'thumbnail size': 80, - 'create thumbnails': True, - 'archive thumbnail as icon' : False, - 'number of pixels to scroll per key event': 50, - 'number of pixels to scroll per mouse wheel event': 50, - 'slideshow delay': 3000, - 'slideshow can go to next archive': True, - 'number of pixels to scroll per slideshow event': 50, - 'smart scroll': True, - 'invert smart scroll': False, - 'smart scroll percentage': 0.5, - 'flip with wheel': True, - 'store recent file info': True, - 'hide all': False, - 'hide all in fullscreen': True, - 'stored hide all values': [True, True, True, True, True], - 'path of last browsed in filechooser': constants.HOME_DIR, - 'last filter in main filechooser': 0, - 'last filter in library filechooser': 1, - 'show menubar': True, - 'previous quit was quit and save': False, - 'show scrollbar': True, - 'show statusbar': True, - 'show toolbar': True, - 'show thumbnails': True, - 'rotation': 0, - 'auto rotate from exif': True, - 'auto rotate depending on size': constants.AUTOROTATE_NEVER, - 'vertical flip': False, - 'horizontal flip': False, - 'keep transformation': False, - 'stored dialog choices': {}, - 'brightness': 1.0, - 'contrast': 1.0, - 'saturation': 1.0, - 'sharpness': 1.0, - 'auto contrast': False, - 'max pages to cache': 7, - 'window x': 0, - 'window y': 0, - 'window height': 600, - 'window width': 640, - 'pageselector height': -1, - 'pageselector width': -1, - 'library cover size': 125, - 'last library collection': None, - 'lib window height': 600, - 'lib window width': 500, - 'lib sort key': constants.SORT_PATH, - 'lib sort order': constants.SORT_ASCENDING, - 'language': 'auto', - 'statusbar fields': constants.STATUS_PAGE | constants.STATUS_RESOLUTION | \ - constants.STATUS_PATH | constants.STATUS_FILENAME | constants.STATUS_FILESIZE, - 'max thumbnail threads': 3, - 'max extract threads': 1, - 'wrap mouse scroll': False, - 'scaling quality': 2, # GdkPixbuf.InterpType.BILINEAR - 'escape quits': False, - 'fit to size mode': constants.ZOOM_MODE_HEIGHT, - 'fit to size px': 1800, - 'scan for new books on library startup': True, - 'openwith commands': [], # (label, command) pairs # keep but no longer used - 'external commands': [], # (label, command) pairs - 'animation mode': constants.ANIMATION_DISABLED, - 'animation background': False, - 'animation transform': False, - 'temporary directory': None, - 'portable allow abspath': False, - 'osd max font size': 16, # hard limited from 8 to 60 - 'osd color': [1, 1, 1, 1], - 'osd bg color': [0, 0, 0, 1], - 'osd timeout': 3.0, # in seconds, hard limited from 0.5 to 30.0 - 'userstyle': None, # None to disable userstyle - 'mount': False, - 'check image mimetype': False, - 'try FLIF support': False, -} - -def check_old_preferences(saved_prefs): - bookmarks_pickle = os.path.join(constants.DATA_DIR, 'bookmarks.pickle') - fileinfo_pickle = os.path.join(constants.DATA_DIR, 'file.pickle') - - old_bookmarks = os.path.exists(bookmarks_pickle) - old_fileinfo = os.path.exists(fileinfo_pickle) - old_prefs = saved_prefs and 'external commands' not in saved_prefs - - if old_bookmarks or old_fileinfo or old_prefs: - from mcomix import upgrade_tools - if old_prefs: - upgrade_tools.openwith_conv(saved_prefs) - os.rename(constants.PREFERENCE_PATH, constants.PREFERENCE_PATH+'.bak') - if old_bookmarks: - upgrade_tools.bookmarks_conv( - bookmarks_pickle, constants.BOOKMARK_JSON_PATH) - if old_fileinfo: - upgrade_tools.fileinfo_conv( - fileinfo_pickle, constants.FILEINFO_JSON_PATH) - -def read_preferences_file(): - '''Read preferences data from disk.''' - - saved_prefs = {} - - if os.path.isfile(constants.PREFERENCE_PATH): - try: - with open(constants.PREFERENCE_PATH, 'r') as config_file: - saved_prefs.update(json.load(config_file)) - except: - # Gettext might not be installed yet at this point. - corrupt_name = constants.PREFERENCE_PATH + '.broken' - log.warning('! Corrupt preferences file, moving to "%s".' % - corrupt_name) - if os.path.isfile(corrupt_name): - os.unlink(corrupt_name) - - os.rename(constants.PREFERENCE_PATH, corrupt_name) - - check_old_preferences(saved_prefs) - - prefs.update(filter(lambda i:i[0] in prefs,saved_prefs.items())) - -def write_preferences_file(): - '''Write preference data to disk.''' - # TODO: it might be better to save only those options that were (ever) - # explicitly changed by the used, leaving everything else as default - # and available (if really needed) to change of defaults on upgrade. - with open(constants.PREFERENCE_PATH, 'w') as config_file: - # XXX: constants.VERSION? It's *preferable* to not complicate the YAML - # file by adding a `{'version': constants.VERSION, 'prefs': config}` - # dict or a list. Adding an extra init line sounds bad too. - json.dump(prefs, config_file, indent=2) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_section.py mcomix-2.1.0/mcomix/mcomix/preferences_section.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/preferences_section.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/preferences_section.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -'''preferences_section.py - Preference dialog section.''' - -from gi.repository import Gtk - -from mcomix import labels - -class _PreferenceSection(Gtk.VBox): - - '''The _PreferenceSection is a convenience class for making one - "section" of a preference-style dialog, e.g. it has a bold header - and a number of rows which are indented with respect to that header. - ''' - - def __init__(self, header, right_column_width): - '''Contruct a new section with the header set to the text in -
, and the width request of the (possible) right columns - set to that of . - ''' - super(_PreferenceSection, self).__init__(homogeneous=False, spacing=0) - self._right_column_width = right_column_width - self.contentbox = Gtk.VBox(homogeneous=False, spacing=6) - label = labels.BoldLabel(header) - label.set_alignment(0, 0.5) - hbox = Gtk.HBox(homogeneous=False, spacing=0) - hbox.pack_start(Gtk.HBox(homogeneous=True, spacing=0), False, False, 6) - hbox.pack_start(self.contentbox, True, True, 0) - self.pack_start(label, False, False, 0) - self.pack_start(hbox, False, False, 6) - - def new_split_vboxes(self): - '''Return two new VBoxes that are automatically put in the section - after the previously added items. The right one has a width request - equal to the right_column_width value passed to the class contructor, - in order to make it easy for all "right column items" in a page to - line up nicely. - ''' - left_box = Gtk.VBox(homogeneous=False, spacing=6) - right_box = Gtk.VBox(homogeneous=False, spacing=6) - - if self._right_column_width != None: - right_box.set_size_request(self._right_column_width, -1) - - hbox = Gtk.HBox(homogeneous=False, spacing=12) - hbox.pack_start(left_box, True, True, 0) - hbox.pack_start(right_box, False, False, 0) - self.contentbox.pack_start(hbox, True, True, 0) - return left_box, right_box - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/process.py mcomix-2.1.0/mcomix/mcomix/process.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/process.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/process.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -'''process.py - Process spawning module.''' - -import gc -import sys -import os -import shutil -import subprocess -from threading import Thread - -from mcomix import log -from mcomix import i18n - - - -NULL = subprocess.DEVNULL -PIPE = subprocess.PIPE -STDOUT = subprocess.STDOUT - -# Convert argument vector to system's file encoding where necessary -# to prevent automatic conversion when appending Unicode strings -# to byte strings later on. -def _fix_args(args): - fixed_args = [] - for arg in args: - if isinstance(arg, str): - fixed_args.append(arg.encode(sys.getfilesystemencoding())) - else: - fixed_args.append(arg) - return fixed_args - -def _get_creationflags(): - if 'win32' == sys.platform: - # Do not create a console window. - return 0x08000000 - else: - return 0 - -# Cannot spawn processes with PythonW/Win32 unless stdin -# and stderr are redirected to a pipe/devnull as well. -def call(args, stdin=NULL, stdout=NULL, stderr=NULL, universal_newlines=False): - return 0 == subprocess.call(_fix_args(args), stdin=stdin, - stdout=stdout, - universal_newlines=universal_newlines, - creationflags=_get_creationflags()) - -def popen(args, stdin=NULL, stdout=PIPE, stderr=NULL, universal_newlines=False): - return subprocess.Popen(_fix_args(args), stdin=stdin, - stdout=stdout, stderr=stderr, - universal_newlines=universal_newlines, - creationflags=_get_creationflags()) - -def call_thread(args): - # call command in thread, so drop std* and set no buffer - params=dict( - stdin=NULL,stdout=NULL,stderr=NULL, - bufsize=0,creationflags=_get_creationflags() - ) - thread=Thread(target=subprocess.call, - args=(args,),kwargs=params,daemon=True) - thread.start() - -if 'win32' == sys.platform: - _exe_dir = os.path.dirname(os.path.abspath(sys.argv[0])) - -def find_executable(candidates, workdir=None, is_valid_candidate=None): - ''' Find executable in path. - - Return an absolute path to a valid executable or None. - - default to the current working directory if not set. - - is an optional function that must return True - if the path passed in argument is a valid candidate (to check for - version number, symlinks to an unsupported variant, etc...). - - If a candidate has a directory component, - it will be checked relative to . - ''' - - if callable(is_valid_candidate): - is_valid = is_valid_candidate - else: - is_valid = lambda exe: True - - for name in candidates: - path = shutil.which(name) - if not path: - continue - if not is_valid(path): - continue - return name - - return None - - -def Win32Popen(cmd): - ''' Spawns a new process on Win32. cmd is a list of parameters. - This method's sole purpose is calling CreateProcessW, not - CreateProcessA as it is done by subprocess.Popen. ''' - import ctypes - - # Declare common data types - DWORD = ctypes.c_uint - WORD = ctypes.c_ushort - LPTSTR = ctypes.c_wchar_p - LPBYTE = ctypes.POINTER(ctypes.c_ubyte) - HANDLE = ctypes.c_void_p - - class StartupInfo(ctypes.Structure): - _fields_ = [('cb', DWORD), - ('lpReserved', LPTSTR), - ('lpDesktop', LPTSTR), - ('lpTitle', LPTSTR), - ('dwX', DWORD), - ('dwY', DWORD), - ('dwXSize', DWORD), - ('dwYSize', DWORD), - ('dwXCountChars', DWORD), - ('dwYCountChars', DWORD), - ('dwFillAttribute', DWORD), - ('dwFlags', DWORD), - ('wShowWindow', WORD), - ('cbReserved2', WORD), - ('lpReserved2', LPBYTE), - ('hStdInput', HANDLE), - ('hStdOutput', HANDLE), - ('hStdError', HANDLE)] - class ProcessInformation(ctypes.Structure): - _fields_ = [('hProcess', HANDLE), - ('hThread', HANDLE), - ('dwProcessId', DWORD), - ('dwThreadId', DWORD)] - - LPSTRARTUPINFO = ctypes.POINTER(StartupInfo) - LPROCESS_INFORMATION = ctypes.POINTER(ProcessInformation) - ctypes.windll.kernel32.CreateProcessW.argtypes = [LPTSTR, LPTSTR, - ctypes.c_void_p, ctypes.c_void_p, ctypes.c_bool, DWORD, - ctypes.c_void_p, LPTSTR, LPSTRARTUPINFO, LPROCESS_INFORMATION] - ctypes.windll.kernel32.CreateProcessW.restype = ctypes.c_bool - - # Convert list of arguments into a single string - cmdline = subprocess.list2cmdline(cmd) - buffer = ctypes.create_unicode_buffer(cmdline) - - # Resolve executable path. - exe = find_executable((cmd[0],)) - - # Some required structures for the method call... - startupinfo = StartupInfo() - ctypes.memset(ctypes.addressof(startupinfo), 0, ctypes.sizeof(startupinfo)) - startupinfo.cb = ctypes.sizeof(startupinfo) - processinfo = ProcessInformation() - - # Spawn new process - success = ctypes.windll.kernel32.CreateProcessW(exe, buffer, - None, None, False, 0, None, None, ctypes.byref(startupinfo), - ctypes.byref(processinfo)) - - if success: - ctypes.windll.kernel32.CloseHandle(processinfo.hProcess) - ctypes.windll.kernel32.CloseHandle(processinfo.hThread) - return processinfo.dwProcessId - else: - raise ctypes.WinError(ctypes.GetLastError(), - i18n.to_unicode(ctypes.FormatError())) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/properties_dialog.py mcomix-2.1.0/mcomix/mcomix/properties_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/properties_dialog.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/properties_dialog.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,140 +0,0 @@ -'''properties_dialog.py - Properties dialog that displays information about the archive/file.''' - -import os -import time -import stat -try: - import pwd -except ImportError: - # Running on non-Unix machine. - pwd = None - -from gi.repository import Gtk - -from mcomix import i18n -from mcomix import properties_page -from mcomix import strings -from mcomix import tools - -class _PropertiesDialog(Gtk.Dialog): - - def __init__(self, window): - - super(_PropertiesDialog, self).__init__(title=_('Properties')) - self.set_transient_for(window) - self.add_buttons(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) - self._window = window - self.resize(500, 430) - self.set_resizable(True) - self.set_default_response(Gtk.ResponseType.CLOSE) - self.set_border_width(4) - self._notebook = Gtk.Notebook() - self._notebook.set_border_width(6) - - self._archive_page = properties_page._Page() - self._image_page = properties_page._Page() - - self._notebook.append_page( - self._archive_page, Gtk.Label(label=_('Archive'))) - self._notebook.append_page( - self._image_page, Gtk.Label(label=_('Image'))) - - self._update_archive_page() - self._window.page_changed += self._on_page_change - self._window.filehandler.file_opened += self._on_book_change - self._window.filehandler.file_closed += self._on_book_change - self._window.imagehandler.page_available += self._on_page_available - - self.vbox.pack_start(self._notebook, True, True, 0) - self.show_all() - - def _on_page_change(self): - self._update_image_page() - - def _on_book_change(self): - self._update_archive_page() - - def _on_page_available(self, page_number): - if 1 == page_number: - self._update_page_image(self._archive_page, 1) - current_page_number = self._window.imagehandler.get_current_page() - if current_page_number == page_number: - self._update_image_page() - - def _update_archive_page(self): - self._update_image_page() - page = self._archive_page - page.reset() - window = self._window - if window.filehandler.archive_type is None: - if self._notebook.get_n_pages() == 2: - self._notebook.detach_tab(page) - return - if self._notebook.get_n_pages() == 1: - self._notebook.insert_page(page, Gtk.Label(label=_('Archive')), 0) - # In case it's not ready yet, bump the cover extraction - # in front of the queue. - path = window.imagehandler.get_path_to_page(1) - if path is not None: - window.filehandler._ask_for_files([path]) - self._update_page_image(page, 1) - filename = window.filehandler.get_pretty_current_filename() - page.set_filename(filename) - path = window.filehandler.get_path_to_base() - main_info = ( - _('%d pages') % window.imagehandler.get_number_of_pages(), - _('%d comments') % - window.filehandler.get_number_of_comments(), - strings.ARCHIVE_DESCRIPTIONS[window.filehandler.archive_type] - ) - page.set_main_info(main_info) - self._update_page_secondary_info(page, path) - page.show_all() - - def _update_image_page(self): - page = self._image_page - page.reset() - window = self._window - if not window.imagehandler.page_is_available(): - return - self._update_page_image(page) - path = window.imagehandler.get_path_to_page() - filename = os.path.basename(path) - page.set_filename(filename) - width, height = window.imagehandler.get_size() - main_info = ( - '%dx%d px' % (width, height), - window.imagehandler.get_mime_name(), - ) - page.set_main_info(main_info) - self._update_page_secondary_info(page, path) - page.show_all() - - def _update_page_image(self, page, page_number=None): - if not self._window.imagehandler.page_is_available(page_number): - return - thumb = self._window.imagehandler.get_thumbnail(page_number, width=128, height=128) - page.set_thumbnail(thumb) - - def _update_page_secondary_info(self, page, location): - secondary_info = [ - (_('Location'), i18n.to_unicode(os.path.dirname(location))), - ] - try: - stats = os.stat(location) - except OSError as e: - page.set_secondary_info(secondary_info) - return - uid = str(stats.st_uid) if pwd is None else pwd.getpwuid(stats.st_uid).pw_name - secondary_info.extend(( - (_('Size'), tools.format_byte_size(stats.st_size)), - (_('Accessed'), time.strftime('%Y-%m-%d, %H:%M:%S', - time.localtime(stats.st_atime))), - (_('Modified'), time.strftime('%Y-%m-%d, %H:%M:%S', - time.localtime(stats.st_mtime))), - (_('Permissions'), oct(stat.S_IMODE(stats.st_mode))), - (_('Owner'), uid) - )) - page.set_secondary_info(secondary_info) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/properties_page.py mcomix-2.1.0/mcomix/mcomix/properties_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/properties_page.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/properties_page.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -'''properties_page.py - A page to put in the properties dialog window.''' - -from gi.repository import Gtk - -from mcomix import i18n -from mcomix import image_tools -from mcomix import labels - -class _Page(Gtk.ScrolledWindow): - - '''A page to put in the Gtk.Notebook. Contains info about a file (an - image or an archive.) - ''' - - def __init__(self): - super(_Page, self).__init__() - self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self._vbox = Gtk.VBox(homogeneous=False, spacing=12) - self.add_with_viewport(self._vbox) - - self.set_border_width(12) - topbox = Gtk.HBox(homogeneous=False, spacing=12) - self._vbox.pack_start(topbox, True, True, 0) - self._thumb = Gtk.Image() - self._thumb.set_size_request(128, 128) - topbox.pack_start(self._thumb, False, False, 0) - borderbox = Gtk.Frame() - borderbox.set_shadow_type(Gtk.ShadowType.ETCHED_IN) - borderbox.set_size_request(-1, 130) - topbox.pack_start(borderbox, True, True, 0) - insidebox = Gtk.EventBox() - insidebox.set_border_width(1) - insidebox.set_state(Gtk.StateType.ACTIVE) - borderbox.add(insidebox) - self._insidebox = insidebox - self._mainbox = None - self._extrabox = None - self.reset() - - def reset(self): - self._thumb.clear() - if self._mainbox is not None: - self._mainbox.destroy() - self._mainbox = Gtk.VBox(homogeneous=False, spacing=5) - self._mainbox.set_border_width(10) - self._insidebox.add(self._mainbox) - if self._extrabox is not None: - self._extrabox.destroy() - self._extrabox = Gtk.HBox(homogeneous=False, spacing=10) - self._vbox.pack_start(self._extrabox, False, False, 0) - - def set_thumbnail(self, pixbuf): - pixbuf = image_tools.add_border(pixbuf, 1) - self._thumb.set_from_pixbuf(pixbuf) - - def set_filename(self, filename): - '''Set the filename to be displayed to . Call this before - set_main_info(). - ''' - label = labels.BoldLabel(i18n.to_unicode(filename)) - label.set_alignment(0, 0.5) - label.set_selectable(True) - self._mainbox.pack_start(label, False, False, 0) - self._mainbox.pack_start(Gtk.VBox(homogeneous=True, spacing=0), True, True, 0) # Just to add space (better way?) - - def set_main_info(self, info): - '''Set the information in the main info box (below the filename) to - the values in the sequence . - ''' - for text in info: - label = Gtk.Label(label=text) - label.set_alignment(0, 0.5) - label.set_selectable(True) - self._mainbox.pack_start(label, False, False, 0) - - def set_secondary_info(self, info): - '''Set the information below the main info box to the values in the - sequence . Each entry in info should be a tuple (desc, value). - ''' - left_box = Gtk.VBox(homogeneous=True, spacing=8) - right_box = Gtk.VBox(homogeneous=True, spacing=8) - self._extrabox.pack_start(left_box, False, False, 0) - self._extrabox.pack_start(right_box, False, False, 0) - for desc, value in info: - desc_label = labels.BoldLabel('%s:' % desc) - desc_label.set_alignment(1.0, 1.0) - left_box.pack_start(desc_label, True, True, 0) - value_label = Gtk.Label(label=value) - value_label.set_alignment(0, 1.0) - value_label.set_selectable(True) - right_box.pack_start(value_label, True, True, 0) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/recent.py mcomix-2.1.0/mcomix/mcomix/recent.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/recent.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/recent.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -'''recent.py - Recent files handler.''' - -import urllib -import itertools -from gi.repository import Gtk -from gi.repository import Gtk -import glib -from gi.repository import GObject -import sys - -from mcomix import preferences -from mcomix import i18n -from mcomix import portability -from mcomix import archive_tools -from mcomix import image_tools -from mcomix import log - -class RecentFilesMenu(Gtk.RecentChooserMenu): - - def __init__(self, ui, window): - super(RecentFilesMenu, self).__init__() - self._window = window - self._manager = Gtk.RecentManager.get_default() - - self.set_sort_type(Gtk.RecentSortType.MRU) - self.set_show_tips(True) - # Missing icons crash GTK on Win32 - if sys.platform == 'win32': - self.set_show_icons(False) - self.set_show_numbers(True) - - rfilter = Gtk.RecentFilter() - supported_formats = {} - supported_formats.update(image_tools.get_supported_formats()) - supported_formats.update(archive_tools.get_supported_formats()) - for name in sorted(supported_formats): - mime_types, extensions = supported_formats[name] - patterns = ['*'+ext for ext in extensions] - for mime in mime_types: - rfilter.add_mime_type(mime) - for pat in patterns: - rfilter.add_pattern(pat) - self.add_filter(rfilter) - - self.connect('item_activated', self._load) - - def _load(self, *args): - uri = self.get_current_uri() - path = urllib.request.url2pathname(uri[7:]) - did_file_load = self._window.filehandler.open_file(path) - - if not did_file_load: - self.remove(path) - - def count(self): - ''' Returns the amount of stored entries. ''' - return len(self._manager.get_items()) - - def add(self, path): - if not preferences.prefs['store recent file info']: - return - uri = (portability.uri_prefix() - + urllib.request.pathname2url(i18n.to_unicode(path))) - self._manager.add_item(uri) - - def remove(self, path): - if not preferences.prefs['store recent file info']: - return - uri = (portability.uri_prefix() - + urllib.request.pathname2url(i18n.to_unicode(path))) - try: - self._manager.remove_item(uri) - except glib.GError: - # Could not remove item - pass - - def remove_all(self): - ''' Removes all entries to recently opened files. ''' - try: - self._manager.purge_items() - except GObject.GError as error: - log.debug(error) - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/run.py mcomix-2.1.0/mcomix/mcomix/run.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/run.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/run.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,229 +0,0 @@ - -import os -import sys -import argparse -import signal - -if __name__ == '__main__': - print('PROGRAM TERMINATED',file=sys.stderr) - print('Please do not run this script directly! Use mcomixstarter.py instead.',file=sys.stderr) - sys.exit(1) - -# These modules must not depend on GTK, PIL, -# or any other optional libraries. -from mcomix import ( - constants, - log, - portability, - preferences, -) - -def wait_and_exit(): - ''' Wait for the user pressing ENTER before closing. This should help - the user find possibly missing dependencies when starting, since the - Python window will not close down immediately after the error. ''' - if sys.platform == 'win32' and not sys.stdin.closed and not sys.stdout.closed: - print() - input('Press ENTER to continue...') - sys.exit(1) - -def print_version(): - '''Print the version number and exit.''' - print(constants.APPNAME, constants.VERSION) - sys.exit(0) - -def parse_arguments(): - ''' Parse the command line passed in . Returns a tuple containing - (options, arguments). Errors parsing the command line are handled in - this function. ''' - - parser = argparse.ArgumentParser( - usage='%%(prog)s %s' % _('[OPTION...] [PATH...]'), - description=_('View images and comic book archives.'), - add_help=False) - parser.add_argument('--help', action='help', - help=_('Show this help and exit.')) - parser.add_argument('path', type=str, action='store', nargs='*', default='', - help=argparse.SUPPRESS) - - parser.add_argument('-s', '--slideshow', dest='slideshow', action='store_true', - help=_('Start the application in slideshow mode.')) - parser.add_argument('-l', '--library', dest='library', action='store_true', - help=_('Show the library on startup.')) - parser.add_argument('-v', '--version', dest='version', action='store_true', - help=_('Show the version number and exit.')) - - viewmodes = parser.add_argument_group('View modes') - viewmodes.add_argument('-f', '--fullscreen', dest='fullscreen', action='store_true', - help=_('Start the application in fullscreen mode.')) - viewmodes.add_argument('-m', '--manga', dest='manga', action='store_true', - help=_('Start the application in manga mode.')) - viewmodes.add_argument('-d', '--double-page', dest='doublepage', action='store_true', - help=_('Start the application in double page mode.')) - - fitmodes = parser.add_argument_group('Zoom modes') - fitmodes.add_argument('-b', '--zoom-best', dest='zoommode', action='store_const', - const=constants.ZOOM_MODE_BEST, - help=_('Start the application with zoom set to best fit mode.')) - fitmodes.add_argument('-w', '--zoom-width', dest='zoommode', action='store_const', - const=constants.ZOOM_MODE_WIDTH, - help=_('Start the application with zoom set to fit width.')) - fitmodes.add_argument('-h', '--zoom-height', dest='zoommode', action='store_const', - const=constants.ZOOM_MODE_HEIGHT, - help=_('Start the application with zoom set to fit height.')) - - debugopts = parser.add_argument_group('Debug options') - debugopts.add_argument('-W', dest='loglevel', action='store', - choices=log.levels.keys(), default='warn', - metavar='[ {} ]'.format(' | '.join(log.levels.keys())), - help=_('Sets the desired output log level.')) - # This supresses an error when MComix is used with cProfile - debugopts.add_argument('-o', dest='output', action='store', - default='', help=argparse.SUPPRESS) - - args = parser.parse_args() - - return args - -def run(): - '''Run the program.''' - - # Load configuration and setup localisation. - preferences.read_preferences_file() - from mcomix import i18n - i18n.install_gettext() - - # Retrieve and parse command line arguments. - args = parse_arguments() - - if args.version: - print_version() - - # First things first: set the log level. - log.setLevel(log.levels[args.loglevel]) - - # Check for PyGTK and PIL dependencies. - try: - from gi import version_info as gi_version_info - if gi_version_info < (3,21,0): - log.error(_('You do not have the required versions of PyGObject installed.')) - wait_and_exit() - - from gi import require_version - - require_version('PangoCairo', '1.0') - require_version('Gtk', '3.0') - require_version('Gdk', '3.0') - - from gi.repository import Gdk, GdkPixbuf, Gtk, GLib - - except ValueError: - log.error(_('You do not have the required versions of GTK+ 3.0 installed.')) - wait_and_exit() - - except ImportError: - log.error(_('No version of GObject was found on your system.')) - log.error(_('This error might be caused by missing GTK+ libraries.')) - wait_and_exit() - - try: - #FIXME - # check Pillow version carefully here. - # from 5.1.0 to 5.4.1, PILLOW_VERSION is used, - # but since 6.0.0, only __version__ should be used. - # clean up these code once python 3.6 goes EOL (maybe 2021) - # (https://pillow.readthedocs.io/en/stable/releasenotes/5.2.0.html) - import PIL.Image - pilver=getattr(PIL.Image,'__version__',None) - if not pilver: - pilver=getattr(PIL.Image,'PILLOW_VERSION') - log.warning(_('Please download latest version of Pillow from {}').format( - 'https://pypi.org/project/Pillow/')) - setattr(PIL.Image,'__version__',pilver) - - except AttributeError: - log.error(_('You don\'t have the required version of the Pillow installed.')) - log.error(_('Required Pillow version is: %s or higher') % constants.REQUIRED_PIL_VERSION) - wait_and_exit() - - except ImportError: - log.error(_('Pillow %s or higher is required.') % constants.REQUIRED_PIL_VERSION) - log.error(_('No version of the Pillow was found on your system.')) - wait_and_exit() - - else: - if pilver < constants.REQUIRED_PIL_VERSION: - log.error(_('You don\'t have the required version of the Pillow installed.')) - log.error(_('Installed PIL version is: %s') % pilver) - log.error(_('Required Pillow version is: %s or higher') % constants.REQUIRED_PIL_VERSION) - wait_and_exit() - - log.info('Image loaders: Pillow [%s], GDK [%s])', - PIL.Image.__version__,GdkPixbuf.PIXBUF_VERSION) - - if not os.path.exists(constants.DATA_DIR): - os.makedirs(constants.DATA_DIR, 0o700) - - if not os.path.exists(constants.CONFIG_DIR): - os.makedirs(constants.CONFIG_DIR, 0o700) - - from mcomix import icons - icons.load_icons() - - open_path = args.path or None - open_page = 1 - - if isinstance(open_path, list): - n = 0 - while n invisible_size: - result[i] = invisible_size - carry = False - if viewport_position[i] > content_size[i]: - reset_all_axes = True - break - if reset_all_axes: - # We don't see anything at all because we are somewhere way before - # the content box. Let's go to it. - for i in range(len(content_size)): - invisible_size = content_size[i] - viewport_size[i] - o = orientation[i] - if o == 1: - result[i] = 0 - else: # o == -1 - result[i] = invisible_size - - # This code is somewhat similar to a simple ripple-carry adder. - if carry: - for i in range(len(content_size)): - invisible_size = content_size[i] - viewport_size[i] - o = orientation[i] - ms = min(max_scroll[i], invisible_size) - # Let's calculate the grid we want to snap to. - if ms != 0: - steps_to_take = int(math.ceil(float(invisible_size) / ms)) - if ms == 0 or steps_to_take >= invisible_size: - # special case: We MUST go forward by at least 1 pixel. - if o >= 0: - result[i] += 1 - carry = result[i] > invisible_size - if carry: - result[i] = 0 - continue - else: - result[i] -= 1 - carry = result[i] < 0 - if carry: - result[i] = invisible_size - continue - break - # If orientation is -1, we need to round half up instead of - # half down. - positions = self._cached_bs(invisible_size, steps_to_take, o == -1) - - # Where are we now (according to the grid)? - index = tools.bin_search(positions, viewport_position[i]) - - if index < 0: - # We're somewhere between two valid grid points, so - # let's go to the next one. - index = ~index - if o >= 0: - # index tends to be greater, so we need to go back - # manually, if needed. - index -= 1 - # Let's go to where we're headed for. - index += o - - carry = index < 0 or index >= len(positions) - if carry: - # There is no space left in this dimension, so let's go - # back in this one and one step forward in the next one. - result[i] = 0 if o > 0 else invisible_size - else: - # We found a valid grid point in this dimension, so let's - # stop here. - result[i] = positions[index] - break - if carry: - # No space left. - return [] - - # Undo axis remapping, if any - if axis_map is not None: - result = Scrolling._remap_axes(result, - Scrolling._inverse_axis_map(axis_map)) - - return tools.vector_add(result, offset) - - - def scroll_to_predefined(self, content_box, viewport_box, orientation, - destination): - ''' Returns a new viewport position when scrolling towards a - predefined destination. Note that all params are lists of integers - where each index corresponds to one dimension. - @param content_box: The Box of the content to display. - @param viewport_box: The viewport Box we are looking through. - @param orientation: The orientation which shows where "forward" - points to. Either 1 (towards larger values in this dimension when - reading) or -1 (towards smaller values in this dimension when reading). - @param destination: An integer representing a predefined destination. - Either 1 (towards the greatest possible values in this dimension), - -1 (towards the smallest value in this dimension), 0 (keep position), - SCROLL_TO_CENTER (scroll to the center of the content in this - dimension), SCROLL_TO_START (scroll to where the content starts in this - dimension) or SCROLL_TO_END (scroll to where the content ends in this - dimension). - @return: A new viewport position as specified above. ''' - content_position = content_box.get_position() - content_size = content_box.get_size() - viewport_size = viewport_box.get_size() - result = list(viewport_box.get_position()) - for i in range(len(content_size)): - o = orientation[i] - d = destination[i] - if d == 0: - continue - if d < constants.SCROLL_TO_END or d > 1: - raise ValueError('invalid destination ' + d + ' at index '+ i) - if d == constants.SCROLL_TO_END: - d = o - if d == constants.SCROLL_TO_START: - d = -o - c = content_size[i] - v = viewport_size[i] - invisible_size = c - v - result[i] = content_position[i] + (box.Box._box_to_center_offset_1d( - invisible_size, o) if d == constants.SCROLL_TO_CENTER - else invisible_size if d == 1 - else 0) # if d == -1 - return result - - - def _cached_bs(self, num, denom, half_up): - ''' A simple (and ugly) caching mechanism used to avoid - recomputations. The current implementation offers a cache with - only two entries so it's only useful for the two "fastest" - dimensions. ''' - if (self._cache0[0] != num or - self._cache0[1] != denom or - self._cache0[2] != half_up): - self._cache0, self._cache1 = self._cache1, self._cache0 - if (self._cache0[0] != num or - self._cache0[1] != denom or - self._cache0[2] != half_up): - self._cache0 = (num, denom, half_up, - Scrolling._bresenham_sums(num, denom, half_up)) - return self._cache0[3] - - - def clear_cache(self): - ''' Clears all caches that are used internally. ''' - self._cache0 = (0, 0, False, []) - self._cache1 = (0, 0, False, []) - - - @staticmethod - def _bresenham_sums(num, denom, half_up): - ''' This algorithm is derived from Bresenham's line algorithm in - order to distribute the remainder of num/denom equally. See - https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm for details. - ''' - if num < 0: - raise ValueError('num < 0') - if denom < 1: - raise ValueError('denom < 1') - quotient = num // denom - remainder = num % denom - needs_up = half_up and (remainder != 0) and ((denom & 1) == 0) - up_flag = False - error = denom >> 1 - result = [0] - partial_sum = 0 - for i in range(denom): - error -= remainder - if error < 0: - error += denom - partial_sum += quotient + 1 - else: - partial_sum += quotient - - # round half up, if necessary - if up_flag: - partial_sum -= 1 - up_flag = False - elif needs_up and error == 0: - partial_sum += 1 - up_flag = True - - result.append(partial_sum) - return result - - - @staticmethod - def _remap_axes(vector, order): - return [vector[i] for i in order] - - - @staticmethod - def _map_remap_axes(vectors, order): - return map(lambda v: Scrolling._remap_axes(v, order), vectors) - - - @staticmethod - def _inverse_axis_map(order): - identity = range(len(order)) - return [identity[order[i]] for i in identity] - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/slideshow.py mcomix-2.1.0/mcomix/mcomix/slideshow.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/slideshow.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/slideshow.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -'''slideshow.py - Slideshow handler.''' - -from gi.repository import Gtk - -from mcomix.lib import mt -from mcomix.preferences import prefs - -class Slideshow(object): - - '''Slideshow handler that manages starting and stopping of slideshows.''' - - def __init__(self, window): - self._window = window - self._interval = mt.Interval( - prefs['slideshow delay'], Slideshow._next, - args=(self._window, - prefs['number of pixels to scroll per slideshow event'])) - - def start(self): - if self.is_running(): - return - self._interval.start() - self._window.update_title() - - def stop(self): - if not self.is_running(): - return - self._interval.stop() - self._window.update_title() - - def is_running(self): - return self._interval.is_running() - - @staticmethod - def _next(window, pixels): - if pixels: - window.scroll_with_flipping(0, pixels) - else: - window.flip_page(+1) - return - - def toggle(self, action): - '''Toggle a slideshow on or off.''' - if action.get_active(): - self.start() - self._window.uimanager.get_widget('/Tool/slideshow').set_stock_id( Gtk.STOCK_MEDIA_STOP ) - self._window.uimanager.get_widget('/Tool/slideshow').set_tooltip_text( _('Stop slideshow') ) - else: - self.stop() - self._window.uimanager.get_widget('/Tool/slideshow').set_stock_id( Gtk.STOCK_MEDIA_PLAY ) - self._window.uimanager.get_widget('/Tool/slideshow').set_tooltip_text( _('Start slideshow') ) - - def update_delay(self): - '''Update the delay time a started slideshow is using.''' - if not self.is_running(): - return - self._interval.reset() - - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/status.py mcomix-2.1.0/mcomix/mcomix/status.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/status.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/status.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ -'''status.py - Statusbar for main window.''' - -from gi.repository import Gdk, Gtk - -from mcomix import i18n -from mcomix import constants -from mcomix.preferences import prefs - -class Statusbar(Gtk.EventBox): - - SPACING = 5 - - def __init__(self): - super(Statusbar, self).__init__() - - self._loading = True - - # Status text, page number, file number, resolution, path, filename, filesize - self.status = Gtk.Statusbar() - self.add(self.status) - - # Create popup menu for enabling/disabling status boxes. - self.ui_manager = Gtk.UIManager() - self.tooltipstatus = TooltipStatusHelper(self.ui_manager, self.status) - ui_description = ''' - - - - - - - - - - - ''' - self.ui_manager.add_ui_from_string(ui_description) - - actiongroup = Gtk.ActionGroup(name='mcomix-statusbar') - actiongroup.add_toggle_actions([ - ('pagenumber', None, _('Show page numbers'), None, None, - self.toggle_status_visibility), - ('filenumber', None, _('Show file numbers'), None, None, - self.toggle_status_visibility), - ('resolution', None, _('Show resolution'), None, None, - self.toggle_status_visibility), - ('rootpath', None, _('Show path'), None, None, - self.toggle_status_visibility), - ('filename', None, _('Show filename'), None, None, - self.toggle_status_visibility), - ('filesize', None, _('Show filesize'), None, None, - self.toggle_status_visibility)]) - self.ui_manager.insert_action_group(actiongroup, 0) - - # Hook mouse release event - self.connect('button-release-event', self._button_released) - self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK) - - # Default status information - self._page_info = '' - self._file_info = '' - self._resolution = '' - self._root = '' - self._filename = '' - self._filesize = '' - self._update_sensitivity() - self.show_all() - - self._loading = False - - def set_message(self, message): - '''Set a specific message (such as an error message) on the statusbar, - replacing whatever was there earlier. - ''' - self.status.pop(0) - self.status.push(0, ' ' * Statusbar.SPACING + message) - - def set_page_number(self, page, total, this_screen): - '''Update the page number.''' - p = ','.join(str(page+i) for i in range(this_screen)) - self._page_info = '{} / {}'.format(p,total) - - def get_page_number(self): - '''Returns the bar's page information.''' - return self._page_info - - def set_file_number(self, fileno, total): - '''Updates the file number (i.e. number of current file/total - files loaded).''' - if total > 0: - self._file_info = '(%d / %d)' % (fileno, total) - else: - self._file_info = '' - - def get_file_number(self): - ''' Returns the bar's file information.''' - return self._file_info - - def set_resolution(self, dimensions): # 2D only - '''Update the resolution data. - - Takes an iterable of tuples, (x, y, scale), describing the original - resolution of an image as well as the currently displayed scale. - ''' - self._resolution = ', '.join('{}x{} ({:.1%})'.format(*d) for d in dimensions) - - def set_root(self, root): - '''Set the name of the root (directory or archive).''' - self._root = i18n.to_unicode(root) - - def set_filename(self, filename): - '''Update the filename.''' - self._filename = i18n.to_unicode(filename) - - def set_filesize(self, size): - '''Update the filesize.''' - if size is None: - size = '' - self._filesize = size - - def update(self): - '''Set the statusbar to display the current state.''' - - s = '{0:^{1}}'.format('|',Statusbar.SPACING*2+1) - text = s.join(self._get_status_text()) - self.status.pop(0) - self.status.push(0, '{1:>{2}}{0}'.format(text,'',Statusbar.SPACING)) - - def push(self, context_id, message): - ''' Compatibility with Gtk.Statusbar. ''' - assert context_id >= 0 - self.status.push(context_id + 1, message) - - def pop(self, context_id): - ''' Compatibility with Gtk.Statusbar. ''' - assert context_id >= 0 - self.status.pop(context_id + 1) - - def _get_status_text(self): - ''' Returns an array of text fields that should be displayed. ''' - fields = [ - (constants.STATUS_PAGE, self._page_info ), - (constants.STATUS_FILENUMBER, self._file_info ), - (constants.STATUS_RESOLUTION, self._resolution), - (constants.STATUS_PATH, self._root ), - (constants.STATUS_FILENAME, self._filename ), - (constants.STATUS_FILESIZE, self._filesize ), - ] - p = prefs['statusbar fields'] - - return [s for c,s in filter(lambda f:f[0]&p,fields)] - - def toggle_status_visibility(self, action, *args): - ''' Called when status entries visibility is to be changed. ''' - - # Ignore events as long as control is still loading. - if self._loading: - return - - names = { - 'pagenumber': constants.STATUS_PAGE, - 'resolution': constants.STATUS_RESOLUTION, - 'rootpath': constants.STATUS_PATH, - 'filename': constants.STATUS_FILENAME, - 'filenumber': constants.STATUS_FILENUMBER, - 'filesize': constants.STATUS_FILESIZE, - } - - bit = names[action.get_name()] - - if action.get_active(): - prefs['statusbar fields'] |= bit - else: - prefs['statusbar fields'] &= ~bit - - self.update() - self._update_sensitivity() - - def _button_released(self, widget, event, *args): - ''' Triggered when a mouse button is released to open the context - menu. ''' - if event.button == 3: - self.ui_manager.get_widget('/Statusbar').popup(None, None, None, None, - event.button, event.time) - - def _update_sensitivity(self): - ''' Updates the action menu's sensitivity based on user preferences. ''' - - p = prefs['statusbar fields'] - names = { - 'pagenumber': p & constants.STATUS_PAGE, - 'filenumber': p & constants.STATUS_FILENUMBER, - 'resolution': p & constants.STATUS_RESOLUTION, - 'rootpath': p & constants.STATUS_PATH, - 'filename': p & constants.STATUS_FILENAME, - 'filesize': p & constants.STATUS_FILESIZE, - } - - for n,v in names.items(): - action = self.ui_manager.get_action('/Statusbar/' + n) - action.set_active(v) - - -class TooltipStatusHelper(object): - ''' Attaches to a L{Gtk.UIManager} to provide statusbar tooltips when - selecting menu items. ''' - - def __init__(self, uimanager, statusbar): - self._statusbar = statusbar - - uimanager.connect('connect-proxy', self._on_connect_proxy) - uimanager.connect('disconnect-proxy', self._on_disconnect_proxy) - - def _on_connect_proxy(self, uimgr, action, widget): - ''' Connects the widget's selection handlers to the status bar update. - ''' - tooltip = action.get_property('tooltip') - if isinstance(widget, Gtk.MenuItem) and tooltip: - cid = widget.connect('select', self._on_item_select, tooltip) - cid2 = widget.connect('deselect', self._on_item_deselect) - setattr(widget, 'app::connect-ids', (cid, cid2)) - - def _on_disconnect_proxy(self, uimgr, action, widget): - ''' Disconnects the widget's selection handlers. ''' - cids = getattr(widget, 'app::connect-ids', ()) - for cid in cids: - widget.disconnect(cid) - - def _on_item_select(self, menuitem, tooltip): - self._statusbar.push(0, ' ' * Statusbar.SPACING + tooltip) - - def _on_item_deselect(self, menuitem): - self._statusbar.pop(0) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/strings.py mcomix-2.1.0/mcomix/mcomix/strings.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/strings.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/strings.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -# -*- coding: utf-8 -*- -''' strings.py - Constant strings that need internationalization. - This file should only be imported after gettext has been correctly initialized - and installed in the global namespace. ''' - -from mcomix.constants import ZIP, RAR, TAR, GZIP, BZIP2, XZ, PDF, SEVENZIP, LHA, ZIP_EXTERNAL - -ARCHIVE_DESCRIPTIONS = { - ZIP : _('ZIP archive'), - RAR : _('RAR archive'), - TAR : _('Tar archive'), - GZIP : _('Gzip compressed tar archive'), - BZIP2 : _('Bzip2 compressed tar archive'), - XZ : _('XZ compressed tar archive'), - PDF : _('PDF document'), - SEVENZIP : _('7z archive'), - LHA : _('LHA archive'), - ZIP_EXTERNAL: _('ZIP archive'), -} - -AUTHORS = ( - ('Pontus Ekberg', _('Original vision/developer of Comix')), - ('Louis Casillas', _('MComix developer')), - ('Moritz Brunner', _('MComix developer')), - ('Ark', _('MComix developer')), - ('Benoit Pierre', _('MComix developer')), -) - -TRANSLATORS = ( - ('Emfox Zhou', _('Simplified Chinese translation')), - ('Xie Yanbo', _('Simplified Chinese translation')), - ('Zach Cheung', _('Simplified Chinese translation')), - ('Manuel Quiñones', _('Spanish translation')), - ('Carlos Feliu', _('Spanish translation')), - ('Marcelo Góes', _('Brazilian Portuguese translation')), - ('Christoph Wolk', _('German translation and Nautilus thumbnailer')), - ('Chris Leick', _('German translation')), - ('Raimondo Giammanco', _('Italian translation')), - ('Giovanni Scafora', _('Italian translation')), - ('GhePeU', _('Italian translation')), - ('Arthur Nieuwland', _('Dutch translation')), - ('Achraf Cherti', _('French translation')), - ('Benoît H.', _('French translation')), - ('Joseph M. Sleiman', _('French translation')), - ('Frédéric Chateaux', _('French translation')), - ('Kamil Leduchowski', _('Polish translatin')), - ('Darek Jakoniuk', _('Polish translation')), - ('Paul Chatzidimitriou', _('Greek translation')), - ('Carles Escrig Royo', _('Catalan translation')), - ('Hsin-Lin Cheng', _('Traditional Chinese translation')), - ('Wayne Su', _('Traditional Chinese translation')), - ('Mamoru Tasaka', _('Japanese translation')), - ('Keita Haga', _('Japanese translation')), - ('Toshiharu Kudoh', _('Japanese translation')), - ('Ernő Drabik', _('Hungarian translation')), - ('Artyom Smirnov', _('Russian translation')), - ('Евгений Лежнин', _('Russian translation')), - ('Adrian C.', _('Croatian translation')), - ('김민기', _('Korean translation')), - ('Gyeongmin Bak', _('Korean translation')), - ('Minho Jeung', _('Korean translation')), - ('Maryam Sanaat', _('Persian translation')), - ('Andhika Padmawan', _('Indonesian translation')), - ('Jan Nekvasil', _('Czech translation')), - ('Олександр Заяц', _('Ukrainian translation')), - ('Roxerio Roxo Carrillo', _('Galician translation')), - ('Martin Karlsson', _('Swedish translation')), - ('Jonatan Nyberg', _('Swedish translation')), - ('Isratine Citizen', _('Hebrew translation')), - ('Zygi Mantus', _('Lithuanian translation')), -) - -ARTISTS = ( - ('Victor Castillejo', _('Icon design')), -) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbbar.py mcomix-2.1.0/mcomix/mcomix/thumbbar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbbar.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/thumbbar.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,275 +0,0 @@ -'''thumbbar.py - Thumbnail sidebar for main window.''' - -import urllib -from gi.repository import GObject, Gdk, GdkPixbuf, Gtk -import cairo - -from mcomix.preferences import prefs -from mcomix import image_tools -from mcomix import tools -from mcomix import constants -from mcomix import thumbnail_view - - -class ThumbnailSidebar(Gtk.ScrolledWindow): - - '''A thumbnail sidebar including scrollbar for the main window.''' - - # Thumbnail border width in pixels. - _BORDER_SIZE = 1 - - def __init__(self, window): - super(ThumbnailSidebar, self).__init__() - - self._window = window - #: Thumbnail load status - self._loaded = False - #: Selected row in treeview - self._currently_selected_row = 0 - - self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) - self.get_vadjustment().step_increment = 15 - self.get_vadjustment().page_increment = 1 - # Disable stupid overlay scrollbars... - if hasattr(self.props, 'overlay_scrolling'): - self.props.overlay_scrolling = False - - # models - contains data - self._thumbnail_liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, bool) - - # view - responsible for laying out the columns - self._treeview = thumbnail_view.ThumbnailTreeView( - self._thumbnail_liststore, - 0, # UID - 1, # pixbuf - 2, # status - ) - self._treeview.set_headers_visible(False) - self._treeview.generate_thumbnail = self._generate_thumbnail - self._treeview.set_activate_on_single_click(True) - - self._treeview.connect_after('drag_begin', self._drag_begin) - self._treeview.connect('drag_data_get', self._drag_data_get) - self._treeview.connect('row-activated', self._row_activated_event) - self._treeview.connect('button_press_event', self._mouse_press_event) - - - # enable drag and dropping of images from thumbnail bar to some file - # manager - self._treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, - [('text/uri-list', 0, 0)], Gdk.DragAction.COPY) - - # Page column - self._thumbnail_page_treeviewcolumn = Gtk.TreeViewColumn(None) - self._treeview.append_column(self._thumbnail_page_treeviewcolumn) - self._text_cellrenderer = Gtk.CellRendererText() - # Right align page numbers. - self._text_cellrenderer.set_property('xalign', 1.0) - self._thumbnail_page_treeviewcolumn.set_sizing(Gtk.TreeViewColumnSizing.FIXED) - self._thumbnail_page_treeviewcolumn.pack_start(self._text_cellrenderer, False) - self._thumbnail_page_treeviewcolumn.add_attribute(self._text_cellrenderer, 'text', 0) - self._thumbnail_page_treeviewcolumn.set_visible(False) - - # Pixbuf column - self._thumbnail_image_treeviewcolumn = Gtk.TreeViewColumn(None) - self._treeview.append_column(self._thumbnail_image_treeviewcolumn) - self._pixbuf_cellrenderer = Gtk.CellRendererPixbuf() - self._thumbnail_image_treeviewcolumn.set_sizing(Gtk.TreeViewColumnSizing.FIXED) - self._thumbnail_image_treeviewcolumn.set_fixed_width(self._pixbuf_size) - self._thumbnail_image_treeviewcolumn.pack_start(self._pixbuf_cellrenderer, True) - self._thumbnail_image_treeviewcolumn.add_attribute(self._pixbuf_cellrenderer, 'pixbuf', 1) - - self._treeview.set_fixed_height_mode(True) - self._treeview.set_can_focus(False) - - self.add(self._treeview) - self.change_thumbnail_background_color(prefs['thumb bg colour']) - self.show_all() - - self._window.page_changed += self._on_page_change - self._window.imagehandler.page_available += self._on_page_available - - def toggle_page_numbers_visible(self): - ''' Enables or disables page numbers on the thumbnail bar. ''' - - visible = prefs['show page numbers on thumbnails'] - if visible: - number_of_pages = self._window.imagehandler.get_number_of_pages() - number_of_digits = tools.number_of_digits(number_of_pages) - self._text_cellrenderer.set_property('width-chars', number_of_digits + 1) - w = self._text_cellrenderer.get_preferred_size(self._treeview)[1].width - self._thumbnail_page_treeviewcolumn.set_fixed_width(w) - self._thumbnail_page_treeviewcolumn.set_visible(visible) - - def get_width(self): - '''Return the width in pixels of the ThumbnailSidebar.''' - return self.size_request().width - - def show(self, *args): - '''Show the ThumbnailSidebar.''' - self.load_thumbnails() - super(ThumbnailSidebar, self).show() - - def hide(self): - '''Hide the ThumbnailSidebar.''' - super(ThumbnailSidebar, self).hide() - self._treeview.stop_update() - - def clear(self): - '''Clear the ThumbnailSidebar of any loaded thumbnails.''' - - self._loaded = False - self._treeview.stop_update() - self._thumbnail_liststore.clear() - self._currently_selected_page = 0 - - def resize(self): - '''Reload the thumbnails with the size specified by in the - preferences. - ''' - self.clear() - self._thumbnail_image_treeviewcolumn.set_fixed_width(self._pixbuf_size) - self.load_thumbnails() - - def change_thumbnail_background_color(self, colour): - ''' Changes the background color of the thumbnail bar. ''' - - self.set_thumbnail_background(colour) - # Force a redraw of the widget. - self._treeview.queue_draw() - - def set_thumbnail_background(self, color): - - rgba = Gdk.RGBA(*color) - self._pixbuf_cellrenderer.set_property('cell-background-rgba', rgba) - self._text_cellrenderer.set_property('background-rgba', rgba) - fg_color = image_tools.text_color_for_background_color(color) - fg_rgba = Gdk.RGBA(*(fg_color.to_floats() + (1.0,))) - self._text_cellrenderer.set_property('foreground-rgba', fg_rgba) - - @property - def _pixbuf_size(self): - # Don't forget the extra pixels for the border! - return prefs['thumbnail size'] + 2 * self._BORDER_SIZE - - def load_thumbnails(self): - '''Load the thumbnails, if it is appropriate to do so.''' - - if (not self._window.filehandler.file_loaded or - self._window.imagehandler.get_number_of_pages() == 0 or - self._loaded): - return - - self.toggle_page_numbers_visible() - - # Detach model for performance reasons - model = self._treeview.get_model() - self._treeview.set_model(None) - - # Create empty preview thumbnails. - filler = self._get_empty_thumbnail() - for row in range(self._window.imagehandler.get_number_of_pages()): - self._thumbnail_liststore.append((row + 1, filler, False)) - - self._loaded = True - - # Re-attach model - self._treeview.set_model(model) - - # Update current image selection in the thumb bar. - self._set_selected_row(self._currently_selected_row) - - def _generate_thumbnail(self, uid): - ''' Generate the pixbuf for C{path} at demand. ''' - assert isinstance(uid, int) - page = uid - pixbuf = self._window.imagehandler.get_thumbnail(page, - prefs['thumbnail size'], prefs['thumbnail size'], nowait=True) - if pixbuf is not None: - pixbuf = image_tools.add_border(pixbuf, self._BORDER_SIZE) - - return pixbuf - - def _set_selected_row(self, row, scroll=True): - '''Set currently selected row. - If is True, the tree is automatically - scrolled to ensure the selected row is visible. - ''' - self._currently_selected_row = row - self._treeview.get_selection().select_path(row) - if self._loaded and scroll: - self._treeview.scroll_to_cell(row, use_align=True, row_align=0.25) - - def _get_selected_row(self): - '''Return the index of the currently selected row.''' - try: - return self._treeview.get_selection().get_selected_rows()[1][0][0] - - except IndexError: - return 0 - - def _row_activated_event(self, treeview, path, column): - '''Handle events due to changed thumbnail selection.''' - selected_row = self._get_selected_row() - self._set_selected_row(selected_row, scroll=False) - self._window.set_page(selected_row + 1) - - def _mouse_press_event(self, widget, event): - if self._window.was_out_of_focus: - # if the window was out of focus and the user clicks on - # the thumbbar then do not select that page because they - # more than likely have many pages open and are simply trying - # to give mcomix focus again - return True - return False - - def _drag_data_get(self, treeview, context, selection, *args): - '''Put the URI of the selected file into the SelectionData, so that - the file can be copied (e.g. to a file manager). - ''' - - selected = self._get_selected_row() - path = self._window.imagehandler.get_path_to_page(selected + 1) - uri = 'file://localhost' + urllib.request.pathname2url(path) - selection.set_uris([uri]) - - def _drag_begin(self, treeview, context): - '''We hook up on drag_begin events so that we can set the hotspot - for the cursor at the top left corner of the thumbnail (so that we - might actually see where we are dropping!). - ''' - path = treeview.get_cursor()[0] - surface = treeview.create_row_drag_icon(path) - # Because of course a cairo.Win32Surface does not have - # get_width/get_height, that would be to easy... - cr = cairo.Context(surface) - x1, y1, x2, y2 = cr.clip_extents() - width, height = x2 - x1, y2 - y1 - pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) - Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) - - def _get_empty_thumbnail(self): - ''' Create an empty filler pixmap. ''' - pixbuf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, - has_alpha=True, - bits_per_sample=8, - width=self._pixbuf_size, - height=self._pixbuf_size) - - # Make the pixbuf transparent. - pixbuf.fill(0) - - return pixbuf - - def _on_page_change(self): - row = self._window.imagehandler.get_current_page() - 1 - if row == self._currently_selected_row: - return - self._set_selected_row(row) - - def _on_page_available(self, page): - ''' Called whenever a new page is ready for display. ''' - if self.get_visible(): - self._treeview.draw_thumbnails_on_screen() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbnail_tools.py mcomix-2.1.0/mcomix/mcomix/thumbnail_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbnail_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/thumbnail_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,287 +0,0 @@ -'''thumbnail.py - Thumbnail module for MComix implementing (most of) the -freedesktop.org "standard" at http://jens.triq.net/thumbnail-spec/ -''' - -import os -import re -import shutil -import tempfile -import threading -import traceback -import PIL.Image as Image -from urllib.request import pathname2url - -from hashlib import md5 - -from mcomix import archive_extractor -from mcomix import archive_tools -from mcomix import callback -from mcomix import constants -from mcomix import i18n -from mcomix import image_tools -from mcomix import log -from mcomix import mimetypes -from mcomix import portability -from mcomix import tools -from mcomix.lib import reader -from mcomix.preferences import prefs - - -class Thumbnailer(object): - ''' The Thumbnailer class is responsible for managing MComix - internal thumbnail creation. Depending on its settings, - it either stores thumbnails on disk and retrieves them later, - or simply creates new thumbnails each time it is called. ''' - - def __init__(self, dst_dir=constants.THUMBNAIL_PATH, store_on_disk=None, - size=None, force_recreation=False, archive_support=False): - ''' - set the thumbnailer's storage directory. - - If on disk is True, it changes the thumbnailer's - behaviour to store files on disk, or just create new thumbnails each - time it was called when set to False. Defaults to the 'create - thumbnails' preference if not set. - - The dimensions for the created thumbnails is set by , a (width, - height) tupple. Defaults to the 'thumbnail size' preference if not set. - - If is True, thumbnails stored on disk - will always be re-created instead of being re-used. - - If is True, support for archive thumbnail creation - (based on cover detection) is enabled. Otherwise, only image files are - supported. - ''' - self.dst_dir = dst_dir - if store_on_disk is None: - self.store_on_disk = prefs['create thumbnails'] - else: - self.store_on_disk = store_on_disk - if size is None: - self.width = self.height = prefs['thumbnail size'] - self.default_sizes = True - else: - self.width, self.height = size - self.default_sizes = False - self.force_recreation = force_recreation - self.archive_support = archive_support - - def thumbnail(self, filepath, mt=False): - ''' Returns a thumbnail pixbuf for , transparently handling - both normal image files and archives. If a thumbnail file already exists, - it is re-used. Otherwise, a new thumbnail is created from . - - Returns None if thumbnail creation failed, or if the thumbnail creation - is run asynchrounosly. ''' - - # Update width and height from preferences if they haven't been set explicitly - if self.default_sizes: - self.width = prefs['thumbnail size'] - self.height = prefs['thumbnail size'] - - if self._thumbnail_exists(filepath): - thumbpath = self._path_to_thumbpath(filepath) - pixbuf = image_tools.load_pixbuf(thumbpath) - self.thumbnail_finished(filepath, pixbuf) - return pixbuf - - else: - if mt: - thread = threading.Thread(target=self._create_thumbnail, args=(filepath,)) - thread.name += '-thumbnailer' - thread.daemon=True - thread.start() - return None - else: - return self._create_thumbnail(filepath) - - @callback.Callback - def thumbnail_finished(self, filepath, pixbuf): - ''' Called every time a thumbnail has been completed. - is the file that was used as source, is the - resulting thumbnail. ''' - - pass - - def delete(self, filepath): - ''' Deletes the thumbnail for (if it exists) ''' - thumbpath = self._path_to_thumbpath(filepath) - if os.path.isfile(thumbpath): - try: - os.remove(thumbpath) - except IOError as error: - log.error(_('! Could not remove file "%s"'), thumbpath) - log.error(error) - - def _create_thumbnail_pixbuf(self, filepath): - ''' Creates a thumbnail pixbuf from , and returns it as a - tuple along with a file metadata dictionary: (pixbuf, tEXt_data) ''' - - if self.archive_support: - mime = archive_tools.archive_mime_type(filepath) - else: - mime = None - if mime is not None: - with archive_tools.get_recursive_archive_handler( - filepath, type=mime, - prefix='mcomix_archive_thumb.') as archive: - if archive is None: - return None, None - if archive.is_encrypted: - image_path=tools.pkg_path('images','encrypted-book.png') - else: - files = archive.list_contents(decrypt=False) - wanted = self._guess_cover(files) - if wanted is None: - return None, None - - image_path = archive.extract(wanted) - if not os.path.isfile(image_path): - return None, None - - pixbuf = image_tools.load_pixbuf_size(image_path, self.width, self.height) - if self.store_on_disk: - tEXt_data = self._get_text_data(image_path) - # Use the archive's mTime instead of the extracted file's mtime - tEXt_data['tEXt::Thumb::MTime'] = str(os.stat(filepath).st_mtime) - else: - tEXt_data = None - - return pixbuf, tEXt_data - - elif image_tools.is_image_file(filepath, check_mimetype=True): - pixbuf = image_tools.load_pixbuf_size(filepath, self.width, self.height) - if self.store_on_disk: - tEXt_data = self._get_text_data(filepath) - else: - tEXt_data = None - - return pixbuf, tEXt_data - else: - return None, None - - def _create_thumbnail(self, filepath): - ''' Creates the thumbnail pixbuf for , and saves the pixbuf - to disk if necessary. Returns the created pixbuf, or None, if creation failed. ''' - - pixbuf, tEXt_data = self._create_thumbnail_pixbuf(filepath) - self.thumbnail_finished(filepath, pixbuf) - - if pixbuf and self.store_on_disk: - thumbpath = self._path_to_thumbpath(filepath) - self._save_thumbnail(pixbuf, thumbpath, tEXt_data) - - return pixbuf - - def _get_text_data(self, filepath): - ''' Creates a tEXt dictionary for . ''' - mime = mimetypes.guess_type(filepath)[0] or 'unknown/mime' - uri = portability.uri_prefix() + pathname2url(i18n.to_unicode(os.path.normpath(filepath))) - stat = os.stat(filepath) - # MTime could be floating point number, so convert to long first to have a fixed point number - mtime = str(stat.st_mtime) - size = str(stat.st_size) - format, width, height = image_tools.get_image_info(filepath) - return { - 'tEXt::Thumb::URI': uri, - 'tEXt::Thumb::MTime': mtime, - 'tEXt::Thumb::Size': size, - 'tEXt::Thumb::Mimetype': mime, - 'tEXt::Thumb::Image::Width': str(width), - 'tEXt::Thumb::Image::Height': str(height), - 'tEXt::Software': 'MComix %s' % constants.VERSION - } - - def _save_thumbnail(self, pixbuf, thumbpath, tEXt_data): - ''' Saves as , with additional metadata - from . If already exists, it is overwritten. ''' - - try: - directory = os.path.dirname(thumbpath) - if not os.path.isdir(directory): - os.makedirs(directory, 0o700) - if os.path.isfile(thumbpath): - os.remove(thumbpath) - - option_keys = [] - option_values = [] - for key, value in tEXt_data.items(): - option_keys.append(key) - option_values.append(value) - pixbuf.savev(thumbpath, 'png', option_keys, option_values) - os.chmod(thumbpath, 0o600) - - except Exception as ex: - log.warning( _('! Could not save thumbnail "%(thumbpath)s": %(error)s'), - { 'thumbpath' : thumbpath, 'error' : ex } ) - - def _thumbnail_exists(self, filepath): - ''' Checks if the thumbnail for already exists. - This function will return False if the thumbnail exists - and it's mTime doesn't match the mTime of , - it's size is different from the one specified in the thumbnailer, - or if is True. ''' - - if not self.force_recreation: - thumbpath = self._path_to_thumbpath(filepath) - - if os.path.isfile(thumbpath): - # Check the thumbnail's stored mTime - try: - with reader.LockedFileIO(thumbpath) as fio: - with Image.open(fio) as img: - info = img.info - stored_mtime = float(info['Thumb::MTime']) - # The source file might no longer exist - file_mtime = os.path.isfile(filepath) and os.stat(filepath).st_mtime or stored_mtime - return stored_mtime == file_mtime and \ - max(*img.size) == max(self.width, self.height) - except IOError: - return False - else: - return False - else: - return False - - def _path_to_thumbpath(self, filepath): - ''' Converts to an URI for the thumbnail in . ''' - uri = portability.uri_prefix() + pathname2url(i18n.to_unicode(os.path.normpath(filepath))) - return self._uri_to_thumbpath(uri) - - def _uri_to_thumbpath(self, uri): - ''' Return the full path to the thumbnail for with - being the base thumbnail directory. ''' - md5hash = md5(uri.encode()).hexdigest() - thumbpath = os.path.join(self.dst_dir, md5hash + '.png') - return thumbpath - - def _guess_cover(self, files): - '''Return the filename within that is the most likely to be the - cover of an archive using some simple heuristics. - ''' - # Ignore MacOSX meta files. - files = filter(lambda filename: - '__MACOSX' not in os.path.normpath(filename).split(os.sep), - files) - # Ignore credit files if possible. - files = filter(lambda filename: - 'credit' not in os.path.split(filename)[1].lower(), files) - - images = [f for f in files if image_tools.is_image_file(f)] - - tools.alphanumeric_sort(images) - - front_re = re.compile('(cover|front)', re.I) - candidates = filter(front_re.search, images) - candidates = [c for c in candidates if 'back' not in c.lower()] - - if candidates: - return candidates[0] - - if images: - return images[0] - - return None - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbnail_view.py mcomix-2.1.0/mcomix/mcomix/thumbnail_view.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/thumbnail_view.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/thumbnail_view.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -''' Gtk.IconView subclass for dynamically generated thumbnails. ''' -import functools -import uuid - -from gi.repository import Gtk -from gi.repository import GLib - -from mcomix.lib import mt -from mcomix.preferences import prefs - - -class ThumbnailViewBase(object): - ''' This class provides shared functionality for Gtk.TreeView and - Gtk.IconView. Instantiating this class directly is *impossible*, - as it depends on methods provided by the view classes. ''' - - def __init__(self, uid_column, pixbuf_column, status_column): - ''' Constructs a new ThumbnailView. - @param uid_column: index of unique identifer column. - @param pixbuf_column: index of pixbuf column. - @param status_column: index of status boolean column - (True if pixbuf is not temporary filler) - ''' - - #: Keep track of already generated thumbnails. - self._uid_column = uid_column - self._pixbuf_column = pixbuf_column - self._status_column = status_column - - #: Worker thread - self._threadpool = mt.ThreadPool( - name=self.__class__.__name__, - processes=prefs['max thumbnail threads'] or None) - self._lock = mt.Lock() - self._done = set() - self._taskid = 0 - - def generate_thumbnail(self, uid): - ''' This function must return the thumbnail for C{uid}. ''' - raise NotImplementedError() - - def stop_update(self): - ''' Stops generation of pixbufs. ''' - with self._lock: - self._taskid = 0 - self._done.clear() - - def draw_thumbnails_on_screen(self, *args): - ''' Prepares valid thumbnails for currently displayed icons. - This method is supposed to be called from the expose-event - callback function. ''' - - # 'draw' event called too frequently - if not self._lock.acquire(blocking=False): - return - try: - visible = self.get_visible_range() - if not visible: - # No valid paths available - return - - start = visible[0][0] - end = visible[1][0] - - # Currently invisible icons are always cached - # only after the visible icons completed. - mid = (start + end) // 2 + 1 - harf = end - start + 1 # twice of current visible length - required = set(range(mid - harf, mid + harf)) - - taskid = self._taskid - if not taskid: - taskid = uuid.uuid4().int - - model = self.get_model() - required &= set(range(len(model))) # filter invalid paths. - for path in required: - iter = model.get_iter(path) - uid, generated = model.get( - iter, self._uid_column, self._status_column) - # Do not queue again if thumbnail was already created. - if generated: - continue - if uid in self._done: - continue - self._taskid = taskid - self._done.add(uid) - self._threadpool.apply_async( - self._pixbuf_worker, args=(uid, iter, model), - callback=functools.partial( - self._pixbuf_finished, taskid=taskid)) - finally: - self._lock.release() - - def _pixbuf_worker(self, uid, iter, model): - ''' Run by a worker thread to generate the thumbnail for a path.''' - pixbuf = self.generate_thumbnail(uid) - if pixbuf is None: - self._done.discard(uid) - raise Exception('no pixbuf, skip callback.') - return iter, pixbuf, model - - def _pixbuf_finished(self, params, taskid=-1): - ''' Executed when a pixbuf was created, to actually insert the pixbuf - into the view store. C{params} is a tuple containing - (index, pixbuf, model). ''' - - with self._lock: - if self._taskid != taskid: - return - iter, pixbuf, model = params - GLib.idle_add( - model.set, - iter, self._status_column, True, self._pixbuf_column, pixbuf) - -class ThumbnailIconView(Gtk.IconView, ThumbnailViewBase): - def __init__(self, model, uid_column, pixbuf_column, status_column): - assert 0 != (model.get_flags() & Gtk.TreeModelFlags.ITERS_PERSIST) - super(ThumbnailIconView, self).__init__(model=model) - ThumbnailViewBase.__init__(self, uid_column, pixbuf_column, status_column) - self.set_pixbuf_column(pixbuf_column) - - # Connect events - self.connect('draw', self.draw_thumbnails_on_screen) - -class ThumbnailTreeView(Gtk.TreeView, ThumbnailViewBase): - def __init__(self, model, uid_column, pixbuf_column, status_column): - assert 0 != (model.get_flags() & Gtk.TreeModelFlags.ITERS_PERSIST) - super(ThumbnailTreeView, self).__init__(model=model) - ThumbnailViewBase.__init__(self, uid_column, pixbuf_column, status_column) - - # Connect events - self.connect('draw', self.draw_thumbnails_on_screen) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/tools.py mcomix-2.1.0/mcomix/mcomix/tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -'''tools.py - Contains various helper functions.''' - -import os -import sys -import re -import gc -import bisect -import operator -import math -import io -from functools import reduce - -ROOTPATH=os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -_PORTABLE_MODE=[] -NUMERIC_REGEXP = re.compile(r'\d+[.]{1}\d+|\d+|\D+') # Split into float, int, and characters -PREFIXED_BYTE_UNITS = ('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB') - -def cmp(x,y): - if x>y:return 1 - if x, - such that for an example "1.jpg", "2.jpg", "10.jpg" is a sorted - ordering. - ''' - - def _isfloat(p): - try: - return 0,float(p) - except ValueError: - return 1,p.lower() - - def keyfunc(s): - s,e=os.path.splitext(s) - if e[1:].isdigit(): # extension with only digital is not extension - s+=e - e='' - return [_isfloat(p) for p in (*NUMERIC_REGEXP.findall(s),e)] - - filenames.sort(key=keyfunc) - -def alphanumeric_compare(s1, s2): - ''' Compares two strings by their natural order (i.e. 1 before 10) - and returns a result comparable to the cmp function. - @return: 0 if identical, -1 if s1 < s2, +1 if s1 > s2. ''' - if s1 is None: - return 1 - elif s2 is None: - return -1 - - stringparts1 = NUMERIC_REGEXP.findall(s1.lower()) - stringparts2 = NUMERIC_REGEXP.findall(s2.lower()) - for i, part in enumerate(stringparts1): - if part.isdigit(): - stringparts1[i] = 0,int(part) - else: - stringparts1[i] = 1,part - for i, part in enumerate(stringparts2): - if part.isdigit(): - stringparts2[i] = 0,int(part) - else: - stringparts2[i] = 1,part - - return cmp(stringparts1, stringparts2) - -def bin_search(lst, value): - ''' Binary search for sorted list C{lst}, looking for C{value}. - @return: List index on success. On failure, it returns the 1's - complement of the index where C{value} would be inserted. - This implies that the return value is non-negative if and only if - C{value} is contained in C{lst}. ''' - - index = bisect.bisect_left(lst, value) - if index != len(lst) and lst[index] == value: - return index - else: - return ~index - - -def get_home_directory(): - '''Return the path to the MComix home directory. - In portable mode, it is 'profile' in the same directory with mcomixstarter.py. - In Windows, it is %APPDATA%/MComix if not in portable mode. - In UNIX, it is $HOME if not in portable mode. - ''' - if is_portable_mode(): - # multiple profiles, maybe :) - return os.path.join(rootdir(),'profile') - if sys.platform == 'win32': - return os.path.join(os.environ.get('APPDATA'), 'MComix') - else: - return os.environ.get('HOME') - - -def get_config_directory(): - '''Return the path to the MComix config directory. - It is get_home_directory()/.config/mcomix if in portable mode. - If not in portable mode, it will be $XDG_CONFIG_HOME/mcomix, - or get_home_directory()/.config/mcomix if $XDG_CONFIG_HOME is empty. - - See http://standards.freedesktop.org/basedir-spec/latest/ for more - information on the $XDG_CONFIG_HOME environmental variable. - ''' - prefix = os.path.join(get_home_directory(),'.config') - # always using get_home_directory() even if in unix - if not is_portable_mode(): - prefix = os.environ.get('XDG_CONFIG_HOME',prefix) - return os.path.join(prefix, 'mcomix') - - -def get_data_directory(): - '''Return the path to the MComix data directory. - It is get_home_directory()/.local/share/mcomix if in portable mode. - If not in portable mode, it will be $XDG_DATA_HOME/mcomix, - or get_home_directory()/.local/share/mcomix if $XDG_DATA_HOME is empty. - - See http://standards.freedesktop.org/basedir-spec/latest/ for more - information on the $XDG_DATA_HOME environmental variable. - ''' - prefix = os.path.join(get_home_directory(),'.local/share') - if not is_portable_mode(): - prefix = os.environ.get('XDG_DATA_HOME',prefix) - return os.path.join(prefix, 'mcomix') - - -def get_thumbnails_directory(): - '''Return the path to the thumbnail cache directory. - It is get_home_directory()/.cache/.thumbnails/normal if in portable mode. - If not in portable mode, it will be $XDG_CACHE_HOME/thumbnails/normal, - or get_home_directory()/.cache/.thumbnails/normal if $XDG_CACHE_HOME is empty. - - See http://standards.freedesktop.org/basedir-spec/latest/ for more - information about the $XDG_CACHE_HOME environmental variable. - ''' - prefix = os.path.join(get_home_directory(), '.cache') - if not is_portable_mode(): - prefix = os.environ.get('XDG_CACHE_HOME', prefix) - return os.path.join(prefix, 'thumbnails/normal') - - -def number_of_digits(n): - if 0 == n: - return 1 - return int(math.log10(abs(n))) + 1 - -def format_byte_size(n): - s=0 - while n>=1024: - s+=1 - n/=1024.0 - try: - e=PREFIXED_BYTE_UNITS[s] - except IndexError: - e='C{}i'.format(s) - return '{:.3f} {}'.format(n,e) - -def garbage_collect(): - ''' Runs the garbage collector. ''' - gc.collect(0) - -def rootdir(): - # return path contains mcomixstarter.py - return ROOTPATH - -def is_portable_mode(): - # check if running in portable mode - if not _PORTABLE_MODE: - portable_file=os.path.join(rootdir(),'portable.txt') - _PORTABLE_MODE.append(os.path.exists(portable_file)) - if _PORTABLE_MODE[0]: - # chdir to rootdir early - os.chdir(rootdir()) - return _PORTABLE_MODE[0] - -def splitpath(path): - # split path to a list of every level - # use os.path.join(*pathlist) to convert such list into path - pathname=os.path.normpath(path) - pathlist=[pathname] - while True: - dirname,basename=os.path.split(pathlist[0]) - if not (dirname and basename): - break - pathlist[0:1]=dirname,basename - return pathlist - -def walkpath(root=None): - # yield tuple of splited relative path of files in root - # or current directory if root is None - for name in os.listdir(root): - path=os.path.join(root or '',name) - if os.path.isdir(path): - yield from map(lambda s:(name,*s),walkpath(path)) - else: - yield name, - -def relpath2root(path,abs_fallback=False): - # return relative path to rootdir in portable mode - # if path is not under the same mount point where rootdir placed - # return abspath of path if abs_fallback is True, else None - # but, always return absolue path if not in portable mode - - # ATTENTION: - # avoid using os.path.relpath without checking mount point in win32 - # it will raise ValueError if path has a different driver letter - # (see source code of ntpath.relpath) - - path=os.path.abspath(path) - if not is_portable_mode(): - return path - - pathmp=os.path.dirname(path) - while not os.path.ismount(pathmp): - pathmp=os.path.dirname(pathmp) - - rootmp=rootdir() - while not os.path.ismount(rootmp): - rootmp=os.path.dirname(rootmp) - - if pathmp==rootmp: - return os.path.relpath(path) - return path if abs_fallback else None - -def pkg_path(*args): - return os.path.join(rootdir(), 'mcomix', *args) - -def read_binary(*args): - with open(pkg_path(*args), mode='rb') as f: - return f.read() - -def div(a, b): - return float(a) / float(b) - -def volume(t): - return reduce(operator.mul, t, 1) - -def relerr(approx, ideal): - return abs(div(approx - ideal, ideal)) - -def smaller(a, b): - ''' Returns a list with the i-th element set to True if and only the i-th - element in a is less than the i-th element in b. ''' - return map(operator.lt, a, b) - -def smaller_or_equal(a, b): - ''' Returns a list with the i-th element set to True if and only the i-th - element in a is less than or equal to the i-th element in b. ''' - return list(map(operator.le, a, b)) - -def scale(t, factor): - return [x * factor for x in t] - -def vector_sub(a, b): - ''' Subtracts vector b from vector a. ''' - return tuple(map(operator.sub, a, b)) - -def vector_add(a, b): - ''' Adds vector a to vector b. ''' - return tuple(map(operator.add, a, b)) - -def vector_opposite(a): - ''' Returns the opposite vector -a. ''' - return tuple(map(operator.neg, a)) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/ui.py mcomix-2.1.0/mcomix/mcomix/ui.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/ui.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/ui.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,480 +0,0 @@ -'''ui.py - UI definitions for main window. -''' - -from gi.repository import Gtk - -from mcomix import bookmark_menu -from mcomix import openwith_menu -from mcomix import edit_dialog -from mcomix import enhance_dialog -from mcomix import preferences_dialog -from mcomix import recent -from mcomix import dialog_handler -from mcomix import constants -from mcomix import status -from mcomix import file_chooser_main_dialog -from mcomix.preferences import prefs -from mcomix.library import main_dialog as library_main_dialog - -class MainUI(Gtk.UIManager): - - def __init__(self, window): - super(MainUI, self).__init__() - - self._window = window - self._tooltipstatus = status.TooltipStatusHelper(self, window.statusbar) - - def _action_lambda(fn, *args): - return lambda *_: fn(*args) - - # ---------------------------------------------------------------- - # Create actions for the menus. - # ---------------------------------------------------------------- - self._actiongroup = Gtk.ActionGroup(name='mcomix-main') - self._actiongroup.add_actions([ - ('copy_image_path', Gtk.STOCK_COPY, _('_Copy'), - None, _('Copies the current page to clipboard.'), - window.clipboard.copy_image_path), - ('copy_image', '', _('Copy _Image'), - None, _('Copies the current image to clipboard.'), - window.clipboard.copy_image), - ('next_page', Gtk.STOCK_GO_FORWARD, _('_Next page'), - None, _('Next page'), _action_lambda(window.flip_page, +1)), - ('previous_page', Gtk.STOCK_GO_BACK, _('_Previous page'), - None, _('Previous page'), _action_lambda(window.flip_page, -1)), - ('first_page', Gtk.STOCK_GOTO_FIRST, _('_First page'), - None, _('First page'), _action_lambda(window.first_page)), - ('last_page', Gtk.STOCK_GOTO_LAST, _('_Last page'), - None, _('Last page'), _action_lambda(window.last_page)), - ('go_to', Gtk.STOCK_JUMP_TO, _('_Go to page...'), - None, _('Go to page...'), window.page_select), - ('refresh_archive', Gtk.STOCK_REFRESH, _('Re_fresh'), - None, _('Reloads the currently opened files or archive.'), - window.filehandler.refresh_file), - ('next_archive', Gtk.STOCK_MEDIA_NEXT, _('Next _archive'), - None, _('Next archive'), window.filehandler._open_next_archive), - ('previous_archive', Gtk.STOCK_MEDIA_PREVIOUS, _('Previous a_rchive'), - None, _('Previous archive'), window.filehandler._open_previous_archive), - ('next_directory', Gtk.STOCK_REDO, _('Next directory'), - None, _('Next directory'), window.filehandler.open_next_directory), - ('previous_directory', Gtk.STOCK_UNDO, _('Previous directory'), - None, _('Previous directory'), window.filehandler.open_previous_directory), - ('zoom_in', Gtk.STOCK_ZOOM_IN, _('Zoom _In'), - None, None, window.manual_zoom_in), - ('zoom_out', Gtk.STOCK_ZOOM_OUT, _('Zoom _Out'), - None, None, window.manual_zoom_out), - ('zoom_original', Gtk.STOCK_ZOOM_100, _('_Normal Size'), - None, None, window.manual_zoom_original), - ('minimize', Gtk.STOCK_LEAVE_FULLSCREEN, _('Mi_nimize'), - None, None, window.minimize), - ('close', Gtk.STOCK_CLOSE, _('_Close'), - None, _('Closes all opened files.'), _action_lambda(window.filehandler.close_file)), - ('quit', Gtk.STOCK_QUIT, _('_Quit'), - None, None, window.close_program), - ('save_and_quit', Gtk.STOCK_QUIT, _('_Save and quit'), - None, _('Quits and restores the currently opened file next time the program starts.'), - window.save_and_terminate_program), - ('rotate_90', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), - None, None, window.rotate_90), - ('rotate_180','mcomix-rotate-180', _('Rotate 180 de_grees'), - None, None, window.rotate_180), - ('rotate_270', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), - None, None, window.rotate_270), - ('flip_horiz', 'mcomix-flip-horizontal', _('Fli_p horizontally'), - None, None, window.flip_horizontally), - ('flip_vert', 'mcomix-flip-vertical', _('Flip _vertically'), - None, None, window.flip_vertically), - ('extract_page', Gtk.STOCK_SAVE_AS, _('Save _As'), - None, None, window.extract_page), - ('menu_zoom', 'mcomix-zoom', _('_Zoom')), - ('menu_recent', Gtk.STOCK_FILE, _('_Recent')), - ('menu_bookmarks_popup', 'comix-add-bookmark', _('_Bookmarks')), - ('menu_bookmarks', None, _('_Bookmarks')), - ('menu_toolbars', None, _('T_oolbars')), - ('menu_edit', None, _('_Edit')), - ('menu_open_with', Gtk.STOCK_OPEN, _('Open _with'), ''), - ('menu_open_with_popup', Gtk.STOCK_OPEN, _('Open _with'), ''), - ('menu_file', None, _('_File')), - ('menu_view', None, _('_View')), - ('menu_view_popup', 'comix-image', _('_View')), - ('menu_go', None, _('_Go')), - ('menu_go_popup', Gtk.STOCK_GO_FORWARD, _('_Go')), - ('menu_tools', None, _('_Tools')), - ('menu_help', None, _('_Help')), - ('menu_transform', 'mcomix-transform', _('_Transform image')), - ('menu_autorotate', None, _('_Auto-rotate image')), - ('menu_autorotate_width', None, _('...when width exceeds height')), - ('menu_autorotate_height', None, _('...when height exceeds width')), - ('expander', None, None, None, None, None)]) - - self._actiongroup.add_toggle_actions([ - ('fullscreen', Gtk.STOCK_FULLSCREEN, _('_Fullscreen'), - None, _('Fullscreen mode'), window.change_fullscreen), - ('double_page', 'mcomix-double-page', _('_Double page mode'), - None, _('Double page mode'), window.change_double_page), - ('toolbar', None, _('_Toolbar'), - None, None, window.change_toolbar_visibility), - ('menubar', None, _('_Menubar'), - None, None, window.change_menubar_visibility), - ('statusbar', None, _('St_atusbar'), - None, None, window.change_statusbar_visibility), - ('scrollbar', None, _('S_crollbars'), - None, None, window.change_scrollbar_visibility), - ('thumbnails', None, _('Th_umbnails'), - None, None, window.change_thumbnails_visibility), - ('hide_all', None, _('H_ide all'), - None, None, window.change_hide_all), - ('manga_mode', 'mcomix-manga', _('_Manga mode'), - None, _('Manga mode'), window.change_manga_mode), - ('invert_scroll', Gtk.STOCK_UNDO, _('Invert smart scroll'), - None, _('Invert smart scrolling direction.'), window.change_invert_scroll), - ('keep_transformation', None, _('_Keep transformation'), - None, _('Keeps the currently selected transformation for the next pages.'), - window.change_keep_transformation), - ('slideshow', Gtk.STOCK_MEDIA_PLAY, _('Start _slideshow'), - None, _('Start slideshow'), window.slideshow.toggle), - ('lens', 'mcomix-lens', _('Magnifying _lens'), - None, _('Magnifying lens'), window.lens.toggle), - ('stretch', None, _('Stretch small images'), - None, _('Stretch images to fit to the screen, depending on zoom mode.'), - window.change_stretch)]) - - # Note: Don't change the default value for the radio buttons unless - # also fixing the code for setting the correct one on start-up in main.py. - self._actiongroup.add_radio_actions([ - ('best_fit_mode', 'mcomix-fitbest', _('_Best fit mode'), - None, _('Best fit mode'), constants.ZOOM_MODE_BEST), - ('fit_width_mode', 'mcomix-fitwidth', _('Fit _width mode'), - None, _('Fit width mode'), constants.ZOOM_MODE_WIDTH), - ('fit_height_mode', 'mcomix-fitheight', _('Fit _height mode'), - None, _('Fit height mode'), constants.ZOOM_MODE_HEIGHT), - ('fit_size_mode', 'mcomix-fitsize', _('Fit _size mode'), - None, _('Fit to size mode'), constants.ZOOM_MODE_SIZE), - ('fit_manual_mode', 'mcomix-fitmanual', _('M_anual zoom mode'), - None, _('Manual zoom mode'), constants.ZOOM_MODE_MANUAL)], - 3, window.change_zoom_mode) - - # Automatically rotate image if width>height or height>width - self._actiongroup.add_radio_actions([ - ('no_autorotation', None, _('Never'), - None, None, constants.AUTOROTATE_NEVER), - ('rotate_90_width', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), - None, None, constants.AUTOROTATE_WIDTH_90), - ('rotate_270_width', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), - None, None, constants.AUTOROTATE_WIDTH_270), - ('rotate_90_height', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), - None, None, constants.AUTOROTATE_HEIGHT_90), - ('rotate_270_height', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), - None, None, constants.AUTOROTATE_HEIGHT_270)], - prefs['auto rotate depending on size'], window.change_autorotation) - - self._actiongroup.add_actions([ - ('about', Gtk.STOCK_ABOUT, _('_About'), - None, None, dialog_handler.open_dialog)], (window, 'about-dialog')) - - self._actiongroup.add_actions([ - ('comments', 'mcomix-comments', _('Co_mments...'), - None, None, dialog_handler.open_dialog)], (window, 'comments-dialog')) - - self._actiongroup.add_actions([ - ('properties', Gtk.STOCK_PROPERTIES, _('Proper_ties'), - None, None, dialog_handler.open_dialog)], (window,'properties-dialog')) - - self._actiongroup.add_actions([ - ('preferences', Gtk.STOCK_PREFERENCES, _('Pr_eferences'), - None, None, preferences_dialog.open_dialog)], window) - - # Some actions added separately since they need extra arguments. - self._actiongroup.add_actions([ - ('edit_archive', Gtk.STOCK_EDIT, _('_Edit archive...'), - None, _('Opens the archive editor.'), - edit_dialog.open_dialog), - ('open', Gtk.STOCK_OPEN, _('_Open...'), - None, None, file_chooser_main_dialog.open_main_filechooser_dialog), - ('enhance_image', 'mcomix-enhance-image', _('En_hance image...'), - None, None, enhance_dialog.open_dialog)], window) - - self._actiongroup.add_actions([ - ('library', 'mcomix-library', _('_Library...'), - None, None, library_main_dialog.open_dialog)], window) - - # fix some gtk magic: removing unreqired accelerators - Gtk.AccelMap.change_entry('/mcomix-main/%s' % 'close', 0, 0, True) - - ui_description = ''' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ''' - - self.add_ui_from_string(ui_description) - self.insert_action_group(self._actiongroup, 0) - - self.bookmarks = bookmark_menu.BookmarksMenu(self, window) - self.get_widget('/Menu/menu_bookmarks').set_submenu(self.bookmarks) - self.get_widget('/Menu/menu_bookmarks').show() - - self.bookmarks_popup = bookmark_menu.BookmarksMenu(self, window) - self.get_widget('/Popup/menu_bookmarks_popup').set_submenu(self.bookmarks_popup) - self.get_widget('/Popup/menu_bookmarks_popup').show() - - self.recent = recent.RecentFilesMenu(self, window) - self.get_widget('/Menu/menu_file/menu_recent').set_submenu(self.recent) - self.get_widget('/Menu/menu_file/menu_recent').show() - - self.recentPopup = recent.RecentFilesMenu(self, window) - self.get_widget('/Popup/menu_recent').set_submenu(self.recentPopup) - self.get_widget('/Popup/menu_recent').show() - - openwith = openwith_menu.OpenWithMenu(self, window) - self.get_widget('/Menu/menu_file/menu_open_with').set_submenu(openwith) - self.get_widget('/Menu/menu_file/menu_open_with').show() - openwith = openwith_menu.OpenWithMenu(self, window) - self.get_widget('/Popup/menu_open_with_popup').set_submenu(openwith) - self.get_widget('/Popup/menu_open_with_popup').show() - - window.add_accel_group(self.get_accel_group()) - - # Is there no built-in way to do this? - self.get_widget('/Tool/expander').set_expand(True) - self.get_widget('/Tool/expander').set_sensitive(False) - - def set_sensitivities(self): - '''Sets the main UI's widget's sensitivities appropriately.''' - general = ('properties', - 'edit_archive', - 'extract_page', - 'save_and_quit', - 'close', - 'copy_image_path', - 'copy_image', - 'slideshow', - 'rotate_90', - 'rotate_180', - 'rotate_270', - 'flip_horiz', - 'flip_vert', - 'next_page', - 'previous_page', - 'first_page', - 'last_page', - 'go_to', - 'refresh_archive', - 'next_archive', - 'previous_archive', - 'next_directory', - 'previous_directory', - 'keep_transformation', - 'enhance_image') - - comment = ('comments',) - - general_sensitive = False - comment_sensitive = False - - if self._window.filehandler.file_loaded: - general_sensitive = True - - if self._window.filehandler.get_number_of_comments(): - comment_sensitive = True - - for name in general: - self._actiongroup.get_action(name).set_sensitive(general_sensitive) - - for name in comment: - self._actiongroup.get_action(name).set_sensitive(comment_sensitive) - - self.bookmarks.set_sensitive(general_sensitive) - self.bookmarks_popup.set_sensitive(general_sensitive) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/upgrade_tools.py mcomix-2.1.0/mcomix/mcomix/upgrade_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/upgrade_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/upgrade_tools.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,188 +0,0 @@ -# -*- coding: utf-8 -*- -''' functions to backup and upgrade config files come from mcomix 1.2.1 ''' - -import json -import pickle -import os -import shlex - -from mcomix import log - -def legacy_pickle_loader(fp): - return pickle.Unpickler(fp,fix_imports=True,encoding='latin1') - -def fileinfo_conv(fileinfo_pickle,fileinfo_json): - try: - with open(fileinfo_pickle,mode='rb') as f: - loader=legacy_pickle_loader(f) - fileinfo=loader.load() - except Exception as e: - log.warning('! Failed to upgrade {}, {}'.format(fileinfo_pickle,str(e))) - else: - with open(fileinfo_json,mode='wt',encoding='utf8') as f: - json.dump(fileinfo,f,ensure_ascii=False,indent=2) - os.rename(fileinfo_pickle,fileinfo_pickle+'.bak') - -def bookmarks_conv(bookmarks_pickle,bookmarks_json): - try: - with open(bookmarks_pickle,mode='rb') as f: - loader=legacy_pickle_loader(f) - version=loader.load() - bookmarks=[(name,path,page,numpages,packtype,date.timestamp()) - for name,path,page,numpages,packtype,date in loader.load()] - except Exception as e: - log.warning('! Failed to upgrade {}, {}'.format(bookmarks_pickle,str(e))) - else: - with open(bookmarks_json,mode='wt',encoding='utf8') as f: - json.dump((version,bookmarks),f,ensure_ascii=False,indent=2) - os.rename(bookmarks_pickle,bookmarks_pickle+'.bak') - -def openwith_conv(prefs): - - class OldOpenWithException(Exception): pass - - def _expand_variable_old(identifier, window, context_type): - # keep this functions only for reference - ''' Replaces variables with their respective file - or archive path. ''' - - DEBUGGING_CONTEXT, NO_FILE_CONTEXT, IMAGE_FILE_CONTEXT, ARCHIVE_CONTEXT = -1, 0, 1, 2 - - if context_type == DEBUGGING_CONTEXT: - return '%' + identifier - - if not (context_type & IMAGE_FILE_CONTEXT) and identifier in ('f', 'd', 'b', 's', 'F', 'D', 'B', 'S'): - raise OldOpenWithException( - _('File-related variables can only be used for files.')) - - if not (context_type & ARCHIVE_CONTEXT) and identifier in ('a', 'c', 'A', 'C'): - raise OldOpenWithException( - _('Archive-related variables can only be used for archives.')) - - if identifier == '/': - return os.path.sep - elif identifier == 'a': - return window.filehandler.get_base_filename() - elif identifier == 'd': - return os.path.basename(os.path.dirname(window.imagehandler.get_path_to_page())) - elif identifier == 'f': - return window.imagehandler.get_page_filename() - elif identifier == 'c': - return os.path.basename(os.path.dirname(window.filehandler.get_path_to_base())) - elif identifier == 'b': - if (context_type & ARCHIVE_CONTEXT): - return window.filehandler.get_base_filename() # same as %a - else: - return os.path.basename(os.path.dirname(window.imagehandler.get_path_to_page())) # same as %d - elif identifier == 's': - if (context_type & ARCHIVE_CONTEXT): - return os.path.basename(os.path.dirname(window.filehandler.get_path_to_base())) # same as %c - else: - return os.path.basename(os.path.dirname(os.path.dirname(window.imagehandler.get_path_to_page()))) - elif identifier == 'A': - return window.filehandler.get_path_to_base() - elif identifier == 'D': - return os.path.normpath(os.path.dirname(window.imagehandler.get_path_to_page())) - elif identifier == 'F': - return os.path.normpath(window.imagehandler.get_path_to_page()) - elif identifier == 'C': - return os.path.dirname(window.filehandler.get_path_to_base()) - elif identifier == 'B': - if (context_type & ARCHIVE_CONTEXT): - return window.filehandler.get_path_to_base() # same as %A - else: - return os.path.normpath(os.path.dirname(window.imagehandler.get_path_to_page())) # same as %D - elif identifier == 'S': - if (context_type & ARCHIVE_CONTEXT): - return os.path.dirname(window.filehandler.get_path_to_base()) # same as %C - else: - return os.path.dirname(os.path.dirname(window.imagehandler.get_path_to_page())) - else: - raise OldOpenWithException( - 'Invalid escape sequence: %{}'.format(identifier)) - - def _expand_variable(identifier): - identifier_map = { - '/': os.path.sep, - 'F': '{image}', - 'f': '{imagebase}', - 'D': '{imagedir}', - 'd': '{imagedirbase}', - 'A': '{archive}', - 'a': '{archivebase}', - 'C': '{archivedir}', - 'c': '{archivedirbase}', - 'B': '{container}', - 'b': '{containerbase}', - 'S': '{containerdir}', - 's': '{containerdirbase}', - } - try: - return identifier_map[identifier] - except: - raise OldOpenWithException( - 'Invalid escape sequence: %{}'.format(identifier)) - - def _old_cmd_to_args(line): - ''' Parse a command line string into a list containing - the parts to pass to Popen. The following two functions have - been contributed by Ark . ''' - result = [] - buf = '' - quote = False - escape = False - inarg = False - for c in line: - if escape: - if c == '%' or c == '"': - buf += c - else: - buf += _expand_variable(c) - escape = False - elif c == ' ' or c == '\t': - if quote: - buf += c - elif inarg: - result.append(buf) - buf = '' - inarg = False - else: - if c == '"': - quote = not quote - elif c == '%': - escape = True - else: - buf += c - inarg = True - - if escape: - raise OldOpenWithException( - _('Incomplete escape sequence. ' - 'For a literal "%", use "%%".')) - if quote: - raise OldOpenWithException( - _('Incomplete quote sequence. ' - 'For a literal "\'", use "%\'".')) - - if inarg: - result.append(buf) - return result - - prefs['external commands']=[] - # convert old style command if exists - for label, command, *params in prefs['openwith commands']: - if not params: - params.extend(('', False)) - cwd, disabled_for_archives = params - for c in ('{','}'): - command = command.replace(c, c*2) - try: - newcmd_args = _old_cmd_to_args(command.strip()) - except Exception as e: - log.warning('! '+str(e)) - continue - new_command = ' '.join(map(shlex.quote, newcmd_args)) - prefs['external commands'].append( - (label, new_command, cwd.strip(), bool(disabled_for_archives)) - ) - prefs['openwith commands'].clear() diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/worker_thread.py mcomix-2.1.0/mcomix/mcomix/worker_thread.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/worker_thread.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/worker_thread.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -# keep this file only for reference -''' Worker thread class. ''' - -import threading -import traceback - -from mcomix import log - -class WorkerThread(object): - - def __init__(self, process_order, name=None, max_threads=1, - sort_orders=False, unique_orders=False): - '''Create a new pool of worker threads. - - Optional will be added to spawned thread names. - will be called to process each work order. - At most will be started for processing. - If is True, the orders queue will be sorted - after each addition. If is True, duplicate - orders will not be added to the queue. ''' - self._name = name - self._process_order = process_order - self._max_threads = max_threads - self._sort_orders = sort_orders - self._unique_orders = unique_orders - self._stop = False - self._threads = [] - # Queue of orders waiting for processing. - self._orders_queue = [] - if self._unique_orders: - # Track orders. - self._orders_set = set() - self._condition = threading.Condition() - - def __enter__(self): - return self._condition.__enter__() - - def __exit__(self, exc_type, exc_value, traceback): - return self._condition.__exit__(exc_type, exc_value, traceback) - - def _start(self, nb_threads=1): - for n in range(nb_threads): - if len(self._threads) == self._max_threads: - break - thread = threading.Thread(target=self._run) - if self._name is not None: - thread.name += '-' + self._name - thread.daemon=False - thread.start() - self._threads.append(thread) - - def _order_uid(self, order): - if isinstance(order, tuple) or isinstance(order, list): - return order[0] - return order - - def _run(self): - order_uid = None - while True: - with self._condition: - if order_uid is not None: - self._orders_set.remove(order_uid) - while not self._stop and 0 == len(self._orders_queue): - self._condition.wait() - if self._stop: - return - order = self._orders_queue.pop(0) - if self._unique_orders: - order_uid = self._order_uid(order) - try: - self._process_order(order) - except Exception as e: - log.error(_('! Worker thread processing %(function)r failed: %(error)s'), - { 'function' : self._process_order, 'error' : e }) - log.debug('Traceback:\n%s', traceback.format_exc()) - - def must_stop(self): - '''Return true if we've been asked to stop processing. - - Can be used by the processing function to check if it must abort early. - ''' - return self._stop - - def clear_orders(self): - '''Clear the current orders queue.''' - with self._condition: - if self._unique_orders: - # We can't just clear the set, as some orders - # can be in the process of being processed. - for order in self._orders_queue: - order_uid = self._order_uid(order) - self._orders_set.remove(order_uid) - self._orders_queue = [] - - def append_order(self, order): - '''Append work order to the thread orders queue.''' - with self._condition: - if self._unique_orders: - order_uid = self._order_uid(order) - if order_uid in self._orders_set: - # Duplicate order. - return - self._orders_set.add(order_uid) - self._orders_queue.append(order) - if self._sort_orders: - self._orders_queue.sort() - self._condition.notifyAll() - self._start() - - def extend_orders(self, orders_list): - '''Append work orders to the thread orders queue.''' - with self._condition: - if self._unique_orders: - nb_added = 0 - for order in orders_list: - order_uid = self._order_uid(order) - if order_uid in self._orders_set: - # Duplicate order. - continue - self._orders_set.add(order_uid) - self._orders_queue.append(order) - nb_added += 1 - else: - self._orders_queue.extend(orders_list) - nb_added = len(orders_list) - if 0 == nb_added: - return - if self._sort_orders: - self._orders_queue.sort() - self._condition.notifyAll() - self._start(nb_threads=nb_added) - - def stop(self): - '''Stop the worker threads and flush the orders queue.''' - self._stop = True - with self._condition: - self._condition.notifyAll() - for thread in self._threads: - thread.join() - self._threads = [] - self._stop = False - self._orders_queue = [] - if self._unique_orders: - self._orders_set.clear() - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/zoom.py mcomix-2.1.0/mcomix/mcomix/zoom.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomix/zoom.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomix/zoom.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -''' Handles zoom and fit of images in the main display area. ''' - -from functools import reduce - -from mcomix import constants -from mcomix.preferences import prefs -from mcomix import tools - -IDENTITY_ZOOM = 1.0 -IDENTITY_ZOOM_LOG = 0 -USER_ZOOM_LOG_SCALE1 = 4.0 -MIN_USER_ZOOM_LOG = -20 -MAX_USER_ZOOM_LOG = 12 - -class ZoomModel(object): - ''' Handles zoom and fit modes. ''' - - def __init__(self): - #: User zoom level. - self._user_zoom_log = IDENTITY_ZOOM_LOG - #: Image fit mode. Determines the base zoom level for an image by - #: calculating its maximum size. - self._fitmode = constants.ZOOM_MODE_MANUAL - self._scale_up = False - - def set_fit_mode(self, fitmode): - if fitmode < constants.ZOOM_MODE_BEST or \ - fitmode > constants.ZOOM_MODE_SIZE: - raise ValueError('No fit mode for id %d.' % fitmode) - self._fitmode = fitmode - - def get_scale_up(self): - return self._scale_up - - def set_scale_up(self, scale_up): - self._scale_up = scale_up - - def _set_user_zoom_log(self, zoom_log): - self._user_zoom_log = min(max(zoom_log, MIN_USER_ZOOM_LOG), MAX_USER_ZOOM_LOG) - - def zoom_in(self): - self._set_user_zoom_log(self._user_zoom_log + 1) - - def zoom_out(self): - self._set_user_zoom_log(self._user_zoom_log - 1) - - def reset_user_zoom(self): - self._set_user_zoom_log(IDENTITY_ZOOM_LOG) - - def get_zoomed_size(self, image_sizes, screen_size, distribution_axis, do_not_transform): - scale_up = self._scale_up - fitted_image_sizes = _fix_page_sizes(image_sizes, distribution_axis, do_not_transform) - union_size = _union_size(fitted_image_sizes, distribution_axis) - limits = ZoomModel._calc_limits(union_size, screen_size, self._fitmode, scale_up) - prefscale = ZoomModel._preferred_scale(union_size, limits, distribution_axis) - preferred_scales = [(IDENTITY_ZOOM if dnt else prefscale) for dnt in do_not_transform] - prescaled = [tuple(_scale_image_size(size, scale)) - for size, scale in zip(fitted_image_sizes, preferred_scales)] - prescaled_union_size = _union_size(prescaled, distribution_axis) - def _other_preferences(limits, distribution_axis): - for i in range(len(limits)): - if i == distribution_axis: - continue - if limits[i] is not None: - return True - return False - other_preferences = _other_preferences(limits, distribution_axis) - if limits[distribution_axis] is not None and \ - (prescaled_union_size[distribution_axis] > screen_size[distribution_axis] - or not other_preferences): - distributed_scales = ZoomModel._scale_distributed(fitted_image_sizes, - distribution_axis, limits[distribution_axis], scale_up, do_not_transform) - if other_preferences: - preferred_scales = map(min, preferred_scales, distributed_scales) - else: - preferred_scales = distributed_scales - if not scale_up: - preferred_scales = map(lambda x: min(x, IDENTITY_ZOOM), preferred_scales) - preferred_scales = list(preferred_scales) - user_scale = 2 ** (self._user_zoom_log / USER_ZOOM_LOG_SCALE1) - res_scales = [preferred_scales[i] * (user_scale if not do_not_transform[i] else IDENTITY_ZOOM) - for i in range(len(preferred_scales))] - return [tuple(_scale_image_size(size, scale)) - for size, scale in zip(fitted_image_sizes, res_scales)] - - @staticmethod - def _preferred_scale(image_size, limits, distribution_axis): - ''' Returns scale that makes an image of size image_size respect the - limits imposed by limits. If no proper value can be determined, - IDENTITY_ZOOM is returned. ''' - min_scale = None - for i in range(len(limits)): - if i == distribution_axis: - continue - l = limits[i] - if l is None: - continue - s = tools.div(l, image_size[i]) - if min_scale is None or s < min_scale: - min_scale = s - if min_scale is None: - min_scale = IDENTITY_ZOOM - return min_scale - - @staticmethod - def _calc_limits(union_size, screen_size, fitmode, allow_upscaling): - ''' Returns a list or a tuple with the i-th element set to int x if - fitmode limits the size at the i-th axis to x, or None if fitmode has no - preference for this axis. ''' - manual = fitmode == constants.ZOOM_MODE_MANUAL - if fitmode == constants.ZOOM_MODE_BEST or \ - (manual and allow_upscaling and all(tools.smaller(union_size, screen_size))): - return screen_size - result = [None] * len(screen_size) - if not manual: - fixed_size = None - if fitmode == constants.ZOOM_MODE_SIZE: - fitmode = prefs['fit to size mode'] # reassigning fitmode - fixed_size = int(prefs['fit to size px']) - if fitmode == constants.ZOOM_MODE_WIDTH: - axis = constants.WIDTH_AXIS - elif fitmode == constants.ZOOM_MODE_HEIGHT: - axis = constants.HEIGHT_AXIS - else: - assert False, 'Cannot map fitmode to axis' - result[axis] = fixed_size if fixed_size is not None else screen_size[axis] - return result - - @staticmethod - def _scale_distributed(sizes, axis, max_size, allow_upscaling, - do_not_transform): - ''' Calculates scales for a list of boxes that are distributed along a - given axis (without any gaps). If the resulting scales are applied to - their respective boxes, their new total size along axis will be as close - as possible to max_size. The current implementation ensures that equal - box sizes are mapped to equal scales. - @param sizes: A list of box sizes. - @param axis: The axis along which those boxes are distributed. - @param max_size: The maximum size the scaled boxes may have along axis. - @param allow_upscaling: True if upscaling is allowed, False otherwise. - @param do_not_transform: True if the resulting scale must be 1, False - otherwise. - @return: A list of scales where the i-th scale belongs to the i-th box - size. If sizes is empty, the empty list is returned. If there are more - boxes than max_size, an approximation is returned where all resulting - scales will shrink their respective boxes to 1 along axis. In this case, - the scaled total size might be greater than max_size. ''' - n = len(sizes) - # trivial cases first - if n == 0: - return [] - if n >= max_size: - # In this case, only one solution or only an approximation is available. - # if n > max_size, the result won't fit into max_size. - return map(lambda x: tools.div(1, x[axis]), sizes) # FIXME ignores do_not_transform - total_axis_size = sum(map(lambda x: x[axis], sizes)) - if (total_axis_size <= max_size) and not allow_upscaling: - # identity - return [IDENTITY_ZOOM] * n - - # non-trival case - scale = tools.div(max_size, total_axis_size) # FIXME initial guess should take unscalable images into account - scaling_data = [None] * n - total_axis_size = 0 - # This loop collects some data we need for the actual computations later. - for i in range(n): - this_size = sizes[i] - # Shortcut: If the size cannot be changed, accept the original size. - if do_not_transform[i]: - total_axis_size += this_size[axis] - scaling_data[i] = [IDENTITY_ZOOM, IDENTITY_ZOOM, False, - IDENTITY_ZOOM, 0.0] - continue - # Initial guess: The current scale works for all tuples. - ideal = tools.scale(this_size, scale) - ideal_vol = tools.volume(ideal) - # Let's use a dummy to compute the actual (rounded) size along axis - # so we can rescale the rounded tuple with a better local_scale - # later. This rescaling is necessary to ensure that the sizes in ALL - # dimensions are monotonically scaled (with respect to local_scale). - # A nice side effect of this is that it keeps the aspect ratio better. - dummy_approx = _round_nonempty((ideal[axis],))[0] - local_scale = tools.div(dummy_approx, this_size[axis]) - total_axis_size += dummy_approx - can_be_downscaled = dummy_approx > 1 - if can_be_downscaled: - forced_size = dummy_approx - 1 - forced_scale = tools.div(forced_size, this_size[axis]) - forced_approx = _scale_image_size(this_size, forced_scale) - forced_vol_err = tools.relerr(tools.volume(forced_approx), ideal_vol) - else: - forced_scale = None - forced_vol_err = None - scaling_data[i] = [local_scale, ideal, can_be_downscaled, - forced_scale, forced_vol_err] - # Now we need to find at most total_axis_size - max_size occasions to - # scale down some tuples so the whole thing would fit into max_size. If - # we are lucky, there will be no gaps at the end (or at least fewer gaps - # than we would have if we always rounded down). - dirty=True # This flag prevents infinite loops if nothing can be made any smaller. - while dirty and (total_axis_size > max_size): - # This algorithm needs O(n*n) time. Let's hope that n is small enough. - dirty=False - current_index = 0 - current_min = None - for i in range(n): - d = scaling_data[i] - if not d[2]: - # Ignore elements that cannot be made any smaller. - continue - if (current_min is None) or (d[4] < current_min[4]): - # We are searching for the tuple where downscaling results - # in the smallest relative volume error (compared to the - # respective ideal volume). - current_min = d - current_index = i - for i in range(current_index, n): - # We must scale down ALL equal tuples. Otherwise, images that - # are of equal size might appear to be of different size - # afterwards. The downside of this approach is that it might - # introduce more gaps than necessary. - d = scaling_data[i] - if (not d[2]) or (d[1] != current_min[1]): - continue - d[0] = d[3] - d[2] = False # only once per tuple - total_axis_size -= 1 - dirty=True - else: - # If we are here and total_axis_size < max_size, we could try to - # upscale some tuples similarily to the other loop (i.e. smallest - # relative volume error first, equal boxes in conjunction with each - # other). However, this is not as useful as the other loop, slightly - # more complicated and it won't do anything if all tuples are equal. - pass - return map(lambda d: d[0], scaling_data) - -def _scale_image_size(size, scale): - return _round_nonempty(tools.scale(size, scale)) - -def _round_nonempty(t): - result = [0] * len(t) - for i in range(len(t)): - x = int(round(t[i])) - result[i] = x if x > 0 else 1 - return result - -def _fix_page_sizes(image_sizes, distribution_axis, do_not_transform): - if len(image_sizes)<2: - return image_sizes.copy() - # in double page mode, resize the smaller image to fit the bigger one - sizes=list(zip(*image_sizes)) # [(x1,x2,...),(y1,y2,...)] - axis_sizes=sizes[int(not distribution_axis)] # use axis else of distribution_axis - max_size=max(axis_sizes) # max size of pages - ratios=[(1 if do_not_transform[n] else max_size/s) - for n,s in enumerate(axis_sizes)] # scale ratio of every page if do transform - return [(int(x*ratios[n]),int(y*ratios[n])) - for n,(x,y) in enumerate(image_sizes)] # scale every page - -def _union_size(image_sizes, distribution_axis): - if len(image_sizes) == 0: - return [] - n = len(image_sizes[0]) - union_size = list(map(lambda i: reduce(max, map(lambda x: x[i], image_sizes)), range(n))) - union_size[distribution_axis] = sum(tuple(map(lambda x: x[distribution_axis], image_sizes))) - return union_size - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/mcomixstarter.py mcomix-2.1.0/mcomix/mcomixstarter.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/mcomixstarter.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mcomix/mcomixstarter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -#!/usr/bin/python3 - -'''MComix - GTK Comic Book Viewer -''' - -# ------------------------------------------------------------------------- -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# ------------------------------------------------------------------------- - -import sys - -py2msg='''PROGRAM TERMINATED -Python 2.x is no longer supported. -''' - -if sys.version_info.major<3: - sys.stderr.write(py2msg) - sys.exit(1) - -if __name__=='__main__': - import mcomix.run - mcomix.run.run() diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/message_dialog.py mcomix-2.1.0/mcomix/message_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/message_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/message_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,87 @@ +""" Simple extension of Gtk.MessageDialog for consistent formating. Also + supports remembering the dialog result. +""" + +from gi.repository import Gtk + +from mcomix.preferences import prefs + + +class MessageDialog(Gtk.MessageDialog): + + def __init__(self, parent=None, flags=0, type=0, buttons=0): + """ Creates a dialog window. + @param parent: Parent window + @param flags: Dialog flags + @param type: Dialog icon/type + @param buttons: Dialog buttons. Can only be a predefined BUTTONS_XXX constant. + """ + if parent is None: + # Fix "mapped without a transient parent" Gtk warning. + from mcomix import main + parent = main.main_window() + super(MessageDialog, self).__init__(parent=parent, flags=flags, type=type, buttons=buttons) + + #: Unique dialog identifier (for storing 'Do not ask again') + self.dialog_id = None + #: List of response IDs that should be remembered + self.choices = [] + #: Automatically destroy dialog after run? + self.auto_destroy = True + + self.remember_checkbox = Gtk.CheckButton(_('Do not ask again.')) + self.remember_checkbox.set_no_show_all(True) + self.remember_checkbox.set_can_focus(False) + self.get_message_area().pack_end(self.remember_checkbox, True, True, 6) + + def set_text(self, primary, secondary=None): + """ Formats the dialog's text fields. + @param primary: Main text. + @param secondary: Descriptive text. + """ + if primary: + self.set_markup('' + + primary + '') + if secondary: + self.format_secondary_markup(secondary) + + def should_remember_choice(self): + """ Returns True when the dialog choice should be remembered. """ + return self.remember_checkbox.get_active() + + def set_should_remember_choice(self, dialog_id, choices): + """ This method enables the 'Do not ask again' checkbox. + @param dialog_id: Unique identifier for the dialog (a string). + @param choices: List of response IDs that should be remembered + """ + self.remember_checkbox.show() + self.dialog_id = dialog_id + self.choices = [int(choice) for choice in choices] + + def set_auto_destroy(self, auto_destroy): + """ Determines if the dialog should automatically destroy itself + after run(). """ + self.auto_destroy = auto_destroy + + def run(self): + """ Makes the dialog visible and waits for a result. Also destroys + the dialog after the result has been returned. """ + + if self.dialog_id in prefs['stored dialog choices']: + self.destroy() + return prefs['stored dialog choices'][self.dialog_id] + else: + self.show_all() + # Prevent checkbox from grabbing focus by only enabling it after show + self.remember_checkbox.set_can_focus(True) + result = super(MessageDialog, self).run() + + if (self.should_remember_choice() and int(result) in self.choices): + prefs['stored dialog choices'][self.dialog_id] = int(result) + + if self.auto_destroy: + self.destroy() + return result + + +# vim: expandtab:sw=4:ts=4 Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/ca/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/ca/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/cs/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/cs/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/de/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/de/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/el/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/el/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/es/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/es/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/fa/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/fa/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/fr/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/fr/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/gl/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/gl/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/he/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/he/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/hr/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/hr/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/hu/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/hu/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/id/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/id/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/it/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/it/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/ja/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/ja/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/ko/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/ko/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/lt/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/lt/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/nl/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/nl/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/pl/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/pl/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/pt_BR/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/ru/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/ru/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/sv/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/sv/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/uk/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/uk/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/zh_CN/LC_MESSAGES/mcomix.mo differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.mo and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix/messages/zh_TW/LC_MESSAGES/mcomix.mo differ diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/openwith_menu.py mcomix-2.1.0/mcomix/openwith_menu.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/openwith_menu.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/openwith_menu.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,95 @@ +""" openwith_menu.py - Menu shell for the Open with... menu. """ + +from gi.repository import Gtk + +from mcomix import openwith + +# Reference to the OpenWith command manager +_openwith_manager = openwith.OpenWithManager() +# Reference to the edit dialog (to keep only one instance) +_openwith_edit_diag = None + +class OpenWithMenu(Gtk.Menu): + def __init__(self, ui, window): + """ Constructor. """ + super(OpenWithMenu, self).__init__() + + self._window = window + self._openwith_manager = _openwith_manager + + actiongroup = Gtk.ActionGroup('mcomix-openwith') + actiongroup.add_actions([ + ('edit_commands', Gtk.STOCK_EDIT, _('_Edit commands'), + None, None, self._edit_commands)]) + + action = actiongroup.get_action('edit_commands') + action.set_accel_group(ui.get_accel_group()) + self.edit_button = action.create_menu_item() + self.append(self.edit_button) + + self._construct_menu() + + self._window.filehandler.file_opened += self._set_sensitivity + self._window.filehandler.file_closed += self._set_sensitivity + self._openwith_manager.set_commands += self._construct_menu + + self.show_all() + + def _construct_menu(self, *args): + """ Build the menu entries from scratch. """ + for item in self.get_children(): + if item != self.edit_button: + self.remove(item) + + commandlist = self._openwith_manager.get_commands() + + if len(commandlist) > 0: + separator = Gtk.SeparatorMenuItem() + separator.show() + self.prepend(separator) + + for command in reversed(commandlist): + if not command.is_separator(): + menuitem = Gtk.MenuItem(command.get_label()) + menuitem.connect('activate', self._commandmenu_clicked, + command.get_command(), command.get_label(), + command.get_cwd(), command.is_disabled_for_archives()) + else: + menuitem = Gtk.SeparatorMenuItem() + + menuitem.show() + self.prepend(menuitem) + + self._set_sensitivity() + + def _set_sensitivity(self): + """ Enables or disables menu items depending on files being loaded. """ + sensitive = self._window.filehandler.file_loaded + for item in self.get_children(): + if item != self.edit_button: + item.set_sensitive(sensitive) + + def _commandmenu_clicked(self, menuitem, cmd, label, cwd, disabled_in_archives): + """ Execute the command associated with the clicked menu. """ + command = openwith.OpenWithCommand(label, cmd, cwd, disabled_in_archives) + command.execute(self._window) + + def _edit_commands(self, *args): + """ When clicked, opens the command editor to set up the menu. Make + sure the dialog isn't opened more than once. """ + global _openwith_edit_diag + if not _openwith_edit_diag: + _openwith_edit_diag = openwith.OpenWithEditor(self._window, + self._openwith_manager) + _openwith_edit_diag.connect_after('response', self._dialog_closed) + + _openwith_edit_diag.show_all() + _openwith_edit_diag.present() + + def _dialog_closed(self, *args): + """ Watch for the dialog getting closed and unset the local instance. """ + global _openwith_edit_diag + _openwith_edit_diag.destroy() + _openwith_edit_diag = None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/openwith.py mcomix-2.1.0/mcomix/openwith.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/openwith.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/openwith.py 2022-01-26 19:21:48.000000000 +0000 @@ -0,0 +1,601 @@ +""" openwith.py - Logic and storage for Open with... commands. """ +import sys +import os +import re +from gi.repository import Gtk +from gi.repository import GObject + +from mcomix.preferences import prefs +from mcomix import message_dialog +from mcomix import process +from mcomix import callback + + +DEBUGGING_CONTEXT, NO_FILE_CONTEXT, IMAGE_FILE_CONTEXT, ARCHIVE_CONTEXT = -1, 0, 1, 2 + + +class OpenWithException(Exception): pass + + +class OpenWithManager(object): + def __init__(self): + """ Constructor. """ + pass + + @callback.Callback + def set_commands(self, cmds): + prefs['openwith commands'] = [(cmd.get_label(), cmd.get_command(), + cmd.get_cwd(), cmd.is_disabled_for_archives()) + for cmd in cmds] + + def get_commands(self): + try: + return [OpenWithCommand(label, command, cwd, disabled_for_archives) + for label, command, cwd, disabled_for_archives + in prefs['openwith commands']] + except ValueError: + # Backwards compatibility for early versions with only two parameters + return [OpenWithCommand(label, command, '', False) + for label, command in prefs['openwith commands']] + + +class OpenWithCommand(object): + def __init__(self, label, command, cwd, disabled_for_archives): + self.label = label + self.command = command.strip() + self.cwd = cwd.strip() + + self.disabled_for_archives = bool(disabled_for_archives) + + def get_label(self): + return self.label + + def get_command(self): + return self.command + + def get_cwd(self): + return self.cwd + + def is_disabled_for_archives(self): + return self.disabled_for_archives + + def is_separator(self): + return bool(re.match(r'^-+$', self.get_label().strip())) + + def execute(self, window): + """ Spawns a new process with the given executable + and arguments. """ + if (self.is_disabled_for_archives() and + window.filehandler.archive_type is not None): + window.osd.show(_("'%s' is disabled for archives.") % self.get_label()) + return + + current_dir = os.getcwd() + try: + if self.is_valid_workdir(window): + workdir = self.parse(window, text=self.get_cwd())[0] + os.chdir(workdir) + + # Redirect process output to null here? + # FIXME: Close process when finished to avoid zombie process + args = self.parse(window) + if sys.platform == 'win32': + proc = process.Win32Popen(args) + else: + proc = process.popen(args, stdout=process.NULL) + del proc + + except Exception as e: + text = _("Could not run command %(cmdlabel)s: %(exception)s") % \ + {'cmdlabel': self.get_label(), 'exception': str(e)} + window.osd.show(text) + finally: + os.chdir(current_dir) + + def is_executable(self, window): + """ Check if a name is executable. This name can be either + a relative path, when the executable is in PATH, or an + absolute path. """ + args = self.parse(window) + if len(args) == 0: + return False + + if self.is_valid_workdir(window): + workdir = self.parse(window, text=self.get_cwd())[0] + else: + workdir = os.getcwd() + + exe = process.find_executable((args[0],), workdir=workdir) + + return exe is not None + + def is_valid_workdir(self, window, allow_empty=False): + """ Check if the working directory is valid. """ + cwd = self.get_cwd().strip() + if not cwd: + return allow_empty + + args = self.parse(window, text=cwd) + if len(args) > 1: + return False + + dir = args[0] + if os.path.isdir(dir) and os.access(dir, os.X_OK): + return True + + return False + + def parse(self, window, text='', check_restrictions=True): + """ Parses the command string and replaces special characters + with their respective variable contents. Returns a list of + arguments. + If check_restrictions is False, no checking will be done + if one of the variables isn't valid in the current file context. """ + if not text: + text = self.get_command() + if not text.strip(): + raise OpenWithException(_('Command line is empty.')) + + args = self._commandline_to_arguments(text, window, + self._get_context_type(window, check_restrictions)) + # Environment variables must be expanded after MComix variables, + # as win32 will eat %% and replace it with %. + args = [os.path.expandvars(arg) for arg in args] + return args + + def _commandline_to_arguments(self, line, window, context_type): + """ Parse a command line string into a list containing + the parts to pass to Popen. The following two functions have + been contributed by Ark . """ + result = [] + buf = "" + quote = False + escape = False + inarg = False + for c in line: + if escape: + if c == '%' or c == '"': + buf += c + else: + buf += self._expand_variable(c, window, context_type) + escape = False + elif c == ' ' or c == '\t': + if quote: + buf += c + elif inarg: + result.append(buf) + buf = "" + inarg = False + else: + if c == '"': + quote = not quote + elif c == '%': + escape = True + else: + buf += c + inarg = True + + if escape: + raise OpenWithException( + _("Incomplete escape sequence. " + "For a literal '%', use '%%'.")) + if quote: + raise OpenWithException( + _("Incomplete quote sequence. " + "For a literal '\"', use '%\"'.")) + + if inarg: + result.append(buf) + return result + + def _expand_variable(self, identifier, window, context_type): + """ Replaces variables with their respective file + or archive path. """ + + if context_type == DEBUGGING_CONTEXT: + return '%' + identifier + + if not (context_type & IMAGE_FILE_CONTEXT) and identifier in ('f', 'd', 'b', 's', 'F', 'D', 'B', 'S'): + raise OpenWithException( + _("File-related variables can only be used for files.")) + + if not (context_type & ARCHIVE_CONTEXT) and identifier in ('a', 'c', 'A', 'C'): + raise OpenWithException( + _("Archive-related variables can only be used for archives.")) + + if identifier == '/': + return os.path.sep + elif identifier == 'a': + return window.filehandler.get_base_filename() + elif identifier == 'd': + return os.path.basename(os.path.dirname(window.imagehandler.get_path_to_page())) + elif identifier == 'f': + return window.imagehandler.get_page_filename() + elif identifier == 'c': + return os.path.basename(os.path.dirname(window.filehandler.get_path_to_base())) + elif identifier == 'b': + if (context_type & ARCHIVE_CONTEXT): + return window.filehandler.get_base_filename() # same as %a + else: + return os.path.basename(os.path.dirname(window.imagehandler.get_path_to_page())) # same as %d + elif identifier == 's': + if (context_type & ARCHIVE_CONTEXT): + return os.path.basename(os.path.dirname(window.filehandler.get_path_to_base())) # same as %c + else: + return os.path.basename(os.path.dirname(os.path.dirname(window.imagehandler.get_path_to_page()))) + elif identifier == 'A': + return window.filehandler.get_path_to_base() + elif identifier == 'D': + return os.path.normpath(os.path.dirname(window.imagehandler.get_path_to_page())) + elif identifier == 'F': + return os.path.normpath(window.imagehandler.get_path_to_page()) + elif identifier == 'C': + return os.path.dirname(window.filehandler.get_path_to_base()) + elif identifier == 'B': + if (context_type & ARCHIVE_CONTEXT): + return window.filehandler.get_path_to_base() # same as %A + else: + return os.path.normpath(os.path.dirname(window.imagehandler.get_path_to_page())) # same as %D + elif identifier == 'S': + if (context_type & ARCHIVE_CONTEXT): + return os.path.dirname(window.filehandler.get_path_to_base()) # same as %C + else: + return os.path.dirname(os.path.dirname(window.imagehandler.get_path_to_page())) + else: + raise OpenWithException( + _("Invalid escape sequence: %%%s") % identifier) + + def _get_context_type(self, window, check_restrictions=True): + if not check_restrictions: + return DEBUGGING_CONTEXT # ignore context, reflect variable name + context = 0 + if not window.filehandler.file_loaded: + context = NO_FILE_CONTEXT # no file loaded + elif window.filehandler.archive_type is not None: + context = IMAGE_FILE_CONTEXT|ARCHIVE_CONTEXT # archive loaded + else: + context = IMAGE_FILE_CONTEXT # image loaded (no archive) + if not window.imagehandler.get_current_page(): + context &= ~IMAGE_FILE_CONTEXT # empty archive + return context + + +class OpenWithEditor(Gtk.Dialog): + """ The editor for changing and creating external commands. This window + keeps its own internal model once initialized, and will overwrite + the external model (i.e. preferences) only when properly closed. """ + + def __init__(self, window, openwithmanager): + super(OpenWithEditor, self).__init__(_('Edit external commands'), parent=window) + self.set_destroy_with_parent(True) + self._window = window + self._openwith = openwithmanager + self._changed = False + + self._command_tree = Gtk.TreeView() + self._command_tree.get_selection().connect('changed', self._item_selected) + self._add_button = Gtk.Button(stock=Gtk.STOCK_ADD) + self._add_button.connect('clicked', self._add_command) + self._add_sep_button = Gtk.Button.new_with_mnemonic(_('Add _separator')) + self._add_sep_button.connect('clicked', self._add_sep_command) + self._remove_button = Gtk.Button(stock=Gtk.STOCK_REMOVE) + self._remove_button.connect('clicked', self._remove_command) + self._remove_button.set_sensitive(False) + self._up_button = Gtk.Button(stock=Gtk.STOCK_GO_UP) + self._up_button.connect('clicked', self._up_command) + self._up_button.set_sensitive(False) + self._down_button = Gtk.Button(stock=Gtk.STOCK_GO_DOWN) + self._down_button.connect('clicked', self._down_command) + self._down_button.set_sensitive(False) + self._run_button = Gtk.Button.new_with_mnemonic(_('Run _command')) + self._run_button.connect('clicked', self._run_command) + self._run_button.set_sensitive(False) + self._test_field = Gtk.Entry() + self._test_field.set_property('editable', False) + self._exec_label = Gtk.Label() + self._exec_label.set_alignment(0, 0) + self._set_exec_text('') + self._save_button = self.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT) + self.set_default_response(Gtk.ResponseType.ACCEPT) + + self._layout() + self._setup_table() + + self.connect('response', self._response) + self._window.page_changed += self.test_command + self._window.filehandler.file_opened += self.test_command + self._window.filehandler.file_closed += self.test_command + + self.resize(600, 400) + + def save(self): + """ Serializes the tree model into a list of OpenWithCommands + and passes these back to the Manager object for persistance. """ + commands = self.get_commands() + self._openwith.set_commands(commands) + self._changed = False + + def get_commands(self): + """ Retrieves a list of OpenWithCommand instances from + the list model. """ + model = self._command_tree.get_model() + iter = model.get_iter_first() + commands = [] + while iter: + label, command, cwd, disabled_for_archives = model.get(iter, 0, 1, 2, 3) + commands.append(OpenWithCommand(label, command, cwd, disabled_for_archives)) + iter = model.iter_next(iter) + return commands + + def get_command(self): + """ Retrieves the selected command object. """ + selection = self._command_tree.get_selection() + if not selection: + return None + + model, iter = self._command_tree.get_selection().get_selected() + if (iter and model.iter_is_valid(iter)): + command = OpenWithCommand(*model.get(iter, 0, 1, 2, 3)) + return command + else: + return None + + def test_command(self): + """ Parses the currently selected command and displays the output in the + text box next to the button. """ + command = self.get_command() + self._run_button.set_sensitive(False) + if not command: + return + + # Test only if the selected field is a valid command + if command.is_separator(): + self._test_field.set_text(_('This is a separator pseudo-command.')) + self._set_exec_text('') + return + + try: + args = list(map(self._quote_if_necessary, command.parse(self._window))) + self._test_field.set_text(" ".join(args)) + self._run_button.set_sensitive(True) + + if not command.is_valid_workdir(self._window, allow_empty=True): + self._set_exec_text( + _('"%s" does not have a valid working directory.') % command.get_label()) + elif not command.is_executable(self._window): + self._set_exec_text( + _('"%s" does not appear to have a valid executable.') % command.get_label()) + else: + self._set_exec_text('') + except OpenWithException as e: + self._test_field.set_text(str(e)) + self._set_exec_text('') + + def _add_command(self, button): + """ Add a new empty label-command line to the list. """ + row = (_('Command label'), '', '', False, True) + selection = self._command_tree.get_selection() + if selection and selection.get_selected()[1]: + model, iter = selection.get_selected() + model.insert_before(iter, row) + else: + self._command_tree.get_model().append(row) + self._changed = True + + def _add_sep_command(self, button): + """ Adds a new separator line. """ + row = ('-', '', '', False, False) + selection = self._command_tree.get_selection() + if selection and selection.get_selected()[1]: + model, iter = selection.get_selected() + model.insert_before(iter, row) + else: + self._command_tree.get_model().append(row) + self._changed = True + + def _remove_command(self, button): + """ Removes the currently selected command from the list. """ + model, iter = self._command_tree.get_selection().get_selected() + if (iter and model.iter_is_valid(iter)): + model.remove(iter) + self._changed = True + + def _up_command(self, button): + """ Moves the selected command up by one. """ + model, iter = self._command_tree.get_selection().get_selected() + if (iter and model.iter_is_valid(iter)): + path = model.get_path(iter)[0] + + if path >= 1: + up = model.get_iter(path - 1) + model.swap(iter, up) + self._changed = True + + def _down_command(self, button): + """ Moves the selected command down by one. """ + model, iter = self._command_tree.get_selection().get_selected() + if (iter and model.iter_is_valid(iter)): + path = model.get_path(iter)[0] + + if path < len(self.get_commands()) - 1: + down = model.get_iter(path + 1) + model.swap(iter, down) + self._changed = True + + def _run_command(self, button): + """ Executes the selected command in the current context. """ + command = self.get_command() + if command and not command.is_separator(): + command.execute(self._window) + + def _item_selected(self, selection): + """ Enable or disable buttons that depend on an item being selected. """ + for button in (self._remove_button, self._up_button, + self._down_button): + button.set_sensitive(selection.count_selected_rows() > 0) + + if selection.count_selected_rows() > 0: + self.test_command() + else: + self._test_field.set_text('') + + def _set_exec_text(self, text): + self._exec_label.set_text(text) + + def _layout(self): + """ Create and lay out UI components. """ + # All these boxes basically are just for adding a 4px border + vbox = self.get_content_area() + hbox = Gtk.HBox() + vbox.pack_start(hbox, True, True, 4) + content = Gtk.VBox() + content.set_spacing(6) + hbox.pack_start(content, True, True, 4) + + scroll_window = Gtk.ScrolledWindow() + scroll_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + scroll_window.add(self._command_tree) + content.pack_start(scroll_window, True, True, 0) + + buttonbox = Gtk.HBox() + buttonbox.pack_start(self._add_button, False, False, 0) + buttonbox.pack_start(self._add_sep_button, False, False, 0) + buttonbox.pack_start(self._remove_button, False, False, 0) + buttonbox.pack_start(self._up_button, False, False, 0) + buttonbox.pack_start(self._down_button, False, False, 0) + content.pack_start(buttonbox, False, False, 0) + + preview_box = Gtk.HBox() + preview_box.pack_start(Gtk.Label(_('Preview:')), False, False, 0) + preview_box.pack_start(self._test_field, True, True, 4) + preview_box.pack_start(self._run_button, False, False, 0) + content.pack_start(preview_box, False, False, 0) + + content.pack_start(self._exec_label, False, False, 0) + + linklabel = Gtk.Label() + linklabel.set_markup(_('Please refer to the external command documentation ' + 'for a list of usable variables and other hints.') % \ + 'https://sourceforge.net/p/mcomix/wiki/External_Commands') + linklabel.set_alignment(0, 0) + content.pack_start(linklabel, False, False, 4) + + def _setup_table(self): + """ Initializes the TreeView with settings and data. """ + for i, label in enumerate((_('Label'), _('Command'), _('Working directory'))): + renderer = Gtk.CellRendererText() + renderer.connect('edited', self._text_changed, i) + column = Gtk.TreeViewColumn(label, renderer) + column.set_property('resizable', True) + column.set_attributes(renderer, text=i, editable=4) + if (i == 1): + column.set_expand(True) # Command column should scale automatically + self._command_tree.append_column(column) + + # The 'Disabled in archives' field is shown as toggle button + renderer = Gtk.CellRendererToggle() + renderer.connect('toggled', self._value_changed, + len(self._command_tree.get_columns())) + column = Gtk.TreeViewColumn(_('Disabled in archives'), renderer) + column.set_attributes(renderer, active=len(self._command_tree.get_columns()), + activatable=4) + self._command_tree.append_column(column) + + # Label, command, working dir, disabled for archives, line is editable + model = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, + GObject.TYPE_BOOLEAN, GObject.TYPE_BOOLEAN) + for command in self._openwith.get_commands(): + model.append((command.get_label(), command.get_command(), command.get_cwd(), + command.is_disabled_for_archives(), not command.is_separator())) + self._command_tree.set_model(model) + + self._command_tree.set_headers_visible(True) + self._command_tree.set_reorderable(True) + + def _text_changed(self, renderer, path, new_text, column): + """ Called when the user edits a field in the table. """ + # Prevent changing command to separator, and completely removing label + if column == 0 and (not new_text.strip() or re.match(r'^-+$', new_text)): + return + + model = self._command_tree.get_model() + iter = model.get_iter(path) + # Editing the model in the cellrenderercallback stops the editing + # operation, causing GTK warnings. Delay until callback is finished. + def delayed_set_value(): + old_value = model.get_value(iter, column) + model.set_value(iter, column, new_text) + self._changed = old_value != new_text + self.test_command() + GObject.idle_add(delayed_set_value) + + def _value_changed(self, renderer, path, column): + """ Called when a toggle field is changed """ + model = self._command_tree.get_model() + iter = model.get_iter(path) + # Editing the model in the cellrenderercallback stops the editing + # operation, causing GTK warnings. Delay until callback is finished. + def delayed_set_value(): + value = not renderer.get_active() + model.set_value(iter, column, value) + self._changed = True + + GObject.idle_add(delayed_set_value) + + def _response(self, dialog, response): + if response == Gtk.ResponseType.ACCEPT: + # The Save button is only enabled if all commands are valid + self.save() + self.hide() + else: + if self._changed: + confirm_diag = message_dialog.MessageDialog(self, Gtk.DialogFlags.MODAL, + Gtk.MessageType.INFO, Gtk.ButtonsType.YES_NO) + confirm_diag.set_text(_('Save changes to commands?'), + _('You have made changes to the list of external commands that ' + 'have not been saved yet. Press "Yes" to save all changes, ' + 'or "No" to discard them.')) + response = confirm_diag.run() + + if response == Gtk.ResponseType.YES: + self.save() + + def _quote_if_necessary(self, arg): + """ Quotes a command line argument if necessary. """ + if arg == "": + return '""' + if sys.platform == 'win32': + # based on http://msdn.microsoft.com/en-us/library/17w5ykft%28v=vs.85%29.aspx + backslash_counter = 0 + needs_quoting = False + result = "" + for c in arg: + if c == '\\': + backslash_counter += 1 + else: + if c == '\"': + result += '\\' * (2 * backslash_counter + 1) + else: + result += '\\' * backslash_counter + backslash_counter = 0 + result += c + if c == ' ': + needs_quoting = True + + if needs_quoting: + result += '\\' * (2 * backslash_counter) + result = '"' + result + '"' + else: + result += '\\' * backslash_counter + return result + else: + # simplified version of + # http://www.gnu.org/software/bash/manual/bashref.html#Double-Quotes + arg = arg.replace('\\', '\\\\') + arg = arg.replace('"', '\\"') + if " " in arg: + return '"' + arg + '"' + return arg + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/osd.py mcomix-2.1.0/mcomix/osd.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/osd.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/osd.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,144 @@ +""" osd.py - Onscreen display showing currently opened file. """ +# -*- coding: utf-8 -*- + +import textwrap + +from gi.repository import Gdk, Gtk, GObject +from gi.repository import Pango, PangoCairo + +from mcomix import image_tools + + +class OnScreenDisplay(object): + + """ The OSD shows information such as currently opened file, archive and + page in a black box drawn on the bottom end of the screen. + + The OSD will automatically be erased after TIMEOUT seconds. + """ + + TIMEOUT = 3 + + def __init__(self, window): + #: MainWindow + self._window = window + #: Stores the last rectangle that was used to render the OSD + self._last_osd_rect = None + #: Timeout event ID registered while waiting to hide the OSD + self._timeout_event = None + + def show(self, text): + """ Shows the OSD on the lower portion of the image window. """ + + # Determine text to draw + text = self._wrap_text(text) + layout = self._window._image_box.create_pango_layout(text) + + # Set up font information + font = layout.get_context().get_font_description() + font.set_weight(Pango.Weight.BOLD) + layout.set_alignment(Pango.Alignment.CENTER) + + # Scale font to fit within the screen size + max_width, max_height = self._window.get_visible_area_size() + self._scale_font(font, layout, max_width, max_height) + + # Calculate surrounding box + layout_width, layout_height = layout.get_pixel_size() + pos_x = max(int(max_width // 2) - int(layout_width // 2) + + int(self._window._hadjust.get_value()), 0) + pos_y = max(int(max_height) - int(layout_height * 1.1) + + int(self._window._vadjust.get_value()), 0) + + rect = (pos_x - 10, pos_y - 20, + layout_width + 20, layout_height + 20) + + self._draw_osd(layout, rect) + + self._last_osd_rect = rect + if self._timeout_event: + GObject.source_remove(self._timeout_event) + self._timeout_event = GObject.timeout_add_seconds(OnScreenDisplay.TIMEOUT, self.clear) + + def clear(self): + """ Removes the OSD. """ + if self._timeout_event: + GObject.source_remove(self._timeout_event) + self._timeout_event = None + self._clear_osd() + return 0 # To unregister gobject timer event + + def _wrap_text(self, text, width=70): + """ Wraps the text to be C{width} characters at most. """ + parts = text.split('\n') + result = [] + + for part in parts: + if part: + result.extend(textwrap.wrap(part, width)) + else: + result.append(part) + + return "\n".join(result) + + def _clear_osd(self): + """ Clear the last OSD region. """ + + if not self._last_osd_rect: + return + + window = self._window._main_layout.get_bin_window() + gdk_rect = Gdk.Rectangle() + gdk_rect.x, gdk_rect.y, gdk_rect.width, gdk_rect.height = self._last_osd_rect + window.invalidate_rect(gdk_rect, True) + window.process_updates(True) + self._last_osd_rect = None + + def _scale_font(self, font, layout, max_width, max_height): + """ Scales the font used by C{layout} until max_width/max_height is reached. """ + + SIZE_MIN, SIZE_MAX = 10, 60 + for font_size in range(SIZE_MIN, SIZE_MAX, 5): + old_size = font.get_size() + font.set_size(font_size * Pango.SCALE) + layout.set_font_description(font) + + if layout.get_pixel_size()[0] > max_width: + font.set_size(old_size) + layout.set_font_description(font) + break + + def _draw_osd(self, layout, rect): + """ Draws the text specified in C{layout} into a box at C{rect}. """ + + draw_region = Gdk.Rectangle() + draw_region.x, draw_region.y, draw_region.width, draw_region.height = rect + if self._last_osd_rect: + last_region = Gdk.Rectangle() + last_region.x, last_region.y, last_region.width, last_region.height = self._last_osd_rect + draw_region = Gdk.rectangle_union(draw_region, last_region) + + gdk_rect = Gdk.Rectangle() + gdk_rect.x = draw_region.x + gdk_rect.y = draw_region.y + gdk_rect.width = draw_region.width + gdk_rect.height = draw_region.height + window = self._window._main_layout.get_bin_window() + window.begin_paint_rect(gdk_rect) + + self._clear_osd() + + cr = window.cairo_create() + cr.set_source_rgb(*image_tools.GTK_GDK_COLOR_BLACK.to_floats()) + cr.rectangle(*rect) + cr.fill() + extents = layout.get_extents()[0] + cr.set_source_rgb(*image_tools.GTK_GDK_COLOR_WHITE.to_floats()) + cr.translate(rect[0] + extents.x / Pango.SCALE, + rect[1] + extents.y / Pango.SCALE) + PangoCairo.update_layout(cr, layout) + PangoCairo.show_layout(cr, layout) + + window.end_paint() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/pageselect.py mcomix-2.1.0/mcomix/pageselect.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/pageselect.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/pageselect.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,136 @@ +"""pageselect.py - The dialog window for the page selector.""" + +from gi.repository import Gtk + +from mcomix.preferences import prefs +from mcomix.worker_thread import WorkerThread +from mcomix import callback + + +class Pageselector(Gtk.Dialog): + + """The Pageselector takes care of the popup page selector + """ + + def __init__(self, window): + self._window = window + super(Pageselector, self).__init__("Go to page...", window, + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT) + self.add_buttons(_('_Go'), Gtk.ResponseType.OK, + _('_Cancel'), Gtk.ResponseType.CANCEL,) + self.set_default_response(Gtk.ResponseType.OK) + self.connect('response', self._response) + self.set_resizable(True) + + self._number_of_pages = self._window.imagehandler.get_number_of_pages() + + self._selector_adjustment = Gtk.Adjustment(value=self._window.imagehandler.get_current_page(), + lower=1,upper=self._number_of_pages, + step_incr=1, page_incr=1 ) + + self._page_selector = Gtk.VScale.new(self._selector_adjustment) + self._page_selector.set_draw_value(False) + self._page_selector.set_digits( 0 ) + + self._page_spinner = Gtk.SpinButton.new(self._selector_adjustment, 0.0, 0) + self._page_spinner.connect( 'changed', self._page_text_changed ) + self._page_spinner.set_activates_default(True) + self._page_spinner.set_numeric(True) + self._pages_label = Gtk.Label(label=_(' of %s') % self._number_of_pages) + self._pages_label.set_alignment(0, 0.5) + + self._image_preview = Gtk.Image() + self._image_preview.set_size_request( + prefs['thumbnail size'], prefs['thumbnail size']) + + self.connect('configure-event', self._size_changed_cb) + self.set_size_request(prefs['pageselector width'], + prefs['pageselector height']) + + # Group preview image and page selector next to each other + preview_box = Gtk.HBox() + preview_box.set_border_width(5) + preview_box.set_spacing(5) + preview_box.pack_start(self._image_preview, True, True, 0) + preview_box.pack_end(self._page_selector, False, True, 0) + # Below them, group selection spinner and current page label + selection_box = Gtk.HBox() + selection_box.set_border_width(5) + selection_box.pack_start(self._page_spinner, True, True, 0) + selection_box.pack_end(self._pages_label, False, True, 0) + + self.get_content_area().pack_start(preview_box, True, True, 0) + self.get_content_area().pack_end(selection_box, False, True, 0) + self.show_all() + + self._selector_adjustment.connect('value-changed', self._cb_value_changed) + + # Set focus on the input box. + self._page_spinner.select_region(0, -1) + self._page_spinner.grab_focus() + + # Currently displayed thumbnail page. + self._thumbnail_page = 0 + self._thread = WorkerThread(self._generate_thumbnail, name='preview') + self._update_thumbnail(int(self._selector_adjustment.props.value)) + self._window.imagehandler.page_available += self._page_available + + def _cb_value_changed(self, *args): + """ Called whenever the spinbox value changes. Updates the preview thumbnail. """ + page = int(self._selector_adjustment.props.value) + if page != self._thumbnail_page: + self._update_thumbnail(page) + + def _size_changed_cb(self, *args): + # Window cannot be scaled down unless the size request is reset + self.set_size_request(-1, -1) + # Store dialog size + prefs['pageselector width'] = self.get_allocation().width + prefs['pageselector height'] = self.get_allocation().height + + self._update_thumbnail(int(self._selector_adjustment.props.value)) + + def _page_text_changed(self, control, *args): + """ Called when the page selector has been changed. Used to instantly update + the preview thumbnail when entering page numbers by hand. """ + if control.get_text().isdigit(): + page = int(control.get_text()) + if page > 0 and page <= self._number_of_pages: + control.set_value(page) + + def _response(self, widget, event, *args): + if event == Gtk.ResponseType.OK: + self._window.set_page(int(self._selector_adjustment.props.value)) + + self._window.imagehandler.page_available -= self._page_available + self._thread.stop() + self.destroy() + + def _update_thumbnail(self, page): + """ Trigger a thumbnail update. """ + width = self._image_preview.get_allocation().width + height = self._image_preview.get_allocation().height + self._thumbnail_page = page + self._thread.clear_orders() + self._thread.append_order((page, width, height)) + + def _generate_thumbnail(self, params): + """ Generate the preview thumbnail for the page selector. + A transparent image will be used if the page is not yet available. """ + page, width, height = params + + pixbuf = self._window.imagehandler.get_thumbnail(page, + width=width, height=height, nowait=True) + self._thumbnail_finished(page, pixbuf) + + @callback.Callback + def _thumbnail_finished(self, page, pixbuf): + # Don't bother if we changed page in the meantime. + if page == self._thumbnail_page: + self._image_preview.set_from_pixbuf(pixbuf) + + def _page_available(self, page): + if page == int(self._selector_adjustment.props.value): + self._update_thumbnail(page) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/portability.py mcomix-2.1.0/mcomix/portability.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/portability.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/portability.py 2022-01-27 05:29:38.000000000 +0000 @@ -0,0 +1,86 @@ +"""Portability functions for MComix.""" + +import sys +import locale +import ctypes +import io + +def uri_prefix(): + """ The prefix used for creating file URIs. This is 'file://' on + Linux, but 'file:' on Windows due to urllib using a different + URI creating scheme here. """ + if sys.platform == 'win32': + return 'file:' + else: + return 'file://' + +def normalize_uri(uri): + """ Normalize URIs passed into the program by different applications, + normally via drag-and-drop. """ + + if uri.startswith('file://localhost/'): # Correctly formatted. + return uri[16:] + elif uri.startswith('file:///'): # Nautilus etc. + return uri[7:] + elif uri.startswith('file:/'): # Xffm etc. + return uri[5:] + else: + return uri + +def get_commandline_args(): + """ Simply returns sys.argv, converted to Unicode objects on UNIX. + Does a bit more work on win32 since Python 2.x' handling of + command line strings is broken. It only passes ASCII characters + while replacing all chars that cannot be converted with the current + encoding to "?". + So we'll just bypass Python and get an unicode argument vector from + native win32 library functions.""" + + if sys.platform == 'win32': + # Set up function prototypes + ctypes.windll.kernel32.GetCommandLineW.restype = ctypes.c_wchar_p + ctypes.windll.shell32.CommandLineToArgvW.restype = ctypes.POINTER(ctypes.c_wchar_p) + args_length = ctypes.c_int(0) + # Convert argument string from GetCommandLineW to array + args_pointer = ctypes.windll.shell32.CommandLineToArgvW( + ctypes.windll.kernel32.GetCommandLineW(), + ctypes.byref(args_length)) + + if args_pointer: + args = [args_pointer[i] for i in range(args_length.value)] + ctypes.windll.kernel32.LocalFree(args_pointer) + # The first argument is either the python interpreter, or MComix.exe + # in case of being called as py2exe wrapper. If called by Python, the + # second argument will be a Python script, which needs to be removed. + if hasattr(sys, 'frozen'): + return args[1:] + else: + return args[2:] + else: + # For some reason CommandLineToArgvW failed and returned NULL + # Fall back to sys.argv + return [arg.decode(locale.getpreferredencoding(), 'replace') for arg in sys.argv[1:]] + else: + return sys.argv[1:] + +def invalid_filesystem_chars(): + """ List of characters that cannot be used in filenames on the target platform. """ + if sys.platform == 'win32': + return r':*?"<>|' + "".join([chr(i) for i in range(0, 32)]) + else: + return '' + +def get_default_locale(): + """ Gets the user's default locale. """ + if sys.platform == 'win32': + windll = ctypes.windll.kernel32 + code = windll.GetUserDefaultUILanguage() + return locale.windows_locale[code] + else: + lang, _ = locale.getdefaultlocale(['LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG']) + if lang: + return str(lang) + else: + return "C" + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_dialog.py mcomix-2.1.0/mcomix/preferences_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/preferences_dialog.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,927 @@ +# -*- coding: utf-8 -*- + +"""preferences_dialog.py - Preferences dialog.""" + +import operator +from gi.repository import Gdk, GdkPixbuf, Gtk, GObject + +from mcomix.preferences import prefs +from mcomix import preferences_page +from mcomix import image_tools +from mcomix import constants +from mcomix import message_dialog +from mcomix import keybindings +from mcomix import keybindings_editor + +_dialog = None + +class _PreferencesDialog(Gtk.Dialog): + + """The preferences dialog where most (but not all) settings that are + saved between sessions are presented to the user. + """ + + def __init__(self, window): + super(_PreferencesDialog, self).__init__(_('Preferences'), window) + + # Button text is set later depending on active tab + self.reset_button = self.add_button('', constants.RESPONSE_REVERT_TO_DEFAULT) + self.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE) + + self._window = window + self.set_resizable(True) + self.set_default_response(Gtk.ResponseType.CLOSE) + + self.connect('response', self._response) + + notebook = self.notebook = Gtk.Notebook() + self.vbox.pack_start(notebook, True, True, 0) + self.set_border_width(4) + notebook.set_border_width(6) + + appearance = self._init_appearance_tab() + notebook.append_page(appearance, Gtk.Label(label=_('Appearance'))) + behaviour = self._init_behaviour_tab() + notebook.append_page(behaviour, Gtk.Label(label=_('Behaviour'))) + display = self._init_display_tab() + notebook.append_page(display, Gtk.Label(label=_('Display'))) + advanced = self._init_advanced_tab() + notebook.append_page(advanced, Gtk.Label(label=_('Advanced'))) + shortcuts = self.shortcuts = self._init_shortcuts_tab() + notebook.append_page(shortcuts, Gtk.Label(label=_('Shortcuts'))) + + notebook.connect('switch-page', self._tab_page_changed) + # Update the Reset button's tooltip + self._tab_page_changed(notebook, None, 0) + + self.show_all() + + def _init_appearance_tab(self): + # ---------------------------------------------------------------- + # The "Appearance" tab. + # ---------------------------------------------------------------- + page = preferences_page._PreferencePage(None) + + page.new_section(_('User interface')) + + page.add_row(Gtk.Label(label=_('Language (needs restart):')), + self._create_language_control()) + + page.add_row(self._create_pref_check_button( + _('Escape key closes program'), 'escape quits', + _('When active, the ESC key closes the program, instead of only ' + 'disabling fullscreen mode.'))) + + page.new_section(_('Background')) + + fixed_bg_button, dynamic_bg_button = self._create_binary_pref_radio_buttons( + _('Use this colour as background:'), + 'color box bg', + _('Always use this selected colour as the background colour.'), + _('Use dynamic background colour'), + 'smart bg', + _('Automatically pick a background colour that fits the viewed image.')) + page.add_row(fixed_bg_button, self._create_color_button('bg colour')) + page.add_row(dynamic_bg_button) + + page.new_section(_('Thumbnails')) + + thumb_fixed_bg_button, thumb_dynamic_bg_button = self._create_binary_pref_radio_buttons( + _('Use this colour as the thumbnail background:'), + 'color box thumb bg', + _('Always use this selected colour as the thumbnail background colour.'), + _('Use dynamic background colour'), + 'smart thumb bg', + _('Automatically use the colour that fits the viewed image for the thumbnail background.')) + page.add_row(thumb_fixed_bg_button, self._create_color_button('thumb bg colour')) + page.add_row(thumb_dynamic_bg_button) + + page.add_row(self._create_pref_check_button( + _('Show page numbers on thumbnails'), + 'show page numbers on thumbnails', None)) + + page.add_row(self._create_pref_check_button( + _('Use archive thumbnail as application icon'), + 'archive thumbnail as icon', + _('By enabling this setting, the first page of a book will be used as application icon instead of the standard icon.'))) + + page.add_row(Gtk.Label(label=_('Thumbnail size (in pixels):')), + self._create_pref_spinner('thumbnail size', + 1, 20, 500, 1, 10, 0, None)) + + page.new_section(_('Transparency')) + + page.add_row(self._create_pref_check_button( + _('Use checkered background for transparent images'), + 'checkered bg for transparent images', + _('Use a grey checkered background for transparent images. If this preference is unset, the background is plain white instead.'))) + + return page + + def _init_behaviour_tab(self): + # ---------------------------------------------------------------- + # The "Behaviour" tab. + # ---------------------------------------------------------------- + page = preferences_page._PreferencePage(None) + + page.new_section(_('Scroll')) + + page.add_row(self._create_pref_check_button( + _('Use smart scrolling'), + 'smart scroll', + _('With this preference set, the space key and mouse wheel ' + 'do not only scroll down or up, but also sideways and so ' + 'try to follow the natural reading order of the comic book.'))) + + page.add_row(self._create_pref_check_button( + _('Flip pages when scrolling off the edges of the page'), + 'flip with wheel', + _('Flip pages when scrolling "off the page" with the scroll wheel or with the arrow keys. It takes n consecutive "steps" with the scroll wheel or the arrow keys for the pages to be flipped.'))) + + page.add_row(self._create_pref_check_button( + _('Automatically open the next archive'), + 'auto open next archive', + _('Automatically open the next archive in the directory when flipping past the last page, or the previous archive when flipping past the first page.'))) + + page.add_row(self._create_pref_check_button( + _('Automatically open next directory'), + 'auto open next directory', + _('Automatically open the first file in the next sibling directory when flipping past the last page of the last file in a directory, or the previous directory when flipping past the first page of the first file.'))) + + page.add_row(self._create_pref_check_button( + _('Open first file when navigating to previous archive'), + 'open first file in prev archive', + _('Automatically open the first file of the previous archive when navigating to it, instead of opening the last file of the previous archive.'))) + + page.add_row(self._create_pref_check_button( + _('Open first file when navigating to previous directory'), + 'open first file in prev directory', + _('Automatically open the first file of the previous directory when navigating to it, instead of opening the last file of the previous directory.'))) + + page.add_row(Gtk.Label(label=_('Number of pixels to scroll per arrow key press:')), + self._create_pref_spinner('number of pixels to scroll per key event', + 1, 1, 500, 1, 3, 0, + _('Set the number of pixels to scroll on a page when using the arrow keys.'))) + + page.add_row(Gtk.Label(label=_('Number of pixels to scroll per mouse wheel turn:')), + self._create_pref_spinner('number of pixels to scroll per mouse wheel event', + 1, 1, 500, 1, 3, 0, + _('Set the number of pixels to scroll on a page when using a mouse wheel.'))) + + page.add_row(Gtk.Label(label=_('Fraction of page to scroll ' + 'per space key press (in percent):')), + self._create_pref_spinner('smart scroll percentage', + 0.01, 1, 100, 1, 5, 0, + _('Sets the percentage by which the page ' + 'will be scrolled down or up when the space key is pressed.'))) + + page.add_row(Gtk.Label(label=_('Number of "steps" to take before flipping the page:')), + self._create_pref_spinner('number of key presses before page turn', + 1, 1, 100, 1, 3, 0, + _('Set the number of "steps" needed to flip to the next or previous page. Less steps will allow for very fast page turning but you might find yourself accidentally turning pages.'))) + + page.new_section(_('Double page mode')) + + page.add_row(self._create_pref_check_button( + _('Flip two pages in double page mode'), + 'double step in double page mode', + _('Flip two pages, instead of one, each time we flip pages in double page mode.'))) + + page.add_row(Gtk.Label(label=_('Show only one page where appropriate:')), + self._create_doublepage_as_one_control()) + + page.add_row(Gtk.Label(_('Page auto-resizing:')), + self._create_double_page_autoresize_control()) + + page.add_row(Gtk.Label(label=_('Space between two pages (in pixels):')), + self._create_pref_spinner('space between two pages', + 1, 0, 2, 1, 2, 0, None)) + + page.new_section(_('Files')) + + page.add_row(self._create_pref_check_button( + _('Automatically open the last viewed file on startup'), + 'auto load last file', + _('Automatically open, on startup, the file that was open when MComix was last closed.'))) + + page.add_row(Gtk.Label(label=_('Store information about recently opened files:')), + self._create_store_recent_combobox()) + + page.add_row(self._create_pref_check_button(_('Save As opens at the last directory saved into'), + 'store last saved in directory', 'Open the Save As dialog at the directory in which the last file was saved.')) + + return page + + def _init_display_tab(self): + # ---------------------------------------------------------------- + # The "Display" tab. + # ---------------------------------------------------------------- + page = preferences_page._PreferencePage(None) + + page.new_section(_('Fullscreen')) + + page.add_row(self._create_pref_check_button( + _('Use fullscreen by default'), + 'default fullscreen', None)) + + page.add_row(self._create_pref_check_button( + _('Automatically hide all toolbars in fullscreen'), + 'hide all in fullscreen', None)) + + page.new_section(_('Fit to size mode')) + + page.add_row(Gtk.Label(label=_('Fit to width or height:')), + self._create_fitmode_control()) + + page.add_row(Gtk.Label(label=_('Fixed size for this mode:')), + self._create_pref_spinner('fit to size px', + 1, 10, 10000, 10, 50, 0, None)) + + page.new_section(_('Slideshow')) + + page.add_row(Gtk.Label(label=_('Slideshow delay (in seconds):')), + self._create_pref_spinner('slideshow delay', + 1000.0, 0.01, 3600.0, 0.1, 1, 2, None)) + + page.add_row(Gtk.Label(label=_('Slideshow step (in pixels):')), + self._create_pref_spinner('number of pixels to scroll per slideshow event', + 1, -500, 500, 1, 1, 0, + _('Specify the number of pixels to scroll while in slideshow mode. A positive value will scroll forward, a negative value will scroll backwards, and a value of 0 will cause the slideshow to always flip to a new page.'))) + + page.add_row(self._create_pref_check_button( + _('During a slideshow automatically open the next archive'), + 'slideshow can go to next archive', + _('While in slideshow mode allow the next archive to automatically be opened.'))) + + page.new_section(_('Rotation')) + + page.add_row(self._create_pref_check_button( + _('Automatically rotate images according to their metadata'), + 'auto rotate from exif', + _('Automatically rotate images when an orientation is specified in the image metadata, such as in an Exif tag.'))) + + page.new_section(_('Image quality')) + + page.add_row(Gtk.Label(label=_('Scaling mode')), + self._create_scaling_quality_combobox()) + + return page + + def _init_advanced_tab(self): + # ---------------------------------------------------------------- + # The "Advanced" tab. + # ---------------------------------------------------------------- + + page = preferences_page._PreferencePage(None) + + page.new_section(_('File order')) + + page.add_row(Gtk.Label(label=_('Sort files and directories by:')), + self._create_sort_by_control()) + + page.add_row(Gtk.Label(label=_('Sort archives by:')), + self._create_archive_sort_by_control()) + + page.new_section(_('Extraction and cache')) + + page.add_row(Gtk.Label(label=_('Maximum number of concurrent extraction threads:')), + self._create_pref_spinner('max extract threads', + 1, 1, 16, 1, 4, 0, + _('Set the maximum number of concurrent threads for formats that support it.'))) + + page.add_row(self._create_pref_check_button( + _('Store thumbnails for opened files'), + 'create thumbnails', + _('Store thumbnails for opened files according to the freedesktop.org specification. These thumbnails are shared by many other applications, such as most file managers.'))) + + page.add_row(Gtk.Label(label=_('Maximum number of pages to store in the cache:')), + self._create_pref_spinner('max pages to cache', + 1, -1, 500, 1, 3, 0, + _('Set the max number of pages to cache. A value of -1 will cache the entire archive.'))) + + page.new_section(_('Magnifying Lens')) + + page.add_row(Gtk.Label(label=_('Magnifying lens size (in pixels):')), + self._create_pref_spinner('lens size', + 1, 50, 400, 1, 10, 0, + _('Set the size of the magnifying lens. It is a square with a side of this many pixels.'))) + + page.add_row(Gtk.Label(label=_('Magnification factor:')), + self._create_pref_spinner('lens magnification', + 1, 1.1, 10.0, 0.1, 1.0, 1, + _('Set the magnification factor of the magnifying lens.'))) + + page.new_section(_('Comments')) + + page.add_row(Gtk.Label(label=_('Comment extensions:')), + self._create_extensions_entry()) + + page.new_section(_('Animated images')) + + page.add_row(Gtk.Label(_('Animation mode:')), + self._create_animation_mode_combobox()) + + return page + + def _init_shortcuts_tab(self): + # ---------------------------------------------------------------- + # The "Shortcuts" tab. + # ---------------------------------------------------------------- + km = keybindings.keybinding_manager(self._window) + page = keybindings_editor.KeybindingEditorWindow(km) + return page + + def _tab_page_changed(self, notebook, page_ptr, page_num): + """ Dynamically switches the "Reset" button's text and tooltip + depending on the currently selected tab page. """ + new_page = notebook.get_nth_page(page_num) + if new_page == self.shortcuts: + self.reset_button.set_label(_("_Reset keys")) + self.reset_button.set_tooltip_text( + _("Resets all keyboard shortcuts to their default values.")) + self.reset_button.set_sensitive(True) + else: + self.reset_button.set_label(_('Clear _dialog choices')) + self.reset_button.set_tooltip_text( + _('Clears all dialog choices that you have previously chosen not to be asked again.')) + self.reset_button.set_sensitive(len(prefs['stored dialog choices']) > 0) + + def _response(self, dialog, response): + if response == Gtk.ResponseType.CLOSE: + _close_dialog() + + elif response == constants.RESPONSE_REVERT_TO_DEFAULT: + if self.notebook.get_nth_page(self.notebook.get_current_page()) == self.shortcuts: + # "Shortcuts" page is active, reset all keys to their default value + km = keybindings.keybinding_manager(self._window) + km.clear_all() + self._window._event_handler.register_key_events() + km.save() + self.shortcuts.refresh_model() + else: + # Reset stored choices + prefs['stored dialog choices'] = {} + self.reset_button.set_sensitive(False) + + else: + # Other responses close the dialog, e.g. clicking the X icon on the dialog. + _close_dialog() + + def _create_language_control(self): + """ Creates and returns the combobox for language selection. """ + # Source: http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + languages = [ + (_('Auto-detect (Default)'), 'auto'), + ('Català', 'ca'), # Catalan + ('čeština', 'cs'), # Czech + ('Deutsch', 'de'), # German + ('ελληνικά', 'el'), # Greek + ('English', 'en'), # English + ('Español', 'es'), # Spanish + ('فارسی', 'fa'), # Persian + ('Français', 'fr'), # French + ('Galego', 'gl'), # Galician + ('עברית', 'he'), # Hebrew + ('Hrvatski jezik', 'hr'), # Croatian + ('Magyar', 'hu'), # Hungarian + ('Bahasa Indonesia', 'id'), # Indonesian + ('Italiano', 'it'), # Italian + ('日本語', 'ja'), # Japanese + ('한국어', 'ko'), # Korean + ('Nederlands', 'nl'), # Dutch + ('Język polski', 'pl'), # Polish + ('Português', 'pt_BR'), # Portuguese + ('pусский язык', 'ru'), # Russian + ('Svenska', 'sv'), # Swedish + ('українська мова', 'uk'), # Ukrainian + ('簡體中文', 'zh_CN'), # Chinese (simplified) + ('正體中文', 'zh_TW')] # Chinese (traditional) + languages.sort(key=operator.itemgetter(0)) + + box = self._create_combobox(languages, prefs['language'], + self._language_changed_cb) + + return box + + def _language_changed_cb(self, combobox, *args): + """ Called whenever the language was changed. """ + model_index = combobox.get_active() + if model_index > -1: + iter = combobox.get_model().iter_nth_child(None, model_index) + text, lang_code = combobox.get_model().get(iter, 0, 1) + prefs['language'] = lang_code + + def _create_doublepage_as_one_control(self): + """ Creates the ComboBox control for selecting virtual double page options. """ + items = ( + (_('Never'), 0), + (_('Only for title pages'), constants.SHOW_DOUBLE_AS_ONE_TITLE), + (_('Only for wide images'), constants.SHOW_DOUBLE_AS_ONE_WIDE), + (_('Always'), constants.SHOW_DOUBLE_AS_ONE_TITLE | constants.SHOW_DOUBLE_AS_ONE_WIDE)) + + box = self._create_combobox(items, + prefs['virtual double page for fitting images'], + self._double_page_changed_cb) + + box.set_tooltip_text( + _("When showing the first page of an archive, or an image's width " + "exceeds its height, only a single page will be displayed.")) + + return box + + def _double_page_changed_cb(self, combobox, *args): + """ Called when a new option was selected for the virtual double page option. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['virtual double page for fitting images'] = value + self._window.draw_image() + + def _create_double_page_autoresize_control(self): + """ Creates the ComboBox control for selecting double page autoresize options. """ + items = ( + (_('Prefer same scale'), constants.DOUBLE_PAGE_AUTORESIZE_SCALE), + (_('Prefer same size'), constants.DOUBLE_PAGE_AUTORESIZE_SIZE), + (_('Fit to same size'), constants.DOUBLE_PAGE_AUTORESIZE_FIT_SIZE)) + + box = self._create_combobox(items, + prefs['double page autoresize'], + self._double_page_autoresize_changed_cb) + + box.set_tooltip_text( + _("Maintain relative size or fit to same size.")) + + return box + + def _double_page_autoresize_changed_cb(self, combobox, *args): + """ Called when a new option was selected for the double page autoresize option. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['double page autoresize'] = value + self._window.draw_image() + + def _create_fitmode_control(self): + """ Combobox for fit to size mode """ + items = ( + (_('Fit to width'), constants.ZOOM_MODE_WIDTH), + (_('Fit to height'), constants.ZOOM_MODE_HEIGHT)) + + box = self._create_combobox(items, + prefs['fit to size mode'], + self._fit_to_size_changed_cb) + + return box + + def _fit_to_size_changed_cb(self, combobox, *args): + """ Change to 'Fit to size' pixels """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + + if prefs['fit to size mode'] != value: + prefs['fit to size mode'] = value + self._window.change_zoom_mode() + + def _create_sort_by_control(self): + """ Creates the ComboBox control for selecting file sort by options. """ + sortkey_items = ( + (_('No sorting'), 0), + (_('File name'), constants.SORT_NAME), + (_('File size'), constants.SORT_SIZE), + (_('Last modified'), constants.SORT_LAST_MODIFIED)) + + sortkey_box = self._create_combobox(sortkey_items, prefs['sort by'], + self._sort_by_changed_cb) + + sortorder_items = ( + (_('Ascending'), constants.SORT_ASCENDING), + (_('Descending'), constants.SORT_DESCENDING)) + + sortorder_box = self._create_combobox(sortorder_items, + prefs['sort order'], + self._sort_order_changed_cb) + + box = Gtk.HBox() + box.pack_start(sortkey_box, True, True, 0) + box.pack_start(sortorder_box, True, True, 0) + + label = _("Files will be opened and displayed according to the sort order " + "specified here. This option does not affect ordering within archives.") + sortkey_box.set_tooltip_text(label) + sortorder_box.set_tooltip_text(label) + + return box + + def _sort_by_changed_cb(self, combobox, *args): + """ Called when a new option was selected for the virtual double page option. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['sort by'] = value + + self._window.filehandler.refresh_file() + + def _sort_order_changed_cb(self, combobox, *args): + """ Called when sort order changes (ascending or descending) """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['sort order'] = value + + self._window.filehandler.refresh_file() + + def _create_archive_sort_by_control(self): + """ Creates the ComboBox control for selecting archive sort by options. """ + sortkey_items = ( + (_('No sorting'), 0), + (_('Natural order'), constants.SORT_NAME), + (_('Literal order'), constants.SORT_NAME_LITERAL)) + + sortkey_box = self._create_combobox(sortkey_items, prefs['sort archive by'], + self._sort_archive_by_changed_cb) + + sortorder_items = ( + (_('Ascending'), constants.SORT_ASCENDING), + (_('Descending'), constants.SORT_DESCENDING)) + + sortorder_box = self._create_combobox(sortorder_items, + prefs['sort archive order'], + self._sort_archive_order_changed_cb) + + box = Gtk.HBox() + box.pack_start(sortkey_box, True, True, 0) + box.pack_start(sortorder_box, True, True, 0) + + label = _("Files within archives will be sorted according to the order specified here. " + "Natural order will sort numbered files based on their natural order, " + "i.e. 1, 2, ..., 10, while literal order uses standard C sorting, " + "i.e. 1, 2, 34, 5.") + sortkey_box.set_tooltip_text(label) + sortorder_box.set_tooltip_text(label) + + return box + + def _sort_archive_by_changed_cb(self, combobox, *args): + """ Called when a new option was selected for the virtual double page option. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['sort archive by'] = value + + self._window.filehandler.refresh_file() + + def _sort_archive_order_changed_cb(self, combobox, *args): + """ Called when sort order changes (ascending or descending) """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + prefs['sort archive order'] = value + + self._window.filehandler.refresh_file() + + def _create_store_recent_combobox(self): + """ Creates the combobox for "Store recently opened files". """ + items = ( + (_('Never'), False), + (_('Always'), True)) + + # Map legacy 0/1/2 values: + if prefs['store recent file info'] == 0: + selection = False + elif prefs['store recent file info'] in (1, 2): + selection = True + else: + selection = prefs['store recent file info'] + + box = self._create_combobox(items, selection, self._store_recent_changed_cb) + box.set_tooltip_text( + _('Add information about all files opened from within MComix to the shared recent files list.')) + return box + + def _store_recent_changed_cb(self, combobox, *args): + """ Called when option "Store recently opened files" was changed. """ + iter = combobox.get_active_iter() + if not combobox.get_model().iter_is_valid(iter): + return + + value = combobox.get_model().get_value(iter, 1) + last_value = prefs['store recent file info'] + prefs['store recent file info'] = value + self._window.filehandler.last_read_page.set_enabled(value) + + # If "Never" was selected, ask to purge recent files. + if (bool(last_value) is True and value is False + and (self._window.uimanager.recent.count() > 0 + or self._window.filehandler.last_read_page.count() > 0)): + + dialog = message_dialog.MessageDialog(self, Gtk.DialogFlags.MODAL, + Gtk.MessageType.INFO, Gtk.ButtonsType.YES_NO) + dialog.set_default_response(Gtk.ResponseType.YES) + dialog.set_text( + _('Delete information about recently opened files?'), + _('This will remove all entries from the "Recent" menu,' + ' and clear information about last read pages.')) + response = dialog.run() + + if response == Gtk.ResponseType.YES: + self._window.uimanager.recent.remove_all() + self._window.filehandler.last_read_page.clear_all() + + def _create_scaling_quality_combobox(self): + """ Creates combo box for image scaling quality """ + items = ( + (_('Normal (fast)'), int(GdkPixbuf.InterpType.TILES)), + (_('Bilinear'), int(GdkPixbuf.InterpType.BILINEAR)), + (_('Hyperbolic (slow)'), int(GdkPixbuf.InterpType.HYPER))) + + selection = prefs['scaling quality'] + + box = self._create_combobox(items, selection, self._scaling_quality_changed_cb) + box.set_tooltip_text( + _('Changes how images are scaled. Slower algorithms result in higher quality resizing, but longer page loading times.')) + + return box + + def _scaling_quality_changed_cb(self, combobox, *args): + """ Called whan image scaling quality changes. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + last_value = prefs['scaling quality'] + prefs['scaling quality'] = value + + if value != last_value: + self._window.draw_image() + + def _create_animation_mode_combobox(self): + """ Creates combo box for animation mode """ + items = ( + (_('Never'), constants.ANIMATION_DISABLED), + (_('Normal'), constants.ANIMATION_NORMAL)) + + selection = prefs['animation mode'] + + box = self._create_combobox(items, selection, self._animation_mode_changed_cb) + box.set_tooltip_text( + _('Controls how animated images should be displayed.')) + + return box + + def _animation_mode_changed_cb(self, combobox, *args): + """ Called whenever animation mode has been changed. """ + iter = combobox.get_active_iter() + if combobox.get_model().iter_is_valid(iter): + value = combobox.get_model().get_value(iter, 1) + last_value = prefs['animation mode'] + prefs['animation mode'] = value + + if value != last_value: + self._window.filehandler.refresh_file() + + def _create_combobox(self, options, selected_value, change_callback): + """ Creates a new dropdown combobox and populates it with the items + passed in C{options}. + + @param options: List of tuples: (Option display text, option value) + @param selected_value: One of the values passed in C{options} that will + be pre-selected when the control is created. + @param change_callback: Function that will be called when the 'changed' + event is triggered. + @returns Gtk.ComboBox + """ + assert options and len(options[0]) == 2, "Invalid format for options." + + # Use the first list item to determine typing of model fields. + # First field is textual description, second field is value. + model = Gtk.ListStore(GObject.TYPE_STRING, type(options[0][1])) + for text, value in options: + model.append((text, value)) + + box = Gtk.ComboBox(model=model) + renderer = Gtk.CellRendererText() + box.pack_start(renderer, True) + box.add_attribute(renderer, "text", 0) + + # Set active box option + iter = model.get_iter_first() + while iter: + if model.get_value(iter, 1) == selected_value: + box.set_active_iter(iter) + break + else: + iter = model.iter_next(iter) + + if change_callback: + box.connect('changed', change_callback) + + return box + + + def _create_extensions_entry(self): + entry = Gtk.Entry() + entry.set_size_request(200, -1) + entry.set_text(', '.join(prefs['comment extensions'])) + entry.connect('activate', self._entry_cb) + entry.connect('focus_out_event', self._entry_cb) + entry.set_tooltip_text( + _('Treat all files found within archives, that have one of these file endings, as comments.')) + return entry + + + def _create_pref_check_button(self, label, prefkey, tooltip_text): + button = Gtk.CheckButton(label) + button.set_active(prefs[prefkey]) + button.connect('toggled', self._check_button_cb, prefkey) + if tooltip_text: + button.set_tooltip_text(tooltip_text) + return button + + + def _create_binary_pref_radio_buttons(self, label1, prefkey1, tooltip_text1, + label2, prefkey2, tooltip_text2): + button1 = Gtk.RadioButton(label=label1) + button1.connect('toggled', self._check_button_cb, prefkey1) + if tooltip_text1: + button1.set_tooltip_text(tooltip_text1) + button2 = Gtk.RadioButton(group=button1, label=label2) + button2.connect('toggled', self._check_button_cb, prefkey2) + if tooltip_text2: + button2.set_tooltip_text(tooltip_text2) + button2.set_active(prefs[prefkey2]) + return button1, button2 + + + def _create_color_button(self, prefkey): + rgba = image_tools.color_to_floats_rgba(prefs[prefkey]) + button = Gtk.ColorButton.new_with_rgba(Gdk.RGBA(*rgba)) + button.connect('color_set', self._color_button_cb, prefkey) + return button + + + def _check_button_cb(self, button, preference): + """Callback for all checkbutton-type preferences.""" + + prefs[preference] = button.get_active() + + if preference == 'color box bg' and button.get_active(): + + if not prefs['smart bg'] or not self._window.filehandler.file_loaded: + self._window.set_bg_colour(prefs['bg colour']) + + elif preference == 'smart bg' and button.get_active(): + + # if the color is no longer using the smart background then return it to the chosen color + if not prefs[preference]: + self._window.set_bg_colour(prefs['bg colour']) + else: + # draw_image() will set the main background to the smart background + self._window.draw_image() + + elif preference == 'color box thumb bg' and button.get_active(): + + if prefs[preference]: + prefs['smart thumb bg'] = False + prefs['thumbnail bg uses main colour'] = False + + self._window.thumbnailsidebar.change_thumbnail_background_color(prefs['thumb bg colour']) + else: + self._window.draw_image() + + elif preference == 'smart thumb bg' and button.get_active(): + + if prefs[preference]: + prefs['color box thumb bg'] = False + prefs['thumbnail bg uses main colour'] = False + + pixbuf = image_tools.static_image(image_tools.unwrap_image( + self._window.images[0])) # XXX transitional(double page limitation) + if pixbuf: + bg_color = image_tools.get_most_common_edge_colour(pixbuf) + self._window.thumbnailsidebar.change_thumbnail_background_color(bg_color) + else: + self._window.draw_image() + + elif preference in ('checkered bg for transparent images', + 'no double page for wide images', 'auto rotate from exif'): + self._window.draw_image() + + elif (preference == 'hide all in fullscreen' and + self._window.is_fullscreen): + self._window.draw_image() + + elif preference == 'show page numbers on thumbnails': + self._window.thumbnailsidebar.toggle_page_numbers_visible() + + def _color_button_cb(self, colorbutton, preference): + """Callback for the background colour selection button.""" + + colour = colorbutton.get_color() + + if preference == 'bg colour': + prefs['bg colour'] = colour.red, colour.green, colour.blue + + if not prefs['smart bg'] or not self._window.filehandler.file_loaded: + self._window.set_bg_colour(prefs['bg colour']) + + elif preference == 'thumb bg colour': + + prefs['thumb bg colour'] = colour.red, colour.green, colour.blue + + if not prefs['smart thumb bg'] or not self._window.filehandler.file_loaded: + self._window.thumbnailsidebar.change_thumbnail_background_color( prefs['thumb bg colour'] ) + + + def _create_pref_spinner(self, prefkey, scale, lower, upper, step_incr, + page_incr, digits, tooltip_text): + value = prefs[prefkey] / scale + adjustment = Gtk.Adjustment(value, lower, upper, step_incr, page_incr) + spinner = Gtk.SpinButton.new(adjustment, 0.0, digits) + spinner.set_size_request(80, -1) + spinner.connect('value_changed', self._spinner_cb, prefkey) + if tooltip_text: + spinner.set_tooltip_text(tooltip_text) + return spinner + + + def _spinner_cb(self, spinbutton, preference): + """Callback for spinner-type preferences.""" + value = spinbutton.get_value() + + if preference == 'lens size': + prefs[preference] = int(value) + + elif preference == 'lens magnification': + prefs[preference] = value + + elif preference == 'slideshow delay': + prefs[preference] = int(round(value * 1000)) + self._window.slideshow.update_delay() + + elif preference == 'number of pixels to scroll per slideshow event': + prefs[preference] = int(value) + + elif preference == 'number of pixels to scroll per key event': + prefs[preference] = int(value) + + elif preference == 'number of pixels to scroll per mouse wheel event': + prefs[preference] = int(value) + + elif preference == 'smart scroll percentage': + prefs[preference] = value / 100.0 + + elif preference == 'thumbnail size': + prefs[preference] = int(value) + self._window.thumbnailsidebar.resize() + self._window.draw_image() + + elif preference == 'max pages to cache': + prefs[preference] = int(value) + self._window.imagehandler.do_cacheing() + + elif preference == 'number of key presses before page turn': + prefs['number of key presses before page turn'] = int(value) + self._window._event_handler._extra_scroll_events = 0 + + elif preference == 'fit to size px': + prefs[preference] = int(value) + self._window.change_zoom_mode() + + elif preference == 'max extract threads': + prefs[preference] = int(value) + + elif preference == 'space between two pages': + prefs[preference] = int(value) + self._window.update_space() + + + def _entry_cb(self, entry, event=None): + """Callback for entry-type preferences.""" + text = entry.get_text() + extensions = [e.strip() for e in text.split(',')] + prefs['comment extensions'] = [e for e in extensions if e] + self._window.filehandler.update_comment_extensions() + +def open_dialog(action, window): + """Create and display the preference dialog.""" + + global _dialog + + # if the dialog window is not created then create the window + if _dialog is None: + _dialog = _PreferencesDialog(window) + else: + # if the dialog window already exists bring it to the forefront of the screen + _dialog.present() + +def _close_dialog(): + + global _dialog + + # if the dialog window exists then destroy it + if _dialog is not None: + _dialog.destroy() + _dialog = None + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_page.py mcomix-2.1.0/mcomix/preferences_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_page.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/preferences_page.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,45 @@ +"""preferences_page.py - MComix preference page.""" + +from gi.repository import Gtk + +from mcomix import preferences_section + +class _PreferencePage(Gtk.VBox): + + """The _PreferencePage is a conveniece class for making one "page" + in a preferences-style dialog that contains one or more + _PreferenceSections. + """ + + def __init__(self, right_column_width): + """Create a new page where any possible right columns have the + width request . + """ + super(_PreferencePage, self).__init__(False, 12) + self.set_border_width(12) + self._right_column_width = right_column_width + self._section = None + + def new_section(self, header): + """Start a new section in the page, with the header text from +
. + """ + self._section = preferences_section._PreferenceSection(header, self._right_column_width) + self.pack_start(self._section, False, False, 0) + + def add_row(self, left_item, right_item=None): + """Add a row to the page (in the latest section), containing one + or two items. If the left item is a label it is automatically + aligned properly. + """ + if isinstance(left_item, Gtk.Label): + left_item.set_alignment(0, 0.5) + + if right_item is None: + self._section.contentbox.pack_start(left_item, True, True, 0) + else: + left_box, right_box = self._section.new_split_vboxes() + left_box.pack_start(left_item, True, True, 0) + right_box.pack_start(right_item, True, True, 0) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/preferences.py mcomix-2.1.0/mcomix/preferences.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/preferences.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/preferences.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,169 @@ +""" preferences.py - Contains the preferences and the functions to read and +write them. """ + +import os +import pickle +import json + +from mcomix import constants + +# All the preferences are stored here. +prefs = { + 'comment extensions': constants.ACCEPTED_COMMENT_EXTENSIONS, + 'auto load last file': False, + 'page of last file': 1, + 'path to last file': '', + 'number of key presses before page turn': 3, + 'auto open next archive': True, + 'auto open next directory': True, + 'open first file in prev archive': False, + 'open first file in prev directory': False, + 'sort by': constants.SORT_NAME, # Normal files obtained by directory listing + 'sort order': constants.SORT_ASCENDING, + 'sort archive by': constants.SORT_NAME, # Files in archives + 'sort archive order': constants.SORT_ASCENDING, + 'bg colour': [5000, 5000, 5000], + 'thumb bg colour': [5000, 5000, 5000], + 'smart bg': False, + 'smart thumb bg': False, + 'thumbnail bg uses main colour': False, + 'checkered bg for transparent images': True, + 'cache': True, + 'stretch': False, + 'default double page': False, + 'default fullscreen': False, + 'zoom mode': constants.ZOOM_MODE_BEST, + 'default manga mode': False, + 'lens magnification': 2, + 'lens size': 200, + 'virtual double page for fitting images': constants.SHOW_DOUBLE_AS_ONE_TITLE | \ + constants.SHOW_DOUBLE_AS_ONE_WIDE, + 'double step in double page mode': True, + 'show page numbers on thumbnails': True, + 'thumbnail size': 80, + 'create thumbnails': True, + 'archive thumbnail as icon' : False, + 'number of pixels to scroll per key event': 50, + 'number of pixels to scroll per mouse wheel event': 50, + 'slideshow delay': 3000, + 'slideshow can go to next archive': True, + 'number of pixels to scroll per slideshow event': 50, + 'smart scroll': True, + 'invert smart scroll': False, + 'smart scroll percentage': 0.5, + 'flip with wheel': True, + 'store recent file info': True, + 'hide all': False, + 'hide all in fullscreen': True, + 'stored hide all values': [True, True, True, True, True], + 'path of last browsed in filechooser': constants.HOME_DIR, + 'store last saved in directory': True, + 'path of last saved in filechooser': constants.HOME_DIR, + 'last filter in main filechooser': 0, + 'last filter in library filechooser': 1, + 'show menubar': True, + 'previous quit was quit and save': False, + 'show scrollbar': True, + 'show statusbar': True, + 'show toolbar': True, + 'show thumbnails': True, + 'rotation': 0, + 'auto rotate from exif': True, + 'auto rotate depending on size': constants.AUTOROTATE_NEVER, + 'vertical flip': False, + 'horizontal flip': False, + 'keep transformation': False, + 'stored dialog choices': {}, + 'brightness': 1.0, + 'contrast': 1.0, + 'saturation': 1.0, + 'sharpness': 1.0, + 'auto contrast': False, + 'max pages to cache': 7, + 'window x': 0, + 'window y': 0, + 'window height': 600, + 'window width': 640, + 'pageselector height': -1, + 'pageselector width': -1, + 'library cover size': 125, + 'last library collection': None, + 'lib window height': 600, + 'lib window width': 500, + 'lib sort key': constants.SORT_PATH, + 'lib sort order': constants.SORT_ASCENDING, + 'language': 'auto', + 'statusbar fields': constants.STATUS_PAGE | constants.STATUS_RESOLUTION | \ + constants.STATUS_PATH | constants.STATUS_FILENAME | constants.STATUS_FILESIZE, + 'max threads': 3, + 'max extract threads': 1, + 'wrap mouse scroll': False, + 'scaling quality': 2, # GdkPixbuf.InterpType.BILINEAR + 'escape quits': False, + 'fit to size mode': constants.ZOOM_MODE_HEIGHT, + 'fit to size px': 1800, + 'scan for new books on library startup': True, + 'openwith commands': [], # (label, command) pairs + 'animation mode': constants.ANIMATION_NORMAL, + 'double page autoresize': constants.DOUBLE_PAGE_AUTORESIZE_SIZE, + 'space between two pages': 2, +} + +def read_preferences_file(): + """Read preferences data from disk.""" + + saved_prefs = None + + if os.path.isfile(constants.PREFERENCE_PATH): + try: + config_file = open(constants.PREFERENCE_PATH, 'r') + saved_prefs = json.load(config_file) + config_file.close() + except: + # Gettext might not be installed yet at this point. + corrupt_name = "%s.broken" % constants.PREFERENCE_PATH + print(('! Corrupt preferences file, moving to "%s".' % + corrupt_name)) + if os.path.isfile(corrupt_name): + os.unlink(corrupt_name) + + try: + # File cannot be moved without closing it first + config_file.close() + except: + pass + + os.rename(constants.PREFERENCE_PATH, corrupt_name) + + elif os.path.isfile(constants.PREFERENCE_PICKLE_PATH): + try: + config_file = open(constants.PREFERENCE_PICKLE_PATH, 'rb') + version = pickle.load(config_file) + saved_prefs = pickle.load(config_file) + config_file.close() + + # Remove legacy format preferences file + os.unlink(constants.PREFERENCE_PICKLE_PATH) + except Exception: + # Gettext might not be installed yet at this point. + print(('! Corrupt legacy preferences file "%s", ignoring...' % + constants.PREFERENCE_PICKLE_PATH)) + + if saved_prefs: + for key in saved_prefs: + if key in prefs: + prefs[key] = saved_prefs[key] + +def write_preferences_file(): + """Write preference data to disk.""" + # TODO: it might be better to save only those options that were (ever) + # explicitly changed by the used, leaving everything else as default + # and available (if really needed) to change of defaults on upgrade. + config_file = open(constants.PREFERENCE_PATH, 'w') + # XXX: constants.VERSION? It's *preferable* to not complicate the YAML + # file by adding a `{'version': constants.VERSION, 'prefs': config}` + # dict or a list. Adding an extra init line sounds bad too. + json.dump(prefs, config_file, indent=2) + config_file.close() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_section.py mcomix-2.1.0/mcomix/preferences_section.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/preferences_section.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/preferences_section.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,49 @@ +"""preferences_section.py - Preference dialog section.""" + +from gi.repository import Gtk + +from mcomix import labels + +class _PreferenceSection(Gtk.VBox): + + """The _PreferenceSection is a convenience class for making one + "section" of a preference-style dialog, e.g. it has a bold header + and a number of rows which are indented with respect to that header. + """ + + def __init__(self, header, right_column_width): + """Contruct a new section with the header set to the text in +
, and the width request of the (possible) right columns + set to that of . + """ + super(_PreferenceSection, self).__init__(False, 0) + self._right_column_width = right_column_width + self.contentbox = Gtk.VBox(False, 6) + label = labels.BoldLabel(header) + label.set_alignment(0, 0.5) + hbox = Gtk.HBox(False, 0) + hbox.pack_start(Gtk.HBox(True, True, 0), False, False, 6) + hbox.pack_start(self.contentbox, True, True, 0) + self.pack_start(label, False, False, 0) + self.pack_start(hbox, False, False, 6) + + def new_split_vboxes(self): + """Return two new VBoxes that are automatically put in the section + after the previously added items. The right one has a width request + equal to the right_column_width value passed to the class contructor, + in order to make it easy for all "right column items" in a page to + line up nicely. + """ + left_box = Gtk.VBox(False, 6) + right_box = Gtk.VBox(False, 6) + + if self._right_column_width != None: + right_box.set_size_request(self._right_column_width, -1) + + hbox = Gtk.HBox(False, 12) + hbox.pack_start(left_box, True, True, 0) + hbox.pack_start(right_box, False, False, 0) + self.contentbox.pack_start(hbox, True, True, 0) + return left_box, right_box + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/process.py mcomix-2.1.0/mcomix/process.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/process.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/process.py 2022-01-28 19:06:50.000000000 +0000 @@ -0,0 +1,200 @@ +"""process.py - Process spawning module.""" + +import sys +import os +import subprocess + +from mcomix import i18n + + +NULL = open(os.devnull, 'r+b') +PIPE = subprocess.PIPE +STDOUT = subprocess.STDOUT + +# Convert argument vector to system's file encoding where necessary +# to prevent automatic conversion when appending Unicode strings +# to byte strings later on. +def _fix_args(args): + fixed_args = [] + for arg in args: + if isinstance(arg, str): + fixed_args.append(arg.encode(sys.getfilesystemencoding())) + else: + fixed_args.append(arg) + return fixed_args + +def _get_creationflags(): + if 'win32' == sys.platform: + # Do not create a console window. + return 0x08000000 + else: + return 0 + +# Cannot spawn processes with PythonW/Win32 unless stdin +# and stderr are redirected to a pipe/devnull as well. +def call(args, stdin=NULL, stdout=NULL, stderr=NULL): + return 0 == subprocess.call(_fix_args(args), stdin=stdin, + stdout=stdout, stderr=stderr, + creationflags=_get_creationflags()) + + +def popen(args, stdin=NULL, stdout=PIPE, stderr=NULL): + return subprocess.Popen(_fix_args(args), stdin=stdin, + stdout=stdout, stderr=stderr, + creationflags=_get_creationflags()) + + +if 'win32' == sys.platform: + _exe_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + +def find_executable(candidates, workdir=None, is_valid_candidate=None): + """ Find executable in path. + + Return an absolute path to a valid executable or None. + + default to the current working directory if not set. + + is an optional function that must return True + if the path passed in argument is a valid candidate (to check for + version number, symlinks to an unsupported variant, etc...). + + If a candidate has a directory component, + it will be checked relative to . + + On Windows: + + - '.exe' will be appended to each candidate if not already + + - MComix executable directory is prepended to the path on Windows + (to support embedded tools/executables in the distribution). + + - will be inserted first in the path. + + On Unix: + + - a valid candidate must have execution right + + """ + if workdir is None: + workdir = os.getcwd() + workdir = os.path.abspath(workdir) + + search_path = os.environ['PATH'].split(os.pathsep) + if 'win32' == sys.platform: + if workdir is not None: + search_path.insert(0, workdir) + search_path.insert(0, _exe_dir) + + is_valid_exe = lambda exe: \ + os.path.isfile(exe) and \ + os.access(exe, os.R_OK|os.X_OK) + + if is_valid_candidate is None: + is_valid = is_valid_exe + else: + is_valid = lambda exe: \ + is_valid_exe(exe) and \ + is_valid_candidate(exe) + + for name in candidates: + + # On Windows, must end with '.exe' + if 'win32' == sys.platform: + if not name.endswith('.exe'): + name = name + '.exe' + + # Absolute path? + if os.path.isabs(name): + if is_valid(name): + return name + + # Does candidate have a directory component? + elif os.path.dirname(name): + # Yes, check relative to working directory. + path = os.path.normpath(os.path.join(workdir, name)) + if is_valid(path): + return path + + # Look in search path. + else: + for dir in search_path: + path = os.path.abspath(os.path.join(dir, name)) + if is_valid(path): + return path + + return None + + +def Win32Popen(cmd): + """ Spawns a new process on Win32. cmd is a list of parameters. + This method's sole purpose is calling CreateProcessW, not + CreateProcessA as it is done by subprocess.Popen. """ + import ctypes + + # Declare common data types + DWORD = ctypes.c_uint + WORD = ctypes.c_ushort + LPTSTR = ctypes.c_wchar_p + LPBYTE = ctypes.POINTER(ctypes.c_ubyte) + HANDLE = ctypes.c_void_p + + class StartupInfo(ctypes.Structure): + _fields_ = [("cb", DWORD), + ("lpReserved", LPTSTR), + ("lpDesktop", LPTSTR), + ("lpTitle", LPTSTR), + ("dwX", DWORD), + ("dwY", DWORD), + ("dwXSize", DWORD), + ("dwYSize", DWORD), + ("dwXCountChars", DWORD), + ("dwYCountChars", DWORD), + ("dwFillAttribute", DWORD), + ("dwFlags", DWORD), + ("wShowWindow", WORD), + ("cbReserved2", WORD), + ("lpReserved2", LPBYTE), + ("hStdInput", HANDLE), + ("hStdOutput", HANDLE), + ("hStdError", HANDLE)] + class ProcessInformation(ctypes.Structure): + _fields_ = [("hProcess", HANDLE), + ("hThread", HANDLE), + ("dwProcessId", DWORD), + ("dwThreadId", DWORD)] + + LPSTRARTUPINFO = ctypes.POINTER(StartupInfo) + LPROCESS_INFORMATION = ctypes.POINTER(ProcessInformation) + ctypes.windll.kernel32.CreateProcessW.argtypes = [LPTSTR, LPTSTR, + ctypes.c_void_p, ctypes.c_void_p, ctypes.c_bool, DWORD, + ctypes.c_void_p, LPTSTR, LPSTRARTUPINFO, LPROCESS_INFORMATION] + ctypes.windll.kernel32.CreateProcessW.restype = ctypes.c_bool + + # Convert list of arguments into a single string + cmdline = subprocess.list2cmdline(cmd) + buffer = ctypes.create_unicode_buffer(cmdline) + + # Resolve executable path. + exe = find_executable((cmd[0],)) + + # Some required structures for the method call... + startupinfo = StartupInfo() + ctypes.memset(ctypes.addressof(startupinfo), 0, ctypes.sizeof(startupinfo)) + startupinfo.cb = ctypes.sizeof(startupinfo) + processinfo = ProcessInformation() + + # Spawn new process + success = ctypes.windll.kernel32.CreateProcessW(exe, buffer, + None, None, False, 0, None, None, ctypes.byref(startupinfo), + ctypes.byref(processinfo)) + + if success: + ctypes.windll.kernel32.CloseHandle(processinfo.hProcess) + ctypes.windll.kernel32.CloseHandle(processinfo.hThread) + return processinfo.dwProcessId + else: + raise ctypes.WinError(ctypes.GetLastError(), + i18n.to_unicode(ctypes.FormatError())) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/properties_dialog.py mcomix-2.1.0/mcomix/properties_dialog.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/properties_dialog.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/properties_dialog.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,135 @@ +"""properties_dialog.py - Properties dialog that displays information about the archive/file.""" + +from gi.repository import Gtk +import os +import time +import stat +try: + import pwd + _has_pwd = True +except ImportError: + # Running on non-Unix machine. + _has_pwd = False + +from mcomix import i18n +from mcomix import strings +from mcomix import properties_page +from mcomix import tools + +class _PropertiesDialog(Gtk.Dialog): + + def __init__(self, window): + + super(_PropertiesDialog, self).__init__(_('Properties'), window, 0, + (Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) + + self._window = window + self.resize(500, 430) + self.set_resizable(True) + self.set_default_response(Gtk.ResponseType.CLOSE) + notebook = Gtk.Notebook() + self.set_border_width(4) + notebook.set_border_width(6) + self.vbox.pack_start(notebook, True, True, 0) + + self._archive_page = properties_page._Page() + notebook.append_page(self._archive_page, Gtk.Label(label=_('Archive'))) + self._image_page = properties_page._Page() + notebook.append_page(self._image_page, Gtk.Label(label=_('Image'))) + self._update_archive_page() + self._window.page_changed += self._on_page_change + self._window.filehandler.file_opened += self._on_book_change + self._window.filehandler.file_closed += self._on_book_change + self._window.imagehandler.page_available += self._on_page_available + + self.show_all() + + def _on_page_change(self): + self._update_image_page() + + def _on_book_change(self): + self._update_archive_page() + + def _on_page_available(self, page_number): + if 1 == page_number: + self._update_page_image(self._archive_page, 1) + current_page_number = self._window.imagehandler.get_current_page() + if current_page_number == page_number: + self._update_image_page() + + def _update_archive_page(self): + self._update_image_page() + page = self._archive_page + page.reset() + window = self._window + if window.filehandler.archive_type is None: + return + # In case it's not ready yet, bump the cover extraction + # in front of the queue. + path = window.imagehandler.get_path_to_page(1) + if path is not None: + window.filehandler._ask_for_files([path]) + self._update_page_image(page, 1) + filename = window.filehandler.get_pretty_current_filename() + page.set_filename(filename) + path = window.filehandler.get_path_to_base() + main_info = ( + _('%d pages') % window.imagehandler.get_number_of_pages(), + _('%d comments') % + window.filehandler.get_number_of_comments(), + strings.ARCHIVE_DESCRIPTIONS[window.filehandler.archive_type] + ) + page.set_main_info(main_info) + self._update_page_secondary_info(page, path) + page.show_all() + + def _update_image_page(self): + page = self._image_page + page.reset() + window = self._window + if not window.imagehandler.page_is_available(): + return + self._update_page_image(page) + path = window.imagehandler.get_path_to_page() + filename = os.path.basename(path) + page.set_filename(filename) + width, height = window.imagehandler.get_size() + main_info = ( + '%dx%d px' % (width, height), + window.imagehandler.get_mime_name(), + ) + page.set_main_info(main_info) + self._update_page_secondary_info(page, path) + page.show_all() + + def _update_page_image(self, page, page_number=None): + if not self._window.imagehandler.page_is_available(page_number): + return + thumb = self._window.imagehandler.get_thumbnail(page_number, width=128, height=128) + page.set_thumbnail(thumb) + + def _update_page_secondary_info(self, page, location): + secondary_info = [ + (_('Location'), i18n.to_unicode(os.path.dirname(location))), + ] + try: + stats = os.stat(location) + except OSError as e: + page.set_secondary_info(secondary_info) + return + if _has_pwd: + uid = pwd.getpwuid(stats.st_uid)[0] + else: + uid = str(stats.st_uid) + secondary_info.extend(( + (_('Size'), tools.format_byte_size(stats.st_size)), + (_('Accessed'), time.strftime('%Y-%m-%d, %H:%M:%S', + time.localtime(stats.st_atime))), + (_('Modified'), time.strftime('%Y-%m-%d, %H:%M:%S', + time.localtime(stats.st_mtime))), + (_('Permissions'), oct(stat.S_IMODE(stats.st_mode))), + (_('Owner'), uid) + )) + page.set_secondary_info(secondary_info) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/properties_page.py mcomix-2.1.0/mcomix/properties_page.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/properties_page.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/properties_page.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,93 @@ +"""properties_page.py - A page to put in the properties dialog window.""" + +from gi.repository import Gtk + +from mcomix import i18n +from mcomix import image_tools +from mcomix import labels + +class _Page(Gtk.ScrolledWindow): + + """A page to put in the Gtk.Notebook. Contains info about a file (an + image or an archive.) + """ + + def __init__(self): + super(_Page, self).__init__() + self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self._vbox = Gtk.VBox(False, 12) + self.add_with_viewport(self._vbox) + + self.set_border_width(12) + topbox = Gtk.HBox(False, 12) + self._vbox.pack_start(topbox, True, True, 0) + self._thumb = Gtk.Image() + self._thumb.set_size_request(128, 128) + topbox.pack_start(self._thumb, False, False, 0) + borderbox = Gtk.Frame() + borderbox.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + borderbox.set_size_request(-1, 130) + topbox.pack_start(borderbox, True, True, 0) + insidebox = Gtk.EventBox() + insidebox.set_border_width(1) + insidebox.set_state(Gtk.StateType.ACTIVE) + borderbox.add(insidebox) + self._insidebox = insidebox + self._mainbox = None + self._extrabox = None + self.reset() + + def reset(self): + self._thumb.clear() + if self._mainbox is not None: + self._mainbox.destroy() + self._mainbox = Gtk.VBox(False, 5) + self._mainbox.set_border_width(10) + self._insidebox.add(self._mainbox) + if self._extrabox is not None: + self._extrabox.destroy() + self._extrabox = Gtk.HBox(False, 10) + self._vbox.pack_start(self._extrabox, False, False, 0) + + def set_thumbnail(self, pixbuf): + pixbuf = image_tools.add_border(pixbuf, 1) + self._thumb.set_from_pixbuf(pixbuf) + + def set_filename(self, filename): + """Set the filename to be displayed to . Call this before + set_main_info(). + """ + label = labels.BoldLabel(i18n.to_unicode(filename)) + label.set_alignment(0, 0.5) + label.set_selectable(True) + self._mainbox.pack_start(label, False, False, 0) + self._mainbox.pack_start(Gtk.VBox(True, True, 0), True, True, 0) # Just to add space (better way?) + + def set_main_info(self, info): + """Set the information in the main info box (below the filename) to + the values in the sequence . + """ + for text in info: + label = Gtk.Label(label=text) + label.set_alignment(0, 0.5) + label.set_selectable(True) + self._mainbox.pack_start(label, False, False, 0) + + def set_secondary_info(self, info): + """Set the information below the main info box to the values in the + sequence . Each entry in info should be a tuple (desc, value). + """ + left_box = Gtk.VBox(True, 8) + right_box = Gtk.VBox(True, 8) + self._extrabox.pack_start(left_box, False, False, 0) + self._extrabox.pack_start(right_box, False, False, 0) + for desc, value in info: + desc_label = labels.BoldLabel('%s:' % desc) + desc_label.set_alignment(1.0, 1.0) + left_box.pack_start(desc_label, True, True, 0) + value_label = Gtk.Label(label=value) + value_label.set_alignment(0, 1.0) + value_label.set_selectable(True) + right_box.pack_start(value_label, True, True, 0) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/recent.py mcomix-2.1.0/mcomix/recent.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/recent.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/recent.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,79 @@ +"""recent.py - Recent files handler.""" + +import urllib.request, urllib.parse, urllib.error +from gi.repository import Gtk, GLib, GObject +import sys + +from mcomix import preferences +from mcomix import i18n +from mcomix import portability +from mcomix import archive_tools +from mcomix import image_tools +from mcomix import log + +class RecentFilesMenu(Gtk.RecentChooserMenu): + + def __init__(self, ui, window): + super(RecentFilesMenu, self).__init__() + self._window = window + self._manager = Gtk.RecentManager.get_default() + + self.set_sort_type(Gtk.RecentSortType.MRU) + self.set_show_tips(True) + # Missing icons crash GTK on Win32 + if sys.platform == 'win32': + self.set_show_icons(False) + self.set_show_numbers(True) + + rfilter = Gtk.RecentFilter() + supported_formats = {} + supported_formats.update(image_tools.get_supported_formats()) + supported_formats.update(archive_tools.get_supported_formats()) + for name in sorted(supported_formats): + mime_types, extensions = supported_formats[name] + patterns = ['*.%s' % ext for ext in extensions] + for mime in mime_types: + rfilter.add_mime_type(mime) + for pat in patterns: + rfilter.add_pattern(pat) + self.add_filter(rfilter) + + self.connect('item_activated', self._load) + + def _load(self, *args): + uri = self.get_current_uri() + path = urllib.request.url2pathname(uri[7:]) + did_file_load = self._window.filehandler.open_file(path) + + if not did_file_load: + self.remove(path) + + def count(self): + """ Returns the amount of stored entries. """ + return len(self._manager.get_items()) + + def add(self, path): + if not preferences.prefs['store recent file info']: + return + uri = portability.uri_prefix() + urllib.request.pathname2url(path) + self._manager.add_item(uri) + + def remove(self, path): + if not preferences.prefs['store recent file info']: + return + uri = portability.uri_prefix() + urllib.request.pathname2url(path) + try: + self._manager.remove_item(uri) + except GLib.GError: + # Could not remove item + pass + + def remove_all(self): + """ Removes all entries to recently opened files. """ + try: + self._manager.purge_items() + except GObject.GError as error: + log.debug(error) + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/run.py mcomix-2.1.0/mcomix/run.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/run.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/run.py 2022-12-17 12:42:38.000000000 +0000 @@ -0,0 +1,209 @@ + +import os +import sys +import optparse +import signal + +if __name__ == '__main__': + print('PROGRAM TERMINATED', file=sys.stderr) + print('Please do not run this script directly! Use mcomixstarter.py instead.', file=sys.stderr) + sys.exit(1) + +# These modules must not depend on GTK, Pillow, +# or any other optional libraries. +from mcomix import ( + constants, + log, + portability, + preferences, +) + +def wait_and_exit(): + """ Wait for the user pressing ENTER before closing. This should help + the user find possibly missing dependencies when starting, since the + Python window will not close down immediately after the error. """ + if sys.platform == 'win32' and not sys.stdin.closed and not sys.stdout.closed: + print() + input("Press ENTER to continue...") + sys.exit(1) + +def print_version(opt, value, parser, *args, **kwargs): + """Print the version number and exit.""" + print(constants.APPNAME + ' ' + constants.VERSION) + sys.exit(0) + +def parse_arguments(argv): + """ Parse the command line passed in . Returns a tuple containing + (options, arguments). Errors parsing the command line are handled in + this function. """ + + parser = optparse.OptionParser( + usage="%%prog %s" % _('[OPTION...] [PATH]'), + description=_('View images and comic book archives.'), + add_help_option=False) + parser.add_option('--help', action='help', + help=_('Show this help and exit.')) + parser.add_option('-s', '--slideshow', dest='slideshow', action='store_true', + help=_('Start the application in slideshow mode.')) + parser.add_option('-l', '--library', dest='library', action='store_true', + help=_('Show the library on startup.')) + parser.add_option('-v', '--version', action='callback', callback=print_version, + help=_('Show the version number and exit.')) + + viewmodes = optparse.OptionGroup(parser, _('View modes')) + viewmodes.add_option('-f', '--fullscreen', dest='fullscreen', action='store_true', + help=_('Start the application in fullscreen mode.')) + viewmodes.add_option('-m', '--manga', dest='manga', action='store_true', + help=_('Start the application in manga mode.')) + viewmodes.add_option('-d', '--double-page', dest='doublepage', action='store_true', + help=_('Start the application in double page mode.')) + parser.add_option_group(viewmodes) + + fitmodes = optparse.OptionGroup(parser, _('Zoom modes')) + fitmodes.add_option('-b', '--zoom-best', dest='zoommode', action='store_const', + const=constants.ZOOM_MODE_BEST, + help=_('Start the application with zoom set to best fit mode.')) + fitmodes.add_option('-w', '--zoom-width', dest='zoommode', action='store_const', + const=constants.ZOOM_MODE_WIDTH, + help=_('Start the application with zoom set to fit width.')) + fitmodes.add_option('-h', '--zoom-height', dest='zoommode', action='store_const', + const=constants.ZOOM_MODE_HEIGHT, + help=_('Start the application with zoom set to fit height.')) + parser.add_option_group(fitmodes) + + debugopts = optparse.OptionGroup(parser, _('Debug options')) + debugopts.add_option('-W', dest='loglevel', action='store', + choices=('all', 'debug', 'info', 'warn', 'error'), default='warn', + metavar='[ all | debug | info | warn | error ]', + help=_('Sets the desired output log level.')) + # This supresses an error when MComix is used with cProfile + debugopts.add_option('-o', dest='output', action='store', + default='', help=optparse.SUPPRESS_HELP) + parser.add_option_group(debugopts) + + opts, args = parser.parse_args(argv) + + # Fix up log level to use constants from log. + if opts.loglevel == 'all': + opts.loglevel = log.DEBUG + if opts.loglevel == 'debug': + opts.loglevel = log.DEBUG + if opts.loglevel == 'info': + opts.loglevel = log.INFO + elif opts.loglevel == 'warn': + opts.loglevel = log.WARNING + elif opts.loglevel == 'error': + opts.loglevel = log.ERROR + + return opts, args + +def run(): + """Run the program.""" + + # Load configuration and setup localisation. + preferences.read_preferences_file() + from mcomix import i18n + i18n.install_gettext() + + # Retrieve and parse command line arguments. + argv = portability.get_commandline_args() + opts, args = parse_arguments(argv) + + # First things first: set the log level. + log.setLevel(opts.loglevel) + + # Reconfigure stdout to replace characters that cannot be printed + if hasattr(sys.stdout, 'reconfigure'): + sys.stdout.reconfigure(errors='replace') + + # Check for PyGTK and PIL dependencies. + try: + from gi import require_version + + require_version('PangoCairo', '1.0') + require_version('Gtk', '3.0') + require_version('Gdk', '3.0') + + from gi.repository import Gdk, Gtk, GObject + + GObject.threads_init() + + except AssertionError: + log.error( _("You do not have the required versions of GTK+ 3.0 and PyGObject installed.") ) + wait_and_exit() + + except ImportError: + log.error( _('No version of GObject was found on your system.') ) + log.error( _('This error might be caused by missing GTK+ libraries.') ) + wait_and_exit() + + try: + import PIL.Image + + if PIL.__version__ < '6.0.0': + log.error( _("You don't have the required version of the Python Imaging Library Fork (Pillow) installed.")) + log.error( _('Installed Pillow version is: %s') % PIL.__version__ ) + log.error( _('Required Pillow version is: 6.0.0 or higher') ) + wait_and_exit() + + except ImportError: + log.error( _('Python Imaging Library Fork (Pillow) 6.0.0 or higher is required.') ) + log.error( _('No version of the Python Imaging Library was found on your system.') ) + wait_and_exit() + + if not os.path.exists(constants.DATA_DIR): + os.makedirs(constants.DATA_DIR, 0o700) + + if not os.path.exists(constants.CONFIG_DIR): + os.makedirs(constants.CONFIG_DIR, 0o700) + + from mcomix import icons + icons.load_icons() + + open_path = None + open_page = 1 + if len(args) == 1: + open_path = args[0] + elif len(args) > 1: + open_path = args + + elif preferences.prefs['auto load last file'] \ + and preferences.prefs['path to last file'] \ + and os.path.isfile(preferences.prefs['path to last file']): + open_path = preferences.prefs['path to last file'] + open_page = preferences.prefs['page of last file'] + + # Some languages require a RTL layout + if preferences.prefs['language'] in ('he', 'fa'): + Gtk.widget_set_default_direction(Gtk.TextDirection.RTL) + + Gdk.set_program_class(constants.APPNAME) + + settings = Gtk.Settings.get_default() + # Enable icons for menu items. + settings.props.gtk_menu_images = True + + from mcomix import main + window = main.MainWindow(fullscreen = opts.fullscreen, is_slideshow = opts.slideshow, + show_library = opts.library, manga_mode = opts.manga, + double_page = opts.doublepage, zoom_mode = opts.zoommode, + open_path = open_path, open_page = open_page) + main.set_main_window(window) + + if 'win32' != sys.platform: + # Add a SIGCHLD handler to reap zombie processes. + def on_sigchld(signum, frame): + try: + os.waitpid(-1, os.WNOHANG) + except OSError: + pass + signal.signal(signal.SIGCHLD, on_sigchld) + + for sig in (signal.SIGINT, signal.SIGTERM): + signal.signal(sig, lambda signum, stack: GObject.idle_add(window.terminate_program)) + try: + Gtk.main() + except KeyboardInterrupt: # Will not always work because of threading. + window.terminate_program() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/scrolling.py mcomix-2.1.0/mcomix/scrolling.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/scrolling.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/scrolling.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,263 @@ +""" Smart scrolling. """ + +from mcomix import tools +from mcomix import constants +from mcomix import box +import math + + +class Scrolling(object): + + def __init__(self): + self.clear_cache() + + + def scroll_smartly(self, content_box, viewport_box, orientation, max_scroll, + axis_map=None): + """ Returns a new viewport position when reading forwards using + the given orientation. If there is no space left to go, the empty + list is returned. Note that all params are lists of ints (except + max_scroll which might also contain floats) where each index + corresponds to one dimension. The lower the index, the faster the + corresponding position changes when reading. If you need to override + this behavior, use the optional axis_map. + @param content_box: The Box of the content to display. + @param viewport_box: The viewport Box we are looking through. + @param orientation: The orientation which shows where "forward" + points to. Either 1 (towards larger values in this dimension when + reading) or -1 (towards smaller values in this dimension when reading). + Note that you can emulate "reading backwards" by flipping the sign + of this argument. + @param max_scroll: The maximum number of pixels to scroll in one step. + (Floats allowed.) + @param axis_map: The index of the dimension to modify. + @return: A new viewport_position if you can read further or the + empty list if there is nothing left to read. """ + # Translate content and viewport so that content position equals origin + offset = content_box.get_position() + content_size = content_box.get_size() + viewport_position = tools.vector_sub(viewport_box.get_position(), offset) + viewport_size = viewport_box.get_size() + # Remap axes + if axis_map is not None: + content_size, viewport_size, viewport_position, orientation, \ + max_scroll = Scrolling._map_remap_axes([content_size, + viewport_size, viewport_position, orientation, max_scroll], + axis_map) + + result = list(viewport_position) + carry = True + reset_all_axes = False + for i in range(len(content_size)): + invisible_size = content_size[i] - viewport_size[i] + o = orientation[i] + # Find a nice starting point + if o == 1: + if viewport_position[i] < 0: + result[i] = 0 + carry = False + if viewport_position[i] <= -viewport_size[i]: + reset_all_axes = True + break + else: # o == -1 + if viewport_position[i] > invisible_size: + result[i] = invisible_size + carry = False + if viewport_position[i] > content_size[i]: + reset_all_axes = True + break + if reset_all_axes: + # We don't see anything at all because we are somewhere way before + # the content box. Let's go to it. + for i in range(len(content_size)): + invisible_size = content_size[i] - viewport_size[i] + o = orientation[i] + if o == 1: + result[i] = 0 + else: # o == -1 + result[i] = invisible_size + + # This code is somewhat similar to a simple ripple-carry adder. + if carry: + for i in range(len(content_size)): + invisible_size = content_size[i] - viewport_size[i] + o = orientation[i] + ms = min(max_scroll[i], invisible_size) + # Let's calculate the grid we want to snap to. + if ms != 0: + steps_to_take = int(math.ceil(float(invisible_size) / ms)) + if ms == 0 or steps_to_take >= invisible_size: + # special case: We MUST go forward by at least 1 pixel. + if o >= 0: + result[i] += 1 + carry = result[i] > invisible_size + if carry: + result[i] = 0 + continue + else: + result[i] -= 1 + carry = result[i] < 0 + if carry: + result[i] = invisible_size + continue + break + # If orientation is -1, we need to round half up instead of + # half down. + positions = self._cached_bs(invisible_size, steps_to_take, o == -1) + + # Where are we now (according to the grid)? + index = tools.bin_search(positions, viewport_position[i]) + + if index < 0: + # We're somewhere between two valid grid points, so + # let's go to the next one. + index = ~index + if o >= 0: + # index tends to be greater, so we need to go back + # manually, if needed. + index -= 1 + # Let's go to where we're headed for. + index += o + + carry = index < 0 or index >= len(positions) + if carry: + # There is no space left in this dimension, so let's go + # back in this one and one step forward in the next one. + result[i] = 0 if o > 0 else invisible_size + else: + # We found a valid grid point in this dimension, so let's + # stop here. + result[i] = positions[index] + break + if carry: + # No space left. + return [] + + # Undo axis remapping, if any + if axis_map is not None: + result = Scrolling._remap_axes(result, + Scrolling._inverse_axis_map(axis_map)) + + return tools.vector_add(result, offset) + + + def scroll_to_predefined(self, content_box, viewport_box, orientation, + destination): + """ Returns a new viewport position when scrolling towards a + predefined destination. Note that all params are lists of integers + where each index corresponds to one dimension. + @param content_box: The Box of the content to display. + @param viewport_box: The viewport Box we are looking through. + @param orientation: The orientation which shows where "forward" + points to. Either 1 (towards larger values in this dimension when + reading) or -1 (towards smaller values in this dimension when reading). + @param destination: An integer representing a predefined destination. + Either 1 (towards the greatest possible values in this dimension), + -1 (towards the smallest value in this dimension), 0 (keep position), + SCROLL_TO_CENTER (scroll to the center of the content in this + dimension), SCROLL_TO_START (scroll to where the content starts in this + dimension) or SCROLL_TO_END (scroll to where the content ends in this + dimension). + @return: A new viewport position as specified above. """ + content_position = content_box.get_position() + content_size = content_box.get_size() + viewport_size = viewport_box.get_size() + result = list(viewport_box.get_position()) + for i in range(len(content_size)): + o = orientation[i] + d = destination[i] + if d == 0: + continue + if d < constants.SCROLL_TO_END or d > 1: + raise ValueError("invalid destination " + d + " at index "+ i) + if d == constants.SCROLL_TO_END: + d = o + if d == constants.SCROLL_TO_START: + d = -o + c = content_size[i] + v = viewport_size[i] + invisible_size = c - v + result[i] = content_position[i] + (box.Box._box_to_center_offset_1d( + invisible_size, o) if d == constants.SCROLL_TO_CENTER + else invisible_size if d == 1 + else 0) # if d == -1 + return result + + + def _cached_bs(self, num, denom, half_up): + """ A simple (and ugly) caching mechanism used to avoid + recomputations. The current implementation offers a cache with + only two entries so it's only useful for the two "fastest" + dimensions. """ + if (self._cache0[0] != num or + self._cache0[1] != denom or + self._cache0[2] != half_up): + self._cache0, self._cache1 = self._cache1, self._cache0 + if (self._cache0[0] != num or + self._cache0[1] != denom or + self._cache0[2] != half_up): + self._cache0 = (num, denom, half_up, + Scrolling._bresenham_sums(num, denom, half_up)) + return self._cache0[3] + + + def clear_cache(self): + """ Clears all caches that are used internally. """ + self._cache0 = (0, 0, False, []) + self._cache1 = (0, 0, False, []) + + + @staticmethod + def _bresenham_sums(num, denom, half_up): + """ This algorithm is derived from Bresenham's line algorithm in + order to distribute the remainder of num/denom equally. See + https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm for details. + """ + if num < 0: + raise ValueError("num < 0") + if denom < 1: + raise ValueError("denom < 1") + quotient = num // denom + remainder = num % denom + needs_up = half_up and (remainder != 0) and ((denom & 1) == 0) + up_flag = False + error = denom >> 1 + result = [0] + partial_sum = 0 + for i in range(denom): + error -= remainder + if error < 0: + error += denom + partial_sum += quotient + 1 + else: + partial_sum += quotient + + # round half up, if necessary + if up_flag: + partial_sum -= 1 + up_flag = False + elif needs_up and error == 0: + partial_sum += 1 + up_flag = True + + result.append(partial_sum) + return result + + + @staticmethod + def _remap_axes(vector, order): + return [vector[i] for i in order] + + + @staticmethod + def _map_remap_axes(vectors, order): + return [Scrolling._remap_axes(v, order) for v in vectors] + + + @staticmethod + def _inverse_axis_map(order): + identity = list(range(len(order))) + return [identity[order[i]] for i in identity] + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/slideshow.py mcomix-2.1.0/mcomix/slideshow.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/slideshow.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/slideshow.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,60 @@ +"""slideshow.py - Slideshow handler.""" + +from gi.repository import Gtk +from gi.repository import GObject + +from mcomix.preferences import prefs + +class Slideshow(object): + + """Slideshow handler that manages starting and stopping of slideshows.""" + + def __init__(self, window): + self._window = window + self._running = False + self._id = None + + def _start(self): + if not self._running: + self._id = GObject.timeout_add(prefs['slideshow delay'], self._next) + self._running = True + self._window.update_title() + + def _stop(self): + if self._running: + GObject.source_remove(self._id) + self._running = False + self._window.update_title() + + def _next(self): + if prefs['number of pixels to scroll per slideshow event'] != 0: + + self._window.scroll_with_flipping(0, prefs['number of pixels to scroll per slideshow event']) + else: + self._window.flip_page(+1) + + return True + + def toggle(self, action): + """Toggle a slideshow on or off.""" + if action.get_active(): + self._start() + self._window.uimanager.get_widget('/Tool/slideshow').set_stock_id( Gtk.STOCK_MEDIA_STOP ) + self._window.uimanager.get_widget('/Tool/slideshow').set_tooltip_text( _('Stop slideshow') ) + else: + self._stop() + self._window.uimanager.get_widget('/Tool/slideshow').set_stock_id( Gtk.STOCK_MEDIA_PLAY ) + self._window.uimanager.get_widget('/Tool/slideshow').set_tooltip_text( _('Start slideshow') ) + + def is_running(self): + """Return True if a slideshow is currently running.""" + return self._running + + def update_delay(self): + """Update the delay time a started slideshow is using.""" + if self.is_running(): + self._stop() + self._start() + + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/status.py mcomix-2.1.0/mcomix/status.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/status.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/status.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,259 @@ +"""status.py - Statusbar for main window.""" + +from gi.repository import Gdk, Gtk + +from mcomix import i18n +from mcomix import constants +from mcomix.preferences import prefs + +class Statusbar(Gtk.EventBox): + + SPACING = 5 + + def __init__(self): + super(Statusbar, self).__init__() + + self._loading = True + + # Status text, page number, file number, resolution, path, filename, filesize + self.status = Gtk.Statusbar() + self.add(self.status) + + # Create popup menu for enabling/disabling status boxes. + self.ui_manager = Gtk.UIManager() + self.tooltipstatus = TooltipStatusHelper(self.ui_manager, self.status) + ui_description = """ + + + + + + + + + + + """ + self.ui_manager.add_ui_from_string(ui_description) + + actiongroup = Gtk.ActionGroup('mcomix-statusbar') + actiongroup.add_toggle_actions([ + ('pagenumber', None, _('Show page numbers'), None, None, + self.toggle_status_visibility), + ('filenumber', None, _('Show file numbers'), None, None, + self.toggle_status_visibility), + ('resolution', None, _('Show resolution'), None, None, + self.toggle_status_visibility), + ('rootpath', None, _('Show path'), None, None, + self.toggle_status_visibility), + ('filename', None, _('Show filename'), None, None, + self.toggle_status_visibility), + ('filesize', None, _('Show filesize'), None, None, + self.toggle_status_visibility)]) + self.ui_manager.insert_action_group(actiongroup, 0) + + # Hook mouse release event + self.connect('button-release-event', self._button_released) + self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK) + + # Default status information + self._page_info = '' + self._file_info = '' + self._resolution = '' + self._root = '' + self._filename = '' + self._filesize = '' + self._update_sensitivity() + self.show_all() + + self._loading = False + + def set_message(self, message): + """Set a specific message (such as an error message) on the statusbar, + replacing whatever was there earlier. + """ + self.status.pop(0) + self.status.push(0, " " * Statusbar.SPACING + message) + + def set_page_number(self, page, total, this_screen): + """Update the page number.""" + page_info = "" + for i in range(this_screen): + page_info += '%d' % (page + i) + if i < this_screen - 1: + page_info +=',' + page_info += ' / %d' % total + self._page_info = page_info + + def get_page_number(self): + """Returns the bar's page information.""" + return self._page_info + + def set_file_number(self, fileno, total): + """Updates the file number (i.e. number of current file/total + files loaded).""" + if total > 0: + self._file_info = '(%d / %d)' % (fileno, total) + else: + self._file_info = '' + + def get_file_number(self): + """ Returns the bar's file information.""" + return self._file_info + + def set_resolution(self, dimensions): # 2D only + """Update the resolution data. + + Takes an iterable of tuples, (x, y, scale, distorted), describing the + original resolution of an image as well as the currently displayed + scale and whether scaling was done irrespective of aspect ratio, + resulting in a distorted image. + """ + resolution = "" + for i in range(len(dimensions)): + d = dimensions[i] + resolution += '%dx%d (%.1f%%%s)' % (d[0], d[1], d[2] * 100.0, + "*" if d[3] else "") + if i < len(dimensions) - 1: + resolution += ', ' + self._resolution = resolution + + def set_root(self, root): + """Set the name of the root (directory or archive).""" + self._root = i18n.to_unicode(root) + + def set_filename(self, filename): + """Update the filename.""" + self._filename = i18n.to_unicode(filename) + + def set_filesize(self, size): + """Update the filesize.""" + if size is None: + size = "" + self._filesize = size + + def update(self): + """Set the statusbar to display the current state.""" + + space = " " * Statusbar.SPACING + text = (space + "|" + space).join(self._get_status_text()) + self.status.pop(0) + self.status.push(0, space + text) + + def push(self, context_id, message): + """ Compatibility with Gtk.Statusbar. """ + assert context_id >= 0 + self.status.push(context_id + 1, message) + + def pop(self, context_id): + """ Compatibility with Gtk.Statusbar. """ + assert context_id >= 0 + self.status.pop(context_id + 1) + + def _get_status_text(self): + """ Returns an array of text fields that should be displayed. """ + fields = [] + + if prefs['statusbar fields'] & constants.STATUS_PAGE: + fields.append(self._page_info) + if prefs['statusbar fields'] & constants.STATUS_FILENUMBER: + fields.append(self._file_info) + if prefs['statusbar fields'] & constants.STATUS_RESOLUTION: + fields.append(self._resolution) + if prefs['statusbar fields'] & constants.STATUS_PATH: + fields.append(self._root) + if prefs['statusbar fields'] & constants.STATUS_FILENAME: + fields.append(self._filename) + if prefs['statusbar fields'] & constants.STATUS_FILESIZE: + fields.append(self._filesize) + + return fields + + def toggle_status_visibility(self, action, *args): + """ Called when status entries visibility is to be changed. """ + + # Ignore events as long as control is still loading. + if self._loading: + return + + actionname = action.get_name() + if actionname == 'pagenumber': + bit = constants.STATUS_PAGE + elif actionname == 'resolution': + bit = constants.STATUS_RESOLUTION + elif actionname == 'rootpath': + bit = constants.STATUS_PATH + elif actionname == 'filename': + bit = constants.STATUS_FILENAME + elif actionname == 'filenumber': + bit = constants.STATUS_FILENUMBER + elif actionname == 'filesize': + bit = constants.STATUS_FILESIZE + + if action.get_active(): + prefs['statusbar fields'] |= bit + else: + prefs['statusbar fields'] &= ~bit + + self.update() + self._update_sensitivity() + + def _button_released(self, widget, event, *args): + """ Triggered when a mouse button is released to open the context + menu. """ + if event.button == 3: + self.ui_manager.get_widget('/Statusbar').popup(None, None, None, None, + event.button, event.time) + + def _update_sensitivity(self): + """ Updates the action menu's sensitivity based on user preferences. """ + + page_visible = prefs['statusbar fields'] & constants.STATUS_PAGE + fileno_visible = prefs['statusbar fields'] & constants.STATUS_FILENUMBER + resolution_visible = prefs['statusbar fields'] & constants.STATUS_RESOLUTION + path_visible = prefs['statusbar fields'] & constants.STATUS_PATH + filename_visible = prefs['statusbar fields'] & constants.STATUS_FILENAME + filesize_visible = prefs['statusbar fields'] & constants.STATUS_FILESIZE + + for name, visible in (('pagenumber', page_visible), + ('filenumber', fileno_visible), + ('resolution', resolution_visible), + ('rootpath', path_visible), + ('filename', filename_visible), + ('filesize', filesize_visible)): + action = self.ui_manager.get_action('/Statusbar/' + name) + action.set_active(visible) + + +class TooltipStatusHelper(object): + """ Attaches to a L{Gtk.UIManager} to provide statusbar tooltips when + selecting menu items. """ + + def __init__(self, uimanager, statusbar): + self._statusbar = statusbar + + uimanager.connect('connect-proxy', self._on_connect_proxy) + uimanager.connect('disconnect-proxy', self._on_disconnect_proxy) + + def _on_connect_proxy(self, uimgr, action, widget): + """ Connects the widget's selection handlers to the status bar update. + """ + tooltip = action.get_property('tooltip') + if isinstance(widget, Gtk.MenuItem) and tooltip: + cid = widget.connect('select', self._on_item_select, tooltip) + cid2 = widget.connect('deselect', self._on_item_deselect) + setattr(widget, 'app::connect-ids', (cid, cid2)) + + def _on_disconnect_proxy(self, uimgr, action, widget): + """ Disconnects the widget's selection handlers. """ + cids = getattr(widget, 'app::connect-ids', ()) + for cid in cids: + widget.disconnect(cid) + + def _on_item_select(self, menuitem, tooltip): + self._statusbar.push(0, " " * Statusbar.SPACING + tooltip) + + def _on_item_deselect(self, menuitem): + self._statusbar.pop(0) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/strings.py mcomix-2.1.0/mcomix/strings.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/strings.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/strings.py 2022-01-25 11:11:36.000000000 +0000 @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +""" strings.py - Constant strings that need internationalization. + This file should only be imported after gettext has been correctly initialized + and installed in the global namespace. """ + +from mcomix.constants import ZIP, RAR, TAR, GZIP, BZIP2, XZ, PDF, SEVENZIP, LHA, ZIP_EXTERNAL + +ARCHIVE_DESCRIPTIONS = { + ZIP : _('ZIP archive'), + RAR : _('RAR archive'), + TAR : _('Tar archive'), + GZIP : _('Gzip compressed tar archive'), + BZIP2 : _('Bzip2 compressed tar archive'), + XZ : _('XZ compressed tar archive'), + PDF : _('PDF document'), + SEVENZIP : _('7z archive'), + LHA : _('LHA archive'), + ZIP_EXTERNAL: _('ZIP archive'), + } + +AUTHORS = ( + ('Pontus Ekberg', _('Original vision/developer of Comix')), + ('Louis Casillas', _('MComix developer')), + ('Moritz Brunner', _('MComix developer')), + ('Ark', _('MComix developer')), + ('Benoit Pierre', _('MComix developer')), + ) +TRANSLATORS = ( + ('Emfox Zhou', _('Simplified Chinese translation')), + ('Xie Yanbo', _('Simplified Chinese translation')), + ('Zach Cheung', _('Simplified Chinese translation')), + ('Manuel Quiñones', _('Spanish translation')), + ('Carlos Feliu', _('Spanish translation')), + ('Marcelo Góes', _('Brazilian Portuguese translation')), + ('Christoph Wolk', _('German translation and Nautilus thumbnailer')), + ('Chris Leick', _('German translation')), + ('Raimondo Giammanco', _('Italian translation')), + ('Giovanni Scafora', _('Italian translation')), + ('GhePeU', _('Italian translation')), + ('Arthur Nieuwland', _('Dutch translation')), + ('Achraf Cherti', _('French translation')), + ('Benoît H.', _('French translation')), + ('Joseph M. Sleiman', _('French translation')), + ('Frédéric Chateaux', _('French translation')), + ('Kamil Leduchowski', _('Polish translatin')), + ('Darek Jakoniuk', _('Polish translation')), + ('Paul Chatzidimitriou', _('Greek translation')), + ('Carles Escrig Royo', _('Catalan translation')), + ('Hsin-Lin Cheng', _('Traditional Chinese translation')), + ('Wayne Su', _('Traditional Chinese translation')), + ('Mamoru Tasaka', _('Japanese translation')), + ('Keita Haga', _('Japanese translation')), + ('Toshiharu Kudoh', _('Japanese translation')), + ('Ernő Drabik', _('Hungarian translation')), + ('Artyom Smirnov', _('Russian translation')), + ('Евгений Лежнин', _('Russian translation')), + ('Adrian C.', _('Croatian translation')), + ('김민기', _('Korean translation')), + ('Gyeongmin Bak', _('Korean translation')), + ('Minho Jeung', _('Korean translation')), + ('Maryam Sanaat', _('Persian translation')), + ('Andhika Padmawan', _('Indonesian translation')), + ('Jan Nekvasil', _('Czech translation')), + ('Олександр Заяц', _('Ukrainian translation')), + ('Roxerio Roxo Carrillo', _('Galician translation')), + ('Martin Karlsson', _('Swedish translation')), + ('Jonatan Nyberg', _('Swedish translation')), + ('Isratine Citizen', _('Hebrew translation')), + ('Zygi Mantus', _('Lithuanian translation')), + ) +ARTISTS = ( + ('Victor Castillejo', _('Icon design')), + ) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/thumbbar.py mcomix-2.1.0/mcomix/thumbbar.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/thumbbar.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/thumbbar.py 2022-02-14 05:39:43.000000000 +0000 @@ -0,0 +1,275 @@ +"""thumbbar.py - Thumbnail sidebar for main window.""" + +import urllib.request, urllib.parse, urllib.error +from gi.repository import GObject, Gdk, GdkPixbuf, Gtk +import cairo + +from mcomix.preferences import prefs +from mcomix import image_tools +from mcomix import tools +from mcomix import constants +from mcomix import thumbnail_view + + +class ThumbnailSidebar(Gtk.ScrolledWindow): + + """A thumbnail sidebar including scrollbar for the main window.""" + + # Thumbnail border width in pixels. + _BORDER_SIZE = 1 + + def __init__(self, window): + super(ThumbnailSidebar, self).__init__() + + self._window = window + #: Thumbnail load status + self._loaded = False + #: Selected row in treeview + self._currently_selected_row = 0 + + self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) + self.get_vadjustment().step_increment = 15 + self.get_vadjustment().page_increment = 1 + # Disable stupid overlay scrollbars... + if hasattr(self.props, 'overlay_scrolling'): + self.props.overlay_scrolling = False + + # models - contains data + self._thumbnail_liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, bool) + + # view - responsible for laying out the columns + self._treeview = thumbnail_view.ThumbnailTreeView( + self._thumbnail_liststore, + 0, # UID + 1, # pixbuf + 2, # status + ) + self._treeview.set_headers_visible(False) + self._treeview.generate_thumbnail = self._generate_thumbnail + self._treeview.set_activate_on_single_click(True) + + self._treeview.connect_after('drag_begin', self._drag_begin) + self._treeview.connect('drag_data_get', self._drag_data_get) + self._treeview.connect('row-activated', self._row_activated_event) + self._treeview.connect('button_press_event', self._mouse_press_event) + + + # enable drag and dropping of images from thumbnail bar to some file + # manager + self._treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, + [('text/uri-list', 0, 0)], Gdk.DragAction.COPY) + + # Page column + self._thumbnail_page_treeviewcolumn = Gtk.TreeViewColumn(None) + self._treeview.append_column(self._thumbnail_page_treeviewcolumn) + self._text_cellrenderer = Gtk.CellRendererText() + # Right align page numbers. + self._text_cellrenderer.set_property('xalign', 1.0) + self._thumbnail_page_treeviewcolumn.set_sizing(Gtk.TreeViewColumnSizing.FIXED) + self._thumbnail_page_treeviewcolumn.pack_start(self._text_cellrenderer, False) + self._thumbnail_page_treeviewcolumn.add_attribute(self._text_cellrenderer, 'text', 0) + self._thumbnail_page_treeviewcolumn.set_visible(False) + + # Pixbuf column + self._thumbnail_image_treeviewcolumn = Gtk.TreeViewColumn(None) + self._treeview.append_column(self._thumbnail_image_treeviewcolumn) + self._pixbuf_cellrenderer = Gtk.CellRendererPixbuf() + self._thumbnail_image_treeviewcolumn.set_sizing(Gtk.TreeViewColumnSizing.FIXED) + self._thumbnail_image_treeviewcolumn.set_fixed_width(self._pixbuf_size) + self._thumbnail_image_treeviewcolumn.pack_start(self._pixbuf_cellrenderer, True) + self._thumbnail_image_treeviewcolumn.add_attribute(self._pixbuf_cellrenderer, 'pixbuf', 1) + + self._treeview.set_fixed_height_mode(True) + self._treeview.set_can_focus(False) + + self.add(self._treeview) + self.change_thumbnail_background_color(prefs['thumb bg colour']) + self.show_all() + + self._window.page_changed += self._on_page_change + self._window.imagehandler.page_available += self._on_page_available + + def toggle_page_numbers_visible(self): + """ Enables or disables page numbers on the thumbnail bar. """ + + visible = prefs['show page numbers on thumbnails'] + if visible: + number_of_pages = self._window.imagehandler.get_number_of_pages() + number_of_digits = tools.number_of_digits(number_of_pages) + self._text_cellrenderer.set_property('width-chars', number_of_digits + 1) + w = self._text_cellrenderer.get_preferred_size(self._treeview)[1].width + self._thumbnail_page_treeviewcolumn.set_fixed_width(w) + self._thumbnail_page_treeviewcolumn.set_visible(visible) + + def get_width(self): + """Return the width in pixels of the ThumbnailSidebar.""" + return self.size_request().width + + def show(self, *args): + """Show the ThumbnailSidebar.""" + self.load_thumbnails() + super(ThumbnailSidebar, self).show() + + def hide(self): + """Hide the ThumbnailSidebar.""" + super(ThumbnailSidebar, self).hide() + self._treeview.stop_update() + + def clear(self): + """Clear the ThumbnailSidebar of any loaded thumbnails.""" + + self._loaded = False + self._treeview.stop_update() + self._thumbnail_liststore.clear() + self._currently_selected_page = 0 + + def resize(self): + """Reload the thumbnails with the size specified by in the + preferences. + """ + self.clear() + self._thumbnail_image_treeviewcolumn.set_fixed_width(self._pixbuf_size) + self.load_thumbnails() + + def change_thumbnail_background_color(self, colour): + """ Changes the background color of the thumbnail bar. """ + + self.set_thumbnail_background(colour) + # Force a redraw of the widget. + self._treeview.queue_draw() + + def set_thumbnail_background(self, color): + + rgba = Gdk.RGBA(*image_tools.color_to_floats_rgba(color)) + self._pixbuf_cellrenderer.set_property('cell-background-rgba', rgba) + self._text_cellrenderer.set_property('background-rgba', rgba) + fg_color = image_tools.text_color_for_background_color(color) + fg_rgba = Gdk.RGBA(*(fg_color.to_floats() + (1.0,))) + self._text_cellrenderer.set_property('foreground-rgba', fg_rgba) + + @property + def _pixbuf_size(self): + # Don't forget the extra pixels for the border! + return prefs['thumbnail size'] + 2 * self._BORDER_SIZE + + def load_thumbnails(self): + """Load the thumbnails, if it is appropriate to do so.""" + + if (not self._window.filehandler.file_loaded or + self._window.imagehandler.get_number_of_pages() == 0 or + self._loaded): + return + + self.toggle_page_numbers_visible() + + # Detach model for performance reasons + model = self._treeview.get_model() + self._treeview.set_model(None) + + # Create empty preview thumbnails. + filler = self._get_empty_thumbnail() + for row in range(self._window.imagehandler.get_number_of_pages()): + self._thumbnail_liststore.append((row + 1, filler, False)) + + self._loaded = True + + # Re-attach model + self._treeview.set_model(model) + + # Update current image selection in the thumb bar. + self._set_selected_row(self._currently_selected_row) + + def _generate_thumbnail(self, uid): + """ Generate the pixbuf for C{path} at demand. """ + assert isinstance(uid, int) + page = uid + pixbuf = self._window.imagehandler.get_thumbnail(page, + prefs['thumbnail size'], prefs['thumbnail size'], nowait=True) + if pixbuf is not None: + pixbuf = image_tools.add_border(pixbuf, self._BORDER_SIZE) + + return pixbuf + + def _set_selected_row(self, row, scroll=True): + """Set currently selected row. + If is True, the tree is automatically + scrolled to ensure the selected row is visible. + """ + self._currently_selected_row = row + self._treeview.get_selection().select_path(row) + if self._loaded and scroll: + self._treeview.scroll_to_cell(row, use_align=True, row_align=0.25) + + def _get_selected_row(self): + """Return the index of the currently selected row.""" + try: + return self._treeview.get_selection().get_selected_rows()[1][0][0] + + except IndexError: + return 0 + + def _row_activated_event(self, treeview, path, column): + """Handle events due to changed thumbnail selection.""" + selected_row = self._get_selected_row() + self._set_selected_row(selected_row, scroll=False) + self._window.set_page(selected_row + 1) + + def _mouse_press_event(self, widget, event): + if self._window.was_out_of_focus: + # if the window was out of focus and the user clicks on + # the thumbbar then do not select that page because they + # more than likely have many pages open and are simply trying + # to give mcomix focus again + return True + return False + + def _drag_data_get(self, treeview, context, selection, *args): + """Put the URI of the selected file into the SelectionData, so that + the file can be copied (e.g. to a file manager). + """ + + selected = self._get_selected_row() + path = self._window.imagehandler.get_path_to_page(selected + 1) + uri = 'file://localhost' + urllib.request.pathname2url(path) + selection.set_uris([uri]) + + def _drag_begin(self, treeview, context): + """We hook up on drag_begin events so that we can set the hotspot + for the cursor at the top left corner of the thumbnail (so that we + might actually see where we are dropping!). + """ + path = treeview.get_cursor()[0] + surface = treeview.create_row_drag_icon(path) + # Because of course a cairo.Win32Surface does not have + # get_width/get_height, that would be to easy... + cr = cairo.Context(surface) + x1, y1, x2, y2 = cr.clip_extents() + width, height = x2 - x1, y2 - y1 + pixbuf = Gdk.pixbuf_get_from_surface(surface, 0, 0, width, height) + Gtk.drag_set_icon_pixbuf(context, pixbuf, -5, -5) + + def _get_empty_thumbnail(self): + """ Create an empty filler pixmap. """ + pixbuf = GdkPixbuf.Pixbuf.new(colorspace=GdkPixbuf.Colorspace.RGB, + has_alpha=True, + bits_per_sample=8, + width=self._pixbuf_size, + height=self._pixbuf_size) + + # Make the pixbuf transparent. + pixbuf.fill(0) + + return pixbuf + + def _on_page_change(self): + row = self._window.imagehandler.get_current_page() - 1 + if row == self._currently_selected_row: + return + self._set_selected_row(row) + + def _on_page_available(self, page): + """ Called whenever a new page is ready for display. """ + if self.get_visible(): + self._treeview.draw_thumbnails_on_screen() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/thumbnail_tools.py mcomix-2.1.0/mcomix/thumbnail_tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/thumbnail_tools.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/thumbnail_tools.py 2022-12-17 12:42:38.000000000 +0000 @@ -0,0 +1,299 @@ +"""thumbnail.py - Thumbnail module for MComix implementing (most of) the +freedesktop.org "standard" at http://jens.triq.net/thumbnail-spec/ +""" + +import os +import re +import shutil +import tempfile +import mimetypes +import threading +import itertools +import traceback +import locale +import PIL.Image as Image +from urllib.request import pathname2url + +try: # The md5 module is deprecated as of Python 2.5, replaced by hashlib. + from hashlib import md5 +except ImportError: + from md5 import new as md5 + +from mcomix.preferences import prefs +from mcomix import archive_extractor +from mcomix import constants +from mcomix import archive_tools +from mcomix import tools +from mcomix import image_tools +from mcomix import portability +from mcomix import i18n +from mcomix import callback +from mcomix import log + + +class Thumbnailer(object): + """ The Thumbnailer class is responsible for managing MComix + internal thumbnail creation. Depending on its settings, + it either stores thumbnails on disk and retrieves them later, + or simply creates new thumbnails each time it is called. """ + + def __init__(self, dst_dir=constants.THUMBNAIL_PATH, store_on_disk=None, + size=None, force_recreation=False, archive_support=False): + """ + set the thumbnailer's storage directory. + + If on disk is True, it changes the thumbnailer's + behaviour to store files on disk, or just create new thumbnails each + time it was called when set to False. Defaults to the 'create + thumbnails' preference if not set. + + The dimensions for the created thumbnails is set by , a (width, + height) tupple. Defaults to the 'thumbnail size' preference if not set. + + If is True, thumbnails stored on disk + will always be re-created instead of being re-used. + + If is True, support for archive thumbnail creation + (based on cover detection) is enabled. Otherwise, only image files are + supported. + """ + self.dst_dir = dst_dir + if store_on_disk is None: + self.store_on_disk = prefs['create thumbnails'] + else: + self.store_on_disk = store_on_disk + if size is None: + self.width = self.height = prefs['thumbnail size'] + self.default_sizes = True + else: + self.width, self.height = size + self.default_sizes = False + self.force_recreation = force_recreation + self.archive_support = archive_support + + def thumbnail(self, filepath, threaded=False): + """ Returns a thumbnail pixbuf for , transparently handling + both normal image files and archives. If a thumbnail file already exists, + it is re-used. Otherwise, a new thumbnail is created from . + + Returns None if thumbnail creation failed, or if the thumbnail creation + is run asynchrounosly. """ + + # Update width and height from preferences if they haven't been set explicitly + if self.default_sizes: + self.width = prefs['thumbnail size'] + self.height = prefs['thumbnail size'] + + if self._thumbnail_exists(filepath): + thumbpath = self._path_to_thumbpath(filepath) + pixbuf = image_tools.load_pixbuf(thumbpath) + self.thumbnail_finished(filepath, pixbuf) + return pixbuf + + else: + if threaded: + thread = threading.Thread(target=self._create_thumbnail, args=(filepath,)) + thread.name += '-thumbnailer' + thread.setDaemon(True) + thread.start() + return None + else: + return self._create_thumbnail(filepath) + + @callback.Callback + def thumbnail_finished(self, filepath, pixbuf): + """ Called every time a thumbnail has been completed. + is the file that was used as source, is the + resulting thumbnail. """ + + pass + + def delete(self, filepath): + """ Deletes the thumbnail for (if it exists) """ + thumbpath = self._path_to_thumbpath(filepath) + if os.path.isfile(thumbpath): + try: + os.remove(thumbpath) + except IOError as error: + log.error(_("! Could not remove file \"%s\""), thumbpath) + log.error(error) + + def _create_thumbnail_pixbuf(self, filepath): + """ Creates a thumbnail pixbuf from , and returns it as a + tuple along with a file metadata dictionary: (pixbuf, tEXt_data) """ + + if self.archive_support: + mime = archive_tools.archive_mime_type(filepath) + else: + mime = None + if mime is not None: + cleanup = [] + try: + tmpdir = tempfile.mkdtemp(prefix='mcomix_archive_thumb.') + cleanup.append(lambda: shutil.rmtree(tmpdir, True)) + archive = archive_tools.get_recursive_archive_handler(filepath, + tmpdir, + type=mime) + if archive is None: + return None, None + cleanup.append(archive.close) + files = archive.list_contents() + wanted = self._guess_cover(files) + if wanted is None: + return None, None + + archive.extract(wanted, tmpdir) + + image_path = os.path.join(tmpdir, wanted) + if not os.path.isfile(image_path): + return None, None + + pixbuf = image_tools.load_pixbuf_size(image_path, self.width, self.height) + if self.store_on_disk: + tEXt_data = self._get_text_data(image_path) + # Use the archive's mTime instead of the extracted file's mtime + tEXt_data['tEXt::Thumb::MTime'] = str(int(os.stat(filepath).st_mtime)) + else: + tEXt_data = None + + return pixbuf, tEXt_data + finally: + for fn in reversed(cleanup): + fn() + + elif image_tools.is_image_file(filepath): + pixbuf = image_tools.load_pixbuf_size(filepath, self.width, self.height) + if self.store_on_disk: + tEXt_data = self._get_text_data(filepath) + else: + tEXt_data = None + + return pixbuf, tEXt_data + else: + return None, None + + def _create_thumbnail(self, filepath): + """ Creates the thumbnail pixbuf for , and saves the pixbuf + to disk if necessary. Returns the created pixbuf, or None, if creation failed. """ + + pixbuf, tEXt_data = self._create_thumbnail_pixbuf(filepath) + self.thumbnail_finished(filepath, pixbuf) + + if pixbuf and self.store_on_disk: + thumbpath = self._path_to_thumbpath(filepath) + self._save_thumbnail(pixbuf, thumbpath, tEXt_data) + + return pixbuf + + def _get_text_data(self, filepath): + """ Creates a tEXt dictionary for . """ + mime = mimetypes.guess_type(filepath)[0] or "unknown/mime" + uri = portability.uri_prefix() + pathname2url(os.path.normpath(filepath)) + stat = os.stat(filepath) + # MTime could be floating point number, so convert to long first to have a fixed point number + mtime = str(int(stat.st_mtime)) + size = str(stat.st_size) + format, (width, height), providers = image_tools.get_image_info(filepath) + return { + 'tEXt::Thumb::URI': uri, + 'tEXt::Thumb::MTime': mtime, + 'tEXt::Thumb::Size': size, + 'tEXt::Thumb::Mimetype': mime, + 'tEXt::Thumb::Image::Width': str(width), + 'tEXt::Thumb::Image::Height': str(height), + 'tEXt::Software': 'MComix %s' % constants.VERSION + } + + def _save_thumbnail(self, pixbuf, thumbpath, tEXt_data): + """ Saves as , with additional metadata + from . If already exists, it is overwritten. """ + + try: + directory = os.path.dirname(thumbpath) + if not os.path.isdir(directory): + os.makedirs(directory, 0o700) + if os.path.isfile(thumbpath): + os.remove(thumbpath) + + option_keys = [] + option_values = [] + for key, value in list(tEXt_data.items()): + option_keys.append(key) + option_values.append(value) + pixbuf.savev(thumbpath, 'png', option_keys, option_values) + os.chmod(thumbpath, 0o600) + + except Exception as ex: + log.warning( _('! Could not save thumbnail "%(thumbpath)s": %(error)s'), + { 'thumbpath' : thumbpath, 'error' : ex } ) + + def _thumbnail_exists(self, filepath): + """ Checks if the thumbnail for already exists. + This function will return False if the thumbnail exists + and it's mTime doesn't match the mTime of , + it's size is different from the one specified in the thumbnailer, + or if is True. """ + + if not self.force_recreation: + thumbpath = self._path_to_thumbpath(filepath) + + if os.path.isfile(thumbpath): + # Check the thumbnail's stored mTime + try: + img = Image.open(thumbpath) + except IOError: + return False + + info = img.info + stored_mtime = int(float(info['Thumb::MTime'])) + # The source file might no longer exist + file_mtime = os.path.isfile(filepath) and int(os.stat(filepath).st_mtime) or stored_mtime + return stored_mtime == file_mtime and \ + max(*img.size) == max(self.width, self.height) + else: + return False + else: + return False + + def _path_to_thumbpath(self, filepath): + """ Converts to an URI for the thumbnail in . """ + uri = portability.uri_prefix() + pathname2url(os.path.normpath(filepath)) + return self._uri_to_thumbpath(uri) + + def _uri_to_thumbpath(self, uri): + """ Return the full path to the thumbnail for with + being the base thumbnail directory. """ + uri = uri.encode(locale.getpreferredencoding()) if isinstance(uri, str) else uri + md5hash = md5(uri).hexdigest() + thumbpath = os.path.join(self.dst_dir, md5hash + '.png') + return thumbpath + + def _guess_cover(self, files): + """Return the filename within that is the most likely to be the + cover of an archive using some simple heuristics. + """ + # Ignore MacOSX meta files. + files = filter(lambda filename: + '__MACOSX' not in os.path.normpath(filename).split(os.sep), + files) + # Ignore credit files if possible. + files = filter(lambda filename: + 'credit' not in os.path.split(filename)[1].lower(), files) + + images = list(filter(image_tools.is_image_file, files)) + + tools.alphanumeric_sort(images) + + front_re = re.compile('(cover|front)', re.I) + candidates = list(filter(front_re.search, images)) + candidates = [c for c in candidates if 'back' not in c.lower()] + + if candidates: + return candidates[0] + + if images: + return images[0] + + return None + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/thumbnail_view.py mcomix-2.1.0/mcomix/thumbnail_view.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/thumbnail_view.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/thumbnail_view.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,132 @@ +""" Gtk.IconView subclass for dynamically generated thumbnails. """ + +import queue +from gi.repository import Gtk +from gi.repository import GObject + +from mcomix.preferences import prefs +from mcomix.worker_thread import WorkerThread + + +class ThumbnailViewBase(object): + """ This class provides shared functionality for Gtk.TreeView and + Gtk.IconView. Instantiating this class directly is *impossible*, + as it depends on methods provided by the view classes. """ + + def __init__(self, uid_column, pixbuf_column, status_column): + """ Constructs a new ThumbnailView. + @param uid_column: index of unique identifer column. + @param pixbuf_column: index of pixbuf column. + @param status_column: index of status boolean column + (True if pixbuf is not temporary filler) + """ + + #: Keep track of already generated thumbnails. + self._uid_column = uid_column + self._pixbuf_column = pixbuf_column + self._status_column = status_column + + #: Ignore updates when this flag is True. + self._updates_stopped = True + #: Worker thread + self._thread = WorkerThread(self._pixbuf_worker, + name='thumbview', + unique_orders=True, + max_threads=prefs["max threads"]) + + def generate_thumbnail(self, uid): + """ This function must return the thumbnail for C{uid}. """ + raise NotImplementedError() + + def get_visible_range(self): + """ See L{Gtk.IconView.get_visible_range}. """ + raise NotImplementedError() + + def stop_update(self): + """ Stops generation of pixbufs. """ + self._updates_stopped = True + self._thread.stop() + + def draw_thumbnails_on_screen(self, *args): + """ Prepares valid thumbnails for currently displayed icons. + This method is supposed to be called from the expose-event + callback function. """ + + visible = self.get_visible_range() + if not visible: + # No valid paths available + return + + pixbufs_needed = [] + start = visible[0][0] + end = visible[1][0] + # Read ahead/back and start caching a few more icons. Currently invisible + # icons are always cached only after the visible icons have been completed. + additional = (end - start) // 2 + required = list(range(start, end + additional + 1)) + \ + list(range(max(0, start - additional), start)) + model = self.get_model() + # Filter invalid paths. + required = [path for path in required if 0 <= path < len(model)] + with self._thread: + # Flush current pixmap generation orders. + self._thread.clear_orders() + for path in required: + iter = model.get_iter(path) + uid, generated = model.get(iter, + self._uid_column, + self._status_column) + # Do not queue again if thumbnail was already created. + if not generated: + pixbufs_needed.append((uid, iter)) + if len(pixbufs_needed) > 0: + self._updates_stopped = False + self._thread.extend_orders(pixbufs_needed) + + def _pixbuf_worker(self, order): + """ Run by a worker thread to generate the thumbnail for a path.""" + uid, iter = order + pixbuf = self.generate_thumbnail(uid) + if pixbuf is not None: + GObject.idle_add(self._pixbuf_finished, iter, pixbuf) + + def _pixbuf_finished(self, iter, pixbuf): + """ Executed when a pixbuf was created, to actually insert the pixbuf + into the view store. C{pixbuf_info} is a tuple containing + (index, pixbuf). """ + + if self._updates_stopped: + return 0 + + model = self.get_model() + model.set(iter, self._status_column, True, self._pixbuf_column, pixbuf) + + # Remove this idle handler. + return 0 + +class ThumbnailIconView(Gtk.IconView, ThumbnailViewBase): + def __init__(self, model, uid_column, pixbuf_column, status_column): + assert 0 != (model.get_flags() & Gtk.TreeModelFlags.ITERS_PERSIST) + super(ThumbnailIconView, self).__init__(model) + ThumbnailViewBase.__init__(self, uid_column, pixbuf_column, status_column) + self.set_pixbuf_column(pixbuf_column) + + # Connect events + self.connect('draw', self.draw_thumbnails_on_screen) + + def get_visible_range(self): + return Gtk.IconView.get_visible_range(self) + +class ThumbnailTreeView(Gtk.TreeView, ThumbnailViewBase): + def __init__(self, model, uid_column, pixbuf_column, status_column): + assert 0 != (model.get_flags() & Gtk.TreeModelFlags.ITERS_PERSIST) + super(ThumbnailTreeView, self).__init__(model) + ThumbnailViewBase.__init__(self, uid_column, pixbuf_column, status_column) + + # Connect events + self.connect('draw', self.draw_thumbnails_on_screen) + + def get_visible_range(self): + return Gtk.TreeView.get_visible_range(self) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/tools.py mcomix-2.1.0/mcomix/tools.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/tools.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/tools.py 2022-12-17 12:42:38.000000000 +0000 @@ -0,0 +1,194 @@ +"""tools.py - Contains various helper functions.""" + +import os +import sys +import re +import gc +import bisect +import operator +import math +import itertools +from functools import reduce, cmp_to_key + + +NUMERIC_REGEXP = re.compile(r"\d+|\D+") # Split into numerics and characters +PREFIXED_BYTE_UNITS = ("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB") + + +def cmp(a, b): + """ Forward port of Python2's cmp function """ + return (a > b) - (a < b) + +def alphanumeric_sort(filenames): + """Do an in-place alphanumeric sort of the strings in , + such that for an example "1.jpg", "2.jpg", "10.jpg" is a sorted + ordering. + """ + + filenames.sort(key=cmp_to_key(alphanumeric_compare)) + +def alphanumeric_compare(s1, s2): + """ Compares two strings by their natural order (i.e. 1 before 10) + and returns a result comparable to the cmp function. + @return: 0 if identical, -1 if s1 < s2, +1 if s1 > s2. """ + if s1 is None: + return 1 + elif s2 is None: + return -1 + + stringparts1 = NUMERIC_REGEXP.findall(s1.lower()) + stringparts2 = NUMERIC_REGEXP.findall(s2.lower()) + for i, part in enumerate(stringparts1): + if part.isdigit(): + stringparts1[i] = int(part) + for i, part in enumerate(stringparts2): + if part.isdigit(): + stringparts2[i] = int(part) + + min_length = min(len(stringparts1), len(stringparts2)) + for i in range(min_length): + if type(stringparts1[i]) is not type(stringparts2[i]): + stringparts1[i] = str(stringparts1[i]) + stringparts2[i] = str(stringparts2[i]) + + return cmp(stringparts1, stringparts2) + +def bin_search(lst, value): + """ Binary search for sorted list C{lst}, looking for C{value}. + @return: List index on success. On failure, it returns the 1's + complement of the index where C{value} would be inserted. + This implies that the return value is non-negative if and only if + C{value} is contained in C{lst}. """ + + index = bisect.bisect_left(lst, value) + if index != len(lst) and lst[index] == value: + return index + else: + return ~index + + +def get_home_directory(): + """On UNIX-like systems, this method will return the path of the home + directory, e.g. /home/username. On Windows, it will return an MComix + sub-directory of . + """ + if sys.platform == 'win32': + return os.path.join(os.path.expanduser('~'), 'MComix') + else: + return os.path.expanduser('~') + + +def get_config_directory(): + """Return the path to the MComix config directory. On UNIX, this will + be $XDG_CONFIG_HOME/mcomix, on Windows it will be the same directory as + get_home_directory(). + + See http://standards.freedesktop.org/basedir-spec/latest/ for more + information on the $XDG_CONFIG_HOME environmental variable. + """ + if sys.platform == 'win32': + return get_home_directory() + else: + base_path = os.getenv('XDG_CONFIG_HOME', + os.path.join(get_home_directory(), '.config')) + return os.path.join(base_path, 'mcomix') + + +def get_data_directory(): + """Return the path to the MComix data directory. On UNIX, this will + be $XDG_DATA_HOME/mcomix, on Windows it will be the same directory as + get_home_directory(). + + See http://standards.freedesktop.org/basedir-spec/latest/ for more + information on the $XDG_DATA_HOME environmental variable. + """ + if sys.platform == 'win32': + return get_home_directory() + else: + base_path = os.getenv('XDG_DATA_HOME', + os.path.join(get_home_directory(), '.local/share')) + return os.path.join(base_path, 'mcomix') + + +def number_of_digits(n): + if 0 == n: + return 1 + return int(math.log10(abs(n))) + 1 + +def decompose_byte_size_exponent(n): + e = 0 + while n > 1024.0: + n /= 1024.0 + e += 1 + return (n, e) + +def byte_size_exponent_to_prefix(e): + return PREFIXED_BYTE_UNITS[min(e, len(PREFIXED_BYTE_UNITS)-1)] + +def format_byte_size(n): + nn, e = decompose_byte_size_exponent(n) + return ('%d %s' if nn == int(nn) else '%.1f %s') % \ + (nn, byte_size_exponent_to_prefix(e)) + +def garbage_collect(): + """ Runs the garbage collector. """ + if sys.version_info[:3] >= (2, 5, 0): + gc.collect(0) + else: + gc.collect() + + +def div(a, b): + return float(a) / float(b) + +def volume(t): + return reduce(operator.mul, t, 1) + +def relerr(approx, ideal): + return abs(div(approx - ideal, ideal)) + +def smaller(a, b): + """ Returns a list with the i-th element set to True if and only if the i-th + element in a is less than the i-th element in b. """ + return list(map(operator.lt, a, b)) + +def smaller_or_equal(a, b): + """ Returns a list with the i-th element set to True if and only if the i-th + element in a is less than or equal to the i-th element in b. """ + return list(map(operator.le, a, b)) + +def scale(t, factor): + return [x * factor for x in t] + +def vector_sub(a, b): + """ Subtracts vector b from vector a. """ + return list(map(operator.sub, a, b)) + +def vector_add(a, b): + """ Adds vector a to vector b. """ + return list(map(operator.add, a, b)) + +def vector_opposite(a): + """ Returns the opposite vector -a. """ + return list(map(operator.neg, a)) + +def fixed_strings_regex(strings): + # introduces a matching group + strings = set(strings) + return r'(%s)' % '|'.join(sorted([re.escape(s) for s in strings])) + +def formats_to_regex(formats): + """ Returns a compiled regular expression that can be used to search for + file extensions specified in C{formats}. """ + return re.compile(r'\.' + fixed_strings_regex( \ + itertools.chain.from_iterable([e[1] for e in formats.values()])) \ + + r'$', re.I) + +def append_number_to_filename(filename, number): + """ Generate a new string from filename with an appended number right + before the extension. """ + file_no_ext = os.path.splitext(filename)[0] + ext = os.path.splitext(filename)[1] + return file_no_ext + (" (%s)" % (number)) + ext + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/ui.py mcomix-2.1.0/mcomix/ui.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/ui.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/ui.py 2022-12-17 11:34:07.000000000 +0000 @@ -0,0 +1,481 @@ +"""ui.py - UI definitions for main window. +""" + +from gi.repository import Gtk + +from mcomix import bookmark_menu +from mcomix import openwith_menu +from mcomix import edit_dialog +from mcomix import enhance_dialog +from mcomix import preferences_dialog +from mcomix import recent +from mcomix import dialog_handler +from mcomix import constants +from mcomix import status +from mcomix import file_chooser_main_dialog +from mcomix.preferences import prefs +from mcomix.library import main_dialog as library_main_dialog + +class MainUI(Gtk.UIManager): + + def __init__(self, window): + super(MainUI, self).__init__() + + self._window = window + self._tooltipstatus = status.TooltipStatusHelper(self, window.statusbar) + + def _action_lambda(fn, *args): + return lambda *_: fn(*args) + + # ---------------------------------------------------------------- + # Create actions for the menus. + # ---------------------------------------------------------------- + self._actiongroup = Gtk.ActionGroup('mcomix-main') + self._actiongroup.add_actions([ + ('copy_page', Gtk.STOCK_COPY, _('_Copy'), + None, _('Copies the current page to clipboard.'), + window.clipboard.copy_page), + ('delete', Gtk.STOCK_DELETE, _('_Delete'), + None, _('Deletes the current file or archive from disk.'), + window.delete), + ('next_page', Gtk.STOCK_GO_FORWARD, _('_Next page'), + None, _('Next page'), _action_lambda(window.flip_page, +1)), + ('previous_page', Gtk.STOCK_GO_BACK, _('_Previous page'), + None, _('Previous page'), _action_lambda(window.flip_page, -1)), + ('first_page', Gtk.STOCK_GOTO_FIRST, _('_First page'), + None, _('First page'), _action_lambda(window.first_page)), + ('last_page', Gtk.STOCK_GOTO_LAST, _('_Last page'), + None, _('Last page'), _action_lambda(window.last_page)), + ('go_to', Gtk.STOCK_JUMP_TO, _('_Go to page...'), + None, _('Go to page...'), window.page_select), + ('refresh_archive', Gtk.STOCK_REFRESH, _('Re_fresh'), + None, _('Reloads the currently opened files or archive.'), + window.filehandler.refresh_file), + ('next_archive', Gtk.STOCK_MEDIA_NEXT, _('Next _archive'), + None, _('Next archive'), window.filehandler._open_next_archive), + ('previous_archive', Gtk.STOCK_MEDIA_PREVIOUS, _('Previous a_rchive'), + None, _('Previous archive'), window.filehandler._open_previous_archive), + ('next_directory', Gtk.STOCK_REDO, _('Next directory'), + None, _('Next directory'), window.filehandler.open_next_directory), + ('previous_directory', Gtk.STOCK_UNDO, _('Previous directory'), + None, _('Previous directory'), window.filehandler.open_previous_directory), + ('zoom_in', Gtk.STOCK_ZOOM_IN, _('Zoom _In'), + None, None, window.manual_zoom_in), + ('zoom_out', Gtk.STOCK_ZOOM_OUT, _('Zoom _Out'), + None, None, window.manual_zoom_out), + ('zoom_original', Gtk.STOCK_ZOOM_100, _('_Normal Size'), + None, None, window.manual_zoom_original), + ('minimize', Gtk.STOCK_LEAVE_FULLSCREEN, _('Mi_nimize'), + None, None, window.minimize), + ('close', Gtk.STOCK_CLOSE, _('_Close'), + None, _('Closes all opened files.'), _action_lambda(window.filehandler.close_file)), + ('quit', Gtk.STOCK_QUIT, _('_Quit'), + None, None, window.close_program), + ('save_and_quit', Gtk.STOCK_QUIT, _('_Save and quit'), + None, _('Quits and restores the currently opened file next time the program starts.'), + window.save_and_terminate_program), + ('rotate_90', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), + None, None, window.rotate_90), + ('rotate_180','mcomix-rotate-180', _('Rotate 180 de_grees'), + None, None, window.rotate_180), + ('rotate_270', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), + None, None, window.rotate_270), + ('flip_horiz', 'mcomix-flip-horizontal', _('Fli_p horizontally'), + None, None, window.flip_horizontally), + ('flip_vert', 'mcomix-flip-vertical', _('Flip _vertically'), + None, None, window.flip_vertically), + ('extract_page', Gtk.STOCK_SAVE_AS, _('Save _As'), + None, None, window.extract_page), + ('menu_zoom', 'mcomix-zoom', _('_Zoom')), + ('menu_recent', Gtk.STOCK_FILE, _('_Recent')), + ('menu_bookmarks_popup', 'comix-add-bookmark', _('_Bookmarks')), + ('menu_bookmarks', None, _('_Bookmarks')), + ('menu_toolbars', None, _('T_oolbars')), + ('menu_edit', None, _('_Edit')), + ('menu_open_with', Gtk.STOCK_OPEN, _('Open _with'), ''), + ('menu_open_with_popup', Gtk.STOCK_OPEN, _('Open _with'), ''), + ('menu_file', None, _('_File')), + ('menu_view', None, _('_View')), + ('menu_view_popup', 'comix-image', _('_View')), + ('menu_go', None, _('_Go')), + ('menu_go_popup', Gtk.STOCK_GO_FORWARD, _('_Go')), + ('menu_tools', None, _('_Tools')), + ('menu_help', None, _('_Help')), + ('menu_transform', 'mcomix-transform', _('_Transform image')), + ('menu_autorotate', None, _('_Auto-rotate image')), + ('menu_autorotate_width', None, _('...when width exceeds height')), + ('menu_autorotate_height', None, _('...when height exceeds width')), + ('expander', None, None, None, None, None)]) + + self._actiongroup.add_toggle_actions([ + ('fullscreen', Gtk.STOCK_FULLSCREEN, _('_Fullscreen'), + None, _('Fullscreen mode'), window.change_fullscreen), + ('double_page', 'mcomix-double-page', _('_Double page mode'), + None, _('Double page mode'), window.change_double_page), + ('toolbar', None, _('_Toolbar'), + None, None, window.change_toolbar_visibility), + ('menubar', None, _('_Menubar'), + None, None, window.change_menubar_visibility), + ('statusbar', None, _('St_atusbar'), + None, None, window.change_statusbar_visibility), + ('scrollbar', None, _('S_crollbars'), + None, None, window.change_scrollbar_visibility), + ('thumbnails', None, _('Th_umbnails'), + None, None, window.change_thumbnails_visibility), + ('hide_all', None, _('H_ide all'), + None, None, window.change_hide_all), + ('manga_mode', 'mcomix-manga', _('_Manga mode'), + None, _('Manga mode'), window.change_manga_mode), + ('invert_scroll', Gtk.STOCK_UNDO, _('Invert smart scroll'), + None, _('Invert smart scrolling direction.'), window.change_invert_scroll), + ('keep_transformation', None, _('_Keep transformation'), + None, _('Keeps the currently selected transformation for the next pages.'), + window.change_keep_transformation), + ('slideshow', Gtk.STOCK_MEDIA_PLAY, _('Start _slideshow'), + None, _('Start slideshow'), window.slideshow.toggle), + ('lens', 'mcomix-lens', _('Magnifying _lens'), + None, _('Magnifying lens'), window.lens.toggle), + ('stretch', None, _('Stretch small images'), + None, _('Stretch images to fit to the screen, depending on zoom mode.'), + window.change_stretch)]) + + # Note: Don't change the default value for the radio buttons unless + # also fixing the code for setting the correct one on start-up in main.py. + self._actiongroup.add_radio_actions([ + ('best_fit_mode', 'mcomix-fitbest', _('_Best fit mode'), + None, _('Best fit mode'), constants.ZOOM_MODE_BEST), + ('fit_width_mode', 'mcomix-fitwidth', _('Fit _width mode'), + None, _('Fit width mode'), constants.ZOOM_MODE_WIDTH), + ('fit_height_mode', 'mcomix-fitheight', _('Fit _height mode'), + None, _('Fit height mode'), constants.ZOOM_MODE_HEIGHT), + ('fit_size_mode', 'mcomix-fitsize', _('Fit _size mode'), + None, _('Fit to size mode'), constants.ZOOM_MODE_SIZE), + ('fit_manual_mode', 'mcomix-fitmanual', _('M_anual zoom mode'), + None, _('Manual zoom mode'), constants.ZOOM_MODE_MANUAL)], + 3, window.change_zoom_mode) + + # Automatically rotate image if width>height or height>width + self._actiongroup.add_radio_actions([ + ('no_autorotation', None, _('Never'), + None, None, constants.AUTOROTATE_NEVER), + ('rotate_90_width', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), + None, None, constants.AUTOROTATE_WIDTH_90), + ('rotate_270_width', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), + None, None, constants.AUTOROTATE_WIDTH_270), + ('rotate_90_height', 'mcomix-rotate-90', _('_Rotate 90 degrees CW'), + None, None, constants.AUTOROTATE_HEIGHT_90), + ('rotate_270_height', 'mcomix-rotate-270', _('Rotat_e 90 degrees CCW'), + None, None, constants.AUTOROTATE_HEIGHT_270)], + prefs['auto rotate depending on size'], window.change_autorotation) + + self._actiongroup.add_actions([ + ('about', Gtk.STOCK_ABOUT, _('_About'), + None, None, dialog_handler.open_dialog)], (window, 'about-dialog')) + + self._actiongroup.add_actions([ + ('comments', 'mcomix-comments', _('Co_mments...'), + None, None, dialog_handler.open_dialog)], (window, 'comments-dialog')) + + self._actiongroup.add_actions([ + ('properties', Gtk.STOCK_PROPERTIES, _('Proper_ties'), + None, None, dialog_handler.open_dialog)], (window,'properties-dialog')) + + self._actiongroup.add_actions([ + ('preferences', Gtk.STOCK_PREFERENCES, _('Pr_eferences'), + None, None, preferences_dialog.open_dialog)], window) + + # Some actions added separately since they need extra arguments. + self._actiongroup.add_actions([ + ('edit_archive', Gtk.STOCK_EDIT, _('_Edit archive...'), + None, _('Opens the archive editor.'), + edit_dialog.open_dialog), + ('open', Gtk.STOCK_OPEN, _('_Open...'), + None, None, file_chooser_main_dialog.open_main_filechooser_dialog), + ('enhance_image', 'mcomix-enhance-image', _('En_hance image...'), + None, None, enhance_dialog.open_dialog)], window) + + self._actiongroup.add_actions([ + ('library', 'mcomix-library', _('_Library...'), + None, None, library_main_dialog.open_dialog)], window) + + # fix some gtk magic: removing unreqired accelerators + Gtk.AccelMap.change_entry('/mcomix-main/%s' % 'close', 0, 0, True) + + ui_description = """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + """ + + self.add_ui_from_string(ui_description) + self.insert_action_group(self._actiongroup, 0) + + self.bookmarks = bookmark_menu.BookmarksMenu(self, window) + self.get_widget('/Menu/menu_bookmarks').set_submenu(self.bookmarks) + self.get_widget('/Menu/menu_bookmarks').show() + + self.bookmarks_popup = bookmark_menu.BookmarksMenu(self, window) + self.get_widget('/Popup/menu_bookmarks_popup').set_submenu(self.bookmarks_popup) + self.get_widget('/Popup/menu_bookmarks_popup').show() + + self.recent = recent.RecentFilesMenu(self, window) + self.get_widget('/Menu/menu_file/menu_recent').set_submenu(self.recent) + self.get_widget('/Menu/menu_file/menu_recent').show() + + self.recentPopup = recent.RecentFilesMenu(self, window) + self.get_widget('/Popup/menu_recent').set_submenu(self.recentPopup) + self.get_widget('/Popup/menu_recent').show() + + openwith = openwith_menu.OpenWithMenu(self, window) + self.get_widget('/Menu/menu_file/menu_open_with').set_submenu(openwith) + self.get_widget('/Menu/menu_file/menu_open_with').show() + openwith = openwith_menu.OpenWithMenu(self, window) + self.get_widget('/Popup/menu_open_with_popup').set_submenu(openwith) + self.get_widget('/Popup/menu_open_with_popup').show() + + window.add_accel_group(self.get_accel_group()) + + # Is there no built-in way to do this? + self.get_widget('/Tool/expander').set_expand(True) + self.get_widget('/Tool/expander').set_sensitive(False) + + def set_sensitivities(self): + """Sets the main UI's widget's sensitivities appropriately.""" + general = ('properties', + 'edit_archive', + 'extract_page', + 'save_and_quit', + 'close', + 'delete', + 'copy_page', + 'slideshow', + 'rotate_90', + 'rotate_180', + 'rotate_270', + 'flip_horiz', + 'flip_vert', + 'next_page', + 'previous_page', + 'first_page', + 'last_page', + 'go_to', + 'refresh_archive', + 'next_archive', + 'previous_archive', + 'next_directory', + 'previous_directory', + 'keep_transformation', + 'enhance_image') + + comment = ('comments',) + + general_sensitive = False + comment_sensitive = False + + if self._window.filehandler.file_loaded: + general_sensitive = True + + if self._window.filehandler.get_number_of_comments(): + comment_sensitive = True + + for name in general: + self._actiongroup.get_action(name).set_sensitive(general_sensitive) + + for name in comment: + self._actiongroup.get_action(name).set_sensitive(comment_sensitive) + + self.bookmarks.set_sensitive(general_sensitive) + self.bookmarks_popup.set_sensitive(general_sensitive) + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/worker_thread.py mcomix-2.1.0/mcomix/worker_thread.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/worker_thread.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/worker_thread.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,146 @@ +""" Worker thread class. """ + + +import threading +import traceback + +from mcomix import log + +class WorkerThread(object): + + def __init__(self, process_order, name=None, max_threads=1, + sort_orders=False, unique_orders=False): + """Create a new pool of worker threads. + + Optional will be added to spawned thread names. + will be called to process each work order. + At most will be started for processing. + If is True, the orders queue will be sorted + after each addition. If is True, duplicate + orders will not be added to the queue. """ + self._name = name + self._process_order = process_order + self._max_threads = max_threads + self._sort_orders = sort_orders + self._unique_orders = unique_orders + self._stop = False + self._threads = [] + # Queue of orders waiting for processing. + self._orders_queue = [] + if self._unique_orders: + # Track orders. + self._orders_set = set() + self._condition = threading.Condition() + + def __enter__(self): + return self._condition.__enter__() + + def __exit__(self, exc_type, exc_value, traceback): + return self._condition.__exit__(exc_type, exc_value, traceback) + + def _start(self, nb_threads=1): + for n in range(nb_threads): + if len(self._threads) == self._max_threads: + break + thread = threading.Thread(target=self._run) + if self._name is not None: + thread.name += '-' + self._name + thread.setDaemon(False) + thread.start() + self._threads.append(thread) + + def _order_uid(self, order): + if isinstance(order, tuple) or isinstance(order, list): + return order[0] + return order + + def _run(self): + order_uid = None + while True: + with self._condition: + if order_uid is not None: + self._orders_set.remove(order_uid) + while not self._stop and 0 == len(self._orders_queue): + self._condition.wait() + if self._stop: + return + order = self._orders_queue.pop(0) + if self._unique_orders: + order_uid = self._order_uid(order) + try: + self._process_order(order) + except Exception as e: + log.error(_('! Worker thread processing %(function)r failed: %(error)s'), + { 'function' : self._process_order, 'error' : e }) + log.debug('Traceback:\n%s', traceback.format_exc()) + + def must_stop(self): + """Return true if we've been asked to stop processing. + + Can be used by the processing function to check if it must abort early. + """ + return self._stop + + def clear_orders(self): + """Clear the current orders queue.""" + with self._condition: + if self._unique_orders: + # We can't just clear the set, as some orders + # can be in the process of being processed. + for order in self._orders_queue: + order_uid = self._order_uid(order) + self._orders_set.remove(order_uid) + self._orders_queue = [] + + def append_order(self, order): + """Append work order to the thread orders queue.""" + with self._condition: + if self._unique_orders: + order_uid = self._order_uid(order) + if order_uid in self._orders_set: + # Duplicate order. + return + self._orders_set.add(order_uid) + self._orders_queue.append(order) + if self._sort_orders: + self._orders_queue.sort() + self._condition.notifyAll() + self._start() + + def extend_orders(self, orders_list): + """Append work orders to the thread orders queue.""" + with self._condition: + if self._unique_orders: + nb_added = 0 + for order in orders_list: + order_uid = self._order_uid(order) + if order_uid in self._orders_set: + # Duplicate order. + continue + self._orders_set.add(order_uid) + self._orders_queue.append(order) + nb_added += 1 + else: + self._orders_queue.extend(orders_list) + nb_added = len(orders_list) + if 0 == nb_added: + return + if self._sort_orders: + self._orders_queue.sort() + self._condition.notifyAll() + self._start(nb_threads=nb_added) + + def stop(self): + """Stop the worker threads and flush the orders queue.""" + self._stop = True + with self._condition: + self._condition.notifyAll() + for thread in self._threads: + thread.join() + self._threads = [] + self._stop = False + self._orders_queue = [] + if self._unique_orders: + self._orders_set.clear() + +# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix/zoom.py mcomix-2.1.0/mcomix/zoom.py --- mcomix-1.2.1mcomix3+git20200206/mcomix/zoom.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix/zoom.py 2022-12-17 12:43:25.000000000 +0000 @@ -0,0 +1,300 @@ +""" Handles zoom and fit of images in the main display area. """ + +import operator +from mcomix import constants +from mcomix.preferences import prefs +from mcomix import tools +from mcomix import box +from functools import reduce + +IDENTITY_ZOOM = 1.0 +IDENTITY_ZOOM_LOG = 0 +USER_ZOOM_LOG_SCALE1 = 4.0 +MIN_USER_ZOOM_LOG = -20 +MAX_USER_ZOOM_LOG = 12 + +class ZoomModel(object): + """ Handles zoom and fit modes. """ + + def __init__(self): + #: User zoom level. + self._user_zoom_log = IDENTITY_ZOOM_LOG + #: Image fit mode. Determines the base zoom level for an image by + #: calculating its maximum size. + self._fitmode = constants.ZOOM_MODE_MANUAL + self._scale_up = False + + def set_fit_mode(self, fitmode): + if fitmode < constants.ZOOM_MODE_BEST or \ + fitmode > constants.ZOOM_MODE_SIZE: + raise ValueError("No fit mode for id %d." % fitmode) + self._fitmode = fitmode + + def get_scale_up(self): + return self._scale_up + + def set_scale_up(self, scale_up): + self._scale_up = scale_up + + def _set_user_zoom_log(self, zoom_log): + self._user_zoom_log = min(max(zoom_log, MIN_USER_ZOOM_LOG), MAX_USER_ZOOM_LOG) + + def zoom_in(self): + self._set_user_zoom_log(self._user_zoom_log + 1) + + def zoom_out(self): + self._set_user_zoom_log(self._user_zoom_log - 1) + + def reset_user_zoom(self): + self._set_user_zoom_log(IDENTITY_ZOOM_LOG) + + def get_zoomed_size(self, image_sizes, screen_size, distribution_axis, + do_not_transform, prefer_same_size, fit_same_size): + scale_up = self._scale_up + if prefer_same_size: + # Preprocessing step: scale all images to the same size + image_boxes = [box.Box(s) for s in image_sizes] + # Scale up to the same size if this is allowed, otherwise scale down. + if scale_up: + # Scale up to union. + pre_limits = box.Box.bounding_box(image_boxes).get_size() + else: + # Scale down to intersection. + pre_limits = reduce(box.Box.intersect, image_boxes, image_boxes[0]).get_size() + new_image_sizes = [tuple(tools.scale(s, ZoomModel._preferred_scale( \ + s, pre_limits, distribution_axis))) for s in image_sizes] + new_image_sizes2 = [new_image_sizes[i] if not do_not_transform[i] else image_sizes[i] \ + for i in range(len(new_image_sizes))] + image_sizes = new_image_sizes2 + union_size = _union_size(image_sizes, distribution_axis) + limits = ZoomModel._calc_limits(union_size, screen_size, self._fitmode, + scale_up) + prefscale = ZoomModel._preferred_scale(union_size, limits, distribution_axis) + preferred_scales = tuple([prefscale if not dnt else IDENTITY_ZOOM for dnt in do_not_transform]) + prescaled = list(map(lambda size, scale, dnt: tuple(_scale_image_size(size, scale)), + image_sizes, preferred_scales, do_not_transform)) + prescaled_union_size = _union_size(prescaled, distribution_axis) + def _other_preferences(limits, distribution_axis): + for i in range(len(limits)): + if i == distribution_axis: + continue + if limits[i] is not None: + return True + return False + other_preferences = _other_preferences(limits, distribution_axis) + if limits[distribution_axis] is not None and \ + (prescaled_union_size[distribution_axis] > screen_size[distribution_axis] + or not other_preferences): + distributed_scales = ZoomModel._scale_distributed(image_sizes, + distribution_axis, limits[distribution_axis], scale_up, do_not_transform) + if other_preferences: + preferred_scales = list(map(min, preferred_scales, distributed_scales)) + else: + preferred_scales = distributed_scales + if not scale_up: + preferred_scales = [min(x, IDENTITY_ZOOM) for x in preferred_scales] + user_scale = 2 ** (self._user_zoom_log / USER_ZOOM_LOG_SCALE1) + res_scales = [preferred_scales[i] * (user_scale if not do_not_transform[i] else IDENTITY_ZOOM) + for i in range(len(preferred_scales))] + res = list(map(lambda size, scale: list(_scale_image_size(size, scale)), + image_sizes, res_scales)) + distorted = [False] * len(res) + if prefer_same_size and fit_same_size: + # While the algorithm so far tries hard to keep the aspect ratios of the + # original images, in extreme cases, it is not possible to both keep aspect + # ratios as well as make the images fit to the same size, especially after + # applying user_scale. In those cases, we will make them fit. + # Simple approach: For each dimension, we fit each image to either the + # minimum size (if scale_up is false) or maximum size (if scale_up is true) + # of all images, given the scaled sizes computed so far. + op = operator.gt if scale_up else operator.lt + exs = [None] * len(limits) + for d in range(len(limits)): + if d == distribution_axis: + continue + for i in res: + if exs[d] is None or op(i[d], exs[d]): + exs[d] = i[d] + for d in range(len(limits)): + if d == distribution_axis: + continue + for i in range(len(res)): + if (res[i][d] != exs[d]) and not do_not_transform[i]: + res[i][d] = exs[d] + distorted[i] = True + return (res, distorted) + + @staticmethod + def _preferred_scale(image_size, limits, distribution_axis): + """ Returns scale that makes an image of size image_size respect the + limits imposed by limits. If no proper value can be determined, + IDENTITY_ZOOM is returned. """ + min_scale = None + for i in range(len(limits)): + if i == distribution_axis: + continue + l = limits[i] + if l is None: + continue + s = tools.div(l, image_size[i]) + if min_scale is None or s < min_scale: + min_scale = s + if min_scale is None: + min_scale = IDENTITY_ZOOM + return min_scale + + @staticmethod + def _calc_limits(union_size, screen_size, fitmode, allow_upscaling): + """ Returns a list or a tuple with the i-th element set to int x if + fitmode limits the size at the i-th axis to x, or None if fitmode has no + preference for this axis. """ + manual = fitmode == constants.ZOOM_MODE_MANUAL + if fitmode == constants.ZOOM_MODE_BEST or \ + (manual and allow_upscaling and all(tools.smaller(union_size, screen_size))): + return screen_size + result = [None] * len(screen_size) + if not manual: + fixed_size = None + if fitmode == constants.ZOOM_MODE_SIZE: + fitmode = prefs['fit to size mode'] # reassigning fitmode + fixed_size = int(prefs['fit to size px']) + if fitmode == constants.ZOOM_MODE_WIDTH: + axis = constants.WIDTH_AXIS + elif fitmode == constants.ZOOM_MODE_HEIGHT: + axis = constants.HEIGHT_AXIS + else: + assert False, 'Cannot map fitmode to axis' + result[axis] = fixed_size if fixed_size is not None else screen_size[axis] + return result + + @staticmethod + def _scale_distributed(sizes, axis, max_size, allow_upscaling, + do_not_transform): + """ Calculates scales for a list of boxes that are distributed along a + given axis (without any gaps). If the resulting scales are applied to + their respective boxes, their new total size along axis will be as close + as possible to max_size. The current implementation ensures that equal + box sizes are mapped to equal scales. + @param sizes: A list of box sizes. + @param axis: The axis along which those boxes are distributed. + @param max_size: The maximum size the scaled boxes may have along axis. + @param allow_upscaling: True if upscaling is allowed, False otherwise. + @param do_not_transform: True if the resulting scale must be 1, False + otherwise. + @return: A list of scales where the i-th scale belongs to the i-th box + size. If sizes is empty, the empty list is returned. If there are more + boxes than max_size, an approximation is returned where all resulting + scales will shrink their respective boxes to 1 along axis. In this case, + the scaled total size might be greater than max_size. """ + n = len(sizes) + # trivial cases first + if n == 0: + return [] + if n >= max_size: + # In this case, only one solution or only an approximation is available. + # if n > max_size, the result won't fit into max_size. + return [IDENTITY_ZOOM if dnt else tools.div(1, s[axis]) for s, dnt in zip(sizes, do_not_transform)] + total_axis_size = sum([s[axis] for s in sizes]) + total_dnt_axis_size = sum([s[axis] for s, dnt in zip(sizes, do_not_transform) if dnt]) + if ((total_axis_size <= max_size) and not allow_upscaling) or \ + (total_axis_size == total_dnt_axis_size): + # identity + return [IDENTITY_ZOOM] * n + + # non-trival case + # initial guess + scale = tools.div(max_size - total_dnt_axis_size, total_axis_size - total_dnt_axis_size) + scaling_data = [None] * n + total_axis_size = 0 + # This loop collects some data we need for the actual computations later. + for i in range(n): + this_size = sizes[i] + # Shortcut: If the size cannot be changed, accept the original size. + if do_not_transform[i]: + total_axis_size += this_size[axis] + scaling_data[i] = [IDENTITY_ZOOM, IDENTITY_ZOOM, False, + IDENTITY_ZOOM, 0.0] + continue + # Initial guess: The current scale works for all tuples. + ideal = tools.scale(this_size, scale) + ideal_vol = tools.volume(ideal) + # Let's use a dummy to compute the actual (rounded) size along axis + # so we can rescale the rounded tuple with a better local_scale + # later. This rescaling is necessary to ensure that the sizes in ALL + # dimensions are monotonically scaled (with respect to local_scale). + # A nice side effect of this is that it keeps the aspect ratio better. + dummy_approx = _round_nonempty((ideal[axis],))[0] + local_scale = tools.div(dummy_approx, this_size[axis]) + total_axis_size += dummy_approx + can_be_downscaled = dummy_approx > 1 + if can_be_downscaled: + forced_size = dummy_approx - 1 + forced_scale = tools.div(forced_size, this_size[axis]) + forced_approx = _scale_image_size(this_size, forced_scale) + forced_vol_err = tools.relerr(tools.volume(forced_approx), ideal_vol) + else: + forced_scale = None + forced_vol_err = None + scaling_data[i] = [local_scale, ideal, can_be_downscaled, + forced_scale, forced_vol_err] + # Now we need to find at most total_axis_size - max_size occasions to + # scale down some tuples so the whole thing would fit into max_size. If + # we are lucky, there will be no gaps at the end (or at least fewer gaps + # than we would have if we always rounded down). + dirty=True # This flag prevents infinite loops if nothing can be made any smaller. + while dirty and (total_axis_size > max_size): + # This algorithm needs O(n*n) time. Let's hope that n is small enough. + dirty=False + current_index = 0 + current_min = None + for i in range(n): + d = scaling_data[i] + if not d[2]: + # Ignore elements that cannot be made any smaller. + continue + if (current_min is None) or (d[4] < current_min[4]): + # We are searching for the tuple where downscaling results + # in the smallest relative volume error (compared to the + # respective ideal volume). + current_min = d + current_index = i + for i in range(current_index, n): + # We must scale down ALL equal tuples. Otherwise, images that + # are of equal size might appear to be of different size + # afterwards. The downside of this approach is that it might + # introduce more gaps than necessary. + d = scaling_data[i] + if (not d[2]) or (d[1] != current_min[1]): + continue + d[0] = d[3] + d[2] = False # only once per tuple + total_axis_size -= 1 + dirty=True + else: + # If we are here and total_axis_size < max_size, we could try to + # upscale some tuples similarly to the other loop (i.e. smallest + # relative volume error first, equal boxes in conjunction with each + # other). However, this is not as useful as the other loop, slightly + # more complicated and it won't do anything if all tuples are equal. + pass + return [d[0] for d in scaling_data] + +def _scale_image_size(size, scale): + return _round_nonempty(tools.scale(size, scale)) + +def _round_nonempty(t): + result = [0] * len(t) + for i in range(len(t)): + x = int(round(t[i])) + result[i] = x if x > 0 else 1 + return result + +def _union_size(image_sizes, distribution_axis): + if len(image_sizes) == 0: + return [] + n = len(image_sizes[0]) + union_size = [reduce(max, [x[i] for x in image_sizes]) for i in range(n)] + union_size[distribution_axis] = sum([x[distribution_axis] for x in image_sizes]) + return union_size + +# vim: expandtab:sw=4:ts=4 Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mcomix.1.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mcomix.1.gz differ diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/dependency_links.txt mcomix-2.1.0/mcomix.egg-info/dependency_links.txt --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/dependency_links.txt 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/dependency_links.txt 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1 @@ + diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/entry_points.txt mcomix-2.1.0/mcomix.egg-info/entry_points.txt --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/entry_points.txt 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/entry_points.txt 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1,6 @@ +[console_scripts] +mcomix = mcomix.run:run + +[setuptools.installation] +eggsecutable = mcomix.run:run + diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/not-zip-safe mcomix-2.1.0/mcomix.egg-info/not-zip-safe --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/not-zip-safe 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/not-zip-safe 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1 @@ + diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/PKG-INFO mcomix-2.1.0/mcomix.egg-info/PKG-INFO --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/PKG-INFO 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/PKG-INFO 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1,16 @@ +Metadata-Version: 2.1 +Name: mcomix +Version: 2.1.0 +Summary: GTK comic book viewer +Home-page: http://mcomix.sourceforge.net +Maintainer: The MComix Team +Maintainer-email: https://sourceforge.net/projects/mcomix/ +License: License :: OSI Approved :: GNU General Public License (GPL) +Download-URL: http://sourceforge.net/projects/mcomix/files +Platform: Operating System :: POSIX :: Linux +Platform: Operating System :: Microsoft :: Windows +Platform: Operating System :: POSIX :: BSD +License-File: COPYING + +MComix is a user-friendly, customizable image viewer. It is specifically designed to handle comic books (both Western comics and manga) and supports a variety of container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). MComix is a fork of Comix. + diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/requires.txt mcomix-2.1.0/mcomix.egg-info/requires.txt --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/requires.txt 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/requires.txt 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1,3 @@ +Pillow>=6.0.0 +PyCairo>=1.16.0 +PyGObject>=3.36.0 diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/SOURCES.txt mcomix-2.1.0/mcomix.egg-info/SOURCES.txt --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/SOURCES.txt 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/SOURCES.txt 2022-12-17 13:21:56.000000000 +0000 @@ -0,0 +1,187 @@ +COPYING +ChangeLog +MANIFEST.in +README +mcomix.1.gz +mcomixstarter.py +setup.cfg +setup.py +mcomix/__init__.py +mcomix/about_dialog.py +mcomix/archive_extractor.py +mcomix/archive_packer.py +mcomix/archive_tools.py +mcomix/bookmark_backend.py +mcomix/bookmark_dialog.py +mcomix/bookmark_menu.py +mcomix/bookmark_menu_item.py +mcomix/box.py +mcomix/callback.py +mcomix/clipboard.py +mcomix/comment_dialog.py +mcomix/constants.py +mcomix/cursor_handler.py +mcomix/dialog_handler.py +mcomix/edit_comment_area.py +mcomix/edit_dialog.py +mcomix/edit_image_area.py +mcomix/enhance_backend.py +mcomix/enhance_dialog.py +mcomix/event.py +mcomix/file_chooser_base_dialog.py +mcomix/file_chooser_library_dialog.py +mcomix/file_chooser_main_dialog.py +mcomix/file_chooser_simple_dialog.py +mcomix/file_handler.py +mcomix/file_provider.py +mcomix/histogram.py +mcomix/i18n.py +mcomix/icons.py +mcomix/image_handler.py +mcomix/image_tools.py +mcomix/keybindings.py +mcomix/keybindings_editor.py +mcomix/labels.py +mcomix/last_read_page.py +mcomix/layout.py +mcomix/lens.py +mcomix/log.py +mcomix/main.py +mcomix/message_dialog.py +mcomix/openwith.py +mcomix/openwith_menu.py +mcomix/osd.py +mcomix/pageselect.py +mcomix/portability.py +mcomix/preferences.py +mcomix/preferences_dialog.py +mcomix/preferences_page.py +mcomix/preferences_section.py +mcomix/process.py +mcomix/properties_dialog.py +mcomix/properties_page.py +mcomix/recent.py +mcomix/run.py +mcomix/scrolling.py +mcomix/slideshow.py +mcomix/status.py +mcomix/strings.py +mcomix/thumbbar.py +mcomix/thumbnail_tools.py +mcomix/thumbnail_view.py +mcomix/tools.py +mcomix/ui.py +mcomix/worker_thread.py +mcomix/zoom.py +mcomix.egg-info/PKG-INFO +mcomix.egg-info/SOURCES.txt +mcomix.egg-info/dependency_links.txt +mcomix.egg-info/entry_points.txt +mcomix.egg-info/not-zip-safe +mcomix.egg-info/requires.txt +mcomix.egg-info/top_level.txt +mcomix/archive/__init__.py +mcomix/archive/archive_base.py +mcomix/archive/archive_recursive.py +mcomix/archive/lha_external.py +mcomix/archive/pdf_external.py +mcomix/archive/rar.py +mcomix/archive/rar_external.py +mcomix/archive/sevenzip_external.py +mcomix/archive/tar.py +mcomix/archive/zip.py +mcomix/archive/zip_external.py +mcomix/images/comments.png +mcomix/images/double-page.png +mcomix/images/fitbest.png +mcomix/images/fitheight.png +mcomix/images/fitmanual.png +mcomix/images/fitsize.png +mcomix/images/fitwidth.png +mcomix/images/gimp-flip-horizontal.png +mcomix/images/gimp-flip-vertical.png +mcomix/images/gimp-rotate-180.png +mcomix/images/gimp-rotate-270.png +mcomix/images/gimp-rotate-90.png +mcomix/images/gimp-thumbnails.png +mcomix/images/gimp-transform.png +mcomix/images/lens.png +mcomix/images/library.png +mcomix/images/manga.png +mcomix/images/mcomix.png +mcomix/images/tango-add-bookmark.png +mcomix/images/tango-archive.png +mcomix/images/tango-enhance-image.png +mcomix/images/tango-image.png +mcomix/images/zoom.png +mcomix/images/16x16/mcomix.png +mcomix/images/22x22/mcomix.png +mcomix/images/24x24/mcomix.png +mcomix/images/32x32/mcomix.png +mcomix/images/48x48/mcomix.png +mcomix/library/__init__.py +mcomix/library/add_progress_dialog.py +mcomix/library/backend.py +mcomix/library/backend_types.py +mcomix/library/book_area.py +mcomix/library/collection_area.py +mcomix/library/control_area.py +mcomix/library/main_dialog.py +mcomix/library/pixbuf_cache.py +mcomix/library/watchlist.py +mcomix/messages/ca/LC_MESSAGES/mcomix.mo +mcomix/messages/cs/LC_MESSAGES/mcomix.mo +mcomix/messages/de/LC_MESSAGES/mcomix.mo +mcomix/messages/el/LC_MESSAGES/mcomix.mo +mcomix/messages/es/LC_MESSAGES/mcomix.mo +mcomix/messages/fa/LC_MESSAGES/mcomix.mo +mcomix/messages/fr/LC_MESSAGES/mcomix.mo +mcomix/messages/gl/LC_MESSAGES/mcomix.mo +mcomix/messages/he/LC_MESSAGES/mcomix.mo +mcomix/messages/hr/LC_MESSAGES/mcomix.mo +mcomix/messages/hu/LC_MESSAGES/mcomix.mo +mcomix/messages/id/LC_MESSAGES/mcomix.mo +mcomix/messages/it/LC_MESSAGES/mcomix.mo +mcomix/messages/ja/LC_MESSAGES/mcomix.mo +mcomix/messages/ko/LC_MESSAGES/mcomix.mo +mcomix/messages/lt/LC_MESSAGES/mcomix.mo +mcomix/messages/nl/LC_MESSAGES/mcomix.mo +mcomix/messages/pl/LC_MESSAGES/mcomix.mo +mcomix/messages/pt_BR/LC_MESSAGES/mcomix.mo +mcomix/messages/ru/LC_MESSAGES/mcomix.mo +mcomix/messages/sv/LC_MESSAGES/mcomix.mo +mcomix/messages/uk/LC_MESSAGES/mcomix.mo +mcomix/messages/zh_CN/LC_MESSAGES/mcomix.mo +mcomix/messages/zh_TW/LC_MESSAGES/mcomix.mo +mime/comicbook.schemas +mime/comicthumb +mime/comicthumb.1.gz +mime/comicthumb.thumbnailer +mime/mcomix.appdata.xml +mime/mcomix.desktop +mime/mcomix.xml +mime/icons/16x16/application-x-cb7.png +mime/icons/16x16/application-x-cbr.png +mime/icons/16x16/application-x-cbt.png +mime/icons/16x16/application-x-cbz.png +mime/icons/22x22/application-x-cb7.png +mime/icons/22x22/application-x-cbr.png +mime/icons/22x22/application-x-cbt.png +mime/icons/22x22/application-x-cbz.png +mime/icons/24x24/application-x-cb7.png +mime/icons/24x24/application-x-cbr.png +mime/icons/24x24/application-x-cbt.png +mime/icons/24x24/application-x-cbz.png +mime/icons/32x32/application-x-cb7.png +mime/icons/32x32/application-x-cbr.png +mime/icons/32x32/application-x-cbt.png +mime/icons/32x32/application-x-cbz.png +mime/icons/48x48/application-x-cb7.png +mime/icons/48x48/application-x-cbr.png +mime/icons/48x48/application-x-cbt.png +mime/icons/48x48/application-x-cbz.png +test/test_archive_tools.py +test/test_archives.py +test/test_image_tools.py +test/test_process.py +test/test_tools.py \ No newline at end of file diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/top_level.txt mcomix-2.1.0/mcomix.egg-info/top_level.txt --- mcomix-1.2.1mcomix3+git20200206/mcomix.egg-info/top_level.txt 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomix.egg-info/top_level.txt 2022-12-17 13:21:53.000000000 +0000 @@ -0,0 +1 @@ +mcomix diff -Nru mcomix-1.2.1mcomix3+git20200206/mcomixstarter.py mcomix-2.1.0/mcomixstarter.py --- mcomix-1.2.1mcomix3+git20200206/mcomixstarter.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mcomixstarter.py 2022-01-25 11:23:30.000000000 +0000 @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +"""MComix - GTK Comic Book Viewer +""" + +# ------------------------------------------------------------------------- +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# ------------------------------------------------------------------------- + +import mcomix.run +mcomix.run.run() diff -Nru mcomix-1.2.1mcomix3+git20200206/mime/comicthumb mcomix-2.1.0/mime/comicthumb --- mcomix-1.2.1mcomix3+git20200206/mime/comicthumb 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/mime/comicthumb 2022-01-23 07:07:19.000000000 +0000 @@ -0,0 +1,45 @@ +#!/usr/bin/env python2 + +"""comicthumb - Thumbnailer for comic book archives, bundled with MComix. + +comicthumb is dependent on the Python Imaging Library (PIL). + +comicthumb was originally written by Christoph Wolk, this version was +re-written from scratch for Comix 4 by Pontus Ekberg. + +Supported formats: ZIP, RAR and tar (.cbz, .cbr, .cbt) + +Usage: comicthumb INFILE OUTFILE [SIZE] +""" + +from mcomix import thumbnail_tools +from mcomix import portability + +import sys +import urllib2 + +if __name__ == '__main__': + argv = portability.get_commandline_args() + try: + in_path = argv[0] + out_path = argv[1] + if len(argv) == 3: + size = int(argv[2]) + else: + size = 128 + except: + print __doc__ + sys.exit(1) + + if in_path.startswith('file://'): + in_path = urllib2.unquote(in_path[7:]) + + thumbnailer = thumbnail_tools.Thumbnailer(force_recreation=True, + archive_support=True, + store_on_disk=False, + size=(size, size)) + thumb = thumbnailer.thumbnail(in_path) + thumb.save(out_path, 'png') + + sys.exit(0) + Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/mime/comicthumb.1.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/mime/comicthumb.1.gz differ diff -Nru mcomix-1.2.1mcomix3+git20200206/mime/mcomix.appdata.xml mcomix-2.1.0/mime/mcomix.appdata.xml --- mcomix-1.2.1mcomix3+git20200206/mime/mcomix.appdata.xml 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/mime/mcomix.appdata.xml 2022-01-23 07:07:19.000000000 +0000 @@ -1,6 +1,6 @@ - + mcomix.desktop CC0-1.0 GPL-2.0+ @@ -19,10 +19,8 @@

- - https://sourceforge.net/p/mcomix/screenshot/273797.jpg - + http://sourceforge.net/p/mcomix/screenshot/273797.jpg - https://sourceforge.net/projects/mcomix/ + http://mcomix.sourceforge.net/ -
+ diff -Nru mcomix-1.2.1mcomix3+git20200206/PKG-INFO mcomix-2.1.0/PKG-INFO --- mcomix-1.2.1mcomix3+git20200206/PKG-INFO 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/PKG-INFO 2022-12-17 13:22:02.431104700 +0000 @@ -0,0 +1,16 @@ +Metadata-Version: 2.1 +Name: mcomix +Version: 2.1.0 +Summary: GTK comic book viewer +Home-page: http://mcomix.sourceforge.net +Maintainer: The MComix Team +Maintainer-email: https://sourceforge.net/projects/mcomix/ +License: License :: OSI Approved :: GNU General Public License (GPL) +Download-URL: http://sourceforge.net/projects/mcomix/files +Platform: Operating System :: POSIX :: Linux +Platform: Operating System :: Microsoft :: Windows +Platform: Operating System :: POSIX :: BSD +License-File: COPYING + +MComix is a user-friendly, customizable image viewer. It is specifically designed to handle comic books (both Western comics and manga) and supports a variety of container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). MComix is a fork of Comix. + diff -Nru mcomix-1.2.1mcomix3+git20200206/README mcomix-2.1.0/README --- mcomix-1.2.1mcomix3+git20200206/README 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/README 2022-12-17 12:42:37.000000000 +0000 @@ -6,12 +6,12 @@ designed to handle comic books (both Western comics and manga) and supports a variety of container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). MComix is a fork of Comix. It is written in Python and uses GTK+ through the - PyGTK bindings. + PyGObject bindings. === Installation ============================================================== - Run "python2 setup.py install" as root. This will install MComix in the + Run "python3 setup.py install" as root. This will install MComix in the site-packages folder of Python. An executable "mcomix" will be placed in /usr/bin. @@ -21,14 +21,14 @@ Example: - # python2 setup.py --prefix /usr install + # python3 setup.py --prefix /usr install As an example of how to install MComix from the downloaded tar.gz file, run as the root user (via su or sudo): # tar -xzf mcomix-x.y.tar.gz # cd mcomix-x.y - # python2 setup.py install + # python3 setup.py install If you don't want to install MComix in some system directory, you can just execute the file mcomixstarter.py in the unpacked MComix directory to @@ -41,7 +41,7 @@ man page, or other optional files normally placed into /usr/share. To do so, setup.py must be called with a additonal options: - # python2 setup.py install --single-version-externally-managed \ + # python3 setup.py install --single-version-externally-managed \ --prefix /usr --root / --record mcomix-files.txt This sort of installation is only recommended for advanced users, as no @@ -51,24 +51,21 @@ === Dependencies ============================================================== - MComix needs Python 2.5, Setuptools 0.6, PyGTK 2.12 and Pillow (Python - Imaging Library Fork) 2.2.1 or newer to function. - - To use the library you need pysqlite (which is usually included in the - standard library for Python 2.5 and later). + MComix needs Python 3.7 or newer to work. PyGObject 3.36.0, PyCairo 1.16.0, + as well as Pillow (Python Imaging Library Fork) 6.0.0 or newer must be + available. You also need either the "unrar" or the "rar" program installed if you wish to read RAR (.cbr) archives. Alternatively, MComix can use libunrar from Rarlab. Place libunrar.so (or - unrar.dll on Win32) either in the system's standard library path (/usr/lib + UnRar64.dll on Win32) either in the system's standard library path (/usr/lib64 or C:\Windows\system32), or directly in MComix' root directory when run without having first installed MComix. To read 7Zip archives, you need to have the "7z" program installed. Likewise, "lha" is needed to open LHA/LZA archives. Note that "7z" can be used as - substitute for both "unrar" and "lha", but extraction of Unicode filenames - on Windows will be broken in that case. + substitute for both "unrar" and "lha". To read PDF files, MComix can use the tools provided by MuPDF, namely mutool and mudraw. diff -Nru mcomix-1.2.1mcomix3+git20200206/README.rst mcomix-2.1.0/README.rst --- mcomix-1.2.1mcomix3+git20200206/README.rst 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/README.rst 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -User under win32 should use `original mcomix`_. - -======= -MComix3 -======= - -Fork from MComix gtk3 branch, switch to python3. - -Only tested under Linux. - -Required: ---------- -- **Python3** 3.5 or later. `1`_ -- **PyGObject** 3.24 or later `2`_, with **GTK+ 3 gir bindings** 3.22 or later. -- **Pillow** 5.2.0 or later. `3`_ (`Latest version`_ is always recommended) - -Recommended: ------------- -- **unrar**, **rar** or **libunrar** to extract RAR archives. `4`_ -- **7z** `5`_ (**p7zip** `6`_ for POSIX system) to extract 7Z and LHA archives. Note that 7z might be able to extract RAR archives as well, but this might require additional software (for example, **p7zip-rar** on Debian-like systems), and it might fail to open certain RAR archives, especially newer ones. -- **lha** `7`_ to extract LHA archives. -- **mupdf** `8`_ for PDF support. -- **libflif_dec** or **libflif** `9`_ for FLIF support. - -Run: ----- -``python3 mcomix/mcomixstarter.py `` - -Install: --------- -**setup.py is not working** - -``python3 installer.py --srcdir=mcomix --target=`` - -then: - -``python3 /mcomix/mcomixstarter.py `` - -.. _original mcomix: https://sourceforge.net/projects/mcomix/ -.. _1: https://www.python.org/downloads/ -.. _2: https://pygobject.readthedocs.io/ -.. _3: https://pillow.readthedocs.io/ -.. _Latest version: https://pypi.org/project/Pillow/ -.. _4: https://www.rarlab.com/rar_add.htm -.. _5: https://www.7-zip.org/ -.. _6: http://p7zip.sourceforge.net/ -.. _7: https://fragglet.github.io/lhasa/ -.. _8: https://mupdf.com/ -.. _9: https://github.com/FLIF-hub/FLIF diff -Nru mcomix-1.2.1mcomix3+git20200206/setup.cfg mcomix-2.1.0/setup.cfg --- mcomix-1.2.1mcomix3+git20200206/setup.cfg 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/setup.cfg 2022-12-17 13:22:02.438102000 +0000 @@ -0,0 +1,11 @@ +[flake8] +builtins = _ +ignore = E501 + +[pylint.VARIABLES] +additional-builtins = '_' + +[egg_info] +tag_build = +tag_date = 0 + diff -Nru mcomix-1.2.1mcomix3+git20200206/setup.py mcomix-2.1.0/setup.py --- mcomix-1.2.1mcomix3+git20200206/setup.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/setup.py 2022-12-17 12:42:38.000000000 +0000 @@ -1,6 +1,84 @@ +#!/usr/bin/env python3 # -*- coding: utf-8 -*- -from __future__ import print_function -exit(print('setup.py is not working. Use:\n\npython3 mcomix/mcomixstarter.py ""\n') or 1) +""" MComix installation routines. + +Example usage: + Normal installation (all files are copied into a directory in python/lib/site-packages/mcomix) + $ ./setup.py install + + For distribution packaging (All files are installed relative to /tmp/mcomix) + $ ./setup.py install --single-version-externally-managed --root /tmp/mcomix --prefix /usr +""" + +import setuptools + +from mcomix import constants + + +setuptools.setup( + name = constants.APPNAME.lower(), + version = constants.VERSION, + packages = ['mcomix', 'mcomix.archive', 'mcomix.library'], + include_package_data=True, + entry_points = { + 'console_scripts' : [ 'mcomix = mcomix.run:run' ], + 'setuptools.installation': [ 'eggsecutable=mcomix.run:run' ], + }, + test_suite = "test", + install_requires = ['PyGObject (>=3.36.0)', 'PyCairo (>= 1.16.0)', 'Pillow (>=6.0.0)'], + zip_safe = False, + + # Various MIME files that need to be copied to certain system locations on Linux. + # Note that these files are only installed correctly if + # --single-version-externally-managed is used as argument to "setup.py install". + # Otherwise, these files end up in a MComix egg directory in site-packages. + # (Thank you, setuptools!) + data_files = [ + ('share/man/man1', ['mcomix.1.gz']), + ('share/applications', ['mime/mcomix.desktop']), + ('share/appdata', ['mime/mcomix.appdata.xml']), + ('share/mime/packages', ['mime/mcomix.xml']), + ('share/icons/hicolor/16x16/apps', ['mcomix/images/16x16/mcomix.png']), + ('share/icons/hicolor/22x22/apps', ['mcomix/images/22x22/mcomix.png']), + ('share/icons/hicolor/24x24/apps', ['mcomix/images/24x24/mcomix.png']), + ('share/icons/hicolor/32x32/apps', ['mcomix/images/32x32/mcomix.png']), + ('share/icons/hicolor/48x48/apps', ['mcomix/images/48x48/mcomix.png']), + ('share/icons/hicolor/16x16/mimetypes', + ['mime/icons/16x16/application-x-cbz.png', + 'mime/icons/16x16/application-x-cbr.png', + 'mime/icons/16x16/application-x-cbt.png']), + ('share/icons/hicolor/22x22/mimetypes', + ['mime/icons/22x22/application-x-cbz.png', + 'mime/icons/22x22/application-x-cbr.png', + 'mime/icons/22x22/application-x-cbt.png']), + ('share/icons/hicolor/24x24/mimetypes', + ['mime/icons/24x24/application-x-cbz.png', + 'mime/icons/24x24/application-x-cbr.png', + 'mime/icons/24x24/application-x-cbt.png']), + ('share/icons/hicolor/32x32/mimetypes', + ['mime/icons/32x32/application-x-cbz.png', + 'mime/icons/32x32/application-x-cbr.png', + 'mime/icons/32x32/application-x-cbt.png']), + ('share/icons/hicolor/48x48/mimetypes', + ['mime/icons/48x48/application-x-cbz.png', + 'mime/icons/48x48/application-x-cbr.png', + 'mime/icons/48x48/application-x-cbt.png'])], + + # Package metadata + maintainer = 'The MComix Team', + maintainer_email = 'https://sourceforge.net/projects/mcomix/', + url = 'http://mcomix.sourceforge.net', + description = 'GTK comic book viewer', + long_description = 'MComix is a user-friendly, customizable image viewer. ' + 'It is specifically designed to handle comic books (both Western comics and manga) ' + 'and supports a variety of container formats (including CBR, CBZ, CB7, CBT, LHA and PDF). ' + 'MComix is a fork of Comix.', + license = "License :: OSI Approved :: GNU General Public License (GPL)", + download_url = "http://sourceforge.net/projects/mcomix/files", + platforms = ['Operating System :: POSIX :: Linux', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: BSD'], +) # vim: expandtab:sw=4:ts=4 Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/01-ZIP-Normal.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/01-ZIP-Normal.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/02-TAR-Normal.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/02-TAR-Normal.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/03-RAR-Normal.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/03-RAR-Normal.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/04-7Z-Normal.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/04-7Z-Normal.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/double-pages-test.cbz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/double-pages-test.cbz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/embedded_red_and_blues_rar.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/embedded_red_and_blues_rar.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Encrypted.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Encrypted.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/EncryptedHeader.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/EncryptedHeader.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/EncryptedHeader.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/EncryptedHeader.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Encrypted.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Encrypted.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Encrypted.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Encrypted.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Encrypted.zip.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Encrypted.zip.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Flat.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Flat.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Flat.lha and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Flat.lha differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Flat.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Flat.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Flat.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Flat.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Flat.zip.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Flat.zip.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/GlobEntries.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/GlobEntries.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/GlobEntries.lha and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/GlobEntries.lha differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/GlobEntries.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/GlobEntries.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/GlobEntries.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/GlobEntries.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/OptEntry.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/OptEntry.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/OptEntry.lha and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/OptEntry.lha differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/OptEntry.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/OptEntry.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/OptEntry.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/OptEntry.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/RAR4.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/RAR4.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/RAR5.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/RAR5.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/red_and_blues.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/red_and_blues.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/red_and_blues.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/red_and_blues.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/red_and_blues.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/red_and_blues.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidEncrypted.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidEncrypted.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidEncryptedHeader.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidEncryptedHeader.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidEncryptedHeader.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidEncryptedHeader.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidEncrypted.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidEncrypted.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.tar.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.tar.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.tar.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.tar.gz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidFlat.tar.xz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidFlat.tar.xz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidGlobEntries.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidGlobEntries.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidGlobEntries.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidGlobEntries.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidGlobEntries.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidGlobEntries.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidGlobEntries.tar.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidGlobEntries.tar.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidGlobEntries.tar.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidGlobEntries.tar.gz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidOptEntry.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidOptEntry.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidOptEntry.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidOptEntry.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidOptEntry.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidOptEntry.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidOptEntry.tar.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidOptEntry.tar.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidOptEntry.tar.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidOptEntry.tar.gz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidTree.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidTree.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidTree.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidTree.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidTree.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidTree.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidTree.tar.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidTree.tar.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidTree.tar.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidTree.tar.gz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidUnicode.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidUnicode.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidUnicode.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidUnicode.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidUnicode.tar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidUnicode.tar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidUnicode.tar.bz2 and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidUnicode.tar.bz2 differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/SolidUnicode.tar.gz and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/SolidUnicode.tar.gz differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Tree.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Tree.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Tree.lha and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Tree.lha differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Tree.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Tree.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Tree.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Tree.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Unicode.7z and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Unicode.7z differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Unicode.lha and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Unicode.lha differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Unicode.rar and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Unicode.rar differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/archives/Unicode.zip and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/archives/Unicode.zip differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/01-JPG-Indexed.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/01-JPG-Indexed.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/02-JPG-RGB.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/02-JPG-RGB.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/03-PNG-RGB.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/03-PNG-RGB.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/04-PNG-Indexed.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/04-PNG-Indexed.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/05-PNG-RGBA.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/05-PNG-RGBA.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/animated.gif and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/animated.gif differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/blue.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/blue.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/checkerboard.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/checkerboard.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/landscape-exif-270-rotation.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/landscape-exif-270-rotation.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/landscape-exif-270-rotation.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/landscape-exif-270-rotation.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/landscape-no-exif.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/landscape-no-exif.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/landscape-no-exif.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/landscape-no-exif.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/pattern.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/pattern.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/pattern-opaque-rgba.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/pattern-opaque-rgba.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/pattern-opaque-rgb.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/pattern-opaque-rgb.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/pattern-transparent-rgba.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/pattern-transparent-rgba.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/portrait-exif-180-rotation.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/portrait-exif-180-rotation.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/portrait-exif-180-rotation.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/portrait-exif-180-rotation.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/portrait-no-exif.jpg and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/portrait-no-exif.jpg differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/portrait-no-exif.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/portrait-no-exif.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/red.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/red.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/transparent-indexed.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/transparent-indexed.png differ Binary files /tmp/tmph92dk6v3/XjkAQzqrUp/mcomix-1.2.1mcomix3+git20200206/test/files/images/transparent.png and /tmp/tmph92dk6v3/qukwjG_ezy/mcomix-2.1.0/test/files/images/transparent.png differ diff -Nru mcomix-1.2.1mcomix3+git20200206/test/files/__init__.py mcomix-2.1.0/test/files/__init__.py --- mcomix-1.2.1mcomix3+git20200206/test/files/__init__.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/files/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -""" This file is required for setuptools packaging. """ diff -Nru mcomix-1.2.1mcomix3+git20200206/test/__init__.py mcomix-2.1.0/test/__init__.py --- mcomix-1.2.1mcomix3+git20200206/test/__init__.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/__init__.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import sys - -# Useful to be able to run the current testsuite with another MComix version. -mcomix_path = os.environ.get('MCOMIXPATH', None) -if mcomix_path is not None: - sys.path.insert(0, mcomix_path) - -# Configure locale. - -import locale - -locale.setlocale(locale.LC_ALL, '') - -# Since some of MComix' modules depend on gettext being installed for _(), -# add such a function here that simply returns the string passed into it. - -import __builtin__ - -if '_' not in __builtin__.__dict__: - __builtin__.__dict__['_'] = unicode - -# Enable debug logging to make post-mortem analysis easier. - -from mcomix import log - -log.setLevel('DEBUG') - -# Use a custom testcase class: -# - isolate tests: do not use or modify the user current -# configuration for MComix (preferences, library, ...) -# - make sure MComix state is reset before each test - -import shutil -import tempfile -import unittest - -from mcomix.preferences import prefs - -default_prefs = {} -default_prefs.update(prefs) - -class MComixTest(unittest.TestCase): - - def setUp(self): - base_tmpdir = os.path.join('test', 'tmp') - if not os.path.exists(base_tmpdir): - os.mkdir(base_tmpdir) - name = '.'.join(( - self.__module__.split('.')[-1], - self.__class__.__name__, - self._testMethodName)) - self.tmp_dir = tempfile.mkdtemp(dir=base_tmpdir, prefix=u'%s.' % name) - # Change storage directories. - home_dir = os.path.join(self.tmp_dir, 'home') - os.mkdir(home_dir) - os.environ['HOME'] = home_dir - os.environ['XDG_DATA_HOME'] = os.path.join(home_dir, 'data') - os.environ['XDG_CONFIG_HOME'] = os.path.join(home_dir, 'config') - # Create and setup temporary directory. - temp_dir = os.path.join(self.tmp_dir, 'tmp') - os.mkdir(temp_dir) - os.environ['TMPDIR'] = os.environ['TEMP'] = os.environ['TMP'] = temp_dir - # Make sure tempfile module uses the correct directory. - tempfile.tempdir = temp_dir - # Reset preferences to default. - prefs.clear() - prefs.update(default_prefs) - - def tearDown(self): - name = '.'.join(( - self.__module__.split('.')[-1], - self.__class__.__name__, - self._testMethodName)) - failed = False - if hasattr(self._resultForDoCleanups, '_excinfo'): - # When running under py.test2 - exclist = self._resultForDoCleanups._excinfo - if exclist is not None: - for exc in exclist: - if 'XFailed' != exc.typename: - failed = True - break - if hasattr(self._resultForDoCleanups, 'failures'): - # When running under nosetest2 - for failure, traceback in self._resultForDoCleanups.failures: - if failure.id() == self.id(): - failed = True - break - if not failed: - shutil.rmtree(self.tmp_dir) - -# Helper to get path to testsuite sample files. - -def get_testfile_path(*components): - return unicode(os.path.join(os.path.dirname(__file__), 'files', *components)) - diff -Nru mcomix-1.2.1mcomix3+git20200206/test/library_types.py mcomix-2.1.0/test/library_types.py --- mcomix-1.2.1mcomix3+git20200206/test/library_types.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/library_types.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -import unittest -import tempfile -import shutil -import os - -from mcomix import constants -from mcomix.library import backend -from mcomix.library import backend_types - -class CollectionTest(unittest.TestCase): - - def setUp(self): - # Database file - fp, self.db = tempfile.mkstemp('.db', 'mcomix-test') - os.close(fp) - - # Initialize library (path must be patched for testing) - constants.LIBRARY_DATABASE_PATH = self.db - self.library = backend.LibraryBackend() - - # Initialize database - self.library.add_collection("Test") - self.library.add_collection("Subtest") - test_col = self.library.get_collection_by_name("Test") - sub_col = self.library.get_collection_by_name("Subtest") - test_col.add_collection(sub_col) - # There is also a collection Recent that is added by default! - - # Add first two archives to no collection, remaining two - # to subcollections. - directory = 'test/files/archives' - zip_archive = unicode(os.path.join(directory, '01-ZIP-Normal.zip')) - tar_archive = unicode(os.path.join(directory, '02-TAR-Normal.tar')) - rar_archive = unicode(os.path.join(directory, '03-RAR-Normal.rar')) - sz_archive = unicode(os.path.join(directory, '04-7Z-Normal.7z')) - - self.library.add_book(zip_archive, None) - self.library.add_book(tar_archive, None) - self.library.add_book(rar_archive, test_col.id) - self.library.add_book(sz_archive, sub_col.id) - - def tearDown(self): - self.library.close() - # Remove singleton instance - backend._backend = None - os.unlink(self.db) - - def test_get_books_default(self): - default_col = backend_types.DefaultCollection - - # All books - books = default_col.get_books() - self.assertEqual(len(books), 4) - # Only RAR - books = default_col.get_books('rar') - self.assertEqual(len(books), 1) - # No matches - books = default_col.get_books('NOMATCH') - self.assertEqual(len(books), 0) - - def test_get_books_normal_collection(self): - test_col = self.library.get_collection_by_name("Test") - - # Two books should be stored (including subcollections) - self.assertEqual(len(test_col.get_books()), 2) - # Only RAR - self.assertEqual(len(test_col.get_books('rar')), 1) - # ZIP shouldn't be included - self.assertEqual(len(test_col.get_books('zip')), 0) - - def test_get_book_with_attribs(self): - books = backend_types.DefaultCollection.get_books('zip') - - self.assertEqual(len(books), 1) - - zipbook = books[0] - self.assertEqual(zipbook.id, 1) - self.assertEqual(zipbook.pages, 4) - - def test_add_subcollection_normal_collection(self): - test_col = self.library.get_collection_by_name("Test") - - self.library.add_collection("New test") - new_col = self.library.get_collection_by_name("New test") - test_col.add_collection(new_col) - - self.assertIsNone(test_col.supercollection, None) - self.assertEqual(new_col.supercollection, test_col.id) - - def test_get_collections_default(self): - col = backend_types.DefaultCollection - root_collections = col.get_collections() - - self.assertEqual(len(root_collections), 2) - self.assertEqual(root_collections[1].name, "Test") - - def test_get_collections_normal_collection(self): - col = self.library.get_collection_by_name("Test") - root_collections = col.get_collections() - - self.assertEqual(len(root_collections), 1) - self.assertEqual(root_collections[0].name, "Subtest") - - def test_equal(self): - test_col1 = self.library.get_collection_by_name("Test") - test_col2 = self.library.get_collection_by_name("Test") - other = 123 - - self.assertEqual(test_col1, test_col2) - self.assertNotEqual(test_col1, other) - - def test_get_all_collections(self): - all_cols = backend_types.DefaultCollection.get_all_collections() - self.assertEqual(len(all_cols), 3) - - col = self.library.get_collection_by_name("Test") - subcol = self.library.get_collection_by_name("Subtest") - self.library.add_collection("New test") - new_col = self.library.get_collection_by_name("New test") - subcol.add_collection(new_col) - - self.assertEqual(len(backend_types.DefaultCollection.get_all_collections()), 4) - self.assertEqual(len(col.get_all_collections()), 2) - - def test_get_default_collection(self): - collection = self.library.get_collection_by_id(None) - self.assertEqual(collection, backend_types.DefaultCollection) - - -class WatchListEntryTest(unittest.TestCase): - - def test_invalid_dir(self): - tmpdir = tempfile.mkdtemp(dir=u'test', prefix=u'tmp.library_types.') - entry = backend_types._WatchListEntry(os.path.join(tmpdir, "invalid-directory"), False, None) - self.assertFalse(entry.is_valid()) - self.assertIsInstance(entry.get_new_files([]), list) - self.assertEqual(len(entry.get_new_files([])), 0) - shutil.rmtree(tmpdir) - - def test_valid_dir(self): - tmpdir = os.path.abspath(tempfile.mkdtemp(dir=u'test', prefix=u'tmp.library_types.')) - directory = unicode(os.path.abspath('test/files/archives')) - available = [u'01-ZIP-Normal.zip', u'02-TAR-Normal.tar'] - others = [u'03-RAR-Normal.rar', u'04-7Z-Normal.7z'] - for entry_list in (available, others): - for n, entry in enumerate(entry_list): - src = os.path.join(directory, entry) - dst = os.path.join(tmpdir, entry) - shutil.copy(src, dst) - entry_list[n] = dst - - entry = backend_types._WatchListEntry(tmpdir, True, None) - new_files = entry.get_new_files(available) - new_files.sort() - - self.assertIsInstance(new_files, list) - self.assertEqual(new_files, others) - - shutil.rmtree(tmpdir) - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/test/open_last_page.py mcomix-2.1.0/test/open_last_page.py --- mcomix-1.2.1mcomix3+git20200206/test/open_last_page.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/open_last_page.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import tempfile -import os - -from mcomix import constants -from mcomix import last_read_page -from mcomix.library import backend - -class OpenLastPageBasicTest(unittest.TestCase): - def setUp(self): - # Database file - fp, self.db = tempfile.mkstemp('.db', 'mcomix-test') - os.close(fp) - constants.LIBRARY_DATABASE_PATH = self.db - - # Dummy archive (files are checked for existance) - self.archive1 = os.path.abspath(u'test/files/archives/01-ZIP-Normal.zip') - self.archive2 = os.path.abspath(u'test/files/archives/02-TAR-Normal.tar') - - # Library backend - self.backend = backend.LibraryBackend() - - self.lastread = last_read_page.LastReadPage(self.backend) - self.lastread.set_enabled(True) - - def tearDown(self): - self.backend.close() - os.unlink(self.db) - - def test_init(self): - self.assertEqual(0, self.lastread.count()) - - def test_count(self): - self.lastread.set_page(self.archive1, 1) - self.assertEqual(1, self.lastread.count()) - self.lastread.set_page(self.archive2, 1) - self.assertEqual(2, self.lastread.count()) - - def test_set_last_page(self): - self.lastread.set_page(self.archive1, 1) - self.assertEqual(1, self.lastread.get_page(self.archive1)) - - def test_multiple_archives(self): - self.lastread.set_page(self.archive1, 1) - self.lastread.set_page(self.archive2, 2) - - self.assertEqual(1, self.lastread.get_page(self.archive1)) - self.assertEqual(2, self.lastread.get_page(self.archive2)) - - def test_clear_page(self): - self.lastread.set_page(self.archive1, 1) - self.lastread.clear_page(self.archive1) - self.assertIsNone(self.lastread.get_page(self.archive1)) - - def test_clear_all(self): - self.lastread.set_page(self.archive1, 1) - self.lastread.clear_all() - self.assertEqual(0, self.lastread.count()) - - def test_overwrite(self): - self.lastread.set_page(self.archive1, 1) - self.assertEqual(1, self.lastread.get_page(self.archive1)) - self.lastread.set_page(self.archive1, 2) - self.assertEqual(2, self.lastread.get_page(self.archive1)) - - def test_enabled(self): - self.lastread.set_enabled(False) - self.lastread.set_page(self.archive1, 1) - self.assertIsNone(self.lastread.get_page(self.archive1)) - - def test_nonexistant_file(self): - self.assertRaises(ValueError, self.lastread.set_page, - '/root/mcomix/file-that-should-not-exist-hopefully', 1) - - def test_invalid_page(self): - self.assertRaises(ValueError, self.lastread.set_page, - self.archive1, 0) - self.assertRaises(ValueError, self.lastread.set_page, - self.archive1, -1) - - def test_date(self): - self.lastread.set_page(self.archive1, 1) - self.assertIsNotNone(self.lastread.get_date(self.archive1)) - - def test_reopen(self): - self.lastread.set_page(self.archive1, 1) - self.lastread.set_page(self.archive2, 2) - self.assertEqual(1, self.lastread.get_page(self.archive1)) - self.assertEqual(2, self.lastread.get_page(self.archive2)) - - self.backend.close() - self.backend = backend.LibraryBackend() - self.lastread = last_read_page.LastReadPage(self.backend) - self.lastread.set_enabled(True) - - self.assertEqual(1, self.lastread.get_page(self.archive1), - 'Page should be remembered after shutdown') - self.assertEqual(2, self.lastread.get_page(self.archive2), - 'Page should be remembered after shutdown') - -# vim: expandtab:sw=4:ts=4 diff -Nru mcomix-1.2.1mcomix3+git20200206/test/pytest.ini mcomix-2.1.0/test/pytest.ini --- mcomix-1.2.1mcomix3+git20200206/test/pytest.ini 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/pytest.ini 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -[pytest] -addopts = -r sFEX -ignore = files diff -Nru mcomix-1.2.1mcomix3+git20200206/test/run.py mcomix-2.1.0/test/run.py --- mcomix-1.2.1mcomix3+git20200206/test/run.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/run.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -#!/usr/bin/python2 - -__requires__ = 'pytest' - -import os -import shutil -import sys - -from pkg_resources import load_entry_point - -if __name__ == '__main__': - - test_dir = os.path.dirname(__file__) - - # Remove __pycache__ directory so pytest does not freak out - # when switching between the Linux/Windows versions. - pycache = os.path.join(test_dir, '__pycache__') - if os.path.exists(pycache): - shutil.rmtree(pycache) - - custom_testsuite = None - args = [] - n = 1 - while n < len(sys.argv): - a = sys.argv[n] - if '-' == a[0]: - if '-V' == a: - n += 1 - os.environ['MCOMIXPATH'] = sys.argv[n] - else: - args.append(a) - elif os.path.exists(a): - custom_testsuite = a - args.append(a) - else: - args.extend(('-k', a)) - n += 1 - if custom_testsuite is None: - args.insert(0, test_dir) - sys.argv[1:] = args - - sys.exit( - load_entry_point('pytest', 'console_scripts', 'py.test')() - ) diff -Nru mcomix-1.2.1mcomix3+git20200206/test/test_archives.py mcomix-2.1.0/test/test_archives.py --- mcomix-1.2.1mcomix3+git20200206/test/test_archives.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/test_archives.py 2022-01-25 11:23:30.000000000 +0000 @@ -42,7 +42,7 @@ cleanup = [] try: outpath = os.path.abspath(outfile) - tmp_dir = tempfile.mkdtemp(dir=u'test/tmp', prefix=u'make_archive.') + tmp_dir = tempfile.mkdtemp(dir='test/tmp', prefix='make_archive.') cleanup.append(lambda: shutil.rmtree(tmp_dir)) entry_list = [] for name, filename in contents: @@ -66,8 +66,8 @@ assert not header_encryption cmd.extend(('--', outpath)) # To avoid @ being treated as a special character... - tmp_file = tempfile.NamedTemporaryFile(dir=u'test/tmp', - prefix=u'make_archive.', + tmp_file = tempfile.NamedTemporaryFile(dir='test/tmp', + prefix='make_archive.', delete=False) cleanup.append(lambda: os.unlink(tmp_file.name)) for entry in entry_list: @@ -161,7 +161,7 @@ def setUpClass(cls): if cls.skip is not None: raise unittest.SkipTest(cls.skip) - cls.archive_path = u'%s.%s' % (get_testfile_path('archives', cls.archive), cls.format) + cls.archive_path = '%s.%s' % (get_testfile_path('archives', cls.archive), cls.format) cls.archive_contents = dict([ (archive_name, filename) for name, archive_name, filename @@ -183,7 +183,7 @@ def setUp(self): super(ArchiveFormatTest, self).setUp() - self.dest_dir = tempfile.mkdtemp(prefix=u'extract.') + self.dest_dir = tempfile.mkdtemp(prefix='extract.') self.archive = None def tearDown(self): @@ -201,14 +201,14 @@ def test_list_contents(self): self.archive = self.handler(self.archive_path) contents = self.archive.list_contents() - self.assertItemsEqual(contents, self.archive_contents.keys()) + self.assertItemsEqual(contents, list(self.archive_contents.keys())) def test_iter_contents(self): self.archive = self.handler(self.archive_path) contents = [] for name in self.archive.iter_contents(): contents.append(name) - self.assertItemsEqual(contents, self.archive_contents.keys()) + self.assertItemsEqual(contents, list(self.archive_contents.keys())) def test_is_solid(self): self.archive = self.handler(self.archive_path) @@ -223,7 +223,7 @@ def test_extract(self): self.archive = self.handler(self.archive_path) contents = self.archive.list_contents() - self.assertItemsEqual(contents, self.archive_contents.keys()) + self.assertItemsEqual(contents, list(self.archive_contents.keys())) # Use out-of-order extraction to try to trip implementation. for name in reversed(contents): self.archive.extract(name, self.dest_dir) @@ -236,7 +236,7 @@ def test_iter_extract(self): self.archive = self.handler(self.archive_path) contents = self.archive.list_contents() - self.assertItemsEqual(contents, self.archive_contents.keys()) + self.assertItemsEqual(contents, list(self.archive_contents.keys())) extracted = [] for name in self.archive.iter_extract(reversed(contents), self.dest_dir): extracted.append(name) @@ -328,10 +328,10 @@ ('meh.png' , 'meh.png' , 'images/03-PNG-RGB.png' ), )), ('Unicode', True, ( - (u'1-قفهسا.jpg' , u'1-قفهسا.jpg' , 'images/01-JPG-Indexed.jpg'), - (u'2-רדןקמא.png' , u'2-רדןקמא.png' , 'images/04-PNG-Indexed.png'), - (u'3-りえsち.jpg' , u'3-りえsち.jpg' , 'images/02-JPG-RGB.jpg' ), - (u'4-щжвщджл.png' , u'4-щжвщджл.png' , 'images/03-PNG-RGB.png' ), + ('1-قفهسا.jpg' , '1-قفهسا.jpg' , 'images/01-JPG-Indexed.jpg'), + ('2-רדןקמא.png' , '2-רדןקמא.png' , 'images/04-PNG-Indexed.png'), + ('3-りえsち.jpg' , '3-りえsち.jpg' , 'images/02-JPG-RGB.jpg' ), + ('4-щжвщджл.png' , '4-щжвщджл.png' , 'images/03-PNG-RGB.png' ), )), # Check we don't treat an entry name as an option or command line switch. ('OptEntry', True, ( @@ -369,7 +369,7 @@ if not is_supported: continue contents = [ - map(lambda s: s.replace('/', os.sep), names) + [s.replace('/', os.sep) for s in names] for names in contents ] for variant, params in base_class_list: diff -Nru mcomix-1.2.1mcomix3+git20200206/test/test_image_tools.py mcomix-2.1.0/test/test_image_tools.py --- mcomix-1.2.1mcomix3+git20200206/test/test_image_tools.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/test_image_tools.py 2022-01-25 11:23:30.000000000 +0000 @@ -9,7 +9,7 @@ from collections import namedtuple from PIL import Image, ImageDraw -from cStringIO import StringIO +from io import StringIO from difflib import unified_diff from . import MComixTest, get_testfile_path @@ -231,8 +231,8 @@ self.assertImagesEqual(pixbuf, im, msg=msg) def test_load_pixbuf_modes(self): - tmp_file = tempfile.NamedTemporaryFile(prefix=u'image.', - suffix=u'.png', delete=False) + tmp_file = tempfile.NamedTemporaryFile(prefix='image.', + suffix='.png', delete=False) tmp_file.close() base_im = Image.open(get_image_path('transparent.png')) for supported, expected_pixbuf_mode, mode in _IMAGE_MODES: @@ -335,8 +335,8 @@ image_size = (2063, 3131) target_size = (500, 500) expected_size = (329, 500) - tmp_file = tempfile.NamedTemporaryFile(prefix=u'image.', - suffix=u'.png', delete=False) + tmp_file = tempfile.NamedTemporaryFile(prefix='image.', + suffix='.png', delete=False) tmp_file.close() im = Image.new('RGB', image_size) im.save(tmp_file.name) @@ -387,7 +387,7 @@ self.assertEqual(result, expected, msg=msg) def test_get_image_info_invalid(self): - expected = (u'Unknown filetype', 0, 0) + expected = ('Unknown filetype', 0, 0) result = image_tools.get_image_info(os.devnull) msg = ( 'get_image_info() on invalid image failed; ' diff -Nru mcomix-1.2.1mcomix3+git20200206/test/test_process.py mcomix-2.1.0/test/test_process.py --- mcomix-1.2.1mcomix3+git20200206/test/test_process.py 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/test/test_process.py 2022-01-25 11:23:30.000000000 +0000 @@ -48,7 +48,7 @@ def test_find_executable(self): cleanup = [] try: - root_dir = tempfile.mkdtemp(dir=u'test', prefix=u'tmp.path.') + root_dir = tempfile.mkdtemp(dir='test', prefix='tmp.path.') # cleanup.append(lambda: shutil.rmtree(root_dir)) if 'win32' == sys.platform: diff -Nru mcomix-1.2.1mcomix3+git20200206/test/test_tools.py mcomix-2.1.0/test/test_tools.py --- mcomix-1.2.1mcomix3+git20200206/test/test_tools.py 1970-01-01 00:00:00.000000000 +0000 +++ mcomix-2.1.0/test/test_tools.py 2022-12-17 12:42:38.000000000 +0000 @@ -0,0 +1,14 @@ +import unittest + +from mcomix import tools + +class TestAlphanumericSort(unittest.TestCase): + def test_numbers_are_ordered_naturally(self): + lst = ['10.jpg', '2.jpg'] + tools.alphanumeric_sort(lst) + self.assertListEqual(lst, ['2.jpg', '10.jpg']) + + def test_sort_with_mixed_number_and_string_files(self): + lst = ['text_2.jpg', '2_text.jpg'] + tools.alphanumeric_sort(lst) + self.assertListEqual(lst, ['2_text.jpg', 'text_2.jpg']) diff -Nru mcomix-1.2.1mcomix3+git20200206/TODO mcomix-2.1.0/TODO --- mcomix-1.2.1mcomix3+git20200206/TODO 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/TODO 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -This is still mcomix compatible with python3, not mcomix in python3. -We have a lot of works to do before adding new features. -Even this TODO is todo. - -Code should be strictly correct: -- fix deprecation warning from gtk. -- avoid workaround for bug of dependences. -- ... - -Code should be written in python3: -- using context manager if supported. -- using generator if supported. -- no `unicode` -- ... - -Code should be simple and readable: -- using `[ for loop ]` instead of `map` and `filter` if `list` is needed. -- seprate big template into another file. -- ... - -Code should be consistent: -- using single quote -- remove extra whitespaces -- ... \ No newline at end of file diff -Nru mcomix-1.2.1mcomix3+git20200206/update_translations.sh mcomix-2.1.0/update_translations.sh --- mcomix-1.2.1mcomix3+git20200206/update_translations.sh 2020-02-06 05:43:34.000000000 +0000 +++ mcomix-2.1.0/update_translations.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -ROOTDIR="mcomix/mcomix" -VERSION=$(grep VERSION $ROOTDIR/constants.py | sed -e "s/VERSION = //" -e "s/'//g") -MAINTAINER="NAME@HO.ST" - -xgettext -LPython -omcomix.pot -p$ROOTDIR/messages/ -cTRANSLATORS \ - --from-code=utf-8 --package-name=MComix --package-version=${VERSION} \ - --msgid-bugs-address=${MAINTAINER} \ - $ROOTDIR/*.py $ROOTDIR/archive/*.py $ROOTDIR/library/*.py - -for pofile in $ROOTDIR/messages/*/LC_MESSAGES/*.po -do - # Merge message files with master template, no fuzzy matching (-N) - msgmerge -U --backup=none ${pofile} $ROOTDIR/messages/mcomix.pot - # Compile translation, add "-f" to include fuzzy strings - #msgfmt ${pofile} -o ${pofile%.*}.mo -done